# DDD Domain Model - Effigenix Fleischerei-ERP **Sprache:** Deutsch (für Domain-Experten) **Code:** Englisch (siehe Java Style Guide) **Erstellt:** 2026-02-17 **Technologie:** Java 21+ mit DDD + Clean Architecture --- ## 📚 Dokumentationsstruktur ### Übersichtsdokumente | Dokument | Beschreibung | |----------|--------------| | `00-overview.md` | Gesamtüberblick, DDD-Phasen, Projektziele | | `01-domain-classification.md` | Core/Supporting/Generic Klassifizierung mit Begründungen | | `02-bounded-contexts.md` | **Context Map** (Mermaid) + Kontextbeziehungen | | `03-ubiquitous-language.md` | Glossar DE/EN für alle Bounded Contexts | ### Kern-Domäne (Core) - 7 Kontexte | Dokument | Bounded Context | Aggregates | |----------|-----------------|------------| | `04-produktions-kontext.md` | **Produktion** | Rezept, Charge, Produktionsauftrag | | `05-qualitaets-kontext.md` | **Qualität (HACCP/QM)** | Temperaturprotokoll, Reinigungsnachweis, Wareneingangsprüfung, Schulungsnachweis, Wartungsprotokoll | | `06-labeling-bc.md` | **Deklaration** | Produktetikett, Allergene-Matrix | | `07-bestandsfuehrungs-kontext.md` | **Bestandsführung** | Bestand, Bestandsbewegung | | `08-procurement-bc.md` | **Beschaffung** | Bestellung, Wareneingang, Bedarfsplan | | `09-filiales-bc.md` | **Filialen** | Filiale, Interfilial-Transfer, Verteilungsplan | ### Unterstützende Domäne (Supporting) - 3 Kontexte | Dokument | Bounded Context | Aggregates | |----------|-----------------|------------| | `10-supporting-bcs.md` | **Stammdaten** | Artikel, Lieferant, Kunde | | `10-supporting-bcs.md` | **Verkauf** | Auftrag, Rechnung, Lieferschein | | `10-supporting-bcs.md` | **Waagen-Integration** | Synchronisations-Job, Bondaten-Import | --- ## 🎯 Verwendung für Domain-Experten ### Für Besprechungen mit Fleischerei-Experten **Diese Dokumente verwenden deutsche Begriffe**, um die Kommunikation zu erleichtern: - ✅ **Rezept** statt Recipe - ✅ **Charge** statt Batch - ✅ **Wareneingang** statt Goods Receipt - ✅ **Rückverfolgbarkeit** statt Traceability **Im Code werden englische Begriffe verwendet** (siehe `03-ubiquitous-language.md`): ```java // Dokumentation: Rezept // Code: Recipe public class Recipe { ... } // Dokumentation: Charge // Code: Batch public class Batch { ... } ``` --- ## 🔍 Wichtige Konzepte ### 1. Aggregate Ein **Aggregat** ist eine Gruppe von Objekten, die immer konsistent zusammen geändert werden müssen. **Beispiel: Rezept-Aggregat** ``` Rezept (Aggregate Root) ├── RezeptId ├── Name ├── Zutaten[] (Teil des Aggregats) ├── Produktionsschritte[] (Teil des Aggregats) └── Status ``` - **Aggregate Root** = Einstiegspunkt (nur Rezept ist von außen zugänglich) - **Invarianten** = Regeln, die IMMER gelten müssen (z.B. "Rezept muss mind. 1 Zutat haben") - **Transaktionsgrenze** = Ein Rezept = eine Datenbanktransaktion ### 2. Wertobjekte (Value Objects) **Unveränderliche Objekte**, die nur durch ihre Werte definiert sind. **Beispiel:** ```java // Zwei Geldbeträge mit gleichen Werten sind identisch Money betrag1 = Money.of(100, "EUR"); Money betrag2 = Money.of(100, "EUR"); // betrag1.equals(betrag2) = true // Im Gegensatz zu Entities (haben ID) Charge charge1 = Charge.of(ChargenId.of("CHARGE-001"), ...); Charge charge2 = Charge.of(ChargenId.of("CHARGE-002"), ...); // charge1.equals(charge2) = false (verschiedene IDs) ``` ### 3. Rückverfolgbarkeit (Traceability) **KRITISCH für Fleischerei-Betriebe!** ```mermaid graph LR A[Lieferanten-Charge
SUPPLIER-12345] -->|verwendet in| B[Produktions-Charge
BATCH-2026-02-17-001] B -->|verkauft als| C[Rechnung
INV-2026-02-20-042] C -->|an| D[Kunde
CUST-123] style A fill:#ffe6e6 style B fill:#e6f3ff style C fill:#e6ffe6 style D fill:#fff9e6 ``` **Bei Rückruf:** 1. Finde alle Produktionschargen mit betroffener Lieferanten-Charge 2. Finde alle Verkäufe dieser Produktionschargen 3. Informiere betroffene Kunden **Code:** Siehe `07-bestandsfuehrungs-kontext.md` - Rückverfolgbarkeits-Beispiel --- ## 📊 Context Map Die **Context Map** zeigt, wie die verschiedenen Bounded Contexts zusammenarbeiten: **Siehe:** `02-bounded-contexts.md` **Kernaussagen:** - **Produktion** liefert Rezeptdaten an **Deklaration** (für Nährwertberechnung) - **Produktion** verbraucht/produziert in **Bestandsführung** - **Qualität** prüft **Wareneingang** (aus Beschaffung) - **Bestandsführung** ist zentral - alle schreiben/lesen dort --- ## ✅ Validierung mit Domain-Experten ### Checkliste für Review-Meetings **Vorbereitung:** 1. Relevanten Bounded Context öffnen (z.B. `04-produktions-kontext.md`) 2. Aggregate-Struktur durchgehen 3. Invarianten besprechen **Fragen an Experten:** - ✅ Sind alle Zutaten erfasst, die in einem Rezept sein können? - ✅ Gibt es weitere Produktionsschritte, die dokumentiert werden müssen? - ✅ Welche Grenzwerte gelten für Temperaturprotokolle? - ✅ Welche Dokumente sind bei Wareneingang Pflicht? - ✅ Wie läuft ein Interfilial-Transfer praktisch ab? **Ergebnis:** - Dokumentation anpassen basierend auf Feedback - Neue Invarianten hinzufügen - Fehlende Aggregate/Entities ergänzen --- ## 🚀 Nächste Schritte 1. ✅ **Phase 0-3 abgeschlossen** - Bounded Contexts & Aggregates modelliert 2. ⏳ **Phase 4: Invarianten** - Detaillierte Geschäftsregeln pro Aggregat 3. ⏳ **Phase 5: Code-Generierung** - Java 21+ Code aus Modellen 4. ⏳ **Phase 6: Validierung** - DDD-Rules-Checklist --- ## 📞 Kontakt **Für Rückfragen zum Domain Model:** - Dokumentation: `docs/mvp/ddd/` - Code-Beispiele: `.claude/skills/ddd-model/languages/java/templates/` - DDD-Regeln: `.claude/skills/ddd-model/rules/ddd-rules.md`