""" EspoCRM ↔ Advoware Entity Mapper Transformiert Beteiligte zwischen den beiden Systemen basierend auf ENTITY_MAPPING_CBeteiligte_Advoware.md """ from typing import Dict, Any, Optional, List from datetime import datetime import logging logger = logging.getLogger(__name__) class BeteiligteMapper: """Mapper für CBeteiligte (EspoCRM) ↔ Beteiligte (Advoware)""" @staticmethod def map_cbeteiligte_to_advoware(espo_entity: Dict[str, Any]) -> Dict[str, Any]: """ Transformiert EspoCRM CBeteiligte → Advoware Beteiligte Format (STAMMDATEN) WICHTIG: Kontaktdaten (Telefon, Email, Fax, Bankverbindungen) werden über separate Advoware-Endpoints gesynct und sind NICHT Teil dieser Mapping-Funktion. Args: espo_entity: CBeteiligte Entity von EspoCRM Returns: Dict mit Stammdaten für Advoware API (POST/PUT /api/v1/advonet/Beteiligte) """ logger.debug(f"Mapping EspoCRM → Advoware STAMMDATEN: {espo_entity.get('id')}") # Bestimme ob Person oder Firma is_firma = bool(espo_entity.get('firmenname')) rechtsform = espo_entity.get('rechtsform', '') # Basis-Struktur (nur Stammdaten, keine Kontaktdaten!) advo_data = { 'rechtsform': rechtsform, } # NAME: Person vs. Firma if is_firma: # Firma: name = firmenname advo_data['name'] = espo_entity.get('firmenname', '') advo_data['vorname'] = None else: # Person: name = lastName, vorname = firstName advo_data['name'] = espo_entity.get('lastName', '') advo_data['vorname'] = espo_entity.get('firstName', '') # ANREDE salutation = espo_entity.get('salutationName', '') if salutation: advo_data['anrede'] = salutation # GEBURTSDATUM date_of_birth = espo_entity.get('dateOfBirth') if date_of_birth: advo_data['geburtsdatum'] = date_of_birth # HANDELSREGISTER (nur für Firmen) if is_firma: hr_nummer = espo_entity.get('handelsregisterNummer') if hr_nummer: advo_data['handelsRegisterNummer'] = hr_nummer # Registergericht registergericht = espo_entity.get('registergericht') if registergericht: advo_data['registergericht'] = registergericht # TODO: Weitere Stammdaten-Felder hier ergänzen (Steuernummer, etc.) logger.debug(f"Mapped to Advoware STAMMDATEN: name={advo_data.get('name')}, vorname={advo_data.get('vorname')}, rechtsform={rechtsform}") return advo_data @staticmethod def map_advoware_to_cbeteiligte(advo_entity: Dict[str, Any]) -> Dict[str, Any]: """ Transformiert Advoware Beteiligte → EspoCRM CBeteiligte Format Args: advo_entity: Beteiligter von Advoware API Returns: Dict für EspoCRM API (POST/PUT /api/v1/CBeteiligte) """ logger.debug(f"Mapping Advoware → EspoCRM: betNr={advo_entity.get('betNr')}") # Bestimme ob Person oder Firma vorname = advo_entity.get('vorname') is_person = bool(vorname) # Basis-Struktur espo_data = { 'rechtsform': advo_entity.get('rechtsform', ''), 'betnr': advo_entity.get('betNr'), # Link zu Advoware 'advowareRowId': advo_entity.get('rowId'), # Änderungserkennung } # NAME: Person vs. Firma if is_person: # Person espo_data['firstName'] = vorname espo_data['lastName'] = advo_entity.get('name', '') espo_data['name'] = f"{vorname} {advo_entity.get('name', '')}".strip() espo_data['firmenname'] = None else: # Firma espo_data['firmenname'] = advo_entity.get('name', '') espo_data['name'] = advo_entity.get('name', '') espo_data['firstName'] = None espo_data['lastName'] = None # ANREDE anrede = advo_entity.get('anrede') if anrede: espo_data['salutationName'] = anrede # GEBURTSDATUM geburtsdatum = advo_entity.get('geburtsdatum') if geburtsdatum: espo_data['dateOfBirth'] = geburtsdatum # HANDELSREGISTER (nur für Firmen) if not is_person: hr_nummer = advo_entity.get('handelsRegisterNummer') if hr_nummer: espo_data['handelsregisterNummer'] = hr_nummer # Registergericht registergericht = advo_entity.get('registergericht') if registergericht: espo_data['registergericht'] = registergericht # TODO: Weitere Stammdaten-Felder hier ergänzen # HINWEIS: Kontaktdaten (Telefon, Email, Fax) werden über separate Endpoints gesynct logger.debug(f"Mapped to EspoCRM STAMMDATEN: name={espo_data.get('name')}") return espo_data @staticmethod def get_changed_fields(espo_entity: Dict[str, Any], advo_entity: Dict[str, Any]) -> List[str]: """ Vergleicht zwei Entities und gibt Liste der geänderten Felder zurück Args: espo_entity: EspoCRM CBeteiligte advo_entity: Advoware Beteiligte Returns: Liste von Feldnamen die unterschiedlich sind """ # Mappe Advoware zu EspoCRM Format für Vergleich mapped_advo = BeteiligteMapper.map_advoware_to_cbeteiligte(advo_entity) changed = [] # Vergleiche wichtige Felder compare_fields = [ 'name', 'firstName', 'lastName', 'firmenname', 'emailAddress', 'phoneNumber', 'dateOfBirth', 'rechtsform', 'handelsregisterNummer', 'handelsregisterArt', 'registergericht', 'betnr', 'advowareRowId' ] for field in compare_fields: espo_val = espo_entity.get(field) advo_val = mapped_advo.get(field) # Normalisiere None und leere Strings espo_val = espo_val if espo_val else None advo_val = advo_val if advo_val else None if espo_val != advo_val: changed.append(field) logger.debug(f"Field '{field}' changed: EspoCRM='{espo_val}' vs Advoware='{advo_val}'") return changed