import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { api } from "../api"; import { useAuth } from "../auth"; import Icon from "../components/Icon"; import { guessGroup, suggestionToProduct } from "../offUtils"; import { buildUnitOptions, fmt, isExpired } from "../units"; const emptyLine = () => ({ quantity: "", best_before: "" }); export default function CheckIn() { const { isAdmin } = useAuth(); const [barcode, setBarcode] = useState(""); const [product, setProduct] = useState(null); const [suggestion, setSuggestion] = useState(null); // Gruppe, die diesem Code zugeordnet ist (z.B. alle Mehl-Marken in "Mehl"). const [suggestionGroup, setSuggestionGroup] = useState({ id: "", name: "" }); const [unknownBarcode, setUnknownBarcode] = useState(null); const [results, setResults] = useState([]); const [search, setSearch] = useState(""); const [locations, setLocations] = useState([]); const [groups, setGroups] = useState([]); const [units, setUnits] = useState([]); const [unit, setUnit] = useState(""); const [locationId, setLocationId] = useState(""); const [lines, setLines] = useState([emptyLine()]); const [error, setError] = useState(null); const [info, setInfo] = useState(null); const [busy, setBusy] = useState(false); useEffect(() => { api.listLocations().then(setLocations).catch(() => {}); api.listGroups().then(setGroups).catch(() => {}); api.listUnits().then(setUnits).catch(() => {}); }, []); function resetLookup() { setSuggestion(null); setUnknownBarcode(null); } function selectProduct(p) { setProduct(p); setResults([]); resetLookup(); const opts = buildUnitOptions(p, units); // Gibt es ein Gebinde (Glas, Packung, …), ist das die naheliegende Eingabe. setUnit(p.package_size ? "package" : (p.unit_name || (opts[0] && opts[0].value) || "")); setLines([emptyLine()]); setLocationId(""); } async function doLookup() { setError(null); setInfo(null); resetLookup(); if (!barcode) return; try { const res = await api.lookup(barcode.trim()); if (res.found && res.existing_product) { selectProduct(res.existing_product); setInfo(`Produkt erkannt: ${res.existing_product.name}`); } else if (res.found && res.suggestion) { setSuggestion(res.suggestion); setSuggestionGroup({ id: res.group_id ? String(res.group_id) : "", name: res.group_name || "" }); } else { setUnknownBarcode(barcode.trim()); setSuggestionGroup({ id: res.group_id ? String(res.group_id) : "", name: res.group_name || "" }); } } catch (err) { setError(err.message); } } async function createFromSuggestion() { setError(null); setBusy(true); try { // Ist der Code einer Gruppe zugeordnet, hat das Vorrang vor dem Kategorie-Rateversuch. const groupId = suggestionGroup.id || guessGroup(groups, suggestion); const payload = suggestionToProduct(suggestion, groupId); const created = await api.createProduct(payload); selectProduct(created); setInfo(`Produkt "${created.name}" angelegt.`); } catch (err) { setError(err.message); } finally { setBusy(false); } } async function doSearch(e) { e.preventDefault(); try { setResults(await api.listProducts(search)); } catch (err) { setError(err.message); } } function setLine(i, key, value) { setLines((ls) => ls.map((l, idx) => (idx === i ? { ...l, [key]: value } : l))); } function addLine() { setLines((ls) => [...ls, emptyLine()]); } function removeLine(i) { setLines((ls) => (ls.length > 1 ? ls.filter((_, idx) => idx !== i) : ls)); } const totalQty = lines.reduce((s, l) => s + (Number(l.quantity) || 0), 0); async function submit(e) { e.preventDefault(); setError(null); setInfo(null); const payloadLines = lines .filter((l) => Number(l.quantity) > 0) .map((l) => ({ quantity: Number(l.quantity), best_before: l.best_before || null, location_id: locationId === "" ? null : Number(locationId), })); if (payloadLines.length === 0) { setError("Bitte mindestens eine Menge angeben."); return; } setBusy(true); try { const res = await api.checkInBatch({ product_id: product.id, unit, lines: payloadLines }); setInfo( `${payloadLines.length} Charge(n) eingelagert. Neuer Bestand: ` + `${fmt(res.product_stock / (product.unit_factor || 1))} ${product.unit_name}` ); setLines([emptyLine()]); setProduct(await api.getProduct(product.id)); } catch (err) { setError(err.message); } finally { setBusy(false); } } return (