import os import requests import json import logging from superoffice_client import SuperOfficeClient from config import settings # Setup Logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger("simulation-e2e") def simulate_sendout(contact_id: int, person_id: int): print(f"🚀 Starting E2E Sendout Simulation for Contact {contact_id}, Person {person_id}...") # 1. Initialize SuperOffice Client so_client = SuperOfficeClient() if not so_client.access_token: print("❌ Auth failed. Check .env") return # 2. Get Data from Company Explorer # We simulate what the worker would do print(f"📡 Requesting provisioning from Company Explorer...") ce_url = f"{settings.COMPANY_EXPLORER_URL}/api/provision/superoffice-contact" ce_req = { "so_contact_id": contact_id, "so_person_id": person_id, "crm_name": "RoboPlanet GmbH", "crm_website": "www.roboplanet.de", "job_title": "Geschäftsführer" # Explicit job title for persona mapping } ce_auth = (os.getenv("API_USER", "admin"), os.getenv("API_PASSWORD", "gemini")) try: resp = requests.post(ce_url, json=ce_req, auth=ce_auth) resp.raise_for_status() provisioning_data = resp.json() except Exception as e: print(f"❌ CE API failed: {e}") return print(f"✅ Received Data: {json.dumps(provisioning_data, indent=2)}") if provisioning_data.get("status") == "processing": print("⏳ CE is still processing. Please wait 1-2 minutes and try again.") return texts = provisioning_data.get("texts", {}) if not texts.get("subject"): print("⚠️ No marketing texts found for this combination (Vertical x Persona).") return # 3. Write Texts to SuperOffice UDFs print("✍️ Writing marketing texts to SuperOffice UDFs...") udf_payload = { settings.UDF_SUBJECT: texts["subject"], settings.UDF_INTRO: texts["intro"], settings.UDF_SOCIAL_PROOF: texts["social_proof"] } success = so_client.update_entity_udfs(person_id, "Person", udf_payload) if success: print("✅ UDFs updated successfully.") else: print("❌ Failed to update UDFs.") return # 4. Create Appointment (The "Sendout Proof") print("📅 Creating Appointment as sendout proof...") app_subject = f"[SIMULATION] Mail Sent: {texts['subject']}" app_desc = f"Content Simulation:\n\n{texts['intro']}\n\n{texts['social_proof']}" appointment = so_client.create_appointment( subject=app_subject, description=app_desc, contact_id=contact_id, person_id=person_id ) if appointment: print(f"✅ Simulation Complete! Appointment ID: {appointment.get('AppointmentId')}") print(f"🔗 Check SuperOffice for Contact {contact_id} and look at the activities.") else: print("❌ Failed to create appointment.") if __name__ == "__main__": # Using the IDs we know exist from previous tests/status TEST_CONTACT_ID = 2 TEST_PERSON_ID = 2 # Usually same or linked simulate_sendout(TEST_CONTACT_ID, TEST_PERSON_ID)