Einlagern-UX: 3-Wege-Barcode, Inline-Anlage aus OFF, Mehr-Chargen mit MHD
Einlagern: - Barcode-Erkennung dreiteilig: bekannt -> direkt Menge; unbekannt aber in OFF -> "Anlegen & einlagern" inline; gar nicht gefunden -> manuell anlegen. - Mehrere Chargen pro Vorgang: je Zeile eigene Menge + eigenes MHD (z.B. 5 Glaeser mit unterschiedlichen Daten). Neuer Endpoint /stock/checkin/batch. Produkte/OFF: - OFF-Fuellmenge (quantity) wird in Basiseinheit + Packungsgroesse geparst (kg->g, l->ml, cl/dl); parse_quantity + Tests. - Produktformular uebernimmt Barcode aus ?barcode= und schlaegt automatisch nach, fuellt Packungsgroesse; gemeinsame offUtils (guessGroup/suggestionToProduct). Lagerorte: - Baum jetzt rekursiv ueber beliebig viele Ebenen (Schrank->Fach->Kiste->...). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
27
web/src/offUtils.js
Normal file
27
web/src/offUtils.js
Normal file
@@ -0,0 +1,27 @@
|
||||
// Gemeinsame Helfer rund um Open-Food-Facts-Vorschläge.
|
||||
|
||||
// Versucht, aus einem OFF-Kategorietext eine vorhandene Gruppe zu erraten.
|
||||
export function guessGroup(groups, suggestion) {
|
||||
if (!suggestion) return "";
|
||||
const haystack = [
|
||||
suggestion.category_suggestion || "",
|
||||
...(suggestion.category_tags || []),
|
||||
suggestion.name || "",
|
||||
].join(" ").toLowerCase();
|
||||
const hit = groups.find((g) => haystack.includes(g.name.toLowerCase()));
|
||||
return hit ? String(hit.id) : "";
|
||||
}
|
||||
|
||||
// Baut aus einem OFF-Vorschlag ein Produkt-Anlage-Payload.
|
||||
export function suggestionToProduct(s, groupId = "") {
|
||||
return {
|
||||
barcode: s.barcode || null,
|
||||
name: s.name,
|
||||
brand: s.brand || null,
|
||||
image_url: s.image_url || null,
|
||||
base_unit: s.base_unit || "piece",
|
||||
package_size: s.package_size ?? null,
|
||||
min_stock: null,
|
||||
group_id: groupId === "" || groupId == null ? null : Number(groupId),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user