- Integrated centralized logging system in all modules. - Extracted all IDs and ProgIds into a separate . - Refactored and for cleaner dependency management. - Included updated discovery and inspection utilities. - Verified end-to-end workflow stability.
168 lines
7.6 KiB
Python
168 lines
7.6 KiB
Python
import os
|
|
import logging
|
|
from auth_handler import AuthHandler
|
|
from superoffice_client import SuperOfficeClient
|
|
from explorer_client import CompanyExplorerClient
|
|
from logging_config import setup_logging
|
|
|
|
# Use the centralized logging configuration
|
|
logger = setup_logging(__name__)
|
|
|
|
def main():
|
|
# Note: Environment loading is now handled by config.py/helpers implicitly when clients are initialized
|
|
|
|
logger.info("Starting SuperOffice Connector S2S POC...")
|
|
|
|
try:
|
|
# Initialize Auth
|
|
auth = AuthHandler()
|
|
|
|
# Initialize Client
|
|
client = SuperOfficeClient(auth)
|
|
|
|
# Initialize Explorer Client
|
|
ce_client = CompanyExplorerClient()
|
|
|
|
# 1. Test Connection
|
|
logger.info("Step 1: Testing connection...")
|
|
user_info = client.test_connection()
|
|
if user_info:
|
|
logger.info(f"Connected successfully as: {user_info.get('FullName')}")
|
|
else:
|
|
logger.error("Connection test failed.")
|
|
return
|
|
|
|
# 1b. Test Company Explorer Connection
|
|
logger.info("Step 1b: Testing Company Explorer connection...")
|
|
if ce_client.check_health():
|
|
logger.info("Company Explorer is reachable.")
|
|
else:
|
|
logger.warning("Company Explorer is NOT reachable. Sync might fail.")
|
|
|
|
# 2. Search for our demo company
|
|
demo_company_name = "Gemini Test Company [2ff88f42]"
|
|
logger.info(f"Step 2: Searching for company '{demo_company_name}'...")
|
|
contact = client.find_contact_by_criteria(name=demo_company_name)
|
|
|
|
target_contact_id = None
|
|
|
|
if contact:
|
|
target_contact_id = contact.get('ContactId')
|
|
logger.info(f"Found existing demo company: {contact.get('Name')} (ID: {target_contact_id})")
|
|
else:
|
|
logger.info(f"Demo company not found. Creating new one...")
|
|
demo_company_url = "https://www.gemini-test-company.com"
|
|
demo_company_orgnr = "DE123456789"
|
|
|
|
new_contact = client.create_contact(
|
|
name=demo_company_name,
|
|
url=demo_company_url,
|
|
org_nr=demo_company_orgnr
|
|
)
|
|
if new_contact:
|
|
target_contact_id = new_contact.get('ContactId')
|
|
logger.info(f"Created new demo company with ID: {target_contact_id}")
|
|
|
|
# 3. Create a Person linked to this company
|
|
if target_contact_id:
|
|
logger.info(f"Step 3: Creating Person for Contact ID {target_contact_id}...")
|
|
|
|
# Create Max Mustermann
|
|
person = client.create_person(
|
|
first_name="Max",
|
|
last_name="Mustermann",
|
|
contact_id=target_contact_id,
|
|
email="max.mustermann@gemini-test.com"
|
|
)
|
|
|
|
if person:
|
|
logger.info("SUCCESS: Person created!")
|
|
person_id = person.get('PersonId')
|
|
logger.info(f"Name: {person.get('Firstname')} {person.get('Lastname')}")
|
|
logger.info(f"Person ID: {person_id}")
|
|
logger.info(f"Linked to Contact ID: {person.get('Contact').get('ContactId')}")
|
|
|
|
# 4. Create a Sale for this company
|
|
logger.info(f"Step 4: Creating Sale for Contact ID {target_contact_id}...")
|
|
sale = client.create_sale(
|
|
title=f"Robotics Automation Opportunity - {demo_company_name}",
|
|
contact_id=target_contact_id,
|
|
person_id=person_id,
|
|
amount=50000.0
|
|
)
|
|
if sale:
|
|
logger.info("SUCCESS: Sale created!")
|
|
logger.info(f"Sale Title: {sale.get('Heading')}")
|
|
logger.info(f"Sale ID: {sale.get('SaleId')}")
|
|
else:
|
|
logger.error("Failed to create sale.")
|
|
|
|
# 5. Create a Project for this company and add the person to it
|
|
logger.info(f"Step 5: Creating Project for Contact ID {target_contact_id} and adding Person ID {person_id}...")
|
|
project = client.create_project(
|
|
name=f"Marketing Campaign Q1 [2ff88f42]",
|
|
contact_id=target_contact_id,
|
|
person_id=person_id
|
|
)
|
|
if project:
|
|
logger.info("SUCCESS: Project created and person added!")
|
|
logger.info(f"Project Name: {project.get('Name')}")
|
|
logger.info(f"Project ID: {project.get('ProjectId')}")
|
|
|
|
# 6. Update Contact UDFs
|
|
logger.info(f"Step 6: Updating Contact UDFs for Contact ID {target_contact_id}...")
|
|
contact_udf_data = {
|
|
"ai_challenge_sentence": "The company faces challenges in automating its logistics processes due to complex infrastructure.",
|
|
"ai_sentence_timestamp": "2026-02-10T12:00:00Z", # Using a fixed timestamp for demo
|
|
"ai_sentence_source_hash": "website_v1_hash_abc",
|
|
"ai_last_outreach_date": "2026-02-10T12:00:00Z" # Using a fixed timestamp for demo
|
|
}
|
|
updated_contact = client.update_entity_udfs(target_contact_id, "Contact", contact_udf_data)
|
|
if updated_contact:
|
|
logger.info("SUCCESS: Contact UDFs updated!")
|
|
else:
|
|
logger.error("Failed to update Contact UDFs.")
|
|
|
|
# 7. Update Person UDFs
|
|
logger.info(f"Step 7: Updating Person UDFs for Person ID {person_id}...")
|
|
person_udf_data = {
|
|
"ai_email_draft": "This is a short draft for the personalized email.", # Placeholder, as it's currently a short text field
|
|
"ma_status": "Ready_to_Send"
|
|
}
|
|
updated_person = client.update_entity_udfs(person_id, "Person", person_udf_data)
|
|
if updated_person:
|
|
logger.info("SUCCESS: Person UDFs updated!")
|
|
else:
|
|
logger.error("Failed to update Person UDFs.")
|
|
|
|
# 9. Sync to Company Explorer
|
|
if updated_contact:
|
|
logger.info(f"Step 9: Syncing Company to Company Explorer...")
|
|
ce_payload = {
|
|
"name": updated_contact.get("Name"),
|
|
"website": updated_contact.get("UrlAddress"),
|
|
"city": updated_contact.get("City"),
|
|
"country": "DE" # Defaulting to DE for now
|
|
}
|
|
|
|
ce_result = ce_client.import_company(ce_payload)
|
|
if ce_result:
|
|
logger.info(f"SUCCESS: Company synced to Explorer! ID: {ce_result.get('id')}")
|
|
else:
|
|
logger.error("Failed to sync company to Explorer.")
|
|
else:
|
|
logger.warning("Skipping CE sync because contact update failed or contact object is missing.")
|
|
|
|
else:
|
|
logger.error("Failed to create project.")
|
|
|
|
else:
|
|
logger.error("Failed to create person.")
|
|
else:
|
|
logger.error("Skipping person creation because company could not be found or created.")
|
|
|
|
except Exception as e:
|
|
logger.error(f"An error occurred: {e}", exc_info=True)
|
|
|
|
if __name__ == "__main__":
|
|
main() |