from abc import ABC, abstractmethod from typing import List, Optional, Dict, Any from pydantic import BaseModel # --- Generisches Datenmodell --- # Damit ist unsere App unabhängig davon, wie SuperOffice Felder benennt. class LeadData(BaseModel): name: str website: Optional[str] = None city: Optional[str] = None country: str = "DE" industry: Optional[str] = None # Enrichment Data robotics_potential_score: int = 0 robotics_potential_reason: Optional[str] = None # Meta source_id: Optional[str] = None # ID im Quellsystem (z.B. SuperOffice ID) class TaskData(BaseModel): subject: str description: str deadline: Optional[str] = None # --- Der Vertrag (Repository Interface) --- class CRMRepository(ABC): """ Abstrakte Basisklasse für alle CRM-Integrationen. Egal ob Notion, SuperOffice oder Odoo - alle müssen diese Methoden haben. """ @abstractmethod def get_name(self) -> str: """Gibt den Namen des Systems zurück (z.B. 'SuperOffice')""" pass @abstractmethod def find_company(self, name: str, email: str = None) -> Optional[str]: """Sucht eine Firma und gibt die externe ID zurück, falls gefunden.""" pass @abstractmethod def create_lead(self, lead: LeadData) -> str: """Erstellt einen neuen Lead und gibt die externe ID zurück.""" pass @abstractmethod def update_lead(self, external_id: str, lead: LeadData) -> bool: """Aktualisiert einen bestehenden Lead mit neuen Enrichment-Daten.""" pass @abstractmethod def create_task(self, external_id: str, task: TaskData) -> bool: """Erstellt eine Aufgabe/Wiedervorlage für den Vertriebler beim Lead.""" pass