feat: Enhance sync conflict detection and resolution logic in BeteiligteSync class
This commit is contained in:
@@ -241,28 +241,37 @@ class BeteiligteSync:
|
||||
# PRIMÄR: rowId-basierte Änderungserkennung (zuverlässiger!)
|
||||
espo_rowid = espo_entity.get('advowareRowId')
|
||||
advo_rowid = advo_entity.get('rowId')
|
||||
last_sync = espo_entity.get('advowareLastSync')
|
||||
espo_modified = espo_entity.get('modifiedAt')
|
||||
|
||||
if espo_rowid and advo_rowid:
|
||||
if espo_rowid != advo_rowid:
|
||||
# rowId unterschiedlich → Advoware wurde geändert
|
||||
if espo_rowid and advo_rowid and last_sync:
|
||||
# Prüfe ob Advoware geändert wurde (rowId)
|
||||
advo_changed = (espo_rowid != advo_rowid)
|
||||
|
||||
# Prüfe ob EspoCRM auch geändert wurde (seit letztem Sync)
|
||||
espo_changed = False
|
||||
if espo_modified:
|
||||
try:
|
||||
espo_ts = self.parse_timestamp(espo_modified)
|
||||
sync_ts = self.parse_timestamp(last_sync)
|
||||
if espo_ts and sync_ts:
|
||||
espo_changed = (espo_ts > sync_ts)
|
||||
except Exception as e:
|
||||
self._log(f"Timestamp-Parse-Fehler: {e}", level='debug')
|
||||
|
||||
# Konfliktlogik: Beide geändert seit letztem Sync?
|
||||
if advo_changed and espo_changed:
|
||||
self._log(f"🚨 KONFLIKT: Beide Seiten geändert seit letztem Sync")
|
||||
return 'conflict'
|
||||
elif advo_changed:
|
||||
self._log(f"Advoware rowId geändert: {espo_rowid[:20]}... → {advo_rowid[:20]}...")
|
||||
return 'advoware_newer'
|
||||
elif espo_changed:
|
||||
self._log(f"EspoCRM neuer (modifiedAt > lastSync)")
|
||||
return 'espocrm_newer'
|
||||
else:
|
||||
# rowId gleich → keine Änderung in Advoware
|
||||
# Prüfe ob EspoCRM geändert wurde (via modifiedAt)
|
||||
espo_modified = espo_entity.get('modifiedAt')
|
||||
last_sync = espo_entity.get('advowareLastSync')
|
||||
|
||||
if espo_modified and last_sync:
|
||||
try:
|
||||
espo_ts = self.parse_timestamp(espo_modified)
|
||||
sync_ts = self.parse_timestamp(last_sync)
|
||||
|
||||
if espo_ts and sync_ts and espo_ts > sync_ts:
|
||||
self._log(f"EspoCRM neuer (rowId gleich, aber modifiedAt > lastSync)")
|
||||
return 'espocrm_newer'
|
||||
except Exception as e:
|
||||
self._log(f"Timestamp-Parse-Fehler: {e}", level='debug')
|
||||
# Weder Advoware noch EspoCRM geändert
|
||||
return 'no_change'
|
||||
|
||||
# Keine Änderungen
|
||||
self._log("Keine Änderungen (rowId identisch)")
|
||||
@@ -502,10 +511,6 @@ class BeteiligteSync:
|
||||
update_data.update(extra_fields)
|
||||
|
||||
await self.espocrm.update_entity('CBeteiligte', entity_id, update_data)
|
||||
'advowareLastSync': now,
|
||||
'syncErrorMessage': f"Konflikt am {now}: {conflict_details}. EspoCRM hat gewonnen.",
|
||||
'syncRetryCount': 0
|
||||
})
|
||||
|
||||
self._log(f"Konflikt gelöst für {entity_id}: EspoCRM wins")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user