10 KiB
Phase 1: DEV-Ist-Stand Tabellen- und Prozesskonzept
Stand: 2026-06-02 Status: Verbindlicher DEV-Ist-Stand fuer Phase 1
1. Uebersicht
Dieses Dokument beschreibt die technische Wahrheit des aktuellen DEV-Standes auf Basis von:
docs/CONCEPT.mddocs/SCHEMA_PHASE1.sqldocs/PROCESS_PHASE1.mddb/migrations/0001_phase1_core.sqlbisdb/migrations/0006_phase1_otc_products.sqlorder-import.phpn8n/exports/current/*.json
Wichtige Einordnung:
SCHEMA_PHASE1.sqlbleibt ein Draft und ist nicht identisch mit der live DB.- Die live DB hat 18 Base Tables und 1 View.
- Die Forecast-Erweiterung aus
0003_phase1_inventory_forecast.sqlist im live Schema nicht aktiv. - Die Doku unten trennt deshalb zwischen implementiertem Ist-Stand und nicht gefundenen Zielbild-Teilen.
Tabellen:
partyaddresscontactproductsellable_itemexternal_item_aliassellable_item_componentwarehouselocationstock_lotpayment_methodshipping_methodsales_ordersales_order_linestock_movesales_order_line_lot_allocationaudit_logoutbound_webhook_event
View:
v_stock_lot_balance
Prozesse:
n8n.bestell-eingang-online-shopkzzorder-import.phpdb.trigger.sales_orderdb.trigger.sales_order_linedb.trigger.stock_movedb.trigger.productn8n.adressetikette-erstellen- Outbox-Ablage ueber
outbound_webhook_event
2. Zweck
Dieses Dokument beschreibt die aktuelle DB- und Prozesswahrheit fuer Phase 1 auf dem DEV-Stand.
Es ist eine technische Uebersicht fuer Analyse, Umsetzung und Review.
Nicht Bestandteil dieses Dokuments sind:
- API-Details
- UI-Details
- Migrations-Rollout-Planung
- offene Zielbilddiskussionen ausserhalb des aktuellen DEV-Standes
3. Normatives Datenmodell
3.1 party
Zweck:
- gemeinsamer Kontaktstamm fuer Kunden und Lieferanten
Ist-Stand:
typeistcustomer,supplieroderbothstatusistactiveoderinactiveemailwird fuer Match/Upsert genutzt
3.2 address
Zweck:
- Rechnungs- und Lieferadressen pro
party
Ist-Stand:
typeistbillingodershippingraw_payloadspeichert die Rohdaten des Eingangsdokuments
3.3 contact
Zweck:
- zusaetzliche Ansprechpartnerdaten pro
party
Ist-Stand:
- keine weitere Prozesslogik im Code gefunden
3.4 product
Zweck:
- lagergefuehrtes Produkt mit Bestand und Charge
Ist-Stand:
skuist eindeutig- beim Insert erzeugt der Trigger
trg_product_bootstrap_lotssofort einecurrent- und eineopen-Charge
3.5 sellable_item
Zweck:
- verkaufbarer Shop-Artikel
Ist-Stand:
- Bestellungen referenzieren zuerst
sellable_item - der Import kann neue
sellable_item-Datensaetze automatisch erzeugen
3.6 external_item_alias
Zweck:
- Mapping externer Shop-Daten auf
sellable_item
Ist-Stand:
source_system = 'wix'- Aufloesung ueber Artikelnummer, normalisierten Titel oder Originaltitel
3.7 sellable_item_component
Zweck:
- Stueckliste eines
sellable_itemauf lagergefuehrte Produkte
Ist-Stand:
qty_per_item > 0- wird vom Import und von Seed-Skripten gepflegt
3.8 warehouse
Zweck:
- oberer Lagerstandort
Ist-Stand:
- im Seed ist ein Hauptlager vorgesehen
3.9 location
Zweck:
- konkreter Lagerort innerhalb eines
warehouse
Ist-Stand:
typeiststorage,receiving,dispatchoderadjustment
3.10 stock_lot
Zweck:
- Charge eines Produkts
Ist-Stand:
statusistopen,currentoderclosed- pro Produkt sind
currentundopenper Unique Index abgesichert - die live DB hat keine
sellout_date- oderwarning_state-Spalten - die Sicht
v_stock_lot_balanceist die Bestandswahrheit
3.11 payment_method
Zweck:
- normalisierte Zahlungsart
Ist-Stand:
- Seed-Werte im DEV:
card,twint,bank_transfer,cash,paypal
3.12 shipping_method
Zweck:
- normalisierte Versandart
Ist-Stand:
- Seed-Werte im DEV:
post_standard,pickup
3.13 sales_order
Zweck:
- Bestellkopf fuer Online-Import und Direktverkauf
Ist-Stand:
external_refist eindeutigorder_sourceistwixoderdirectparty_idist nullablepayment_statusist faktisch aufpaidbeschraenktshipping_dateexistiert im live Schema und wird per Trigger berechnet, falls leer
3.14 sales_order_line
Zweck:
- Bestellposition
Ist-Stand:
qty_cancelledundline_statuswerden per Trigger synchronisiertsellable_item_idkannNULLsein
3.15 stock_move
Zweck:
- Bewegungsjournal fuer Zu- und Abgaenge
Ist-Stand:
move_typeistin,out,transferoderadjustment- Bewegungen werden vor Insert/Update gegen Negativbestand validiert
3.16 sales_order_line_lot_allocation
Zweck:
- explizite Rueckverfolgung zwischen Bestellposition und Charge
Ist-Stand:
allocation_statusistreserved,allocated,releasedodercancelled- im Import wird
allocatedverwendet
3.17 audit_log
Zweck:
- technische Historisierung
Ist-Stand:
- im Schema vorhanden
- im geprüften PHP- und n8n-Flow nicht als zentraler Pflichtpfad sichtbar
3.18 outbound_webhook_event
Zweck:
- Outbox fuer ERP-Events
Ist-Stand:
- Spalten:
event_type,event_key,aggregate_type,aggregate_id,payload,status,attempt_count,next_attempt_at,last_attempt_at,last_error,created_at,sent_at fn_enqueue_event(...)schreibt idempotent in diese Tabelle- ein Dispatcher/Worker fuer die Auslieferung wurde im geprüften DEV-Baum nicht gefunden
3.19 v_stock_lot_balance
Zweck:
- berechneter Chargensaldo
Ist-Stand:
- die Sicht ermittelt
qty_in,qty_outundqty_net - sie ist die Grundlage fuer Bestandspruefung und Auto-Switch
4. Normatives Prozessmodell
Alle Prozesse gehoeren fachlich zur Phase-1-Bestell-, Lager- und Integrationslogik.
4.1 n8n.bestell-eingang-online-shop
Fachliche Aufgabe:
- E-Mail auf
Neue Bestellungerkennen - Payload in ERP-JSON umformen
- JSON per HTTP POST an
order-import.phpsenden
Liest:
- IMAP-Eingang
- n8n-Extraktionslogik
Schreibt:
- keine DB direkt
Fachliche Wirkung:
- n8n ist hier nur die Integrationshuelle fuer den ERP-Import
4.2 order-import.php
Fachliche Aufgabe:
- eingehende Bestelldaten idempotent in die ERP-DB schreiben
- Kontakte, Adressen, Bestellkopf, Positionen und Chargenrueckverfolgung aufbauen
- bei Reimport vorhandene Allokationen zurueckbuchen
- nach Commit die Label- und Excel-Flows direkt anstossen
Liest:
.env- eingehendes Webhook-JSON
party,address,sales_order,sales_order_lineexternal_item_aliassellable_item_componentstock_lotv_stock_lot_balance
Schreibt:
partyaddresssales_ordersales_order_linesellable_itemexternal_item_aliassellable_item_componentwarehouselocationstock_lotstock_movesales_order_line_lot_allocation
Fachliche Wirkung:
- die Bestellung wird im ERP gespeichert und mit Lagerbewegung verknuepft
- vorhandene Allokationen derselben
external_refwerden vor dem Neuimport rueckwaerts gebucht - nach erfolgreichem Commit werden Label- und Excel-N8N-Flows direkt per HTTP ausgelöst
4.3 db.trigger.sales_order
Fachliche Aufgabe:
shipping_dateausorder_dateableitenorder.importedundorder.cancelled.fullin die Outbox schreibendirect-Bestellungen automatisch mitDIR-...Nummer versehen
Liest:
sales_orderfn_next_business_day(timestamp)
Schreibt:
sales_order.shipping_dateoutbound_webhook_event
Fachliche Wirkung:
- fehlendes
shipping_datewird auf den naechsten Werktag gesetzt - neue Auftraege und Vollstornos werden als Event in die Outbox gelegt
- direkte Auftraege erhalten bei leerer Nummer automatisch einen
DIR-...-Ref
4.4 db.trigger.sales_order_line
Fachliche Aufgabe:
line_statusausqty_cancelledableiten- Partial-Cancel-Event enqueuen
Liest:
sales_order_line
Schreibt:
sales_order_line.line_statusoutbound_webhook_event
Fachliche Wirkung:
allocated,partially_cancelledundcancelledwerden deterministisch gesetzt- ein Wechsel auf
partially_cancellederzeugt einorder.cancelled.partial-Event
4.5 db.trigger.stock_move
Fachliche Aufgabe:
- Negativbestand verhindern
- Chargenwechsel bei leerer
current-Charge ausloesen
Liest:
stock_movestock_lotv_stock_lot_balance
Schreibt:
stock_lotoutbound_webhook_event
Fachliche Wirkung:
out-Bewegungen sind nur aufcurrent-Chargen erlaubt- bei
qty_net <= 0wird die naechsteopen-Chargecurrent - danach wird wieder eine neue
open-Charge angelegt
4.6 db.trigger.product
Fachliche Aufgabe:
- neue Produkte sofort chargenfaehig machen
Liest:
product
Schreibt:
stock_lot
Fachliche Wirkung:
- jedes neue Produkt bekommt direkt eine
current- und eineopen-Charge
4.7 n8n.adressetikette-erstellen
Fachliche Aufgabe:
- Lieferadresse entgegennehmen
- Felder normalisieren
- HTML/CSS in PDF/PNG umsetzen
- Ergebnis per SFTP hochladen
Liest:
- Webhook-Input
- Gotenberg / pdf2png / SFTP-Ziele
Schreibt:
- keine ERP-DB
Fachliche Wirkung:
- eigenstaendiger Ausgabekanal fuer Versandetiketten
4.8 Outbox-Ablage ueber outbound_webhook_event
Fachliche Aufgabe:
- Eventdaten fuer spaetere Auslieferung sammeln
Liest:
fn_enqueue_event
Schreibt:
outbound_webhook_event
Fachliche Wirkung:
- Queue wird im geprüften DEV-Stand befuellt
- ein dazugehoeriger Dispatcher/Worker wurde im Code nicht gefunden
5. Technische Einbettung
Die reale Phase-1-Logik bildet einen kleinen operativen Kern mit vier Schwerpunkten:
- Kontakt- und Adressstamm
- Bestellimport via n8n -> PHP -> DB
- Chargen- und Lagerbewegung mit Trigger-Logik
- Label-Generierung als separater n8n-Ausgang
Wichtige Abweichungen zum alten Zielbild:
- Sellout-Forecast ist im live Schema nicht aktiv.
- Ein Dispatcher fuer
outbound_webhook_eventwurde im geprüften DEV-Baum nicht gefunden. - Eine separate Direct-Sale-Eingabestrecke wurde im geprüften DEV-Baum nicht gefunden; vorhanden ist nur die DB-/Trigger-Unterstuetzung fuer
order_source = direct.
6. Kurzfazit
Die aktuelle technische Wahrheit von Phase 1 ist auf Nachvollziehbarkeit und direkte Integrationspfade ausgerichtet:
- Bestellungen werden idempotent gespeichert
- Lagerbestand wird ueber Chargen und Bewegungen abgebildet
- Rueckverfolgung erfolgt ueber explizite Allokationen
- n8n importiert und erzeugt Labels direkt
- Outbox-Events werden geschrieben, aber ein Dispatcher ist im geprüften DEV-Stand nicht vorhanden