1
0
Fork 0
mirror of https://github.com/s-frick/effigenix.git synced 2026-03-28 19:10:22 +01:00
effigenix/backend/docs/mvp/sequence-diagrams-e2e.md
2026-02-24 22:19:37 +01:00

27 KiB
Raw Blame History

Effigenix ERP End-to-End Real-Life Workflows

Reale Tagesabläufe einer Fleischerei, BC-übergreifend. Alle Diagramme nutzen Mermaid-Syntax.


Inhaltsverzeichnis

  1. Morgenroutine: Wareneingang Frischfleisch
  2. Tagesproduktion: Bratwurst herstellen
  3. Wochenplanung & Bedarfsermittlung
  4. Rückruf-Szenario: Salmonellen beim Lieferanten
  5. Qualitätsproblem in der Produktion
  6. MHD-Management: Ablaufende Ware & Abverkauf
  7. Inventur: Monatliche Bestandszählung
  8. Zentrale Produktion & Filialbelieferung

1. Morgenroutine: Wareneingang Frischfleisch

Szenario: Montag, 5:30 Uhr. Der LKW von Lieferant „Müller Fleisch" kommt mit 200 kg Schweineschulter und 80 kg Rindfleisch. Der Wareneingangs-Mitarbeiter muss die Lieferung prüfen, dokumentieren und einbuchen.

Beteiligte BCs: Procurement, Quality, Inventory, Master Data

sequenceDiagram
    actor Fahrer as LKW-Fahrer (Müller Fleisch)
    actor WE as Wareneingangs-Mitarbeiter
    participant MD as Master Data BC
    participant Proc as Procurement BC<br/>(PurchaseOrder, GoodsReceipt)
    participant QM as Quality BC<br/>(GoodsReceiptInspection)
    participant Inv as Inventory BC<br/>(Stock, StockMovement)

    Note over Fahrer,Inv: 🕠 05:30  LKW-Anlieferung

    Fahrer->>WE: Lieferschein übergeben<br/>(200kg Schweineschulter, 80kg Rind,<br/>Charge "MF-2026-0847", MHD 2026-03-03)

    WE->>Proc: Wareneingang erfassen
    Note right of Proc: GoodsReceipt anlegen<br/>Referenz: PurchaseOrder #PO-2026-041<br/>Lieferanten-Charge: MF-2026-0847<br/>MHD: 2026-03-03

    Note over WE,QM: 🌡️ HACCP-Pflichtprüfung

    WE->>QM: Qualitätsprüfung starten
    Note right of QM: GoodsReceiptInspection erstellt

    WE->>QM: 1. Temperaturmessung
    Note right of QM: Kerntemperatur Schwein: 2,1°C ✅<br/>Kerntemperatur Rind: 3,4°C ✅<br/>(Grenzwert: ≤ 4°C für Frischfleisch)

    WE->>QM: 2. Sichtkontrolle
    Note right of QM: Verpackung: unbeschädigt ✅<br/>Farbe: frisch, keine Verfärbung ✅<br/>Geruch: neutral, arttypisch ✅

    WE->>QM: 3. MHD-Prüfung
    Note right of QM: MHD 2026-03-03 → noch 7 Tage ✅<br/>(Mindest-Restlaufzeit: 3 Tage)

    WE->>QM: 4. Dokumentenprüfung
    Note right of QM: Lieferschein: vorhanden ✅<br/>Veterinärbescheinigung: vorhanden ✅<br/>Identitätskennzeichen: DE NW 20145 ✅

    QM-->>QM: Alle Prüfungen bestanden
    QM->>Proc: GoodsReceiptAccepted
    Note right of Proc: GoodsReceipt Status → ACCEPTED<br/>PurchaseOrder → FULLY_RECEIVED

    Note over WE,Inv: 📦 Bestand einbuchen

    Proc->>Inv: Event: GoodsReceiptAccepted
    Inv->>Inv: Stock.addBatch(Schweineschulter)
    Note right of Inv: StockBatch: MF-2026-0847<br/>BatchType: PURCHASED<br/>200 kg, MHD 2026-03-03<br/>Lagerort: KÜHLRAUM_1

    Inv->>Inv: Stock.addBatch(Rindfleisch)
    Note right of Inv: StockBatch: MF-2026-0847-R<br/>100 kg, MHD 2026-03-03

    Inv->>Inv: StockMovement.record(GOODS_RECEIPT, IN)
    Note right of Inv: 2× Bewegungen protokolliert<br/>(immutable Audit-Trail)

    Note over WE,Inv: ✅ 05:45  Ware eingelagert, System aktuell

Sonderfall: Prüfung fehlgeschlagen

