74 lines
2.4 KiB
Python
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))
|