# Quality BC (HACCP/QM) - Detailliertes Domain Model **Bounded Context:** Quality **Domain Type:** CORE **Verantwortung:** HACCP-Compliance, Qualitätsmanagement, Audit-Vorbereitung --- ## Aggregates ### 1. TemperatureLog (Aggregate Root) ``` TemperatureLog ├── TemperatureLogId (VO) ├── MeasurementPoint (VO: COLD_ROOM | FREEZER | DISPLAY_COUNTER | PRODUCTION_ROOM) ├── DeviceId (VO) - Reference to Equipment ├── MeasuredAt (VO: Timestamp) ├── Temperature (VO: with unit °C) ├── MeasuredBy (VO: UserId) ├── CriticalLimitMin (VO) ├── CriticalLimitMax (VO) └── Status (VO: OK | WARNING | CRITICAL) Invariants: - Temperature must be within physically possible range (-50°C to +50°C) - MeasuredAt cannot be in the future - Status = CRITICAL if temperature outside critical limits - Status = WARNING if temperature close to limits (within 10%) - CriticalLimitMin < CriticalLimitMax ``` ### 2. CleaningRecord (Aggregate Root) ``` CleaningRecord ├── CleaningRecordId (VO) ├── Area (VO: PRODUCTION_ROOM | COLD_STORAGE | SALES_COUNTER | EQUIPMENT) ├── CleaningPlanId (VO) - Reference to CleaningPlan ├── ScheduledFor (VO: Date) ├── CompletedAt (VO: Timestamp) ├── CompletedBy (VO: UserId) ├── ChecklistItems[] (Entity) │ ├── Item (VO: "Floor mopped", "Surfaces disinfected") │ ├── Checked (VO: boolean) │ └── Remarks (VO: optional) └── OverallRemarks (VO) Invariants: - All checklist items must be checked to complete - CompletedAt must be >= ScheduledFor - Cannot complete without CompletedBy - Cannot modify after completion ``` ### 3. GoodsReceiptInspection (Aggregate Root) ``` GoodsReceiptInspection ├── InspectionId (VO) ├── GoodsReceiptId (VO) - Reference to Procurement BC ├── InspectedAt (VO) ├── InspectedBy (VO: UserId) ├── TemperatureCheck (Entity) │ ├── MeasuredTemperature (VO) │ ├── ExpectedRange (VO) │ └── Status (VO: PASSED | FAILED) ├── VisualInspection (Entity) │ ├── PackagingIntact (VO: boolean) │ ├── ColorAppearance (VO: NORMAL | ABNORMAL) │ ├── SmellTest (VO: NORMAL | ABNORMAL) │ └── Remarks (VO) ├── MHDCheck (Entity) │ ├── ExpiryDate (VO) │ ├── DaysUntilExpiry (VO) │ ├── MinimumAcceptableDays (VO) │ └── Status (VO: PASSED | FAILED) ├── DocumentCheck (Entity) │ ├── DeliveryNoteReceived (VO: boolean) │ ├── VeterinaryCertificateReceived (VO: boolean) │ ├── QualityCertificates[] (VO) │ └── AllDocumentsComplete (VO: boolean) ├── SupplierBatchNumber (VO) - For traceability! └── FinalResult (VO: ACCEPTED | REJECTED | CONDITIONALLY_ACCEPTED) Invariants: - All checks must be performed before FinalResult can be set - If REJECTED, OverallRemarks must be provided - Temperature must be within acceptable range for ACCEPTED - MHD must have minimum days for ACCEPTED - VeterinaryCertificate required for meat products ``` ### 4. TrainingRecord (Aggregate Root) ``` TrainingRecord ├── TrainingRecordId (VO) ├── EmployeeId (VO: UserId) ├── TrainingType (VO: HACCP | HYGIENE | FOOD_SAFETY | EQUIPMENT_OPERATION) ├── TrainingDate (VO) ├── ValidUntil (VO) - Auffrischung notwendig ├── Trainer (VO) - Internal or external ├── CertificateNumber (VO) ├── CertificateDocumentUrl (VO) └── Status (VO: VALID | EXPIRED | REVOKED) Invariants: - ValidUntil must be after TrainingDate - Status = EXPIRED if ValidUntil < TODAY - Cannot revoke without reason ``` ### 5. MaintenanceRecord (Aggregate Root) ``` MaintenanceRecord ├── MaintenanceRecordId (VO) ├── EquipmentId (VO) ├── MaintenanceType (VO: SCHEDULED | REPAIR | INSPECTION) ├── ScheduledFor (VO: Date) ├── PerformedAt (VO: Timestamp) ├── PerformedBy (VO) - Internal staff or external company ├── Findings (VO) ├── Actions (VO) ├── NextMaintenanceDue (VO: Date) └── Status (VO: COMPLETED | PENDING | FAILED) Invariants: - PerformedAt must be >= ScheduledFor - If FAILED, Findings and Actions must be documented - NextMaintenanceDue must be calculated based on maintenance interval ``` ## Repository Interfaces ```java public interface TemperatureLogRepository { Result save(TemperatureLog log); Result> findByPeriod( LocalDate from, LocalDate to ); Result> findCritical(); } public interface GoodsReceiptInspectionRepository { Result save(GoodsReceiptInspection inspection); Result findByGoodsReceiptId( GoodsReceiptId id ); } ``` ## Domain Events ```java TemperatureCriticalLimitExceeded(TemperatureLogId, MeasurementPoint, Temperature) CleaningOverdue(CleaningPlanId, Area, LocalDate scheduledFor) GoodsReceiptRejected(InspectionId, GoodsReceiptId, String reason) TrainingExpiringSoon(TrainingRecordId, UserId, LocalDate expiryDate) MaintenanceOverdue(EquipmentId, LocalDate scheduledFor) ```