Mindestbestand auch fuer Gegenstaende (Web-Formular + iOS)

Gegenstaende (Verbrauchsmaterial wie Sonnencreme) koennen jetzt einen Mindestbestand haben - im Web-Produktformular ein Gesamt-Feld (Stueck) plus Mindestbestand je Lagerort, auf iOS ein Gesamt-Feld in der Detailansicht. Umrechnung wie bei Lebensmitteln (fuer Stueck-Artikel = Stueckzahl); iOS sendet min_stock nur bei Gegenstaenden, damit Lebensmittel-Modi unberuehrt bleiben. Backend/Einkaufsliste unterstuetzen das bereits. Namen (Lebensmittel/Gegenstaende) bleiben.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-27 19:48:41 +02:00
parent 9551751732
commit 1dc249eb79
3 changed files with 68 additions and 2 deletions

View File

@@ -446,7 +446,14 @@ export default function ProductForm() {
Object.entries(fieldValues).forEach(([k, v]) => {
if (erlaubt.has(String(k))) fv[k] = v;
});
return { ...base, individual: form.individual, field_values: fv };
// Auch Gegenstände dürfen einen Mindestbestand haben (Verbrauchsmaterial):
// gleiche Umrechnung wie bei Lebensmitteln, für Stück-Artikel = Stückzahl.
return {
...base, individual: form.individual, field_values: fv,
min_stock: minBase,
min_stock_unit_id: sel === "package" || sel === "" ? null : Number(sel),
min_stock_in_packages: sel === "package",
};
}
return {
...base,
@@ -803,6 +810,36 @@ export default function ProductForm() {
</div>
</label>
</div>
<div className="row">
<label className="grow" style={{ maxWidth: 300 }}>
Mindestbestand (Stück)
<input type="number" step="any" min="0" value={form.min_stock}
onChange={(e) => set("min_stock", e.target.value)} disabled={readOnly}
placeholder="z.B. 3" />
</label>
</div>
{!isNew && product && isAdmin && (
<div style={{ marginTop: "var(--sp-2)", marginBottom: "var(--sp-4)" }}>
<div className="card-head" style={{ marginBottom: "var(--sp-1)" }}>
<Icon name="location" size={16} />
<h3 style={{ margin: 0 }}>Mindestbestand je Lagerort</h3>
</div>
<p className="muted small mt-0">
Bedarf je Lagerort (z.B. Ferienhaus, Zuhause), zusätzlich zum Gesamt-Mindestbestand. Menge in Stück.
</p>
<LocationMinStock
locations={locations}
initial={product.location_min_stocks || []}
unitLabel="Stück"
onError={(m) => toast(m, "warn")}
onSave={async (list) => {
const updated = await api.setProductLocationMinStock(product.id, list);
setProduct(updated);
toast("Bedarfe je Lagerort gespeichert.");
}}
/>
</div>
)}
{form.category_id !== "" && (
<div style={{ marginTop: "var(--sp-2)" }}>
<div className="card-head" style={{ marginBottom: "var(--sp-2)" }}>