sequenceDiagram
    actor WE as Wareneingangs-Mitarbeiter
    actor Fahrer as LKW-Fahrer
    participant QM as Quality BC
    participant Proc as Procurement BC

    Note over WE,Proc: ❌ Temperatur zu hoch

    WE->>QM: Temperaturmessung: 7,2°C
    Note right of QM: GRENZWERT ÜBERSCHRITTEN!<br/>Max. erlaubt: 4°C<br/>Gemessen: 7,2°C

    QM->>QM: TemperatureCriticalLimitExceeded
    QM->>Proc: GoodsReceiptRejected
    Note right of Proc: Grund: Kühlkette unterbrochen<br/>GoodsReceipt Status → REJECTED<br/>PurchaseOrder bleibt CONFIRMED

    WE->>Fahrer: Ware zurückweisen
    Note right of WE: Ablehnungsprotokoll erstellt<br/>Fotos dokumentiert<br/>Lieferant wird informiert

    Note over WE,Proc: Kein Bestand eingebucht!<br/>Reklamation beim Lieferant

2. Tagesproduktion: Bratwurst herstellen

Szenario: Dienstag, 6:00 Uhr. Der Metzgermeister soll laut Wochenplan 150 kg Nürnberger Bratwurst herstellen. Rezept „R-NB-001" (Ausbeute 85%, Haltbarkeit 5 Tage). Zutaten: Schweineschulter, Speck, Gewürzmischung, Naturdärme.

Beteiligte BCs: Production, Inventory, (Labeling, Quality)

sequenceDiagram
    actor PL as Produktionsleiter
    actor MM as Metzgermeister
    participant PO as Production BC<br/>(ProductionOrder)
    participant Batch as Production BC<br/>(Batch)
    participant Recipe as Production BC<br/>(Recipe)
    participant Stock as Inventory BC<br/>(Stock)
    participant SM as Inventory BC<br/>(StockMovement)
    participant Label as Labeling BC<br/>(ProductLabel)

    Note over PL,Label: 🕕 06:00  Produktionsauftrag vorbereiten

    PL->>PO: Produktionsauftrag anlegen
    Note right of PO: Rezept: R-NB-001 (Nürnberger)<br/>Menge: 150 kg<br/>Datum: 2026-02-24<br/>Priorität: NORMAL<br/>Status → PLANNED

    PL->>PO: Auftrag freigeben
    Note right of PO: Prüfung: Rezept R-NB-001 ist ACTIVE ✅<br/>Status → RELEASED

    PL->>PO: Produktion starten
    PO->>Batch: Charge automatisch erstellen
    Note right of Batch: BatchNumber: P-2026-02-24-001<br/>Geplante Menge: 150 kg<br/>Status → IN_PRODUCTION
    PO-->>PO: Status → IN_PRODUCTION<br/>BatchId verknüpft

    Note over MM,SM: 🥩 06:15  Material vorbereiten & reservieren

    PO->>Recipe: Materialbedarf berechnen
    Note right of Recipe: Ausbeute 85% → Bedarf = 150/0,85 = 176 kg<br/>Schweineschulter: 60% → 106 kg<br/>Speck: 25% → 44 kg<br/>Gewürzmischung: 10% → 18 kg<br/>Naturdärme: 5% → 9 kg

    MM->>Stock: Material reservieren (FEFO)
    Note right of Stock: Schweineschulter: 106 kg reservieren
    Stock->>Stock: FEFO-Allokation
    Note right of Stock: Charge MF-2026-0847 (MHD 03.03): 106 kg ✅<br/>(älteste Charge zuerst)
    Stock-->>MM: Reservierung erstellt

    MM->>Stock: Speck reservieren
    Note right of Stock: Charge SP-2026-0812 (MHD 05.03): 44 kg ✅

    MM->>Stock: Gewürze + Därme reservieren
    Note right of Stock: GW-2026-0099 (MHD 15.08): 18 kg ✅<br/>ND-2026-0201 (MHD 20.04): 9 kg ✅

    Note over MM,SM: 🔪 06:30  Produktion & Entnahme

    MM->>Stock: Reservierungen bestätigen (entnehmen)
    Stock->>SM: StockMovement(PRODUCTION_CONSUMPTION, OUT)
    Note right of SM: 4× Entnahme-Bewegungen protokolliert

    MM->>Batch: Verbrauch dokumentieren
    Note right of Batch: Consumption 1: MF-2026-0847, 106 kg Schweineschulter<br/>Consumption 2: SP-2026-0812, 44 kg Speck<br/>Consumption 3: GW-2026-0099, 18 kg Gewürze<br/>Consumption 4: ND-2026-0201, 9 kg Därme
    Note right of Batch: → Chargen-Genealogie aufgebaut!<br/>Rückverfolgbar bis zum Lieferanten

    Note over MM,Label: ⚖️ 09:30  Produktion abschließen

    MM->>Batch: Charge abschließen
    Note right of Batch: Ist-Menge: 148 kg (gewogen)<br/>Verschnitt: 3,5 kg<br/>Ausbeute real: 148/177 = 83,6%<br/>MHD berechnet: 2026-02-24 + 5 = 2026-03-01<br/>Status → COMPLETED

    Batch->>Stock: Event: BatchCompleted
    Stock->>Stock: addBatch(P-2026-02-24-001)
    Note right of Stock: Neuer StockBatch:<br/>148 kg Nürnberger Bratwurst<br/>BatchType: PRODUCED<br/>MHD: 2026-03-01<br/>Lagerort: KÜHLRAUM_2
    Stock->>SM: StockMovement(PRODUCTION_OUTPUT, IN)

    PL->>PO: Produktionsauftrag abschließen
    Note right of PO: Prüfung: Charge COMPLETED ✅<br/>Status → COMPLETED

    Note over MM,Label: 🏷️ Etikett steht bereit

    Note right of Label: ProductLabel für Nürnberger verfügbar:<br/>Zutaten: Schweinefleisch (60%),<br/>Speck (25%), Gewürze...<br/>Allergene: SELLERIE, SENF (auto)<br/>MHD: 01.03.2026<br/>Nährwerte pro 100g berechnet

