Files
zeus-skills/ops/connectwise/connectwise/scripts/connectwise_api.py
T

74 lines
2.4 KiB
Python

import argparse
import json
import os
import requests
import base64
from datetime import datetime, timedelta
# Load environment variables
CW_URL = os.getenv("CW_BASE_URL", "https://api-na.connectwise.com")
CW_COMPANY = os.getenv("CW_COMPANY", "VNI")
CW_PUBLIC_KEY = os.getenv("CW_PUBLIC_KEY", "")
CW_PRIVATE_KEY = os.getenv("CW_PRIVATE_KEY", "")
CW_CLIENT_ID = os.getenv("CW_CLIENT_ID", "")
def get_auth_header():
auth_str = f"{CW_COMPANY}+{CW_PUBLIC_KEY}:{CW_PRIVATE_KEY}"
encoded = base64.b64encode(auth_str.encode()).decode()
return f"Basic {encoded}"
def create_schedule_entry(ticket_id, member_id, start_local, end_local):
endpoint = f"{CW_URL}/schedule/entries"
# ConnectWise expects UTC.
# Pacific Time (PDT) is UTC-7.
# To convert 8:00 AM PDT to UTC, we add 7 hours.
# The user input is expected as "YYYY-MM-DDTHH:MM:SS"
start_dt = datetime.strptime(start_local, "%Y-%m-%dT%H:%M:%S")
end_dt = datetime.strptime(end_local, "%Y-%m-%dT%H:%M:%S")
utc_start = (start_dt + timedelta(hours=7)).strftime("%Y-%m-%dT%H:%M:%SZ")
utc_end = (end_dt + timedelta(hours=7)).strftime("%Y-%m-%dT%H:%M:%SZ")
payload = {
"member": {
"id": int(member_id)
},
"dateStart": utc_start,
"dateEnd": utc_end,
"objectId": int(ticket_id),
"type": {
"id": 4
},
"span": {
"id": 1
}
}
headers = {
"Authorization": get_auth_header(),
"clientId": CW_CLIENT_ID,
"Content-Type": "application/json"
}
try:
response = requests.post(endpoint, headers=headers, json=payload, timeout=30)
response.raise_for_status()
return response.json()
except Exception as e:
return {"error": str(e), "body": getattr(e.response, 'text', 'No body')}
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("action", choices=["schedule"])
parser.add_argument("--ticket_id")
parser.add_argument("--member_id")
parser.add_argument("--start") # Format: 2026-07-03T08:00:00
parser.add_argument("--end") # Format: 2026-07-03T08:30:00
args = parser.parse_args()
if args.action == "schedule":
result = create_schedule_entry(args.ticket_id, args.member_id, args.start, args.end)
print(json.dumps(result, indent=2))