From 0c97d9772614518a01ac6af95bfd592590d4f3f7 Mon Sep 17 00:00:00 2001 From: bsiggel Date: Thu, 26 Mar 2026 10:07:42 +0000 Subject: [PATCH] feat(webhooks): Add webhook handlers for Beteiligte and Document entities - Implemented create, update, and delete webhook handlers for Beteiligte. - Implemented create, update, and delete webhook handlers for Document entities. - Added logging and error handling for each webhook handler. - Created a universal step for generating document previews. - Ensured payload validation and entity ID extraction for batch processing. --- src/steps/akte/__init__.py | 1 - src/steps/akte/webhook/__init__.py | 1 - src/steps/crm/__init__.py | 0 src/steps/crm/akte/__init__.py | 0 .../{ => crm}/akte/akte_sync_cron_step.py | 0 .../{ => crm}/akte/akte_sync_event_step.py | 23 +++++++++++++------ src/steps/crm/akte/webhooks/__init__.py | 0 .../akte/webhooks}/akte_webhook_step.py | 2 +- src/steps/crm/bankverbindungen/__init__.py | 0 .../bankverbindungen_sync_event_step.py | 0 .../crm/bankverbindungen/webhooks/__init__.py | 0 .../bankverbindungen_create_api_step.py | 2 +- .../bankverbindungen_delete_api_step.py | 2 +- .../bankverbindungen_update_api_step.py | 2 +- src/steps/crm/beteiligte/__init__.py | 0 .../beteiligte}/beteiligte_sync_cron_step.py | 0 .../beteiligte}/beteiligte_sync_event_step.py | 0 src/steps/crm/beteiligte/webhooks/__init__.py | 0 .../webhooks}/beteiligte_create_api_step.py | 2 +- .../webhooks}/beteiligte_delete_api_step.py | 2 +- .../webhooks}/beteiligte_update_api_step.py | 2 +- src/steps/crm/document/__init__.py | 0 .../generate_document_preview_step.py | 0 src/steps/crm/document/webhooks/__init__.py | 0 .../webhooks}/aiknowledge_update_api_step.py | 2 +- .../webhooks}/document_create_api_step.py | 2 +- .../webhooks}/document_delete_api_step.py | 2 +- .../webhooks}/document_update_api_step.py | 2 +- src/steps/shared/__init__.py | 1 - src/steps/vmh/__init__.py | 1 - src/steps/vmh/webhook/__init__.py | 1 - 31 files changed, 27 insertions(+), 23 deletions(-) delete mode 100644 src/steps/akte/__init__.py delete mode 100644 src/steps/akte/webhook/__init__.py create mode 100644 src/steps/crm/__init__.py create mode 100644 src/steps/crm/akte/__init__.py rename src/steps/{ => crm}/akte/akte_sync_cron_step.py (100%) rename src/steps/{ => crm}/akte/akte_sync_event_step.py (95%) create mode 100644 src/steps/crm/akte/webhooks/__init__.py rename src/steps/{akte/webhook => crm/akte/webhooks}/akte_webhook_step.py (97%) create mode 100644 src/steps/crm/bankverbindungen/__init__.py rename src/steps/{vmh => crm/bankverbindungen}/bankverbindungen_sync_event_step.py (100%) create mode 100644 src/steps/crm/bankverbindungen/webhooks/__init__.py rename src/steps/{vmh/webhook => crm/bankverbindungen/webhooks}/bankverbindungen_create_api_step.py (97%) rename src/steps/{vmh/webhook => crm/bankverbindungen/webhooks}/bankverbindungen_delete_api_step.py (97%) rename src/steps/{vmh/webhook => crm/bankverbindungen/webhooks}/bankverbindungen_update_api_step.py (97%) create mode 100644 src/steps/crm/beteiligte/__init__.py rename src/steps/{vmh => crm/beteiligte}/beteiligte_sync_cron_step.py (100%) rename src/steps/{vmh => crm/beteiligte}/beteiligte_sync_event_step.py (100%) create mode 100644 src/steps/crm/beteiligte/webhooks/__init__.py rename src/steps/{vmh/webhook => crm/beteiligte/webhooks}/beteiligte_create_api_step.py (98%) rename src/steps/{vmh/webhook => crm/beteiligte/webhooks}/beteiligte_delete_api_step.py (97%) rename src/steps/{vmh/webhook => crm/beteiligte/webhooks}/beteiligte_update_api_step.py (98%) create mode 100644 src/steps/crm/document/__init__.py rename src/steps/{shared => crm/document}/generate_document_preview_step.py (100%) create mode 100644 src/steps/crm/document/webhooks/__init__.py rename src/steps/{vmh/webhook => crm/document/webhooks}/aiknowledge_update_api_step.py (97%) rename src/steps/{vmh/webhook => crm/document/webhooks}/document_create_api_step.py (98%) rename src/steps/{vmh/webhook => crm/document/webhooks}/document_delete_api_step.py (98%) rename src/steps/{vmh/webhook => crm/document/webhooks}/document_update_api_step.py (98%) delete mode 100644 src/steps/shared/__init__.py delete mode 100644 src/steps/vmh/__init__.py delete mode 100644 src/steps/vmh/webhook/__init__.py diff --git a/src/steps/akte/__init__.py b/src/steps/akte/__init__.py deleted file mode 100644 index 9c1db70..0000000 --- a/src/steps/akte/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Akte sync steps – unified sync across Advoware, EspoCRM, and xAI diff --git a/src/steps/akte/webhook/__init__.py b/src/steps/akte/webhook/__init__.py deleted file mode 100644 index d93801b..0000000 --- a/src/steps/akte/webhook/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Akte webhook steps diff --git a/src/steps/crm/__init__.py b/src/steps/crm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/steps/crm/akte/__init__.py b/src/steps/crm/akte/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/steps/akte/akte_sync_cron_step.py b/src/steps/crm/akte/akte_sync_cron_step.py similarity index 100% rename from src/steps/akte/akte_sync_cron_step.py rename to src/steps/crm/akte/akte_sync_cron_step.py diff --git a/src/steps/akte/akte_sync_event_step.py b/src/steps/crm/akte/akte_sync_event_step.py similarity index 95% rename from src/steps/akte/akte_sync_event_step.py rename to src/steps/crm/akte/akte_sync_event_step.py index 20d56a8..27c8ff5 100644 --- a/src/steps/akte/akte_sync_event_step.py +++ b/src/steps/crm/akte/akte_sync_event_step.py @@ -356,16 +356,25 @@ async def _run_advoware_sync( ctx.logger.error(f" ❌ Error for hnr {hnr} ({filename}): {e}") results['errors'] += 1 - # ── Ablage check ─────────────────────────────────────────────────── + # ── Ablage check + Rubrum sync ───────────────────────────────────── try: akte_details = await advoware_service.get_akte(aktennummer) - if akte_details and akte_details.get('ablage') == 1: - ctx.logger.info("📁 Akte marked as ablage → deactivating") - await espocrm.update_entity('CAkten', akte_id, { - 'aktivierungsstatus': 'deaktiviert', - }) + if akte_details: + espo_update: Dict[str, Any] = {} + + if akte_details.get('ablage') == 1: + ctx.logger.info("📁 Akte marked as ablage → deactivating") + espo_update['aktivierungsstatus'] = 'deaktiviert' + + rubrum = akte_details.get('rubrum') + if rubrum and rubrum != akte.get('rubrum'): + espo_update['rubrum'] = rubrum + ctx.logger.info(f"📝 Rubrum synced: {rubrum[:80]}") + + if espo_update: + await espocrm.update_entity('CAkten', akte_id, espo_update) except Exception as e: - ctx.logger.warn(f"⚠️ Ablage check failed: {e}") + ctx.logger.warn(f"⚠️ Ablage/Rubrum check failed: {e}") return results diff --git a/src/steps/crm/akte/webhooks/__init__.py b/src/steps/crm/akte/webhooks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/steps/akte/webhook/akte_webhook_step.py b/src/steps/crm/akte/webhooks/akte_webhook_step.py similarity index 97% rename from src/steps/akte/webhook/akte_webhook_step.py rename to src/steps/crm/akte/webhooks/akte_webhook_step.py index 466a586..cc5982b 100644 --- a/src/steps/akte/webhook/akte_webhook_step.py +++ b/src/steps/crm/akte/webhooks/akte_webhook_step.py @@ -19,7 +19,7 @@ config = { "name": "Akte Webhook - EspoCRM", "description": "Empfängt EspoCRM-Webhooks für CAkten und queued Entity-IDs für den Sync", "flows": ["akte-sync"], - "triggers": [http("POST", "/akte/webhook/update")], + "triggers": [http("POST", "/crm/akte/webhook/update")], "enqueues": [], } diff --git a/src/steps/crm/bankverbindungen/__init__.py b/src/steps/crm/bankverbindungen/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/steps/vmh/bankverbindungen_sync_event_step.py b/src/steps/crm/bankverbindungen/bankverbindungen_sync_event_step.py similarity index 100% rename from src/steps/vmh/bankverbindungen_sync_event_step.py rename to src/steps/crm/bankverbindungen/bankverbindungen_sync_event_step.py diff --git a/src/steps/crm/bankverbindungen/webhooks/__init__.py b/src/steps/crm/bankverbindungen/webhooks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/steps/vmh/webhook/bankverbindungen_create_api_step.py b/src/steps/crm/bankverbindungen/webhooks/bankverbindungen_create_api_step.py similarity index 97% rename from src/steps/vmh/webhook/bankverbindungen_create_api_step.py rename to src/steps/crm/bankverbindungen/webhooks/bankverbindungen_create_api_step.py index 512b281..80656da 100644 --- a/src/steps/vmh/webhook/bankverbindungen_create_api_step.py +++ b/src/steps/crm/bankverbindungen/webhooks/bankverbindungen_create_api_step.py @@ -10,7 +10,7 @@ config = { "description": "Receives create webhooks from EspoCRM for Bankverbindungen", "flows": ["vmh-bankverbindungen"], "triggers": [ - http("POST", "/vmh/webhook/bankverbindungen/create") + http("POST", "/crm/bankverbindungen/webhook/create") ], "enqueues": ["vmh.bankverbindungen.create"], } diff --git a/src/steps/vmh/webhook/bankverbindungen_delete_api_step.py b/src/steps/crm/bankverbindungen/webhooks/bankverbindungen_delete_api_step.py similarity index 97% rename from src/steps/vmh/webhook/bankverbindungen_delete_api_step.py rename to src/steps/crm/bankverbindungen/webhooks/bankverbindungen_delete_api_step.py index 1f5f110..e6f51cb 100644 --- a/src/steps/vmh/webhook/bankverbindungen_delete_api_step.py +++ b/src/steps/crm/bankverbindungen/webhooks/bankverbindungen_delete_api_step.py @@ -10,7 +10,7 @@ config = { "description": "Receives delete webhooks from EspoCRM for Bankverbindungen", "flows": ["vmh-bankverbindungen"], "triggers": [ - http("POST", "/vmh/webhook/bankverbindungen/delete") + http("POST", "/crm/bankverbindungen/webhook/delete") ], "enqueues": ["vmh.bankverbindungen.delete"], } diff --git a/src/steps/vmh/webhook/bankverbindungen_update_api_step.py b/src/steps/crm/bankverbindungen/webhooks/bankverbindungen_update_api_step.py similarity index 97% rename from src/steps/vmh/webhook/bankverbindungen_update_api_step.py rename to src/steps/crm/bankverbindungen/webhooks/bankverbindungen_update_api_step.py index 8f5a498..dbc92a3 100644 --- a/src/steps/vmh/webhook/bankverbindungen_update_api_step.py +++ b/src/steps/crm/bankverbindungen/webhooks/bankverbindungen_update_api_step.py @@ -10,7 +10,7 @@ config = { "description": "Receives update webhooks from EspoCRM for Bankverbindungen", "flows": ["vmh-bankverbindungen"], "triggers": [ - http("POST", "/vmh/webhook/bankverbindungen/update") + http("POST", "/crm/bankverbindungen/webhook/update") ], "enqueues": ["vmh.bankverbindungen.update"], } diff --git a/src/steps/crm/beteiligte/__init__.py b/src/steps/crm/beteiligte/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/steps/vmh/beteiligte_sync_cron_step.py b/src/steps/crm/beteiligte/beteiligte_sync_cron_step.py similarity index 100% rename from src/steps/vmh/beteiligte_sync_cron_step.py rename to src/steps/crm/beteiligte/beteiligte_sync_cron_step.py diff --git a/src/steps/vmh/beteiligte_sync_event_step.py b/src/steps/crm/beteiligte/beteiligte_sync_event_step.py similarity index 100% rename from src/steps/vmh/beteiligte_sync_event_step.py rename to src/steps/crm/beteiligte/beteiligte_sync_event_step.py diff --git a/src/steps/crm/beteiligte/webhooks/__init__.py b/src/steps/crm/beteiligte/webhooks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/steps/vmh/webhook/beteiligte_create_api_step.py b/src/steps/crm/beteiligte/webhooks/beteiligte_create_api_step.py similarity index 98% rename from src/steps/vmh/webhook/beteiligte_create_api_step.py rename to src/steps/crm/beteiligte/webhooks/beteiligte_create_api_step.py index 251a25a..5105b13 100644 --- a/src/steps/vmh/webhook/beteiligte_create_api_step.py +++ b/src/steps/crm/beteiligte/webhooks/beteiligte_create_api_step.py @@ -10,7 +10,7 @@ config = { "description": "Receives create webhooks from EspoCRM for Beteiligte", "flows": ["vmh-beteiligte"], "triggers": [ - http("POST", "/vmh/webhook/beteiligte/create") + http("POST", "/crm/beteiligte/webhook/create") ], "enqueues": ["vmh.beteiligte.create"], } diff --git a/src/steps/vmh/webhook/beteiligte_delete_api_step.py b/src/steps/crm/beteiligte/webhooks/beteiligte_delete_api_step.py similarity index 97% rename from src/steps/vmh/webhook/beteiligte_delete_api_step.py rename to src/steps/crm/beteiligte/webhooks/beteiligte_delete_api_step.py index 60ccce4..577b4b7 100644 --- a/src/steps/vmh/webhook/beteiligte_delete_api_step.py +++ b/src/steps/crm/beteiligte/webhooks/beteiligte_delete_api_step.py @@ -10,7 +10,7 @@ config = { "description": "Receives delete webhooks from EspoCRM for Beteiligte", "flows": ["vmh-beteiligte"], "triggers": [ - http("POST", "/vmh/webhook/beteiligte/delete") + http("POST", "/crm/beteiligte/webhook/delete") ], "enqueues": ["vmh.beteiligte.delete"], } diff --git a/src/steps/vmh/webhook/beteiligte_update_api_step.py b/src/steps/crm/beteiligte/webhooks/beteiligte_update_api_step.py similarity index 98% rename from src/steps/vmh/webhook/beteiligte_update_api_step.py rename to src/steps/crm/beteiligte/webhooks/beteiligte_update_api_step.py index 29211f8..654ff22 100644 --- a/src/steps/vmh/webhook/beteiligte_update_api_step.py +++ b/src/steps/crm/beteiligte/webhooks/beteiligte_update_api_step.py @@ -10,7 +10,7 @@ config = { "description": "Receives update webhooks from EspoCRM for Beteiligte", "flows": ["vmh-beteiligte"], "triggers": [ - http("POST", "/vmh/webhook/beteiligte/update") + http("POST", "/crm/beteiligte/webhook/update") ], "enqueues": ["vmh.beteiligte.update"], } diff --git a/src/steps/crm/document/__init__.py b/src/steps/crm/document/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/steps/shared/generate_document_preview_step.py b/src/steps/crm/document/generate_document_preview_step.py similarity index 100% rename from src/steps/shared/generate_document_preview_step.py rename to src/steps/crm/document/generate_document_preview_step.py diff --git a/src/steps/crm/document/webhooks/__init__.py b/src/steps/crm/document/webhooks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/steps/vmh/webhook/aiknowledge_update_api_step.py b/src/steps/crm/document/webhooks/aiknowledge_update_api_step.py similarity index 97% rename from src/steps/vmh/webhook/aiknowledge_update_api_step.py rename to src/steps/crm/document/webhooks/aiknowledge_update_api_step.py index b5ccc33..72b2cc6 100644 --- a/src/steps/vmh/webhook/aiknowledge_update_api_step.py +++ b/src/steps/crm/document/webhooks/aiknowledge_update_api_step.py @@ -8,7 +8,7 @@ config = { "description": "Receives update webhooks from EspoCRM for CAIKnowledge entities", "flows": ["vmh-aiknowledge"], "triggers": [ - http("POST", "/vmh/webhook/aiknowledge/update") + http("POST", "/crm/document/webhook/aiknowledge/update") ], "enqueues": ["aiknowledge.sync"], } diff --git a/src/steps/vmh/webhook/document_create_api_step.py b/src/steps/crm/document/webhooks/document_create_api_step.py similarity index 98% rename from src/steps/vmh/webhook/document_create_api_step.py rename to src/steps/crm/document/webhooks/document_create_api_step.py index a02cf6a..7c1dfc2 100644 --- a/src/steps/vmh/webhook/document_create_api_step.py +++ b/src/steps/crm/document/webhooks/document_create_api_step.py @@ -10,7 +10,7 @@ config = { "description": "Empfängt Create-Webhooks von EspoCRM für Documents", "flows": ["vmh-documents"], "triggers": [ - http("POST", "/vmh/webhook/document/create") + http("POST", "/crm/document/webhook/create") ], "enqueues": ["vmh.document.create"], } diff --git a/src/steps/vmh/webhook/document_delete_api_step.py b/src/steps/crm/document/webhooks/document_delete_api_step.py similarity index 98% rename from src/steps/vmh/webhook/document_delete_api_step.py rename to src/steps/crm/document/webhooks/document_delete_api_step.py index 35b96b0..6f8c9a7 100644 --- a/src/steps/vmh/webhook/document_delete_api_step.py +++ b/src/steps/crm/document/webhooks/document_delete_api_step.py @@ -10,7 +10,7 @@ config = { "description": "Empfängt Delete-Webhooks von EspoCRM für Documents", "flows": ["vmh-documents"], "triggers": [ - http("POST", "/vmh/webhook/document/delete") + http("POST", "/crm/document/webhook/delete") ], "enqueues": ["vmh.document.delete"], } diff --git a/src/steps/vmh/webhook/document_update_api_step.py b/src/steps/crm/document/webhooks/document_update_api_step.py similarity index 98% rename from src/steps/vmh/webhook/document_update_api_step.py rename to src/steps/crm/document/webhooks/document_update_api_step.py index 88c8b2b..e01d725 100644 --- a/src/steps/vmh/webhook/document_update_api_step.py +++ b/src/steps/crm/document/webhooks/document_update_api_step.py @@ -10,7 +10,7 @@ config = { "description": "Empfängt Update-Webhooks von EspoCRM für Documents", "flows": ["vmh-documents"], "triggers": [ - http("POST", "/vmh/webhook/document/update") + http("POST", "/crm/document/webhook/update") ], "enqueues": ["vmh.document.update"], } diff --git a/src/steps/shared/__init__.py b/src/steps/shared/__init__.py deleted file mode 100644 index 1f3f6a0..0000000 --- a/src/steps/shared/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Shared steps used across multiple modules diff --git a/src/steps/vmh/__init__.py b/src/steps/vmh/__init__.py deleted file mode 100644 index 5318810..0000000 --- a/src/steps/vmh/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""VMH Steps""" diff --git a/src/steps/vmh/webhook/__init__.py b/src/steps/vmh/webhook/__init__.py deleted file mode 100644 index 8455423..0000000 --- a/src/steps/vmh/webhook/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""VMH Webhook Steps"""