3. Wochenplanung & Bedarfsermittlung

Szenario: Freitag Nachmittag. Der Produktionsleiter plant die Produktion für nächste Woche. Er prüft Bestände, legt Aufträge an und das System ermittelt automatisch den Materialbedarf und löst Bestellungen aus.

Beteiligte BCs: Production, Inventory, Procurement, Master Data

sequenceDiagram
    actor PL as Produktionsleiter
    actor EK as Einkäufer
    participant PO as Production BC<br/>(ProductionOrder)
    participant Recipe as Production BC<br/>(Recipe)
    participant Stock as Inventory BC<br/>(Stock)
    participant Demand as Procurement BC<br/>(DemandPlan)
    participant Order as Procurement BC<br/>(PurchaseOrder)
    participant MD as Master Data BC<br/>(Supplier)

    Note over PL,MD: 📋 Freitag 14:00  Wochenplanung

    PL->>Stock: Aktuelle Bestände prüfen
    Stock-->>PL: Bestandsübersicht:
    Note right of Stock: Schweineschulter: 94 kg (MHD 03.03)<br/>Speck: 36 kg (MHD 05.03)<br/>Rindfleisch: 80 kg (MHD 03.03)<br/>Gewürze: 45 kg (MHD 15.08)<br/>⚠️ Schweineschulter unter Mindestbestand (100 kg)!

    PL->>PO: Aufträge für nächste Woche anlegen
    Note right of PO: Mo: 200 kg Bratwurst (R-NB-001)<br/>Di: 100 kg Leberwurst (R-LW-003)<br/>Mi: 150 kg Wiener (R-WI-002)<br/>Do: 80 kg Leberkäse (R-LK-005)

    PL->>PO: Alle Aufträge freigeben
    PO->>PO: 4× Status → RELEASED

    Note over PL,MD: 📊 Bedarfsermittlung

    PO->>Demand: Event: ProductionOrderReleased (4×)
    Demand->>Recipe: Materialbedarf aus Rezepten berechnen
    Note right of Recipe: Mo Bratwurst: 235 kg Rohstoffe<br/>Di Leberwurst: 125 kg Rohstoffe<br/>Mi Wiener: 180 kg Rohstoffe<br/>Do Leberkäse: 100 kg Rohstoffe

    Demand->>Stock: Aktuelle Bestände abfragen
    Stock-->>Demand: Verfügbare Mengen

    Demand->>Demand: Bedarfsplan generieren
    Note right of Demand: Schweineschulter:<br/>  Bedarf: 320 kg<br/>  Bestand: 94 kg<br/>  Fehlmenge: 226 kg<br/>  + Sicherheitsbestand: 50 kg<br/>  → Bestellvorschlag: 276 kg<br/><br/>Speck:<br/>  Bedarf: 95 kg<br/>  Bestand: 36 kg<br/>  → Bestellvorschlag: 109 kg<br/><br/>Rindfleisch:<br/>  Bedarf: 60 kg<br/>  Bestand: 80 kg<br/>  → kein Bedarf ✅<br/><br/>Gewürze: → kein Bedarf ✅

    Note over EK,MD: 🛒 Bestellungen aufgeben

    EK->>Demand: Bedarfsplan prüfen & genehmigen
    Note right of Demand: Status → APPROVED

    EK->>MD: Lieferantenkonditionen prüfen
    MD-->>EK: Müller Fleisch: Mindestbestellmenge 50 kg,<br/>Lieferzeit 1 Tag, Preis 5,80€/kg

    EK->>Order: Bestellung anlegen
    Note right of Order: PurchaseOrder #PO-2026-048<br/>Lieferant: Müller Fleisch<br/>Pos 1: 280 kg Schweineschulter (≥ MBM)<br/>Pos 2: 110 kg Speck<br/>Lieferdatum: Montag 05:00<br/>Gesamtwert: 2.262,00€<br/>Status → ORDERED

    EK->>Order: Bestellung an Lieferant senden
    Note right of Order: Status → CONFIRMED<br/>(Lieferant hat bestätigt)

    Note over PL,MD: ✅ Planung abgeschlossen<br/>Mo-Lieferung und Produktion gesichert

