diff --git a/web/src/pages/Settings.jsx b/web/src/pages/Settings.jsx index 19b3416..f7a2861 100644 --- a/web/src/pages/Settings.jsx +++ b/web/src/pages/Settings.jsx @@ -10,6 +10,10 @@ import { DATE_FORMATS, formatDate } from "../units"; import { applyFavicon } from "../branding"; const EXPIRY_KEY = "expiry_warning_days"; +// Haltbarkeit nach dem Anbrechen. Der Wert ganz oben in der Kette: Artikel > +// Kategorie (naechster Vorfahr) > hier. Weil er die letzte Station ist, darf er +// nicht leer sein - sonst haette eine angebrochene Packung kein Verbrauchsdatum. +const OPEN_DAYS_KEY = "open_days"; const RECEIPT_KEY = "receipt_match_threshold"; const SESSION_KEY = "session_days"; @@ -28,6 +32,7 @@ export default function Settings() { const { reload } = useSettings(); const toast = useToast(); const [days, setDays] = useState(""); + const [openDays, setOpenDays] = useState(""); const [threshold, setThreshold] = useState(""); const [dateFormat, setDateFormat] = useState("de"); const [sessionDays, setSessionDays] = useState("30"); @@ -38,6 +43,7 @@ export default function Settings() { try { const settings = await api.listSettings(); setDays(settings.find((s) => s.key === EXPIRY_KEY)?.value ?? "7"); + setOpenDays(settings.find((s) => s.key === OPEN_DAYS_KEY)?.value ?? "3"); setThreshold(settings.find((s) => s.key === RECEIPT_KEY)?.value ?? "45"); setDateFormat(settings.find((s) => s.key === DATE_FORMAT_KEY)?.value ?? "de"); setSessionDays(settings.find((s) => s.key === SESSION_KEY)?.value ?? "30"); @@ -53,6 +59,8 @@ export default function Settings() { setError(null); setBusy(true); try { await api.setSetting(EXPIRY_KEY, String(parseInt(days, 10))); + // Mindestens 1: "0 Tage" waere keine Frist, sondern ein Widerspruch. + await api.setSetting(OPEN_DAYS_KEY, String(Math.max(1, parseInt(openDays, 10) || 1))); await api.setSetting(RECEIPT_KEY, String(Math.max(0, Math.min(100, parseInt(threshold, 10) || 0)))); await api.setSetting(DATE_FORMAT_KEY, dateFormat); await api.setSetting(SESSION_KEY, sessionDays); @@ -97,6 +105,19 @@ export default function Settings() { bereits überschritten ist), erscheinen auf der Übersicht unter „Bald ablaufend“.

+ +

+ Wie lange eine angebrochene Packung noch gilt, wenn weder der Artikel + noch eine seiner Kategorien etwas anderes sagt. Dieser Wert ist die + letzte Station der Kette und deshalb Pflicht – ohne ihn bekäme eine + offene Packung kein „zu verbrauchen bis“. Abweichungen stehen bei den + Kategorien unter „Maße & Frist“. +

+

Kassenzettel-Scan