From 9cc3e325bbbb31b9effbe19cc20fc499ba43bb70 Mon Sep 17 00:00:00 2001
From: Scarriffle
Date: Thu, 30 Jul 2026 18:26:20 +0200
Subject: [PATCH] Web: Kassenzettel-Trefferschwelle in den Einstellungen
Prozent-Feld fuer receipt_match_threshold (Default 45) analog zur Ablaufwarnung;
speichert ueber den generischen Settings-Endpunkt.
Co-Authored-By: Claude Opus 4.8
---
web/src/pages/Settings.jsx | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/web/src/pages/Settings.jsx b/web/src/pages/Settings.jsx
index 28c6ec5..4c3e5a3 100644
--- a/web/src/pages/Settings.jsx
+++ b/web/src/pages/Settings.jsx
@@ -10,11 +10,13 @@ import { DATE_FORMATS, formatDate } from "../units";
import { applyFavicon } from "../branding";
const EXPIRY_KEY = "expiry_warning_days";
+const RECEIPT_KEY = "receipt_match_threshold";
export default function Settings() {
const { reload } = useSettings();
const toast = useToast();
const [days, setDays] = useState("");
+ const [threshold, setThreshold] = useState("");
const [dateFormat, setDateFormat] = useState("de");
const [error, setError] = useState(null);
const [busy, setBusy] = useState(false);
@@ -23,6 +25,7 @@ export default function Settings() {
try {
const settings = await api.listSettings();
setDays(settings.find((s) => s.key === EXPIRY_KEY)?.value ?? "7");
+ setThreshold(settings.find((s) => s.key === RECEIPT_KEY)?.value ?? "45");
setDateFormat(settings.find((s) => s.key === DATE_FORMAT_KEY)?.value ?? "de");
} catch (err) {
setError(err.message);
@@ -36,6 +39,7 @@ export default function Settings() {
setError(null); setBusy(true);
try {
await api.setSetting(EXPIRY_KEY, String(parseInt(days, 10)));
+ await api.setSetting(RECEIPT_KEY, String(Math.max(0, Math.min(100, parseInt(threshold, 10) || 0))));
await api.setSetting(DATE_FORMAT_KEY, dateFormat);
await reload();
toast("Gespeichert.");
@@ -71,6 +75,20 @@ export default function Settings() {
bereits überschritten ist), erscheinen auf der Übersicht unter „Bald ablaufend“.
+
+
Kassenzettel-Scan
+
+
+ Trefferschwelle (%)
+ setThreshold(e.target.value)} style={{ maxWidth: 160 }} />
+
+
+ Beim Scannen eines Kassenzettels (iOS) werden je Zeile nur Artikel vorgeschlagen,
+ deren Übereinstimmung mindestens so hoch ist. Höher = strenger (weniger, dafür
+ sicherere Vorschläge), niedriger = mehr Vorschläge.
+
+
Darstellung