8.9 KiB
8.9 KiB
Phase 1 Component Specification
Dokumentstatus
- Typ:
operational - Zweck: verbindliche Umsetzungs-Spezifikation fuer Schritt 1 Komponenten
- Normative Referenz:
/Users/mathias/Documents/Dokumente Chouchou/Codebases/erp_naurua/docs/CONCEPT.md - Abgeleitete Referenz:
/Users/mathias/Documents/Dokumente Chouchou/Codebases/erp_naurua/docs/SCHEMA_PHASE1.sql - Prozessreferenz:
/Users/mathias/Documents/Dokumente Chouchou/Codebases/erp_naurua/docs/PROCESS_PHASE1.md - Implementierungsreferenz:
/Users/mathias/Documents/Dokumente Chouchou/Codebases/erp_naurua/db/migrations/
Scope
Diese Spezifikation deckt alle Schritt-1-Komponenten ab:
- Bestellerfassung
- Kontakt- und Adressdaten
- Artikel-Mapping und Stuecklisten
- Lagerverwaltung mit Chargen, MHD, Zu-/Abgaengen
- Chargenrueckverfolgung
- Teil-/Vollstorno
- Inbound/Outbound Webhooks
- Audit und technische Guardrails
Globale Invarianten
sales_order.external_refist eindeutig und dient als Upsert-Schluessel (Shop:BestellungNr, Direktverkauf:DIR-...).- Datensaetze werden nicht geloescht; Statusaenderungen und Audit-Trail werden verwendet.
- Verkaufsbewegungen sind immer chargengebunden.
- Negativbestand ist unzulaessig.
- Pro Produkt existieren exakt eine
current-Charge und eineopen-Charge. opendarf nie fehlen.- Zahlungsstatus aus Shop wird intern auf
paidnormalisiert. - Direktverkaeufe haben
order_source = directundexternal_refmitDIR--Praefix.
Komponente 1: Bestellerfassung
Ziel
Persistente Erfassung von Bestellungen aus Shop und Direktverkauf inkl. Positionen, Summen und Import-/Erfassungsdaten.
Eingangsquelle
- n8n Inbound Webhook mit Shop-JSON (
order_source = wix) - Manuelle ERP-Erfassung fuer Direktverkauf (
order_source = direct)
Datenregeln
- Upsert auf
sales_order.external_reffuer Shop-Bestellungen. - Direktbestellungen erhalten ERP-interne Nummern mit
DIR--Praefix. order_statusinitialimported.- Summenfelder werden direkt gespeichert (
amount_net,amount_shipping,amount_tax,amount_discount,total_amount). webhook_payloadwird fuer Shop-Rohdaten gespeichert (Nachvollziehbarkeit).- Fuer Direktverkauf darf
party_idleer sein (Laufkundschaft).
Fehlerverhalten
- Bei fehlender
BestellungNr: Import ablehnen, Audit-Logimport_rejected. - Bei unbekanntem Artikelfehler: Bestellung speichern, Position mit Rohdaten speichern, Mapping-Luecke markieren.
Akzeptanzkriterien
- Wiederholter Import derselben
BestellungNrerzeugt kein Duplikat. - Direktbestellungen sind ueber den
DIR--Praefix eindeutig erkennbar. - Positionsdaten bleiben stabil und auditierbar.
Komponente 2: Kontakt- und Adressdaten
Ziel
Speicherung von Kundenkontakt, Lieferadresse und optionaler Rechnungsadresse.
Datenregeln
- Rechnungsadresse darf vollstaendig
NULLsein. - Lieferadresse wird als eigener Datensatz gespeichert.
- Land wird immer doppelt gespeichert:
country_name+country_iso2. - Keine serverseitige Adressvalidierung in Phase 1.
- Ausnahmefaelle bei Name/Firma werden unveraendert uebernommen.
- Bei Direktverkauf ist keine Kontakt-/Adressanlage erforderlich.
Akzeptanzkriterien
- Bestellung kann ohne Rechnungsadresse gespeichert werden.
- Liefer- und Rechnungsadresse sind getrennt auswertbar.
Komponente 3: Artikel-Mapping und Stuecklisten
Ziel
Stabile Entkopplung von Shop-Artikeln und lagergefuehrten Produkten.
Datenmodell
sellable_item: verkaufbarer Artikel (auch Bundles).external_item_alias: Mapping Shop-Artikelnummer/Titel ->sellable_item.sellable_item_component: Stuecklistesellable_item->productmit Menge.
Aufloesungsreihenfolge
- Match ueber
external_article_number. - Fallback ueber normalisierten Titel.
- Wenn beides fehlschlaegt: Position als unmapped speichern und auditieren.
Akzeptanzkriterien
- Bundle-Artikel koennen auf mehrere Lagerprodukte aufgeloest werden.
- Ohne Mapping bleibt Bestellung dennoch erfassbar.
Komponente 4: Lagerverwaltung und Chargen
Ziel
Konsistente Bestandsfuehrung je Charge inklusive Auto-Wechsel.
Statusmodell Charge
open: vorbereitete Chargecurrent: aktive Entnahmechargeclosed: abgeschlossene Charge
Lebenszyklus
open -> current -> closed- Wenn
currentaufqty_net <= 0faellt:- alte
currentwirdclosed - vorhandene
openwirdcurrent - neue
openwird auto-angelegt
- alte
Feldregeln
lot_numberbeiopendarf leer sein.lot_numberfuercurrent/closedist Pflicht.- Chargennummer ist pro Produkt eindeutig.
- Chargensalden werden aus
stock_moveberechnet (v_stock_lot_balance). - Abverkaufprognose pro aktueller Charge wird im System gepflegt (
sellout_date,warning_state).
Korrekturregeln
- Korrekturen erfolgen ueber
adjustment-Bewegungen. - Keine direkten Netto-Setzungen als Betriebsprozess.
Akzeptanzkriterien
- Nach jeder Entnahme bleibt die Invariante
1x current + 1x openerhalten. - Negativbestand wird technisch verhindert.
- Warnstatus fuer UI ist ohne E-Mail nutzbar (
none,due_60d,due_now).
Komponente 5: Chargenrueckverfolgung
Ziel
Lueckenlose Rueckverfolgung Bestellung -> Position -> Produkt -> Charge -> Lagerbewegung.
Datenregeln
- Jede Entnahme schreibt
stock_move(move_type = out) mitlot_id. - Pro Entnahme wird
sales_order_line_lot_allocationgeschrieben. allocation_statusin Phase 1 standardmaessigallocated.
Akzeptanzkriterien
- Fuer jede ausgelieferte Position ist die verwendete Charge abfragbar.
- Rueckverfolgung funktioniert auch nach Teilstorno.
Komponente 6: Storno (Teil/Voll)
Ziel
Revisionssicheres Storno ohne physisches Loeschen.
Datenregeln
- Teil- und Vollstorno sind erlaubt.
sales_order_line.qty_cancelledwird fortgeschrieben.line_status:allocated,partially_cancelled,cancelled.- Bei Storno von bereits
allocatedMengen erfolgt Gegenbuchung alsadjustment inauf dieselbe Charge. - Bestellung bleibt erhalten; Statuswechsel statt Delete.
Akzeptanzkriterien
- Historische Ursprungs- und Korrekturbewegungen bleiben sichtbar.
- Vollstorno setzt
sales_order.order_status = cancelled.
Komponente 7: Webhooks
Inbound (n8n -> ERP)
- Transport: JSON via HTTP.
- Idempotenzschluessel:
BestellungNr. - Verarbeitung: Upsert Bestellung, Kontakt, Positionen, Lagerabgang, Audit.
- Quelle wird als
order_source = wixgespeichert.
Direkt (ERP intern)
- Transport: manuelle Erfassung in ERP-Maske.
- Nummernlogik: ERP erzeugt
external_refmitDIR--Praefix. - Verarbeitung: Bestellung (optional ohne Kontakt), Positionen, Lagerabgang, Audit.
Outbound (ERP -> n8n)
- Transport: Queue-basierter POST ueber
outbound_webhook_event. - Events Phase 1:
order.importedorder.cancelled.partialorder.cancelled.fulllot.auto_switched
- Signatur:
X-ERP-Signature(HMAC-SHA256). - Zustellung: Retry mit Backoff; final
dead_letter.
Akzeptanzkriterien
- Event-Zustellung ist idempotent (
event_keyeindeutig). - Fehlgeschlagene Events sind operativ auffindbar.
- Outbound-Payload enthaelt die Quelle (
order_source), damitwixunddirectgetrennt auswertbar sind.
Komponente 8: Audit und Betriebssicherheit
Audit
- Jede fachliche Aenderung schreibt
audit_log. - Pflichtfelder:
entity_name,entity_id,action,changed_at. - Vorher/Nachher-Daten werden als JSON gespeichert, wenn verfuegbar.
Guardrails
- Check-Constraints fuer Statuswerte.
- Check-Constraints fuer Mengenbereiche.
- Unique-Constraints fuer kritische Eindeutigkeiten.
- Outbox-Statusmaschine fuer robuste externe Zustellung.
Komponenten-Matrix
BestellerfassungZustandsquelle:sales_order,sales_order_lineHauptereignisse:order.imported,order.cancelled.*Kontakt/AdressenZustandsquelle:party,contact,addressHauptereignisse:order.importedArtikel-MappingZustandsquelle:sellable_item,external_item_alias,sellable_item_componentHauptereignisse:order.importedLagerverwaltungZustandsquelle:stock_lot,stock_move,v_stock_lot_balanceHauptereignisse:order.imported,lot.auto_switched,order.cancelled.*RueckverfolgungZustandsquelle:sales_order_line_lot_allocationHauptereignisse: alle Abgaenge und StornosOutbound-IntegrationZustandsquelle:outbound_webhook_eventHauptereignisse: alle publizierten Domain-Events
Nicht in Phase 1
- Rechnungswesen, Buchungssaetze, OCR-Verarbeitung.
- Automatisierte Preis-/Steuerneuberechnung.
- Vollautomatische Chargennummerngenerierung nach Produktklasse.
Change Governance
- Konzeptaenderungen zuerst in
CONCEPT.md. - Prozess- und Betriebsablauf in
PROCESS_PHASE1.md. - Technische Ableitung in
SCHEMA_PHASE1.sql. - Diese Spezifikation synchronisiert alle Komponenten auf Umsetzungsniveau.