# 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<br/>SUPPLIER-12345] -->|verwendet in| B[Produktions-Charge<br/>BATCH-2026-02-17-001]
    B -->|verkauft als| C[Rechnung<br/>INV-2026-02-20-042]
    C -->|an| D[Kunde<br/>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`