4. Rückruf-Szenario: Salmonellen beim Lieferanten

Szenario: Mittwoch, 10:00 Uhr. Das Veterinäramt informiert, dass bei Lieferant „Müller Fleisch" Salmonellen in der Charge „MF-2026-0847" (Schweineschulter, geliefert am Montag) nachgewiesen wurden. Sofortmaßnahmen sind nötig.

Beteiligte BCs: Quality, Production (Traceability), Inventory, Filiales

sequenceDiagram
    actor Amt as Veterinäramt
    actor QM as Qualitätsmanager
    actor FL as Filialleiter (3 Filialen)
    participant Trace as Production BC<br/>(TraceabilityService)
    participant Quality as Quality BC<br/>(QualityHold)
    participant Stock as Inventory BC<br/>(Stock)
    participant SM as Inventory BC<br/>(StockMovement)
    participant Branch as Filiales BC

    Note over Amt,Branch: ☎️ 10:00  Veterinäramt meldet Kontamination

    Amt->>QM: Salmonellen in Charge MF-2026-0847<br/>(Schweineschulter, Müller Fleisch)

    Note over QM,Branch: 🔍 10:05  Vorwärts-Tracing starten

    QM->>Trace: traceForward("MF-2026-0847")
    Trace->>Trace: Suche: Welche Chargen verwenden MF-2026-0847?

    Trace-->>QM: Betroffene Chargen ermittelt:
    Note right of Trace: Stufe 1  Direkte Verwendung:<br/>  P-2026-02-24-001: 148 kg Nürnberger Bratwurst<br/>  P-2026-02-24-003: 95 kg Leberwurst<br/><br/>Stufe 2  Weiterverarbeitung:<br/>  (keine  Endprodukte)

    QM->>SM: Wo ist die Ware jetzt?
    SM-->>QM: Bestandsbewegungen:
    Note right of SM: P-2026-02-24-001 (Bratwurst 148kg):<br/>  → 50 kg Filiale Hauptstraße (verkauft: 12 kg)<br/>  → 40 kg Filiale Marktplatz (verkauft: 8 kg)<br/>  → 58 kg Zentrale (Lager, unverkauft)<br/><br/>P-2026-02-24-003 (Leberwurst 95kg):<br/>  → 95 kg Zentrale (Lager, unverkauft)<br/><br/>Rohstoff-Rest:<br/>  → 0 kg MF-2026-0847 (vollständig verbraucht)

    Note over QM,Branch: 🚨 10:15  Sofortige Qualitätssperre

    QM->>Quality: QualityHold initiieren
    Note right of Quality: Grund: CONTAMINATION_SUSPECTED<br/>Referenz: Veterinäramt-Meldung #VA-2026-0412

    Quality->>Stock: Event: QualityHoldCreated (Bratwurst)
    Stock->>Stock: blockBatch(P-2026-02-24-001)
    Note right of Stock: Bratwurst: AVAILABLE → BLOCKED<br/>Kann nicht mehr verkauft/entnommen werden

    Quality->>Stock: Event: QualityHoldCreated (Leberwurst)
    Stock->>Stock: blockBatch(P-2026-02-24-003)
    Note right of Stock: Leberwurst: AVAILABLE → BLOCKED

    Note over QM,Branch: 📞 10:20  Filialen informieren

    QM->>Branch: Betroffene Filialen ermitteln
    Branch-->>QM: Filiale Hauptstraße, Filiale Marktplatz

    QM->>FL: SOFORT: Bratwurst Charge P-2026-02-24-001<br/>aus Theke nehmen! Gesperrt wegen<br/>Salmonellen-Verdacht Rohstoff.

    FL->>Stock: Ware aus Verkauf entfernt
    Note right of Stock: Physisch separiert & gekennzeichnet

    Note over QM,Branch: 📋 10:30  Rückruf-Dokumentation

    QM->>Quality: Korrekturmaßnahmen dokumentieren
    Note right of Quality: 1. Alle betroffenen Chargen gesperrt ✅<br/>2. Filialen informiert ✅<br/>3. Ware aus Verkauf entfernt ✅<br/>4. Veterinäramt Rückmeldung: 20 kg verkauft<br/>5. Kundeninformation vorbereitet

    QM->>Quality: Bereits verkaufte Ware:
    Note right of Quality: 20 kg verkauft (12+8 kg)<br/>→ Kundenrückruf-Aushang in Filialen<br/>→ Social-Media-Warnung<br/>→ Veterinäramt informiert

    Note over QM,Branch: 🧪 Nächste Tage  Laborergebnis abwarten

    alt Laborergebnis: Keine Salmonellen in Endprodukt
        Note over QM,Branch: ✅ Entwarnung
        actor Approver as Chef (≠ QM)
        QM->>Quality: Entwarnung dokumentieren
        Approver->>Quality: QualityHold freigeben (4-Augen)
        Note right of Quality: initiatedBy ≠ releasedBy ✅
        Quality->>Stock: Event: QualityHoldReleased
        Stock->>Stock: unblockBatch(P-2026-02-24-001)
        Stock->>Stock: unblockBatch(P-2026-02-24-003)
        Note right of Stock: Status: BLOCKED → AVAILABLE<br/>Ware wieder verkaufbar
    else Laborergebnis: Salmonellen bestätigt
        Note over QM,Branch: ❌ Vernichtung
        QM->>Quality: Ablehnung dokumentieren
        Quality->>Stock: Event: QualityHoldRejected
        Stock->>Stock: removeBatch(P-2026-02-24-001, FULL)
        Stock->>Stock: removeBatch(P-2026-02-24-003, FULL)
        Stock->>SM: StockMovement(WASTE, OUT)
        Note right of SM: 2× Vernichtungs-Buchungen<br/>Grund: Salmonellen-Kontamination<br/>Referenz: VA-2026-0412
    end

