# Ticket 003 – Prüfung: Sperr-Grund (reason) im Domain Model persistieren?

**Datum:** 2026-02-20
**Commit:** e7c3258 (feat(inventory): Charge sperren/entsperren)
**Status:** Offen

---

## Kontext

Beim Code-Review von `blockBatch`/`unblockBatch` wurde festgestellt, dass der `reason`-Parameter
(Sperr-Grund) zwar über die API entgegengenommen und validiert wird (`@NotBlank`), aber aktuell
nur im Audit-Log als `details` gespeichert wird – nicht im Domain Model selbst.

Das DDD-Modell (`docs/mvp/ddd/07-inventory-bc.md`, Zeile 63) sieht die Signatur
`blockBatch(StockBatchId batchId, String reason)` vor, d.h. der `reason` war ursprünglich
als Teil der Domain-Logik geplant.

## Zu klären

1. **Soll `reason` in `StockBatch` persistiert werden?**
   - Pro: Direkt abfragbar ohne Audit-Log-Suche, fachlich sichtbar im Bestandsüberblick
   - Contra: Audit-Log reicht für Nachvollziehbarkeit (HACCP/GoBD), zusätzliches Feld = Schema-Migration

2. **Falls ja: als optionales Feld `blockReason` in `StockBatch`?**
   - Nur gesetzt wenn `status == BLOCKED`
   - Wird bei `unblockBatch` auf `null` zurückgesetzt
   - Erfordert: Liquibase-Migration, JPA-Entity-Anpassung, Mapper-Update

3. **Domain-Event `StockBatchBlocked(StockId, StockBatchId, String reason)`?**
   - Das DDD-Modell (Zeile 302) sieht dieses Event vor
   - Aktuell keine Domain-Event-Infrastruktur implementiert → separates Thema

## Aktuelle Lösung

`reason` wird im Audit-Log via `AuditLogger.log(STOCK_BATCH_BLOCKED, batchId, "Reason: " + reason, actorId)` festgehalten. Damit ist die HACCP-Compliance gewährleistet.

## Empfehlung

Kurzfristig reicht der Audit-Log-Ansatz. Mittelfristig (wenn Chargen-Sperrgrund in der UI angezeigt
werden soll) sollte `blockReason` als optionales Feld in `StockBatch` aufgenommen werden.
