# 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 speichern(Temperaturprotokoll protokoll); Result> findeNachZeitraum( LocalDate von, LocalDate bis ); Result> findeKritische(); } public interface WareneingangspruefungRepository { Result speichern(Wareneingangspruefung pruefung); Result findeNachWareneingangId( WareneingangId id ); } ```