5. Qualitätsproblem in der Produktion

Szenario: Während der Bratwurstproduktion misst der Metzgermeister bei der Kerntemperaturprüfung nach dem Brühen 65°C statt der geforderten mindestens 72°C. Das CCP (Critical Control Point) ist nicht erreicht.

Beteiligte BCs: Quality, Production, Inventory

sequenceDiagram
    actor MM as Metzgermeister
    actor QM as Qualitätsmanager
    actor Chef as Betriebsleiter
    participant Batch as Production BC<br/>(Batch)
    participant QC as Quality BC<br/>(ProcessParameter)
    participant QH as Quality BC<br/>(QualityHold)
    participant Stock as Inventory BC

    Note over MM,Stock: 🌡️ 08:45  CCP-Messung nach Brühvorgang

    MM->>QC: Kerntemperatur messen
    Note right of QC: CCP: CORE_TEMPERATURE<br/>Charge: P-2026-02-24-002 (Wiener)<br/>Gemessen: 65°C<br/>Akzeptabler Bereich: 7278°C<br/>Status: OUT_OF_SPEC ❌

    QC->>QC: DeviationRecorded
    Note right of QC: Abweichung: -7°C unter Minimum

    Note over MM,Stock: 🚨 Automatische Eskalation

    QC->>QH: QualityHold automatisch erstellt
    Note right of QH: Grund: CCP_DEVIATION<br/>Charge: P-2026-02-24-002<br/>Details: Kerntemp 65°C < 72°C Minimum

    MM->>QM: Abweichung melden

    Note over QM,Stock: 🔧 Korrekturmaßnahme

    QM->>QH: Korrekturmaßnahme festlegen
    Note right of QH: Maßnahme: Erneutes Brühen<br/>auf 75°C Kerntemperatur<br/>Verantwortlich: Metzgermeister<br/>Frist: sofort

    MM->>Batch: Erneut brühen (Prozess wiederholen)

    MM->>QC: Zweite Kerntemperatur-Messung
    Note right of QC: CCP: CORE_TEMPERATURE<br/>Gemessen: 74°C<br/>Akzeptabler Bereich: 7278°C<br/>Status: IN_SPEC ✅

    QM->>QH: Korrekturmaßnahme dokumentieren
    Note right of QH: Ergebnis: Erfolgreich nachgebrüht<br/>Zweitmessung: 74°C ✅

    Chef->>QH: QualityHold freigeben
    Note right of QH: 4-Augen: QM initiiert, Chef gibt frei ✅

    Note over MM,Stock: ✅ Produktion kann fortgesetzt werden

    MM->>Batch: Charge abschließen
    Note right of Batch: Alle CCP-Werte dokumentiert<br/>Korrekturmaßnahme nachvollziehbar<br/>Status → COMPLETED

    Batch->>Stock: Event: BatchCompleted
    Note right of Stock: Ware eingebucht<br/>Audit-Trail lückenlos

