Ohne Charge wird gegen den Restbestand des gewählten Lagerorts geprüft und die
Menge FEFO auf die dort verfügbaren Chargen verteilt (je Charge gebucht, in
einer Transaktion) — wie der Produktionsverbrauch. Gesamt-, Standort- und
Chargenbestand stimmen damit überein.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Neuer Helper reFormatWawiNumber(): '5.1'/'5.12' werden als 5,1/5,12
gelesen (kommt beim Kopieren von Daten vor); '1.500' bleibt Tausender.
Gilt nur für die WaWi-Eingaben (Mengen, Preise, Gewichte, Rezeptur) —
reFormatNumber() app-weit unverändert. JS-Parser (parseGerman,
parseDeNumber) auf dieselbe Regel vereinheitlicht; parseDeNumber
behandelte '1.500' bisher sogar als 1,5.
Tests: +1 (Parsing-Matrix).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- H-2: quantity_used muss > 0 sein (FormRequest-Regel + Service-Guard) —
negative Zeilen konnten sich in der Summenprüfung aufheben und
Chargen-Restbestände aufblähen.
- H-3: expandBatchLines() dekrementiert die gecachten Restmengen —
zwei Zeilen derselben Charge belasten nicht mehr denselben Einkauf
doppelt (FEFO korrekt über beide Zeilen).
- M-1: Ausschuss validiert Chargen-Konsistenz (gehört zum Rohstoff,
received) und Restbestand (je Charge bzw. gesamt).
- M-9: lockForUpdate auf die Produktionszeile bei Update und Löschen.
Tests: neuer ProductionHardeningTest (4). Suite: 223 grün, 806 Assertions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>