feat: Improve logging and rowId handling in sync process for Advoware and EspoCRM

This commit is contained in:
2026-02-07 21:52:58 +00:00
parent 99fb2e22c7
commit bed3c09bb1
2 changed files with 53 additions and 23 deletions

View File

@@ -77,7 +77,7 @@ class BeteiligteMapper:
# Advoware ignoriert diese Felder im PUT (trotz Swagger Schema) # Advoware ignoriert diese Felder im PUT (trotz Swagger Schema)
# Siehe: docs/ADVOWARE_BETEILIGTE_FIELDS.md # Siehe: docs/ADVOWARE_BETEILIGTE_FIELDS.md
logger.debug(f"Mapped to Advoware STAMMDATEN: name={advo_data.get('name')}, vorname={advo_data.get('vorname')}, rechtsform={rechtsform}") logger.debug(f"Mapped to Advoware STAMMDATEN: name={advo_data.get('name')}, vorname={advo_data.get('vorname')}, rechtsform={advo_data.get('rechtsform')}")
return advo_data return advo_data

View File

@@ -129,23 +129,38 @@ async def handle_create(entity_id, espo_entity, espocrm, advoware, sync_utils, m
data=advo_data data=advo_data
) )
# Extrahiere betNr aus Response # Extrahiere betNr aus Response (case-insensitive: betNr oder betnr)
new_betnr = result.get('betNr') if isinstance(result, dict) else None new_betnr = None
if isinstance(result, dict):
new_betnr = result.get('betNr') or result.get('betnr')
if not new_betnr: if not new_betnr:
raise Exception(f"Keine betNr in Advoware Response: {result}") raise Exception(f"Keine betNr/betnr in Advoware Response: {result}")
context.logger.info(f"✅ In Advoware erstellt: betNr={new_betnr}") context.logger.info(f"✅ In Advoware erstellt: betNr={new_betnr}")
# OPTIMIERT: Kombiniere release_lock + betnr update in 1 API call # Lade Entity nach POST um rowId zu bekommen (WICHTIG für Change Detection!)
created_entity = await advoware.api_call(
f'api/v1/advonet/Beteiligte/{new_betnr}',
method='GET'
)
new_rowid = created_entity.get('rowId') if isinstance(created_entity, dict) else created_entity[0].get('rowId')
if not new_rowid:
context.logger.warn(f"⚠️ Keine rowId nach CREATE - Change Detection nicht möglich!")
# OPTIMIERT: Kombiniere release_lock + betnr + rowId update in 1 API call
await sync_utils.release_sync_lock( await sync_utils.release_sync_lock(
entity_id, entity_id,
'clean', 'clean',
error_message=None, error_message=None,
extra_fields={'betnr': new_betnr} extra_fields={
'betnr': new_betnr,
'advowareRowId': new_rowid # WICHTIG für Change Detection!
}
) )
context.logger.info(f"✅ CREATE erfolgreich: {entity_id} → betNr {new_betnr}") context.logger.info(f"✅ CREATE erfolgreich: {entity_id} → betNr {new_betnr}, rowId {new_rowid[:20] if new_rowid else 'N/A'}...")
except Exception as e: except Exception as e:
context.logger.error(f"❌ CREATE fehlgeschlagen: {e}") context.logger.error(f"❌ CREATE fehlgeschlagen: {e}")
@@ -196,19 +211,26 @@ async def handle_update(entity_id, betnr, espo_entity, espocrm, advoware, sync_u
# OPTIMIERT: Use merge utility (reduces code duplication) # OPTIMIERT: Use merge utility (reduces code duplication)
merged_data = sync_utils.merge_for_advoware_put(advo_entity, espo_entity, mapper) merged_data = sync_utils.merge_for_advoware_put(advo_entity, espo_entity, mapper)
await advoware.api_call( put_result = await advoware.api_call(
f'api/v1/advonet/Beteiligte/{betnr}', f'api/v1/advonet/Beteiligte/{betnr}',
method='PUT', method='PUT',
data=merged_data data=merged_data
) )
# Speichere rowId für zukünftige Vergleiche # Extrahiere neue rowId aus PUT Response (spart extra GET!)
new_rowid = None
if isinstance(put_result, list) and len(put_result) > 0:
new_rowid = put_result[0].get('rowId')
elif isinstance(put_result, dict):
new_rowid = put_result.get('rowId')
# Speichere neue rowId für zukünftige Vergleiche
await sync_utils.release_sync_lock( await sync_utils.release_sync_lock(
entity_id, entity_id,
'clean', 'clean',
extra_fields={'advowareRowId': advo_entity.get('rowId')} extra_fields={'advowareRowId': new_rowid}
) )
context.logger.info(f"✅ Advoware aktualisiert (initial sync)") context.logger.info(f"✅ Advoware aktualisiert (initial sync), neue rowId: {new_rowid[:20] if new_rowid else 'N/A'}...")
return return
# KEIN SYNC NÖTIG # KEIN SYNC NÖTIG
@@ -224,23 +246,25 @@ async def handle_update(entity_id, betnr, espo_entity, espocrm, advoware, sync_u
# OPTIMIERT: Use merge utility # OPTIMIERT: Use merge utility
merged_data = sync_utils.merge_for_advoware_put(advo_entity, espo_entity, mapper) merged_data = sync_utils.merge_for_advoware_put(advo_entity, espo_entity, mapper)
await advoware.api_call( put_result = await advoware.api_call(
f'api/v1/advonet/Beteiligte/{betnr}', f'api/v1/advonet/Beteiligte/{betnr}',
method='PUT', method='PUT',
data=merged_data data=merged_data
) )
# Hole aktualisierte Entity um neue rowId zu bekommen # Extrahiere neue rowId aus PUT Response (spart extra GET!)
updated_advo = await advoware.api_call(f'api/v1/advonet/Beteiligte/{betnr}', method='GET') new_rowid = None
if isinstance(updated_advo, list): if isinstance(put_result, list) and len(put_result) > 0:
updated_advo = updated_advo[0] new_rowid = put_result[0].get('rowId')
elif isinstance(put_result, dict):
new_rowid = put_result.get('rowId')
await sync_utils.release_sync_lock( await sync_utils.release_sync_lock(
entity_id, entity_id,
'clean', 'clean',
extra_fields={'advowareRowId': updated_advo.get('rowId')} extra_fields={'advowareRowId': new_rowid}
) )
context.logger.info(f"✅ Advoware aktualisiert") context.logger.info(f"✅ Advoware aktualisiert, neue rowId: {new_rowid[:20] if new_rowid else 'N/A'}...")
# ADVOWARE NEUER → Update EspoCRM # ADVOWARE NEUER → Update EspoCRM
elif comparison == 'advoware_newer': elif comparison == 'advoware_newer':
@@ -263,16 +287,18 @@ async def handle_update(entity_id, betnr, espo_entity, espocrm, advoware, sync_u
# OPTIMIERT: Use merge utility # OPTIMIERT: Use merge utility
merged_data = sync_utils.merge_for_advoware_put(advo_entity, espo_entity, mapper) merged_data = sync_utils.merge_for_advoware_put(advo_entity, espo_entity, mapper)
await advoware.api_call( put_result = await advoware.api_call(
f'api/v1/advonet/Beteiligte/{betnr}', f'api/v1/advonet/Beteiligte/{betnr}',
method='PUT', method='PUT',
data=merged_data data=merged_data
) )
# Hole aktualisierte Entity um neue rowId zu bekommen # Extrahiere neue rowId aus PUT Response (spart extra GET!)
updated_advo = await advoware.api_call(f'api/v1/advonet/Beteiligte/{betnr}', method='GET') new_rowid = None
if isinstance(updated_advo, list): if isinstance(put_result, list) and len(put_result) > 0:
updated_advo = updated_advo[0] new_rowid = put_result[0].get('rowId')
elif isinstance(put_result, dict):
new_rowid = put_result.get('rowId')
conflict_msg = ( conflict_msg = (
f"EspoCRM: {espo_entity.get('modifiedAt')}, " f"EspoCRM: {espo_entity.get('modifiedAt')}, "
@@ -284,6 +310,10 @@ async def handle_update(entity_id, betnr, espo_entity, espocrm, advoware, sync_u
entity_id, entity_id,
espo_entity, espo_entity,
advo_entity, advo_entity,
conflict_msg,
extra_fields={'advowareRowId': new_rowid}
)
context.logger.info(f"✅ Konflikt gelöst (EspoCRM won), neue rowId: {new_rowid[:20] if new_rowid else 'N/A'}...")
conflict_msg, conflict_msg,
extra_fields={'advowareRowId': updated_advo.get('rowId')} extra_fields={'advowareRowId': updated_advo.get('rowId')}
) )