6. MHD-Management: Ablaufende Ware & Abverkauf

Szenario: Der tägliche System-Job (6:00 Uhr) erkennt, dass 25 kg Leberwurst morgen ablaufen und 40 kg Aufschnitt in 2 Tagen. Das Team muss reagieren.

Beteiligte BCs: Inventory, (Sales, Labeling noch nicht implementiert, daher vereinfacht)

sequenceDiagram
    participant Cron as Täglicher Scheduler<br/>(06:00 Uhr)
    participant Stock as Inventory BC<br/>(Stock)
    actor VK as Verkaufsleiter
    actor Theke as Theken-Mitarbeiter
    participant SM as Inventory BC<br/>(StockMovement)

    Note over Cron,SM: ⏰ 06:00  Tägliche MHD-Prüfung

    Cron->>Stock: markExpiredBatches(today = 2026-02-24)

    Stock->>Stock: Alle Chargen prüfen
    Note right of Stock: ❌ EXPIRED (MHD überschritten):<br/>  LW-Charge P-2026-02-19-004: 3 kg Weißwurst<br/>  (MHD war 2026-02-23 → gestern abgelaufen)<br/><br/>⚠️ EXPIRING_SOON (innerhalb MinimumShelfLife):<br/>  LW-Charge P-2026-02-20-002: 25 kg Leberwurst<br/>  (MHD 2026-02-25 → morgen, MinShelfLife=2d)<br/><br/>  AS-Charge P-2026-02-21-001: 40 kg Aufschnitt<br/>  (MHD 2026-02-26 → übermorgen)

    Stock-->>Stock: Events publiziert:
    Note right of Stock: BatchExpired(Weißwurst, 3kg)<br/>BatchExpiringSoon(Leberwurst, 25kg, 1 Tag)<br/>BatchExpiringSoon(Aufschnitt, 40kg, 2 Tage)

    Note over VK,SM: 📊 06:30  Verkaufsleiter prüft Warnungen

    VK->>Stock: MHD-Warnungen abrufen
    Stock-->>VK: 3 Positionen mit Handlungsbedarf

    Note over VK,SM: 🗑️ Abgelaufene Ware entsorgen

    VK->>Theke: Weißwurst 3 kg entsorgen
    Theke->>Stock: removeBatch(P-2026-02-19-004, 3kg)
    Stock->>SM: StockMovement(WASTE, OUT)
    Note right of SM: Grund: MHD abgelaufen<br/>3 kg Weißwurst vernichtet

    Note over VK,SM: 💰 Bald ablaufende Ware rabattieren

    VK->>Theke: Leberwurst 25 kg: 30% Rabatt-Etikett
    Note right of Theke: Preisreduzierung im Verkauf<br/>"Heute 30% günstiger"

    VK->>Theke: Aufschnitt 40 kg: Aktionsplatzierung
    Note right of Theke: Sichtbare Platzierung in Theke<br/>Ggf. morgen rabattieren

    Note over VK,SM: 🔄 Bei Verkauf normale Entnahme (FEFO)

    Note right of SM: FEFO stellt automatisch sicher,<br/>dass älteste Chargen zuerst<br/>entnommen werden  auch<br/>im regulären Verkauf

7. Inventur: Monatliche Bestandszählung

Szenario: Letzter Freitag im Monat. Inventur im Kühlraum 1 (Rohstoffe). Der Lagermitarbeiter zählt, der Betriebsleiter genehmigt. Abweichungen werden automatisch ausgeglichen.

Beteiligte BCs: Inventory

