From f2c9150cb305002083ba5d8ea578d7e52f4c3e29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Gla=CC=88ser?= Date: Wed, 12 Aug 2026 16:14:02 +0200 Subject: [PATCH] Fuehre technische Shopify-Runpersistenz ein --- db/README.md | 3 ++ db/migrations/0008_shopify_sync_technical.sql | 41 +++++++++++++++++++ .../database/module_db_ownership.md | 5 +++ .../shopify-umstellung-checkliste.md | 14 ++++++- 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 db/migrations/0008_shopify_sync_technical.sql diff --git a/db/README.md b/db/README.md index 1b71e4a..9af2795 100644 --- a/db/README.md +++ b/db/README.md @@ -7,6 +7,9 @@ 3. `db/migrations/0003_phase1_inventory_forecast.sql` 4. `db/migrations/0004_phase1_direct_sales.sql` 5. `db/migrations/0005_phase1_auto_switch_fix.sql` +6. `db/migrations/0006_phase1_otc_products.sql` +7. `db/migrations/0007_phase1_excel_webhook.sql` +8. `db/migrations/0008_shopify_sync_technical.sql` ## Beispielausfuehrung diff --git a/db/migrations/0008_shopify_sync_technical.sql b/db/migrations/0008_shopify_sync_technical.sql new file mode 100644 index 0000000..308aa0f --- /dev/null +++ b/db/migrations/0008_shopify_sync_technical.sql @@ -0,0 +1,41 @@ +BEGIN; + +CREATE TABLE process_runs ( + id BIGSERIAL PRIMARY KEY, + process_name TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'running', + scope_json JSONB NOT NULL DEFAULT '{}'::jsonb, + result_json JSONB, + requested_by TEXT, + started_at TIMESTAMP NOT NULL DEFAULT NOW(), + finished_at TIMESTAMP, + error_code TEXT, + error_message TEXT, + CONSTRAINT chk_process_runs_status CHECK (status IN ('running', 'done', 'partial_success', 'failed')) +); + +CREATE INDEX idx_process_runs_name_started ON process_runs(process_name, started_at DESC); +CREATE INDEX idx_process_runs_status_started ON process_runs(status, started_at DESC); + +CREATE TABLE shopify_webhook_event ( + id BIGSERIAL PRIMARY KEY, + webhook_id TEXT NOT NULL, + topic TEXT NOT NULL, + shop_domain TEXT NOT NULL, + payload_sha256 TEXT NOT NULL, + payload JSONB NOT NULL, + shopify_order_gid TEXT, + status TEXT NOT NULL DEFAULT 'received', + received_at TIMESTAMP NOT NULL DEFAULT NOW(), + processed_at TIMESTAMP, + error_code TEXT, + error_message TEXT, + CONSTRAINT chk_shopify_webhook_event_status CHECK (status IN ('received', 'processed', 'duplicate', 'failed')) +); + +CREATE UNIQUE INDEX uq_shopify_webhook_event_webhook_id ON shopify_webhook_event(webhook_id); +CREATE INDEX idx_shopify_webhook_event_order_gid ON shopify_webhook_event(shopify_order_gid); +CREATE INDEX idx_shopify_webhook_event_received_at ON shopify_webhook_event(received_at DESC); +CREATE INDEX idx_shopify_webhook_event_status ON shopify_webhook_event(status, received_at DESC); + +COMMIT; diff --git a/docs/architektur/database/module_db_ownership.md b/docs/architektur/database/module_db_ownership.md index 31747d5..047e48e 100644 --- a/docs/architektur/database/module_db_ownership.md +++ b/docs/architektur/database/module_db_ownership.md @@ -43,6 +43,11 @@ Diese Referenz ordnet die aktuellen Tabellen, Views und technischen DB-Artefakte - `outbound_webhook_event` - `system_user` +### `erp/import-integration` + +- `process_runs` +- `shopify_webhook_event` + ## 3. Hinweise - Die Ownership ist fachlich und technisch bindend. diff --git a/docs/modules/erp/import-integration/shopify-umstellung-checkliste.md b/docs/modules/erp/import-integration/shopify-umstellung-checkliste.md index 578e523..2980a6c 100644 --- a/docs/modules/erp/import-integration/shopify-umstellung-checkliste.md +++ b/docs/modules/erp/import-integration/shopify-umstellung-checkliste.md @@ -112,6 +112,15 @@ Fachliche Übergabe: `erp/bestellungen` - [x] Verbindlichen Sub-Prozess-Vertrag für technische Shopify-Eventpersistenz dokumentieren. - [x] Verbindlichen Sub-Prozess-Vertrag für die identifier-only Bestellübergabe dokumentieren. - [ ] Technische Eingangstabelle und DB-Ownership für Shopify-Events festlegen. +- [x] `process_runs` als technische Laufpersistenz im Submodul `erp/import-integration` definiert. +- [x] `shopify_webhook_event` als technische Eingangstabelle im Submodul `erp/import-integration` definiert. +- [x] DB-Ownership für `process_runs` und `shopify_webhook_event` dokumentiert. +- [x] ERP-Backupskript im Repository angelegt: `scripts/db/synology_db_backup.sh`. +- [x] ERP-Backupskript auf DEV bereitgestellt. +- [x] Backupziel festgelegt: `/volume1/naurua_db_backups/dev`. +- [x] PostgreSQL-17-Clientcontainer für das ERP-Backup verwendet. +- [x] Manuelles DEV-Backup erfolgreich erzeugt und mit `pg_restore --list` verifiziert. +- [ ] Migration `0008_shopify_sync_technical.sql` auf DEV ausführen. - [x] ERP-Backupskript im Repository angelegt: `scripts/db/synology_db_backup.sh`. - [x] ERP-Backupskript auf DEV bereitgestellt. - [x] Backupziel im Skript festgelegt: `/volume1/naurua_db_backups/dev`. @@ -257,10 +266,11 @@ Aktueller Blocker: - Der vorgeschriebene DEV-DB-Wrapper `/volume2/webssd/erpnaurua/dev/scripts/db/psql.sh` ist auf Synology nicht vorhanden. - Auf ausdrückliche Anweisung wurde ein read-only-Direktzugriff über `/usr/bin/psql` verwendet. - Die vollständige Shopify-Bestandszählung und historische Zuordnung bleiben weiterhin offen. -- Der Cron-Aufruf erreicht das Skript jetzt; der Lauf bricht kontrolliert ab, weil der Server PostgreSQL 17 und der verfügbare Client `pg_dump` 11 verwendet. +- Der Cron-Aufruf erreicht das Skript und verwendet den PostgreSQL-17-Clientcontainer. - Das Backupziel ist `/volume1/naurua_db_backups/dev`. - Der Logpfad ist `/volume1/naurua_db_backups/dev/synology_db_backup.log`. -- Es wurde kein gültiges Backup und keine DB-Änderung erzeugt. +- Ein gültiger DEV-Dump wurde erzeugt und mit `pg_restore --list` verifiziert. +- Die DB-Migration wurde nach dem Backup noch nicht ausgeführt. ## Abnahmeregel