1
0
Fork 0
mirror of https://github.com/s-frick/effigenix.git synced 2026-03-28 10:19:35 +01:00

docs(ddd): detaillierte Domain Models für Production, Quality und Inventory BC

- Production BC: Aggregates (Recipe, Batch, ProductionOrder) mit Invarianten, Drafts, Status-Maschinen, Domain Events und Chargen-Genealogie
- Quality BC: 9 Aggregates (TemperatureLog, CleaningPlan/Record, GoodsReceiptInspection, SampleRecord, TrainingRecord, MaintenanceRecord, QualityHold, ProcessParameter) mit HACCP-Compliance
- Inventory BC: 4 Aggregates (Stock, StockMovement, InventoryCount, StorageLocation) mit FEFO, Reservierungen mit Priorität, Vier-Augen-Prinzip bei Inventur
- Ubiquitous Language: Inventory-Sektion von 11 auf 27 Begriffe erweitert
- Alte deutsche Datei 05-qualitaets-kontext.md entfernt (ersetzt durch 05-quality-bc.md)
This commit is contained in:
Sebastian Frick 2026-02-19 01:13:12 +01:00
parent 2ace5be394
commit fb735702cf
6 changed files with 4101 additions and 694 deletions

View file

@ -11,14 +11,28 @@ Diese Datei definiert die **Ubiquitous Language** für jeden Bounded Context. Di
| Begriff (DE) | Begriff (EN) | Typ | Definition |
|--------------|--------------|-----|------------|
| Rezept | Recipe | Aggregate | Mehrstufige Anleitung zur Herstellung eines Produkts aus Rohstoffen und Zwischenprodukten |
| Zutat | Ingredient | Entity | Rohstoff oder Zwischenprodukt, das in einem Rezept verwendet wird |
| Ausbeute | Yield | Value Object | Verhältnis zwischen Input (Rohmaterial) und Output (Endprodukt) nach Verarbeitungsverlusten, in Prozent |
| Charge | Batch | Aggregate | Eindeutig identifizierte Produktionseinheit mit Datum, Rezept, Menge und verwendeten Rohstoffchargen |
| Produktionsauftrag | Production Order | Aggregate | Auftrag zur Herstellung einer bestimmten Menge eines Produkts nach Rezept |
| Rückverfolgbarkeit | Traceability | Concept | Lückenlose Dokumentation von Rohstoff-Charge → Produktions-Charge → Verkauf |
| Zwischenprodukt | Intermediate Product | Concept | Produkt, das in Rezept A hergestellt wird und als Zutat in Rezept B verwendet wird |
| Ausschuss | Waste | Value Object | Menge an Material, die während Produktion verloren geht oder unbrauchbar ist |
| Rezeptur-Version | Recipe Version | Value Object | Versionsnummer eines Rezepts, um Änderungen nachvollziehbar zu machen |
| Zutat | Ingredient | Entity | Rohstoff oder Zwischenprodukt, das in einem Rezept verwendet wird. Position bestimmt die Reihenfolge |
| Produktionsschritt | ProductionStep | Entity | Einzelner Arbeitsschritt in einer Rezeptur mit optionaler Dauer und Temperaturangabe |
| Rezepttyp | RecipeType | Value Object | Klassifizierung: RAW_MATERIAL, INTERMEDIATE (Zwischenprodukt) oder FINISHED_PRODUCT (Endprodukt) |
| Ausbeute | YieldPercentage | Value Object | Verhältnis Input→Output in % (1-200%). >100% bei Pökel-/Spritzprozessen. Bei 80% Ausbeute braucht man 125kg Input für 100kg Output |
| Haltbarkeitsdauer | ShelfLifeDays | Value Object | Anzahl Tage ab Produktionsdatum bis MHD. Definiert im Rezept, angewandt bei Chargen-Erzeugung |
| Unter-Rezept | SubRecipe | Concept | Verweis auf ein anderes Rezept (INTERMEDIATE), das als Zutat verwendet wird. Ermöglicht verschachtelte Rezepturen |
| Rezeptur-Version | Recipe Version | Value Object | Versionsnummer eines Rezepts. Neue Version = neues Recipe-Objekt, altes wird archiviert |
| Charge | Batch | Aggregate | Eindeutig identifizierte Produktionseinheit mit Chargennummer, Datum, Rezept, Mengen und Genealogie |
| Chargennummer | BatchNumber | Value Object | Formatierte eindeutige Kennung einer Charge (Format: "P-YYYY-MM-DD-XXX"). Generiert über BatchNumberGenerator |
| Verbrauch | Consumption | Entity | Dokumentation, dass eine Input-Charge (Rohstoff/Zwischenprodukt) in einer Produktions-Charge verwendet wurde. Bildet die Chargen-Genealogie |
| Chargen-Genealogie | Batch Genealogy | Concept | Gesamtheit aller Consumption-Beziehungen einer Charge. Ermöglicht Vorwärts- und Rückwärts-Tracing |
| Vorwärts-Tracing | Forward Tracing | Concept | Ausgehend von einer Rohstoff-Charge: Welche Endprodukt-Chargen sind betroffen? Kritisch für Rückruf-Szenarien |
| Rückwärts-Tracing | Backward Tracing | Concept | Ausgehend von einer Endprodukt-Charge: Welche Rohstoff-Chargen wurden verwendet? |
| Rückverfolgbarkeit | Traceability | Concept | Lückenlose Dokumentation der Kette: Rohstoff-Charge → Produktions-Charge → Verkauf. HACCP-Pflicht |
| Zwischenprodukt | Intermediate Product | Concept | Produkt, das in Rezept A hergestellt wird und als Zutat in Rezept B verwendet wird (z.B. Brät, Gewürzmischung) |
| Ausschuss | Waste | Value Object | Menge an Material, die während Produktion verloren geht (Schwund, Knochen, Fett-Trimmen) |
| Produktionsauftrag | ProductionOrder | Aggregate | Geplante zukünftige Produktion mit Rezept, Menge, Termin und Priorität. Erzeugt bei Start eine Charge |
| Priorität | Priority | Value Object | Dringlichkeit eines Produktionsauftrags: LOW, NORMAL, HIGH, URGENT |
| Freigabe | Release | Concept | Übergang eines Produktionsauftrags von PLANNED zu RELEASED. Signalisiert, dass Material verfügbar ist |
| Catch-Weight | Dual Quantity | Concept | Doppelte Mengenführung für Artikel, die stückweise UND gewichtsweise erfasst werden (z.B. "10 Stück à 2,3 kg") |
| MHD | BestBeforeDate | Value Object | Mindesthaltbarkeitsdatum einer Charge. Berechnet: ProductionDate + Recipe.ShelfLifeDays |
| Materialbedarf | Material Requirement | Concept | Aus Rezeptur berechnete Rohstoffmenge unter Berücksichtigung der Ausbeute. Ausgelöst durch ProductionOrderReleased |
---
@ -28,16 +42,33 @@ Diese Datei definiert die **Ubiquitous Language** für jeden Bounded Context. Di
|--------------|--------------|-----|------------|
| HACCP | HACCP | Concept | Hazard Analysis Critical Control Points - systematische Präventivmaßnahmen für Lebensmittelsicherheit |
| Kritischer Kontrollpunkt | Critical Control Point (CCP) | Concept | Stelle im Prozess, an der Kontrolle notwendig ist, um Gefahren zu vermeiden |
| Temperaturprotokoll | Temperature Log | Aggregate | Dokumentierte Temperaturmessung an kritischem Punkt (Kühlraum, Theke) mit Grenzwerten |
| Reinigungsnachweis | Cleaning Record | Aggregate | Dokumentation einer durchgeführten Reinigung mit Datum, Person, Checkliste |
| Reinigungsplan | Cleaning Plan | Aggregate | Vordefinierter Plan mit Intervallen und Checklisten für Reinigungsaufgaben |
| Wareneingangskontrolle | Goods Receipt Inspection | Aggregate | Prüfung von Temperatur, MHD, Sichtkontrolle, Dokumenten bei Warenanlieferung |
| Schulungsnachweis | Training Record | Aggregate | Zertifikat oder Nachweis einer absolvierten Schulung (HACCP, Hygiene) mit Gültigkeitsdatum |
| Wartungsprotokoll | Maintenance Record | Aggregate | Dokumentation von Gerätewartungen (planmäßig oder Störung) mit Befund |
| Messwert | Measurement | Value Object | Gemessener Wert mit Einheit (z.B. Temperatur in °C) |
| Grenzwert | Critical Limit | Value Object | Minimal-/Maximalwert für CCP (z.B. Kühlraum: 2-7°C) |
| Temperaturprotokoll | TemperatureLog | Aggregate | Standortbezogene Temperaturmessung an kritischem Punkt (Kühlraum, Theke) mit Grenzwertüberwachung |
| Messpunkt | MeasurementPoint | VO (Enum) | Physischer Ort der Messung: COLD_ROOM, FREEZER, DISPLAY_COUNTER, PRODUCTION_ROOM |
| Temperatur | Temperature | Value Object | Temperaturwert in °C mit physikalisch plausiblem Bereich (-50 bis +50) |
| Kritischer Grenzwert | CriticalLimit | Value Object | Min-/Max-Paar für einen CCP (z.B. Kühlraum 2-7°C). Mindestens ein Limit muss gesetzt sein |
| Reinigungsplan | CleaningPlan | Aggregate | Vorlage für Reinigungsaufgaben mit Bereich, Intervall und Checklisten-Template |
| Reinigungsintervall | CleaningInterval | VO (Enum) | Turnus einer Reinigung: DAILY, WEEKLY, MONTHLY |
| Reinigungsnachweis | CleaningRecord | Aggregate | Durchgeführte Reinigung gegen einen CleaningPlan mit abgehakter Checkliste |
| Checklisten-Eintrag | ChecklistItem | Entity | Einzelner Prüfpunkt in einer Reinigung oder Inspektion |
| Wareneingangskontrolle | GoodsReceiptInspection | Aggregate | Mehrteilige Prüfung bei Warenanlieferung (Temperatur, Sicht, MHD, Dokumente) |
| Temperaturprüfung | TemperatureCheck | Value Object | Temperaturmessung bei Wareneingang mit Soll-/Ist-Vergleich |
| Sichtkontrolle | VisualCheck | Value Object | Prüfung von Verpackung, Farbe, Geruch bei Wareneingang |
| MHD-Prüfung | ShelfLifeCheck | Value Object | Prüfung des Mindesthaltbarkeitsdatums gegen Mindest-Restlaufzeit |
| Dokumentenprüfung | DocumentCheck | Value Object | Prüfung von Lieferschein, Veterinärbescheinigung, Zertifikaten |
| Probenentnahme | SampleRecord | Aggregate | Probenentnahme mit Analyseergebnis, Charge und Prüfmethode |
| Probenart | SampleType | VO (Enum) | Klassifizierung: MICROBIOLOGICAL, CHEMICAL, PHYSICAL, SENSORY |
| Analyseergebnis | AnalysisResult | Value Object | Messergebnis einer Probe mit Wert, Einheit und Interpretation |
| Schulungsnachweis | TrainingRecord | Aggregate | Nachweis einer absolvierten Schulung mit Gültigkeitsdatum und Trainer |
| Schulungsart | TrainingType | VO (Enum) | Klassifizierung: HACCP, HYGIENE, FOOD_SAFETY, EQUIPMENT_OPERATION, FIRST_AID |
| Wartungsprotokoll | MaintenanceRecord | Aggregate | Dokumentation von Gerätewartungen (planmäßig, Reparatur, Kalibrierung, Inspektion) |
| Wartungsart | MaintenanceType | VO (Enum) | SCHEDULED, REPAIR, CALIBRATION, INSPECTION |
| Qualitätssperre | QualityHold | Aggregate | Sperre einer Charge bei Qualitätsproblemen. Block/Release-Pattern mit Vier-Augen-Prinzip |
| Sperrgrund | HoldReason | VO (Enum) | TEMPERATURE_DEVIATION, SAMPLE_FAILED, CONTAMINATION_SUSPECTED, PROCESS_DEVIATION, CUSTOMER_COMPLAINT, REGULATORY |
| Korrekturmaßnahme | CorrectiveAction | Entity | Maßnahme zur Behebung einer Abweichung im Rahmen eines QualityHold |
| Prozessparameter | ProcessParameter | Aggregate | Batch-bezogene CCP-Messwerte (Kerntemperatur, pH, aw-Wert, Metalldetektion) |
| CCP-Typ | CcpType | VO (Enum) | CORE_TEMPERATURE, PH_VALUE, WATER_ACTIVITY, METAL_DETECTION |
| Abweichung | Deviation | Concept | Überschreitung eines Grenzwerts oder Nichteinhaltung eines Verfahrens |
| Korrekturmaßnahme | Corrective Action | Entity | Maßnahme zur Behebung einer Abweichung |
| HACCP-Report | HaccpReport | Concept | Audit-Report aggregiert aus allen Quality-Aggregates für einen Zeitraum |
---
@ -62,17 +93,29 @@ Diese Datei definiert die **Ubiquitous Language** für jeden Bounded Context. Di
| Begriff (DE) | Begriff (EN) | Typ | Definition |
|--------------|--------------|-----|------------|
| Bestand | Stock | Aggregate | Aktueller Bestand eines Artikels in einem Lagerort, chargengenau |
| Lagerort | Storage Location | Value Object | Physischer Ort (Kühlraum, Tiefkühler, Trockenlager, Theke) |
| Bestandsbewegung | Stock Movement | Aggregate | Veränderung des Bestands (Wareneingang, Produktion, Verkauf, Umbuchung) |
| MHD | Best-Before Date | Value Object | Mindesthaltbarkeitsdatum, chargenspezifisch |
| FEFO | First-Expired-First-Out | Concept | Verkaufspriorisierung nach MHD (ältestes MHD zuerst) |
| Charge | Batch | Concept | Eindeutig identifizierte Menge eines Artikels mit gleicher Herkunft/Produktion |
| Chargennummer | Batch Number | Value Object | Eindeutige Identifikation einer Charge (ProductionBatchId oder SupplierBatchId) |
| Verfügbarer Bestand | Available Stock | Value Object | Bestand abzüglich Reservierungen |
| Reservierung | Reservation | Entity | Vorgemerkter Bestand für Produktionsauftrag oder Kundenauftrag |
| Schwund | Shrinkage | Concept | Bestandsverlust durch Verderb, Bruch, Diebstahl |
| Inventur | Inventory Count | Aggregate | Physische Zählung des Bestands mit Soll-Ist-Abgleich |
| Bestand | Stock | Aggregate | Aktueller Bestand eines Artikels an einem Lagerort, chargengenau mit FEFO und Reservierungen |
| Bestandscharge | StockBatch | Entity | Einzelne Charge im Bestand mit Menge, MHD und Status (AVAILABLE, EXPIRING_SOON, BLOCKED, EXPIRED) |
| Chargenreferenz | BatchReference | Value Object | Verweis auf Produktions- oder Lieferantencharge mit BatchType (PRODUCED oder PURCHASED) |
| Chargentyp | BatchType | VO (Enum) | PRODUCED (Eigenproduktion via Production BC) oder PURCHASED (Zukauf via Procurement BC) |
| Chargen-Status | StockBatchStatus | VO (Enum) | AVAILABLE, EXPIRING_SOON, BLOCKED, EXPIRED steuert Verfügbarkeit |
| Mindestbestand | MinimumLevel | Value Object | Mindestmenge, bei Unterschreitung wird StockLevelBelowMinimum Event ausgelöst |
| Mindest-Resthaltbarkeit | MinimumShelfLife | Value Object | Konfigurierbare Tage bis MHD, ab der eine Charge als EXPIRING_SOON markiert wird |
| FEFO | First-Expired-First-Out | Concept | Entnahme/Reservierung priorisiert nach nächstem MHD (ältestes zuerst) |
| Verfügbarer Bestand | AvailableStock | Concept | SUM(AVAILABLE Chargen) minus SUM(Reservierungen). Darf nicht negativ werden |
| Reservierung | Reservation | Entity | Reservierte Menge für einen Produktionsauftrag oder Kundenauftrag mit Priorität |
| Reservierungspriorität | ReservationPriority | VO (Enum) | URGENT, NORMAL, LOW bestimmt Zuteilungsreihenfolge bei Knappheit |
| Referenztyp | ReferenceType | VO (Enum) | PRODUCTION_ORDER oder SALE_ORDER wofür reserviert wurde |
| Chargen-Zuteilung | StockBatchAllocation | Entity | Zuordnung einer reservierten Menge zu einer konkreten StockBatch (per FEFO ausgewählt) |
| Bestandsbewegung | StockMovement | Aggregate | Immutabler Audit-Trail einer Bestandsveränderung mit Chargen-Rückverfolgbarkeit |
| Bewegungstyp | MovementType | VO (Enum) | GOODS_RECEIPT, PRODUCTION_OUTPUT, PRODUCTION_CONSUMPTION, SALE, INTER_BRANCH_TRANSFER, WASTE, ADJUSTMENT, RETURN |
| Bewegungsrichtung | MovementDirection | VO (Enum) | IN (Zugang) oder OUT (Abgang) abgeleitet aus MovementType |
| Inventur | InventoryCount | Aggregate | Physische Bestandsaufnahme pro Lagerort mit Soll/Ist-Abgleich und automatischer Differenzbuchung |
| Zählposition | CountItem | Entity | Einzelne Position in einer Inventur: Artikel, Soll-Menge, Ist-Menge, berechnete Abweichung |
| Lagerort | StorageLocation | Aggregate | Konfigurierbarer physischer Lagerort mit Typ und optionalem Temperaturbereich |
| Lagertyp | StorageType | VO (Enum) | COLD_ROOM, FREEZER, DRY_STORAGE, DISPLAY_COUNTER, PRODUCTION_AREA |
| Temperaturbereich | TemperatureRange | Value Object | Min-/Max-Temperatur eines Lagerorts in °C (-50 bis +80) |
| Schwund | Shrinkage | Concept | Bestandsverlust durch Verderb, Bruch, Diebstahl erfasst als WASTE-StockMovement |
| Vier-Augen-Prinzip | Four-Eyes Principle | Concept | Inventur: CompletedBy muss sich von InitiatedBy unterscheiden |
---
@ -181,7 +224,7 @@ com.effigenix.domain.masterdata // Master Data BC
Recipe, Batch, ProductionOrder
TemperatureLog, CleaningRecord
ProductLabel, AllergenMatrix
Stock, StockMovement
Stock, StockMovement, InventoryCount, StorageLocation
PurchaseOrder, GoodsReceipt
Branch, InterBranchTransfer
@ -189,6 +232,8 @@ Branch, InterBranchTransfer
RecipeId, BatchId, YieldPercentage
Temperature, CriticalLimit
AllergenType, NutritionFacts
BatchReference, MinimumLevel, MinimumShelfLife
TemperatureRange, StorageLocationName
Quantity, Money, Timestamp
```
@ -197,7 +242,9 @@ Quantity, Money, Timestamp
// Domain behavior (verbs)
recipe.addIngredient(...)
batch.complete(...)
stock.withdraw(...)
stock.addBatch(...)
stock.reserve(...)
stock.confirmReservation(...)
purchaseOrder.confirm(...)
// Factory methods

File diff suppressed because it is too large Load diff

View file

@ -1,192 +0,0 @@
# Qualitäts-Kontext (HACCP/QM) - Detailliertes Domain Model
**Bounded Context:** Qualität
**Domain-Typ:** KERN
**Verantwortung:** HACCP-Compliance, Qualitätsmanagement, Audit-Vorbereitung
---
## Aggregate
### 1. Temperaturprotokoll (Aggregate Root)
**Struktur:**
```
Temperaturprotokoll
├── TemperaturprotokollId (Wertobjekt)
├── Messpunkt (Wertobjekt: KUEHLRAUM | TIEFKUEHLER | VERKAUFSTHEKE | PRODUKTIONSRAUM)
├── GeraetId (Wertobjekt) - Referenz zu Ausstattung
├── GemessenAm (Wertobjekt: Zeitstempel)
├── Temperatur (Wertobjekt: mit Einheit °C)
├── GemessenVon (Wertobjekt: BenutzerId)
├── KritischeGrenzwertMin (Wertobjekt)
├── KritischeGrenzwertMax (Wertobjekt)
└── Status (Wertobjekt: OK | WARNUNG | KRITISCH)
Invarianten:
- Temperatur muss im physikalisch möglichen Bereich liegen (-50°C bis +50°C)
- GemessenAm darf nicht in der Zukunft liegen
- Status = KRITISCH wenn Temperatur außerhalb kritischer Grenzwerte
- Status = WARNUNG wenn Temperatur nahe an Grenzwerten (innerhalb 10%)
- KritischeGrenzwertMin < KritischeGrenzwertMax
```
**Domänen-Events:**
```java
TemperaturKritischeGrenzwerteUeberschritten(TemperaturprotokollId, Messpunkt, Temperatur)
```
---
### 2. Reinigungsnachweis (Aggregate Root)
**Struktur:**
```
Reinigungsnachweis
├── ReinigungsnachweisId (Wertobjekt)
├── Bereich (Wertobjekt: PRODUKTIONSRAUM | KUEHLRAUM | VERKAUFSTHEKE | GERAET)
├── ReinigungsplanId (Wertobjekt) - Referenz zu Reinigungsplan
├── GeplantesFuer (Wertobjekt: Datum)
├── AbgeschlossenAm (Wertobjekt: Zeitstempel)
├── AbgeschlossenVon (Wertobjekt: BenutzerId)
├── Checklisten-Eintraege[] (Entität)
│ ├── Eintrag (Wertobjekt: "Boden gewischt", "Oberflächen desinfiziert")
│ ├── Erledigt (Wertobjekt: boolean)
│ └── Bemerkungen (Wertobjekt: optional)
└── GesamtBemerkungen (Wertobjekt)
Invarianten:
- Alle Checklisten-Einträge müssen erledigt sein zum Abschluss
- AbgeschlossenAm muss >= GeplantesFuer sein
- Kann nicht abgeschlossen werden ohne AbgeschlossenVon
- Kann nach Abschluss nicht mehr geändert werden
```
**Domänen-Events:**
```java
ReinigungUeberfaellig(ReinigungsplanId, Bereich, LocalDate geplantesFuer)
```
---
### 3. Wareneingangspruefung (Aggregate Root)
**Struktur:**
```
Wareneingangspruefung
├── PruefungId (Wertobjekt)
├── WareneingangId (Wertobjekt) - Referenz zu Beschaffungs-Kontext
├── GeprueftAm (Wertobjekt)
├── GeprueftVon (Wertobjekt: BenutzerId)
├── Temperaturpruefung (Entität)
│ ├── GemesseneTemperatur (Wertobjekt)
│ ├── ErwarteterBereich (Wertobjekt)
│ └── Status (Wertobjekt: BESTANDEN | DURCHGEFALLEN)
├── Sichtpruefung (Entität)
│ ├── VerpackungIntakt (Wertobjekt: boolean)
│ ├── Farbe (Wertobjekt: NORMAL | ABNORMAL)
│ ├── Geruchstest (Wertobjekt: NORMAL | ABNORMAL)
│ └── Bemerkungen (Wertobjekt)
├── MHD-Pruefung (Entität)
│ ├── Verfallsdatum (Wertobjekt)
│ ├── TageBeisVerfallsdatum (Wertobjekt)
│ ├── MinimalAkzeptableTage (Wertobjekt)
│ └── Status (Wertobjekt: BESTANDEN | DURCHGEFALLEN)
├── Dokumentenpruefung (Entität)
│ ├── LieferscheinErhalten (Wertobjekt: boolean)
│ ├── VeterinaerbescheinigungErhalten (Wertobjekt: boolean)
│ ├── Qualitaetszertifikate[] (Wertobjekt)
│ └── AlleDokumenteVollstaendig (Wertobjekt: boolean)
├── LieferantenChargennummer (Wertobjekt) - Für Rückverfolgbarkeit!
└── Endergebnis (Wertobjekt: ANGENOMMEN | ABGELEHNT | BEDINGT_ANGENOMMEN)
Invarianten:
- Alle Prüfungen müssen durchgeführt sein, bevor Endergebnis gesetzt werden kann
- Bei ABGELEHNT müssen GesamtBemerkungen angegeben werden
- Temperatur muss im akzeptablen Bereich liegen für ANGENOMMEN
- MHD muss Mindesttage haben für ANGENOMMEN
- Veterinärbescheinigung erforderlich für Fleischprodukte
```
**Domänen-Events:**
```java
WareneingangAbgelehnt(PruefungId, WareneingangId, String grund)
```
---
### 4. Schulungsnachweis (Aggregate Root)
**Struktur:**
```
Schulungsnachweis
├── SchulungsnachweisId (Wertobjekt)
├── MitarbeiterId (Wertobjekt: BenutzerId)
├── SchulungsTyp (Wertobjekt: HACCP | HYGIENE | LEBENSMITTELSICHERHEIT | GERAETEBEDIENUNG)
├── Schulungsdatum (Wertobjekt)
├── GueltigBis (Wertobjekt) - Auffrischung notwendig
├── Schulender (Wertobjekt) - Intern oder extern
├── Zertifikatsnummer (Wertobjekt)
├── ZertifikatsDokumentUrl (Wertobjekt)
└── Status (Wertobjekt: GUELTIG | ABGELAUFEN | WIDERRUFEN)
Invarianten:
- GueltigBis muss nach Schulungsdatum liegen
- Status = ABGELAUFEN wenn GueltigBis < HEUTE
- Kann nicht widerrufen werden ohne Grund
```
**Domänen-Events:**
```java
SchulungLaeuftDemnaechstAb(SchulungsnachweisId, BenutzerId, LocalDate ablaufdatum)
```
---
### 5. Wartungsprotokoll (Aggregate Root)
**Struktur:**
```
Wartungsprotokoll
├── WartungsprotokollId (Wertobjekt)
├── GeraetId (Wertobjekt)
├── WartungsTyp (Wertobjekt: GEPLANT | REPARATUR | INSPEKTION)
├── GeplantesFuer (Wertobjekt: Datum)
├── DurchgefuehrtAm (Wertobjekt: Zeitstempel)
├── DurchgefuehrtVon (Wertobjekt) - Internes Personal oder externe Firma
├── Befunde (Wertobjekt)
├── Massnahmen (Wertobjekt)
├── NaechsteWartungFaellig (Wertobjekt: Datum)
└── Status (Wertobjekt: ABGESCHLOSSEN | AUSSTEHEND | FEHLGESCHLAGEN)
Invarianten:
- DurchgefuehrtAm muss >= GeplantesFuer sein
- Bei FEHLGESCHLAGEN müssen Befunde und Massnahmen dokumentiert sein
- NaechsteWartungFaellig muss basierend auf Wartungsintervall berechnet werden
```
**Domänen-Events:**
```java
WartungUeberfaellig(GeraetId, LocalDate geplantesFuer)
```
---
## Repository-Schnittstellen
```java
public interface TemperaturprotokollRepository {
Result<RepositoryFehler, Void> speichern(Temperaturprotokoll protokoll);
Result<RepositoryFehler, List<Temperaturprotokoll>> findeNachZeitraum(
LocalDate von, LocalDate bis
);
Result<RepositoryFehler, List<Temperaturprotokoll>> findeKritische();
}
public interface WareneingangspruefungRepository {
Result<RepositoryFehler, Void> speichern(Wareneingangspruefung pruefung);
Result<RepositoryFehler, Wareneingangspruefung> findeNachWareneingangId(
WareneingangId id
);
}
```

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff