import { useMemo, useState } from 'preact/hooks'; import type { BarConfig, CartItem } from '@wutzcalc/shared'; import { api, formatCents, uuid } from '../api'; interface Props { config: BarConfig; onChangeBar: () => void; } type Line = { drink_id: number; qty: number }; export function Sale({ config, onChangeBar }: Props) { const { bar, drinks } = config; const [lines, setLines] = useState([]); const [pfandReturns, setPfandReturns] = useState(0); const [submitting, setSubmitting] = useState(false); const drinkById = useMemo(() => { const m = new Map(); drinks.forEach(d => m.set(d.id, d)); return m; }, [drinks]); const total = useMemo(() => { const drinksSum = lines.reduce((sum, l) => { const d = drinkById.get(l.drink_id); if (!d) return sum; return sum + (d.price_cents + bar.pfand_cents) * l.qty; }, 0); return drinksSum - bar.pfand_cents * pfandReturns; }, [lines, drinkById, bar.pfand_cents, pfandReturns]); function addDrink(drinkId: number) { setLines(prev => { const i = prev.findIndex(l => l.drink_id === drinkId); if (i >= 0) { const copy = prev.slice(); copy[i] = { ...copy[i]!, qty: copy[i]!.qty + 1 }; return copy; } return [...prev, { drink_id: drinkId, qty: 1 }]; }); } function addPfandReturn() { setPfandReturns(n => n + 1); } function clear() { setLines([]); setPfandReturns(0); } const pfandCount = useMemo(() => lines.reduce((sum, l) => sum + l.qty, 0), [lines]); const isEmpty = lines.length === 0 && pfandReturns === 0; async function confirm(crew: boolean) { if (isEmpty || submitting) return; setSubmitting(true); const items: CartItem[] = lines.map(l => ({ drink_id: l.drink_id, qty: l.qty })); try { await api.createTransaction({ client_uuid: uuid(), bar_id: bar.id, crew, items, pfand_returns: pfandReturns, }); clear(); } catch (e) { alert(`Fehler beim Speichern: ${e}`); } finally { setSubmitting(false); } } return (
{bar.name}
{drinks.map(d => ( ))} {bar.pfand_cents > 0 && ( )}
{isEmpty &&
Keine Einträge
} {lines.map((l, i) => { const d = drinkById.get(l.drink_id); if (!d) return null; return (
{l.qty}× {d.name} {formatCents(d.price_cents * l.qty)}
); })} {bar.pfand_cents > 0 && pfandCount > 0 && (
{pfandCount}× Pfand {formatCents(bar.pfand_cents * pfandCount)}
)} {pfandReturns > 0 && (
{pfandReturns}× Pfand zurück {formatCents(-bar.pfand_cents * pfandReturns)}
)}
{formatCents(total)}
); }