From 7ce07daa9707802aadc8517ba4dacacf1c1d7a75 Mon Sep 17 00:00:00 2001
From: Scarriffle
Date: Fri, 2 Oct 2026 14:39:20 +0200
Subject: [PATCH] Globale Oeffnungsfrist in die Einstellungen
Die letzte Station der Vererbungskette hatte keine Oberflaeche: Artikel >
Kategorie (naechster Vorfahr) > global. Die Kategorien konnten seit dem
letzten Commit abweichen, aber der Wert, von dem alles ausgeht, liess
sich nur per API setzen.
Er steht jetzt in der Karte "Ablaufwarnung", direkt unter der
Vorwarnzeit - beides sind Fristen, die man im selben Moment einstellt.
Mindestens 1 Tag, denn er ist Pflicht: Waere er leer, bekaeme eine
angebrochene Packung gar kein "zu verbrauchen bis".
Von Hand geprueft: 3 auf 4 Tage geaendert und gespeichert.
Co-Authored-By: Claude Opus 5
---
web/src/pages/Settings.jsx | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
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“.
+