sequenceDiagram
    actor Lager as Lagermitarbeiter (Zähler)
    actor Chef as Betriebsleiter (Prüfer)
    participant IC as Inventory BC<br/>(InventoryCount)
    participant Stock as Inventory BC<br/>(Stock)
    participant SM as Inventory BC<br/>(StockMovement)

    Note over Lager,SM: 📋 Freitag 16:00  Inventur starten

    Lager->>IC: Inventur anlegen für KÜHLRAUM_1
    IC->>Stock: Aktuelle Soll-Bestände abrufen
    Stock-->>IC: Bestände nach Artikel:
    Note right of IC: Soll-Bestände auto-befüllt:<br/>Schweineschulter: 94,0 kg<br/>Rindfleisch: 80,0 kg<br/>Speck: 36,0 kg<br/>Hackfleisch: 22,5 kg<br/>Status → COUNTING

    Note over Lager,SM: 📦 16:15  Physische Zählung

    Lager->>IC: Schweineschulter: 91,5 kg (Ist)
    Note right of IC: Soll: 94,0 kg → Differenz: -2,5 kg

    Lager->>IC: Rindfleisch: 80,0 kg (Ist)
    Note right of IC: Soll: 80,0 kg → Differenz: 0 kg ✅

    Lager->>IC: Speck: 37,2 kg (Ist)
    Note right of IC: Soll: 36,0 kg → Differenz: +1,2 kg

    Lager->>IC: Hackfleisch: 20,0 kg (Ist)
    Note right of IC: Soll: 22,5 kg → Differenz: -2,5 kg

    Note over Lager,SM: ✍️ 16:45  Zählung einreichen

    Lager->>IC: Zählung einreichen (submitForApproval)
    Note right of IC: Status → SUBMITTED<br/>Zähler: Lagermitarbeiter

    Note over Chef,SM: 👀 17:00  4-Augen-Prüfung

    Chef->>IC: Abweichungen prüfen
    Note right of IC: Abweichungen:<br/>Schweineschulter: -2,5 kg (Schwund?)<br/>Speck: +1,2 kg (Wiegefehler?)<br/>Hackfleisch: -2,5 kg (nicht erfasste Entnahme?)

    Chef->>IC: Inventur genehmigen
    Note right of IC: Prüfung: Chef ≠ Lagermitarbeiter ✅ (4-Augen)<br/>Status → COMPLETED

    Note over Chef,SM: ⚖️ Automatische Ausgleichsbuchungen

    IC->>SM: Ausgleich Schweineschulter
    Note right of SM: StockMovement(ADJUSTMENT, OUT)<br/>-2,5 kg Schweineschulter<br/>Grund: Inventurdifferenz

    IC->>SM: Ausgleich Speck
    Note right of SM: StockMovement(ADJUSTMENT, IN)<br/>+1,2 kg Speck<br/>Grund: Inventurdifferenz

    IC->>SM: Ausgleich Hackfleisch
    Note right of SM: StockMovement(ADJUSTMENT, OUT)<br/>-2,5 kg Hackfleisch<br/>Grund: Inventurdifferenz

    IC->>Stock: Bestände korrigiert
    Note right of Stock: Schweineschulter: 94,0 → 91,5 kg<br/>Rindfleisch: 80,0 kg (unverändert)<br/>Speck: 36,0 → 37,2 kg<br/>Hackfleisch: 22,5 → 20,0 kg

    Note over Lager,SM: ✅ 17:10  Inventur abgeschlossen<br/>Alle Bewegungen im Audit-Trail

8. Zentrale Produktion & Filialbelieferung

Szenario: Die Zentrale (Hauptfiliale mit Produktion) stellt morgens 300 kg Bratwurst her und verteilt sie an 3 Filialen. Der Transport muss chargengenau dokumentiert werden für die Rückverfolgbarkeit.

Beteiligte BCs: Production, Inventory, Filiales

