Warenwirtschaft: F-09 — Ausschuss ohne Charge standort- und chargenkonsistent

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>
This commit is contained in:
Kevin Adametz 2026-09-08 11:01:13 +00:00
parent 2796b1103e
commit db27f040e6
3 changed files with 107 additions and 5 deletions

View file

@ -88,11 +88,14 @@ class StoreStockDisposalRequest extends FormRequest
$ingredientId = (int) $this->input('ingredient_id');
if (! $this->filled('stock_entry_id')) {
if ($ingredientId > 0 && $quantity > 0) {
// Prüfung 08.09.2026 F-09: ohne Charge gegen den gewählten Lagerort prüfen,
// nicht gegen den globalen Bestand (sonst geht ein leerer Standort ins Minus).
$locationId = (int) $this->input('location_id');
if ($ingredientId > 0 && $quantity > 0 && $locationId > 0) {
$remaining = app(InventoryService::class)
->remainingByIngredient([$ingredientId])[$ingredientId] ?? 0.0;
->remainingByLocationForIngredient($ingredientId)[$locationId] ?? 0.0;
if ($quantity > $remaining) {
$validator->errors()->add('quantity', __('Die Menge (:qty g) übersteigt den Restbestand (:rest g).', [
$validator->errors()->add('quantity', __('Die Menge (:qty g) übersteigt den Restbestand am gewählten Lagerort (:rest g).', [
'qty' => number_format($quantity, 2, ',', '.'),
'rest' => number_format(max(0, $remaining), 2, ',', '.'),
]));