diff --git a/backend/src/tools/bestellungen/routes.js b/backend/src/tools/bestellungen/routes.js index 7f4e290..c3efc25 100644 --- a/backend/src/tools/bestellungen/routes.js +++ b/backend/src/tools/bestellungen/routes.js @@ -69,20 +69,24 @@ router.put('/:id', authenticate, (req, res) => { if (!ex) return res.status(404).json({ error: 'Nicht gefunden' }); const { name=ex.name, bemerkung=ex.bemerkung, status=ex.status, custom_price=ex.custom_price } = req.body; - // Bezahlt-Status mit Datum + // Bezahlt-Status mit Datum (optional überschreibbar) let bezahlt = ex.bezahlt; let bezahlt_am = ex.bezahlt_am; if (req.body.bezahlt !== undefined) { bezahlt = req.body.bezahlt ? 1 : 0; - bezahlt_am = req.body.bezahlt ? new Date().toISOString() : null; + bezahlt_am = req.body.bezahlt + ? (req.body.bezahlt_am_override || new Date().toISOString()) + : null; } - // Abgeholt-Status mit Datum + // Abgeholt-Status mit Datum (optional überschreibbar) let abgeholt = ex.abgeholt; let abgeholt_am = ex.abgeholt_am; if (req.body.abgeholt !== undefined) { abgeholt = req.body.abgeholt ? 1 : 0; - abgeholt_am = req.body.abgeholt ? new Date().toISOString() : null; + abgeholt_am = req.body.abgeholt + ? (req.body.abgeholt_am_override || new Date().toISOString()) + : null; } db.prepare('UPDATE orders SET name=?,bemerkung=?,status=?,custom_price=?,bezahlt=?,bezahlt_am=?,abgeholt=?,abgeholt_am=?,updated_at=CURRENT_TIMESTAMP WHERE id=? AND user_id=?') diff --git a/frontend/src/tools/bestellungen.jsx b/frontend/src/tools/bestellungen.jsx index a1dd00f..0cdcaf8 100644 --- a/frontend/src/tools/bestellungen.jsx +++ b/frontend/src/tools/bestellungen.jsx @@ -124,13 +124,44 @@ function BestellungDetail({ id, toast, onBack }) { return 'warteliste'; }; - const toggleBezahlt = () => - api(`/tools/bestellungen/${id}`,{method:'PUT',body:{bezahlt:!order.bezahlt}}) - .then(u=>{setOrder(u);toast(u.bezahlt?'Als bezahlt markiert':'Bezahlung aufgehoben');}); + const today = () => new Date().toISOString().slice(0,10); + const [bezahltDate, setBezahltDate] = useState(today()); + const [abgeholtDate, setAbgeholtDate] = useState(today()); + const [showBezahltPicker, setShowBezahltPicker] = useState(false); + const [showAbgeholtPicker, setShowAbgeholtPicker] = useState(false); - const toggleAbgeholt = () => - api(`/tools/bestellungen/${id}`,{method:'PUT',body:{abgeholt:!order.abgeholt}}) - .then(u=>{setOrder(u);toast(u.abgeholt?'Als abgeholt markiert':'Abholung aufgehoben');}); + function toggleBezahlt() { + if (!order.bezahlt) { + // Noch nicht bezahlt → Datum-Picker anzeigen + setBezahltDate(today()); + setShowBezahltPicker(true); + } else { + api(`/tools/bestellungen/${id}`,{method:'PUT',body:{bezahlt:false}}) + .then(u=>{setOrder(u);toast('Bezahlung aufgehoben');}); + } + } + + function confirmBezahlt() { + const iso = new Date(bezahltDate).toISOString(); + api(`/tools/bestellungen/${id}`,{method:'PUT',body:{bezahlt:true, bezahlt_am_override: iso}}) + .then(u=>{setOrder(u);setShowBezahltPicker(false);toast('Als bezahlt markiert');}); + } + + function toggleAbgeholt() { + if (!order.abgeholt) { + setAbgeholtDate(today()); + setShowAbgeholtPicker(true); + } else { + api(`/tools/bestellungen/${id}`,{method:'PUT',body:{abgeholt:false}}) + .then(u=>{setOrder(u);toast('Abholung aufgehoben');}); + } + } + + function confirmAbgeholt() { + const iso = new Date(abgeholtDate).toISOString(); + api(`/tools/bestellungen/${id}`,{method:'PUT',body:{abgeholt:true, abgeholt_am_override: iso}}) + .then(u=>{setOrder(u);setShowAbgeholtPicker(false);toast('Als abgeholt markiert');}); + } const isAbgeschlossen = order && !!order.bezahlt && !!order.abgeholt; @@ -179,6 +210,29 @@ function BestellungDetail({ id, toast, onBack }) { )} + {showBezahltPicker && ( +