1
0
Fork 0
mirror of https://github.com/s-frick/effigenix.git synced 2026-03-28 17:04:49 +01:00
effigenix/backend/docs/mvp/ddd/05-qualitaets-kontext.md
Sebastian Frick c2c48a03e8 refactor: restructure repository with separate backend and frontend directories
- Move Java backend to backend/ directory
- Create frontend/ directory for TypeScript TUI and future WebUI
- Update .gitignore for Node.js and worktrees
- Update README.md with new repository structure
- Copy documentation to backend/
2026-02-17 22:08:51 +01:00

6.3 KiB

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:

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:

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:

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:

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:

WartungUeberfaellig(GeraetId, LocalDate geplantesFuer)

Repository-Schnittstellen

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
    );
}