mirror of
https://github.com/s-frick/effigenix.git
synced 2026-03-28 20:59:56 +01:00
615 lines
27 KiB
Markdown
615 lines
27 KiB
Markdown
# 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: 72–78°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: 72–78°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 |
|