From 141eabae6de9efb33858401172cc6c08aa53abc0 Mon Sep 17 00:00:00 2001 From: bsiggel Date: Tue, 31 Mar 2026 06:26:33 +0000 Subject: [PATCH] feat(sync): Enhance metadata synchronization for unchanged files in Advoware sync process --- services/advoware_document_sync_utils.py | 22 ++++++++++++---------- src/steps/akte/akte_sync_event_step.py | 16 +++++++++++++++- src/steps/crm/akte/akte_sync_event_step.py | 16 +++++++++++++++- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/services/advoware_document_sync_utils.py b/services/advoware_document_sync_utils.py index ff21fd2..00c75f1 100644 --- a/services/advoware_document_sync_utils.py +++ b/services/advoware_document_sync_utils.py @@ -312,25 +312,27 @@ class AdvowareDocumentSyncUtils: """ updates = {} - # Map History fields to correct EspoCRM field names + # Map History metadata fields to EspoCRM field names history_text = advo_history.get('text', '') history_art = advo_history.get('art', '') - history_hnr = advo_history.get('hNr') - + espo_bemerkung = espo_doc.get('advowareBemerkung', '') espo_art = espo_doc.get('advowareArt', '') - espo_hnr = espo_doc.get('hnr') - + # Check if different - sync metadata independently of file changes if history_text != espo_bemerkung: updates['advowareBemerkung'] = history_text - + if history_art != espo_art: updates['advowareArt'] = history_art - - if history_hnr is not None and history_hnr != espo_hnr: - updates['hnr'] = history_hnr - + + # Sync dat (creation date from Advoware History) → advowareErstellungTimestamp + history_dat_raw = advo_history.get('dat') or '' + history_erstellung = history_dat_raw.replace('T', ' ')[:19] if history_dat_raw else '' + espo_erstellung = espo_doc.get('advowareErstellungTimestamp') or '' + if history_erstellung and history_erstellung != espo_erstellung: + updates['advowareErstellungTimestamp'] = history_erstellung + # Always update lastSyncTimestamp when metadata changes (EspoCRM format) if len(updates) > 0: updates['lastSyncTimestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') diff --git a/src/steps/akte/akte_sync_event_step.py b/src/steps/akte/akte_sync_event_step.py index 820a71d..63443b0 100644 --- a/src/steps/akte/akte_sync_event_step.py +++ b/src/steps/akte/akte_sync_event_step.py @@ -247,7 +247,17 @@ async def _run_advoware_sync( ctx.logger.info(f" [{action.action:12s}] {filename} (hnr={hnr}) – {action.reason}") if action.action == 'SKIP': - results['skipped'] += 1 + # Even for unchanged files: sync metadata from History (art, text, hnr, dat) + if espo_doc and history_entry: + needs_meta_update, meta_updates = sync_utils.should_sync_metadata(espo_doc, history_entry) + if needs_meta_update: + await espocrm.update_entity('CDokumente', espo_doc['id'], meta_updates) + ctx.logger.info(f" [META UPDATE ] {filename} (hnr={hnr}) – {list(meta_updates.keys())}") + results['updated'] += 1 + else: + results['skipped'] += 1 + else: + results['skipped'] += 1 elif action.action == 'CREATE': if not windows_file: @@ -274,6 +284,7 @@ async def _run_advoware_sync( 'hnr': history_entry.get('hNr') if history_entry else None, 'advowareArt': (history_entry.get('art', 'Schreiben') or 'Schreiben')[:100] if history_entry else 'Schreiben', 'advowareBemerkung': (history_entry.get('text', '') or '')[:255] if history_entry else '', + 'advowareErstellungTimestamp': ((history_entry.get('dat') or '').replace('T', ' ')[:19] or None) if history_entry else None, 'dateipfad': windows_file.get('path', ''), 'blake3hash': blake3_hash, 'syncedHash': blake3_hash, @@ -322,6 +333,9 @@ async def _run_advoware_sync( update_data['hnr'] = history_entry.get('hNr') update_data['advowareArt'] = (history_entry.get('art', 'Schreiben') or 'Schreiben')[:100] update_data['advowareBemerkung'] = (history_entry.get('text', '') or '')[:255] + erstellung_dat = (history_entry.get('dat') or '').replace('T', ' ')[:19] + if erstellung_dat: + update_data['advowareErstellungTimestamp'] = erstellung_dat await espocrm.update_entity('CDokumente', espo_doc['id'], update_data) results['updated'] += 1 diff --git a/src/steps/crm/akte/akte_sync_event_step.py b/src/steps/crm/akte/akte_sync_event_step.py index 9ae0dc8..e96973c 100644 --- a/src/steps/crm/akte/akte_sync_event_step.py +++ b/src/steps/crm/akte/akte_sync_event_step.py @@ -264,7 +264,17 @@ async def _run_advoware_sync( ctx.logger.info(f" [{action.action:12s}] {filename} (hnr={hnr}) – {action.reason}") if action.action == 'SKIP': - results['skipped'] += 1 + # Even for unchanged files: sync metadata from History (art, text, hnr, dat) + if espo_doc and history_entry: + needs_meta_update, meta_updates = sync_utils.should_sync_metadata(espo_doc, history_entry) + if needs_meta_update: + await espocrm.update_entity('CDokumente', espo_doc['id'], meta_updates) + ctx.logger.info(f" [META UPDATE ] {filename} (hnr={hnr}) – {list(meta_updates.keys())}") + results['updated'] += 1 + else: + results['skipped'] += 1 + else: + results['skipped'] += 1 elif action.action == 'CREATE': if not windows_file: @@ -290,6 +300,7 @@ async def _run_advoware_sync( 'hnr': history_entry.get('hNr') if history_entry else None, 'advowareArt': (history_entry.get('art', 'Schreiben') or 'Schreiben')[:100] if history_entry else 'Schreiben', 'advowareBemerkung': (history_entry.get('text', '') or '')[:255] if history_entry else '', + 'advowareErstellungTimestamp': ((history_entry.get('dat') or '').replace('T', ' ')[:19] or None) if history_entry else None, 'dateipfad': windows_file.get('path', ''), 'blake3hash': blake3_hash, 'syncedHash': blake3_hash, @@ -337,6 +348,9 @@ async def _run_advoware_sync( update_data['hnr'] = history_entry.get('hNr') update_data['advowareArt'] = (history_entry.get('art', 'Schreiben') or 'Schreiben')[:100] update_data['advowareBemerkung'] = (history_entry.get('text', '') or '')[:255] + erstellung_dat = (history_entry.get('dat') or '').replace('T', ' ')[:19] + if erstellung_dat: + update_data['advowareErstellungTimestamp'] = erstellung_dat # Mark for re-sync to xAI only if file content actually changed # (USN can change without content change, e.g. metadata-only updates)