Warenwirtschaft: OPT-6 Bestandswahrheit — Ausschuss in Chargen-Restmengen (Audit H-1, M-5)

- consumedByStockEntry(): chargen-bezogener Ausschuss zählt jetzt als
  Verbrauch — entsorgte Chargen verschwinden aus Rohstoff-Detail,
  Produktions-FEFO/Dropdown und AP-27-Batch-Check.
- Rohstoff-Detail: Kopfwert aus remainingByIngredient() (identisch zur
  Index-Seite, inkl. Ausschuss ohne Chargenbezug).
- Aggregationen iterieren über die Key-Vereinigung (received ∪ consumed
  ∪ disposed) — negative Bestände werden nicht mehr als 0 maskiert.
- Standort-Aggregation: Chargen-Ausschuss zählt am Standort der Charge
  (COALESCE), nicht am frei gewählten Formular-Standort.

Tests: neuer ChargeDisposalConsistencyTest (5). Suite: 219 grün, 795 Assertions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-15 12:42:46 +00:00
parent 46a832f2be
commit 84450385e3
4 changed files with 193 additions and 13 deletions

View file

@ -77,7 +77,9 @@ class RawMaterialStockController extends Controller
// AP-27: Chargen je batch_number zusammengeführt (jeder Einkauf bleibt eigener stock_entry).
$chargeGroups = $this->inventoryService->chargeGroupsForIngredient($ingredient->id);
$remaining = round((float) $chargeGroups->sum('remaining'), 2);
// Audit H-1: Kopfwert aus der Gesamt-Aggregation (zieht auch Ausschuss
// ohne Chargenbezug ab) — identisch zur Index-Seite, nicht Chargen-Summe.
$remaining = $this->inventoryService->remainingByIngredient([$ingredient->id])[$ingredient->id] ?? 0.0;
$remainingByLocation = $this->inventoryService->remainingByLocationForIngredient($ingredient->id);