feat: Enhance Advoware API integration with backward compatibility for data payloads and improve logging for sync events

This commit is contained in:
2026-02-07 15:44:56 +00:00
parent b5abe6cf00
commit 8550107b89
4 changed files with 447 additions and 94 deletions

View File

@@ -17,21 +17,24 @@ class BeteiligteMapper:
@staticmethod
def map_cbeteiligte_to_advoware(espo_entity: Dict[str, Any]) -> Dict[str, Any]:
"""
Transformiert EspoCRM CBeteiligte → Advoware Beteiligte Format
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 für Advoware API (POST/PUT /api/v1/advonet/Beteiligte)
Dict mit Stammdaten für Advoware API (POST/PUT /api/v1/advonet/Beteiligte)
"""
logger.debug(f"Mapping EspoCRM → Advoware: {espo_entity.get('id')}")
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
# Basis-Struktur (nur Stammdaten, keine Kontaktdaten!)
advo_data = {
'rechtsform': rechtsform,
}
@@ -56,43 +59,15 @@ class BeteiligteMapper:
if date_of_birth:
advo_data['geburtsdatum'] = date_of_birth
# KONTAKTDATEN
# E-Mail (emailAddressData ist Array, wir nehmen Primary)
email_data = espo_entity.get('emailAddressData')
if email_data and isinstance(email_data, list):
primary_email = next((e for e in email_data if e.get('primary')), None)
if primary_email:
advo_data['emailGesch'] = primary_email.get('emailAddress')
elif espo_entity.get('emailAddress'):
advo_data['emailGesch'] = espo_entity.get('emailAddress')
# Telefon (phoneNumberData ist Array, wir nehmen Primary)
phone_data = espo_entity.get('phoneNumberData')
if phone_data and isinstance(phone_data, list):
primary_phone = next((p for p in phone_data if p.get('primary')), None)
if primary_phone:
phone_num = primary_phone.get('phoneNumber')
phone_type = primary_phone.get('type', '').lower()
if 'mobile' in phone_type or 'mobil' in phone_type:
advo_data['mobil'] = phone_num
else:
advo_data['telGesch'] = phone_num
elif espo_entity.get('phoneNumber'):
advo_data['telGesch'] = espo_entity.get('phoneNumber')
# HANDELSREGISTER (nur für Firmen)
if is_firma:
hr_nummer = espo_entity.get('handelsregisterNummer')
if hr_nummer:
advo_data['handelsRegisterNummer'] = hr_nummer
# DISGTYP (EspoCRM spezifisch - falls vorhanden)
disgtyp = espo_entity.get('disgTyp')
if disgtyp:
advo_data['disgTyp'] = disgtyp
# TODO: Weitere Stammdaten-Felder hier ergänzen (Steuernummer, etc.)
logger.debug(f"Mapped to Advoware: name={advo_data.get('name')}, vorname={advo_data.get('vorname')}")
logger.debug(f"Mapped to Advoware STAMMDATEN: name={advo_data.get('name')}, vorname={advo_data.get('vorname')}, rechtsform={rechtsform}")
return advo_data
@@ -143,63 +118,16 @@ class BeteiligteMapper:
if geburtsdatum:
espo_data['dateOfBirth'] = geburtsdatum
# KONTAKTDATEN
# E-Mail (emailGesch ist primary)
email_gesch = advo_entity.get('emailGesch')
email = advo_entity.get('email')
primary_email = email_gesch or email
if primary_email:
espo_data['emailAddress'] = primary_email
espo_data['emailAddressData'] = [
{
'emailAddress': primary_email,
'primary': True,
'optOut': False,
'invalid': False
}
]
# Telefon (telGesch ist primary, mobil als secondary)
tel_gesch = advo_entity.get('telGesch')
tel_privat = advo_entity.get('telPrivat')
mobil = advo_entity.get('mobil')
phone_data = []
# Primary: telGesch oder telPrivat
primary_tel = tel_gesch or tel_privat
if primary_tel:
espo_data['phoneNumber'] = primary_tel
phone_data.append({
'phoneNumber': primary_tel,
'primary': True,
'type': 'Office' if tel_gesch else 'Home'
})
# Secondary: mobil
if mobil and mobil != primary_tel:
phone_data.append({
'phoneNumber': mobil,
'primary': False,
'type': 'Mobile'
})
if phone_data:
espo_data['phoneNumberData'] = phone_data
# HANDELSREGISTER (nur für Firmen)
if not is_person:
hr_nummer = advo_entity.get('handelsRegisterNummer')
if hr_nummer:
espo_data['handelsregisterNummer'] = hr_nummer
# DISGTYP
disgtyp = advo_entity.get('disgTyp')
if disgtyp:
espo_data['disgTyp'] = disgtyp
# TODO: Weitere Stammdaten-Felder hier ergänzen
# HINWEIS: Kontaktdaten (Telefon, Email, Fax) werden über separate Endpoints gesynct
logger.debug(f"Mapped to EspoCRM: name={espo_data.get('name')}")
logger.debug(f"Mapped to EspoCRM STAMMDATEN: name={espo_data.get('name')}")
return espo_data