import base64 import requests import pandas as pd from datetime import datetime import sys def generate_report(owner_id, company_id, public_key, private_key, client_id): base_url = 'https://cw.vistanetinc.com/v4_6_release/apis/3.0' # Auth Format: Basic base64(companyidpublickey:privatekey) auth_str = f"{company_id}{public_key}:{private_key}" encoded_auth = base64.b64encode(auth_str.encode()).decode() headers = { 'Authorization': f'Basic {encoded_auth}', 'clientId': client_id, 'Company-Id': company_id, 'Content-Type': 'application/json' } conditions = f"closedFlag=false and owner/identifier='{owner_id}'" url = f"{base_url}/service/tickets?conditions={conditions}" response = requests.get(url, headers=headers) if response.status_code != 200: print(f"Error: API request failed with status {response.status_code}: {response.text}") sys.exit(1) tickets = response.json() if not tickets: return f"No open tickets found for {owner_id}." data = [] for t in tickets: status_name = t.get('status', {}).get('name', 'Unknown') if isinstance(t.get('status'), dict) else t.get('status', 'Unknown') if status_name.startswith('>'): continue data.append({ 'Ticket #': t.get('id', 'N/A'), 'Company': t.get('company', {}).get('name', 'N/A') if isinstance(t.get('company'), dict) else t.get('company', 'N/A'), 'Owner': t.get('owner', {}).get('identifier', 'N/A') if isinstance(t.get('owner'), dict) else t.get('owner', 'N/A'), 'Status': status_name, 'Summary': t.get('summary', 'No Summary'), 'Date Entered': t.get('dateEntered', 'N/A') }) if not data: return f"No open tickets found for {owner_id} (excluding completed statuses)." df = pd.DataFrame(data).sort_values(by='Date Entered', ascending=False) return f'''

Open Tickets Report: {owner_id}

Generated on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}

{df.to_html(index=False, border=1, justify='left')}
''' if __name__ == "__main__": # This script is intended to be used by the agent providing credentials from a secret store if len(sys.argv) < 2: print("Usage: generate_open_tickets.py ") sys.exit(1) # Note: Actual credentials should be passed via env or a wrapper; # the agent should read from ~/.secrets/connectwise print("Error: This script requires a wrapper to inject credentials from ~/.secrets/connectwise") sys.exit(1)