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

615 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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](#1-morgenroutine-wareneingang-frischfleisch)
2. [Tagesproduktion: Bratwurst herstellen](#2-tagesproduktion-bratwurst-herstellen)
3. [Wochenplanung & Bedarfsermittlung](#3-wochenplanung--bedarfsermittlung)
4. [Rückruf-Szenario: Salmonellen beim Lieferanten](#4-rückruf-szenario-salmonellen-beim-lieferanten)
5. [Qualitätsproblem in der Produktion](#5-qualitätsproblem-in-der-produktion)
6. [MHD-Management: Ablaufende Ware & Abverkauf](#6-mhd-management-ablaufende-ware--abverkauf)
7. [Inventur: Monatliche Bestandszählung](#7-inventur-monatliche-bestandszählung)
8. [Zentrale Produktion & Filialbelieferung](#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
```mermaid
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
```mermaid
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)
```mermaid
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
```mermaid
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
```mermaid
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
```mermaid
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)
```mermaid
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
```mermaid
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
```mermaid
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 |