Abschlussprojekt
Ziel dieses Dokuments ist es, eine vollständige, professionelle Integrationslösung für das beschriebene Multi-Channel-Szenario zu entwerfen. Es enthält die Architektur-Übersicht, detaillierte Workflow-Pläne und die wichtigsten Datenmodelle & Konfigurationen.
1 — Architektur-Übersicht
Kurzbeschreibung der Gesamtarchitektur
Zentraler Integrations-Dreh- und Angelpunkt ist Xentral (führendes System).
Für jeden funktionalen Bereich existieren entkoppelte, spezialisierte Workflows, um Single Responsibility, Observability und Wiederverwendbarkeit zu gewährleisten.
Workflows kommunizieren über den Data Store (persistente Queue / Tables) und Ereignisse (Event-Driven) miteinander, wo möglich in Echtzeit; batch- bzw. scheduler-getriebene Prozesse sind für Nachtläufe oder periodische Exporte vorgesehen.
Fehlerhafte Datensätze werden in einer Error-Queue persistiert; ein dedizierter "Error-Repair"-Workflow erlaubt manuelle Korrektur und Retry.
Externe Systeme:
Shopify (REST Admin API, Webhooks)
B2B-Marktplatz (REST + OAuth2, Webhooks)
Retailer (SFTP: Bestell-CSV-In, Lieferschein-PDF-Out)
Xentral (Xentral-Konnektor, Events für Lieferschein/Rechnung)
Geplante Workflows (Kurzliste)
Product & Inventory Sync (Nachtlauf + stündlicher Retailer CSV)
Product Upsert Batcher (API rate-limit aware)
Shopify Webhook Receiver → Order Import
B2B-Marktplatz Webhook Receiver → Order Import (inkl. Customer-Lookup)
Retailer SFTP Poller → Order Import (15-minütig)
SKU-Normalizer & Mapping (Retailer-Suffix)
Order Processing & Validation (inkl. Error-Queue)
Shipping Notification Dispatcher (event-driven)
Invoice Collector & Daily Exporter
Error-Repair UI/Workflow (manueller Retry)
Monitoring & Alerting (Admin-Benachrichtigung bei kritischen Fehlern)
Mermaid-Diagramm (komplett, alle Workflows, Trigger und Systeme)
Hinweis: Das Diagramm zeigt die Verantwortlichkeiten: Synchronisation-Batches sind separat von Echtzeit-Webhook-Pfaden; alle asynchronen/fehleranfälligen Übergaben laufen über den Data Store / Queues.
2 — Detaillierte Workflow-Pläne
Jeder Workflow wird schrittweise beschrieben. Wo vorher numerierte lange Schritte auftreten, sind diese als Stepper dargestellt.
Product & Inventory Sync (Nightly) — Xentral → Shopify, B2B-Marktplatz
Zweck: Nächtliche Voll- bzw. inkrementelle Synchronisation aller aktiven Artikel inkl. Preis- und Bestandsänderungen.
Ablauf:
Trigger: Scheduler (einmal pro Nacht).
Schritt 1: Fetch Upfront — Alle aktiven Artikel-Metadaten (SKU, Title, Beschreibung, Preise, Varianten, Lagerlocation) aus Xentral in Seiten (Pagination) lesen und in Memory/Temp-Store vorhalten.
Schritt 2: Differenzermittlung — Vergleiche zu letztem Snapshot (im Data Store) um nur geänderte Items zu senden.
Schritt 3: Batch-Bildung — Batches nach Kanal-spezifischen Limit-Strategien (z.B. Shopify: Batch-Größe 20, 1s Delay nach N Requests; B2B: Batch-Größe 50).
Schritt 4: Product Upsert via Product Upsert Batcher (siehe separater Workflow). UID-Mapping (Xentral product_id ↔ Channel product_id) in Assignment Table persistieren.
Schritt 5: Ergebnis-Logging — Erfolge in Audit-Table, Fehler in Error-Queue.
Rückfall: Wenn Channel-API Raten-Limit erreicht, wird Exponential Backoff angewandt und Batch erneut in Queue gelegt.
Wesentliche Knoten:
Fetcher (Xentral API)
Differ Engine ( Snapshot-Vergleich )
Batcher (Channel-spezifisch)
Retry / Backoff Handler
Audit Logger
Konzept zur Raten-Limit-Vermeidung:
Fetch Upfront um viele kleine GETs zu vermeiden.
Channel-spezifische Batching + token-bucket throttling.
Parallelität limitiert pro Kanal.
Dead-letter Queue für dauerhaft fehlerhafte Items.
Product Upsert Batcher (shared)
Zweck: Kanal-spezifischer Sender mit Rate-Limit-Logik und Retry.
Ablauf:
Trigger: Accepts batches vom Product & Inventory Sync oder manuellem Trigger.
Schritt 1: Für jeden Batch: Annotate mit Channel-Config (rate-limit, max-concurrency).
Schritt 2: Sende Requests sequenziert/parallel innerhalb Limits.
Schritt 3: On 429 oder transient Fehler: Queue-Item mit exponentially increasing delay.
Schritt 4: Auf dauerhafte Fehler: Move to Dead-letter / Error-Queue.
Wesentliche Knoten:
Throttler (token-bucket)
Sender
Response-Mapper (speichert channel-product-id Mapping)
Error-Handler
Retailer Stock CSV Export (Hourly) — Xentral → Retailer SFTP
Zweck: Retailer erwartet stündlich CSV mit "sku,stock".
Ablauf:
Trigger: Scheduler (stündlich).
Schritt 1: Query Xentral für SKUs & aktuelle Lagerbestände.
Schritt 2: CSV-Generierung (Header: sku,stock). Nur SKUs, keine Produktdaten.
Schritt 3: Atomarer Upload auf SFTP (zuerst temporäre Datei, dann atomic rename).
Schritt 4: Log/Verifiy (optional: checksum).
Fehler: Bei SFTP-Ausfall -> Retry mit Backoff, bei Dauerfehler -> Admin-Benachrichtigung.
Beispiel CSV:
Shopify Webhook Receiver → Order Import
Zweck: Echtzeit-Import von Shopify-Bestellungen nach Xentral.
Ablauf:
Trigger: HTTP-Webhook von Shopify.
Schritt 1: Authentifiziere und validiere Webhook-Signatur.
Schritt 2: Normalisiere Bestelldaten (LineItems → sku, qty, price).
Schritt 3: Check SKU-Mapping (Data Store: xentral_sku_lookup). Wenn SKU fehlt -> Fehlerfall (siehe Error-Handling).
Schritt 4: Anreichern: Customer-Lookup (per Email / externe Referenz). Wenn Kunde unbekannt -> Create-Customer in Xentral (oder in Error-Queue je nach Policy).
Schritt 5: Auftrag in Xentral anlegen via Xentral-Konnektor.
Schritt 6: Antwort an Shopify (200 OK). Audit-Eintrag.
Wesentliche Knoten:
Webhook-Validator
Order Normalizer
SKU Resolver
Customer Resolver
Xentral Creator
B2B-Marktplatz Webhook Receiver → Order Import (inkl. USt-IdNr. Customer-Lookup)
Zweck: Echtzeit-Import von B2B-Bestellungen und Identifikation/Anlage von Geschäftskunden über USt-IdNr.
Ablauf:
Trigger: HTTP-Webhook vom B2B-Marktplatz.
Schritt 1: OAuth2-gesicherter Kommunikation (Token-Refresh handled zentral).
Schritt 2: Order Normalizer.
Schritt 3: Customer-Lookup: Suche nach USt-IdNr. Falls gefunden -> verknüpfen, sonst -> Kunde neu anlegen (Kreditlimit/Tax-Handling beachten).
Schritt 4: SKU-Resolving & Menge.
Schritt 5: Auftrag an Xentral senden.
Fehler: Unbekannte SKU -> Datensatz in Error-Queue (inkl. Raw Payload + Diagnose).
Rate-Limits: Webhook-Payloads sind selten; Upstream API Calls (z.B. zur Validierung) werden rate-limited.
Wesentliche Knoten:
OAuth2 Token Manager
Customer Lookup (USt-IdNr.)
Validation & Enrichment
Xentral Auftragscreate
Retailer SFTP Poller → Order Import (15-minütig)
Zweck: Alle 15 Minuten prüft ein Poller neue CSV-Bestellungen auf dem SFTP-Server; jede Datei enthält genau eine Bestellung.
Ablauf:
Trigger: Scheduler (alle 15 Minuten).
Schritt 1: Connect to SFTP (Key/Auth) — robustes Error-Handling und Retries.
Schritt 2: List new files (z.B. nach Timestamp oder processed-folder pattern).
Schritt 3: Für jede Datei: Download, Parse CSV → Order Payload.
Schritt 4: SKU Normalizer: Entferne Retailer-Suffix
-RTLaus allen SKUs vor Mapping.Beispiel: "PEN-RED-RTL" → "PEN-RED"
Schritt 5: SKU Auflösung (Data Store Lookup) → wenn nicht gefunden → Error-Queue.
Schritt 6: Auftrag in Xentral anlegen.
Schritt 7: Move processed file to archive folder / mark as processed (atomic rename).
Fehlerhandling:
Parsing-Fehler → Error-Queue mit raw file.
SFTP unreachable → Critical Alert (Admin).
Wesentliche Knoten:
SFTP Client
Parser
SKU Normalizer
Xentral Auftragscreate
Archiver
SKU Normalizer & Mapping
Zweck: Einheitliche SKU-Repräsentation, Retailer-Suffix-Handling und Kanal-Mapping.
Ablauf:
Eingangsregel für Retailer: entferne Suffix
-RTL(RegEx:^(.*?)(-RTL)?$).Lookup in Assignment Table:
xentral_sku ↔ channel_sku(bidirektional).Falls Mapping fehlt:
Für Webhooks: Markiere Fehler → Error-Queue.
Für Batch-Import: Optionally markiere und versuche Fuzzy-Match (optional, konfigurierbar), ansonsten Error-Queue.
Persistenz: Assignment Table im Data Store mit Audit-Fields (created_by, created_at).
Wesentliche Knoten:
Normalizer-Funktion
Assignment Table Lookup
Fuzzy Match (configurable)
Order Processing & Validation (Shared)
Zweck: Validierung, Preisprüfung, Fraud-Checks (falls konfiguriert) und finale Auftragserstellung in Xentral.
Ablauf:
Input: Normalized Order-Payload (aus Webhooks oder Poller).
Validierungen:
SKU existiert
Kundeninformation vorhanden oder anlegbar
Zahlungs- und Versandinformationen valide
Falls valid: Erstelle Auftrag via Xentral-Konnektor.
Falls invalid: Schreibe vollständigen Payload + Fehler-Metadaten in Error-Queue.
Nebenaufgabe: Generiere Audit-Event für downstream Prozesse (Shipping, Billing).
Wesentliche Knoten:
Validator
Xentral-AuftragsClient
Error-Queue-Schreiber
Shipping Notification Dispatcher (Event-Driven)
Zweck: Versandevents (Lieferscheine) in Xentral an Kanäle zurückmelden; Lieferschein PDF für Retailer erzeugen und auf SFTP ablegen.
Ablauf:
Trigger: Xentral Event "Lieferschein erstellt".
Schritt 1: Event-Consumer validiert Event (Auftrag ID, Kanal).
Schritt 2: Fetch Tracking-Info aus Xentral (Tracking-Nummer, Carrier).
Schritt 3: Kanal-spezifische Update-Aufrufe:
Shopify: Fulfillment/Tracking-Update via REST
B2B-Marktplatz: Status-Update API
Retailer: PDF-Lieferschein erzeugen (PDF Generator) und auf SFTP ablegen (atomic put)
Schritt 4: Persistiere Versand-Event in Audit-Log.
Fehler: On SFTP write-fail -> Retry + Admin-Alert bei Dauerfehlern.
Wesentliche Knoten:
Event-Consumer
Channel-Adapter (Shopify / B2B / Retailer)
PDF-Generator
SFTP-Uploader
Invoice Collector & Daily Exporter
Zweck: Rechnungen für B2B-Marktplatz und Retailer zwischenspeichern und täglich gesammelt an Buchhaltungssysteme übertragen (hier: simuliert durch Log-Eintrag).
Ablauf:
Trigger: Xentral Event "Rechnung erstellt" → Invoice Collector schreibt Rechnung (PDF/Meta) in Data Store per Kanal.
Täglich: Invoice Daily Exporter sammelt alle neuen Rechnungen und überträgt sie an die jeweiligen Buchhaltungssysteme (hier: Log-Eintrag).
Nach erfolgreichem Export: Markiere as exported.
Wesentliche Knoten:
Invoice Collector
Export Scheduler
Export Logger (Simulierte Übertragung)
Reconciliation-Table
Error-Handling Allgemein & Error-Repair Workflow
Zweck: Einheitliches Fehlermanagement, Persistenz defekter Datensätze und manuelle Wiederherstellung.
Ablauf (Error-Queue):
Fehlerhafte Datensätze (z.B. unbekannte SKU, Parsing-Fehler) werden mit folgendem Payload gespeichert:
raw_payload
error_code
error_message
source_workflow
created_at, retry_count
Fehler werden nicht sofort verworfen; sie sind für Review zugänglich.
Error-Repair Workflow (für Sachbearbeiter):
Trigger: Manuell per UI / Admin-Trigger.
Schritt 1: Lade Eintrag aus Error-Queue.
Schritt 2: Sachbearbeiter korrigiert Daten im Data Store (z.B. SKU mapping ergänzen, CSV korrigieren).
Schritt 3: Trigger "Retry Single Record" — speichert korrigiertes Payload in Verarbeitung-Queue mit Ursprungshandling (idempotenz beachtet).
Schritt 4: Workflow behandelt den Datensatz erneut; bei Erfolg: Error-Queue-Eintrag markiert resolved.
Kritische Fehler:
Beispiel: SFTP nicht erreichbar → Mail an Admin-Verteiler + Monitoring-Eintrag.
Bei kritischen recurring failures: Auto-Escalation nach konfigurierbaren Thresholds.
(Die Error-Repair Logik ist interaktiv; hier ist nur das Design dokumentiert.)
3 — Datenmodelle & Konfiguration
Wichtige Data Structures und Assignment Tables. Diese Tabellen sind persistente Entities im Data Store.
SKU Assignment Table
Zweck: Bidirektionales Mapping zwischen Xentral-SKU und Kanal-SKU.
Struktur:
id
string
Primärschlüssel
xentral_sku
string
SKU in Xentral
channel
string
z.B. shopify, b2b, retailer
channel_sku
string
SKU im Kanal
created_by
string
wer erstellt hat
created_at
datetime
updated_at
datetime
Channel Configuration Table
Zweck: Storing API endpoints, auth, rate-limits, batch-sizes.
id
string
channel
string
shopify / b2b / retailer
base_url
string
vollständige URL (mit Query params wenn nötig)
auth
json
credentials / OAuth config
rate_limit
json
e.g. { "max_requests": 100, "per_seconds": 60 }
batch_size
int
empfohlene Batch-Größe
created_at
datetime
Error-Queue Table
Zweck: Persistente Speicherung fehlerhafter Datensätze.
id
string
source_workflow
string
z.B. retailer-sftp-poller
raw_payload
json/text
Originaldaten
error_code
string
z.B. SKU_NOT_FOUND
error_message
text
Debug-Info
retry_count
int
created_at
datetime
resolved
boolean
Invoice Store
Zweck: Speicherung der Rechnungs-PDFs / Metadaten zur täglichen Aggregation.
invoice_id
string
Xentral Invoice ID
channel
string
b2b / retailer
pdf_blob
binary/ref
Link oder Blob im Data Store
metadata
json
amount, date, order_ref
exported
boolean
default false
created_at
datetime
Audit Log (Events)
Zweck: Nachvollziehbarkeit aller Aktionen (sync/calls/errors).
id
string
event_type
string
e.g. product_update, order_import
source
string
workflow name
payload_ref
ref
pointer auf relevant data
status
string
success/failure
created_at
datetime
Konfigurationsempfehlungen
Secrets & Keys: zentral verwaltet (Secret Store), nicht in plain config.
OAuth2: Token-Refresh-Service zentral implementieren (B2B).
SFTP: Key-Pair Auth, IP-Failover Config.
Throttling: Channel-spezifische Token-Buckets konfigurierbar.
4 — Fehlerbehandlung & Monitoring (Detail)
Fehlerklassifizierung:
Transiente Fehler: 429, Netzwerkprobleme → Retry mit Backoff.
Datenfehler: Missing SKU, invalid payload → persist in Error-Queue.
Kritische Infrastrukturfehler: SFTP unreachable, Xentral auth broken → Admin-Alert + Incident-Ticket.
Retry-Strategien:
Transient: Exponential Backoff, max_retries configurable (z.B. 5).
Dauerhafte Failure → Dead-letter / Error-Queue.
Observability:
Metrics: queue_depth, success_rate, avg_processing_time, failed_jobs.
Dashboards für jede Pipeline (Sync, Orders, SFTP).
Alerts: Thresholds (z.B. Error-Queue > N, SFTP down > 5min).
Admin-Benachrichtigung:
E-Mail / PagerDuty Integration bei kritischen Fehlern.
Beispiel-Trigger: SFTP unreachable after 3 retries, repeated authentication failures.
Expandable: Error-Repair Flow (für Sachbearbeiter)
5 — Security & Idempotency
Idempotency Keys: Bei allen Aufrufen zu Xentral und Channel-APIs Idempotency-Header verwenden, falls unterstützt.
Authentication:
Shopify: HMAC-Webhook Verification + API Key
B2B: OAuth2 (Client Credentials oder Authorization Code mit Refresh)
SFTP: Key Based Auth
Least Privilege: API-Credentials mit minimalen Rechten für die jeweiligen Aktionen.
Sensitive Data: Keine sensiblen Daten in Logs; Maskierung von Payment-Daten.
6 — Operational Notes & Deliverables
Was in der Preset Instance enthalten sein sollte
Struktur der Workflows (als Xentral Connect Workflows), z. B.:
product-sync (Scheduler)
product-upsert-batcher
shopify-webhook-receiver
b2b-webhook-receiver
retailer-sftp-poller
sku-normalizer
order-processor
shipping-dispatcher
invoice-collector
invoice-daily-exporter
error-repair-workflow
Data Store Schemas (tables): SKU Assignment, Channel Config, Error-Queue, Invoice Store, Audit Log.
Beispiel-Configs für Channel Credentials (als Placeholder, nicht echte Keys).
Beispiel-Mappings (einige SKU-Zuordnungen).
Scheduler-Konfigurationen (15min poller, hourly CSV, nightly sync, daily invoice export).
Hinweis zur Einreichung (wie gefordert)
Lösungsdokument (dieses Markdown).
Export der "Preset Instance" als ZIP, die die oben genannten Workflow-Strukturen, Data Store-Schemas und Beispiel-Konfigurationen enthält.
Wenn du möchtest, kann ich als nächsten Schritt:
Eine konkrete JSON-Schema-Definition für die wichtigsten Data Structures erstellen (z.B. Error-Queue, SKU Assignment).
Beispiel-Implementierungen der wichtigsten Workflow-Knoten in Pseudocode oder als detaillierte Node-By-Node Beschreibung ausarbeiten.
Eine Checkliste für die Preset-Instance-Erstellung liefern (welche Dateien/Flows exakt exportiert werden sollen).
Was möchtest du als Nächstes?
Was this helpful?