sequenceDiagram
    actor PL as Produktionsleiter (Zentrale)
    actor FL_A as Filialleiter Hauptstraße
    actor FL_B as Filialleiter Marktplatz
    actor Fahrer as Fahrer/Auslieferer
    participant Batch as Production BC<br/>(Batch)
    participant DP as Filiales BC<br/>(DistributionPlan)
    participant IBT as Filiales BC<br/>(InterBranchTransfer)
    participant Stock_Z as Inventory BC<br/>(Stock  Zentrale)
    participant Stock_A as Inventory BC<br/>(Stock  Hauptstraße)
    participant Stock_B as Inventory BC<br/>(Stock  Marktplatz)
    participant SM as Inventory BC<br/>(StockMovement)

    Note over PL,SM: 🏭 06:00-09:00  Zentrale Produktion

    PL->>Batch: Charge P-2026-02-24-001 abschließen
    Note right of Batch: 300 kg Bratwurst<br/>MHD: 2026-03-01<br/>Status → COMPLETED

    Batch->>Stock_Z: Event: BatchCompleted
    Stock_Z->>Stock_Z: addBatch(P-2026-02-24-001, 300 kg)
    Note right of Stock_Z: 300 kg im Zentrallager

    Note over PL,SM: 📦 09:15  Verteilplan erstellen

    PL->>DP: Verteilplan anlegen
    Note right of DP: Charge: P-2026-02-24-001 (300 kg)<br/>Produzierende Filiale: Zentrale<br/><br/>Verteilung:<br/>  → Hauptstraße: 100 kg<br/>  → Marktplatz: 80 kg<br/>  → Verbleibt Zentrale: 120 kg<br/><br/>Summe: 300 kg ✅

    Note over PL,SM: 🚚 09:30  Transfers anlegen

    DP->>IBT: Transfer Zentrale → Hauptstraße
    Note right of IBT: 100 kg Bratwurst<br/>Charge: P-2026-02-24-001<br/>MHD: 2026-03-01<br/>Status → REQUESTED

    DP->>IBT: Transfer Zentrale → Marktplatz
    Note right of IBT: 80 kg Bratwurst<br/>Charge: P-2026-02-24-001<br/>MHD: 2026-03-01<br/>Status → REQUESTED

    FL_A->>IBT: Transfer genehmigen
    Note right of IBT: Status → APPROVED
    FL_B->>IBT: Transfer genehmigen

    Note over Fahrer,SM: 🚚 10:00  Auslieferung

    Fahrer->>IBT: Versand bestätigen (beide)
    IBT->>Stock_Z: Event: TransferShipped
    Stock_Z->>Stock_Z: removeBatch(P-2026-02-24-001, 100 kg)
    Stock_Z->>Stock_Z: removeBatch(P-2026-02-24-001, 80 kg)
    Stock_Z->>SM: 2× StockMovement(INTER_BRANCH_TRANSFER, OUT)
    Note right of Stock_Z: Zentrale: 300 → 120 kg

    Note over Fahrer,SM: 📍 10:30  Ankunft Hauptstraße

    FL_A->>IBT: Empfang bestätigen (98 kg erhalten)
    Note right of IBT: Geplant: 100 kg<br/>Empfangen: 98 kg<br/>(2 kg Transportverlust)<br/>Status → RECEIVED

    IBT->>Stock_A: Event: TransferReceived
    Stock_A->>Stock_A: addBatch(P-2026-02-24-001, 98 kg)
    Stock_A->>SM: StockMovement(INTER_BRANCH_TRANSFER, IN)
    Note right of Stock_A: Hauptstraße: 0 → 98 kg Bratwurst<br/>Gleiche Charge-ID! Rückverfolgbar.

    Note over Fahrer,SM: 📍 11:00  Ankunft Marktplatz

    FL_B->>IBT: Empfang bestätigen (80 kg erhalten)
    Note right of IBT: Geplant: 80 kg, Empfangen: 80 kg ✅

    IBT->>Stock_B: Event: TransferReceived
    Stock_B->>Stock_B: addBatch(P-2026-02-24-001, 80 kg)
    Stock_B->>SM: StockMovement(INTER_BRANCH_TRANSFER, IN)
    Note right of Stock_B: Marktplatz: 0 → 80 kg Bratwurst

    DP->>DP: Alle Lieferungen abgeschlossen
    Note right of DP: Status → COMPLETED

    Note over PL,SM: ✅ Ergebnis: 300 kg verteilt
    Note right of SM: Zentrale: 120 kg<br/>Hauptstraße: 98 kg (2 kg Schwund)<br/>Marktplatz: 80 kg<br/><br/>Chargen-ID überall identisch!<br/>→ Bei Rückruf: alle 3 Filialen<br/>   sofort identifizierbar

Workflow-Zusammenfassung

# Workflow Beteiligte BCs Status
1 Wareneingang Frischfleisch Procurement, Quality, Inventory Quality/Procurement: geplant, Inventory: implementiert
2 Tagesproduktion Bratwurst Production, Inventory, Labeling Production: teilw. impl., Inventory: implementiert, Labeling: geplant
3 Wochenplanung & Bedarfsermittlung Production, Inventory, Procurement Procurement: geplant
4 Rückruf-Szenario Quality, Production, Inventory, Filiales Tracing: offen (#43/#44), Quality: geplant
5 Qualitätsproblem Produktion Quality, Production Quality: geplant
6 MHD-Management Inventory Implementiert (#10, #11)
7 Inventur Inventory Offen (#17#20)
8 Zentrale Produktion & Filialbelieferung Production, Inventory, Filiales Filiales: geplant

Legende

Symbol Bedeutung
actor Menschlicher Akteur mit Rolle
participant Bounded Context + Aggregate
Note Fachliche Details, Validierungen, Berechnungen
alt/else Entscheidungspunkt
→ Event: Domain Event zwischen BCs
Prüfung bestanden / Aktion erfolgreich
Prüfung fehlgeschlagen / Fehler
⚠️ Warnung / Handlungsbedarf