feat: Enhance Advoware API integration with backward compatibility for data payloads and improve logging for sync events
This commit is contained in:
@@ -130,6 +130,9 @@ class AdvowareAPI:
|
||||
effective_headers = headers.copy() if headers else {}
|
||||
effective_headers['Authorization'] = f'Bearer {token}'
|
||||
effective_headers.setdefault('Content-Type', 'application/json')
|
||||
|
||||
# Prefer 'data' parameter over 'json_data' if provided (for backward compatibility)
|
||||
json_payload = data if data is not None else json_data
|
||||
|
||||
async with aiohttp.ClientSession(timeout=effective_timeout) as session:
|
||||
try:
|
||||
@@ -137,13 +140,13 @@ class AdvowareAPI:
|
||||
self.context.logger.debug(f"Making API call: {method} {url}")
|
||||
else:
|
||||
logger.debug(f"Making API call: {method} {url}")
|
||||
async with session.request(method, url, headers=effective_headers, params=params, json=json_data) as response:
|
||||
async with session.request(method, url, headers=effective_headers, params=params, json=json_payload) as response:
|
||||
response.raise_for_status()
|
||||
if response.status == 401:
|
||||
self._log("401 Unauthorized, refreshing token")
|
||||
token = self.get_access_token(force_refresh=True)
|
||||
effective_headers['Authorization'] = f'Bearer {token}'
|
||||
async with session.request(method, url, headers=effective_headers, params=params, json=json_data) as response:
|
||||
async with session.request(method, url, headers=effective_headers, params=params, json=json_payload) as response:
|
||||
response.raise_for_status()
|
||||
return await response.json() if response.content_type == 'application/json' else None
|
||||
response.raise_for_status()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user