Warenwirtschaft: AP-42 — Rohstoff-Dichte (g/ml) für ml-Erfassung im Wareneingang

Kundenentscheid 26.08.: Rohstoffe werden in Gramm geführt, dürfen aber in ml
erfasst werden; über die Dichte ergeben sich die Gramm (100 ml Propolistinktur
× 0,79 = 79 g).

- Neues Feld ingredients.density (g/ml, optional) inkl. Feld im INCI-Formular.
- Wareneingang: Einheiten-Umschalter g/ml am Mengenfeld (nur wenn Dichte
  hinterlegt; Live-Hinweis mit Gramm-Umrechnung, Dichte kommt aus der
  Rohstoff-Suche mit). Erfassung in ml wird über die Dichte in Gramm
  umgerechnet und kanonisch als Gramm gespeichert — InventoryService und alle
  Aggregationen bleiben unverändert. purchase_unit + density_used (Snapshot)
  protokollieren die ml-Erfassung für Anzeige/Bearbeitung; Detailseite zeigt
  „790 g (= 1.000 ml)". Wareneingang-Buchung rechnet gelieferte ml ebenfalls um.
- Serverseitige Validierung: ml nur mit hinterlegter Dichte.

Migrationen add_density_* auf Dev-/Live-DB. 4 Tests, Suite 318 grün.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-08-28 09:05:07 +00:00
parent d51860af39
commit fa852340ee
13 changed files with 332 additions and 11 deletions

View file

@ -62,6 +62,7 @@ class Ingredient extends Model
'pos' => 'int',
'default_factor' => 'decimal:2',
'min_stock_alert' => 'decimal:2',
'density' => 'decimal:4',
'delivery_time_days' => 'integer',
];
@ -77,6 +78,7 @@ class Ingredient extends Model
'pos',
'default_factor',
'min_stock_alert',
'density',
'exclude_from_stock',
'material_quality_id',
'tax_rate_id',

View file

@ -23,6 +23,8 @@ class StockEntry extends Model
'supplier_id',
'location_id',
'unit',
'purchase_unit',
'density_used',
'ordered_by',
'ordered_at',
'ordered_quantity',
@ -51,6 +53,7 @@ class StockEntry extends Model
'best_before' => 'date',
'ordered_quantity' => 'decimal:2',
'received_quantity' => 'decimal:2',
'density_used' => 'decimal:4',
'price_per_kg' => 'decimal:4',
'price_per_kg_gross' => 'decimal:4',
'price_total' => 'decimal:4',