fix(multi): FDISK sync, order UX, Ausbildungen display, untracked items
FDISK sync: - fix(sync): strip 'KFZ-Führerschein / ' prefix from license class select option text before whitelist validation - fix(sync): fix navigateAndGetTableRows to pick date column with most matches (prevents sidebar tables from hijacking dateColIdx for Beförderungen) - fix(sync): input.value fallback now falls through to textContent when value is empty - feat(sync): expand Ausbildungen to capture Kursnummer, Kurz, Kurs (full name), Erfolgscode from FDISK table; add migration 086 External orders (Bestellungen): - fix(bestellungen): allow erhalten_menge editing in lieferung_pruefen status (resolves deadlock preventing order completion) - fix(bestellungen): show cost/received warnings for bestellt/teillieferung/lieferung_pruefen, not just when abgeschlossen is next - feat(bestellungen): rename status labels to Eingereicht, Genehmigt, Teilweise geliefert, Vollständig geliefert - fix(bestellungen): remove duplicate Bestelldatum from PDF export - feat(bestellungen): add catalog item autocomplete to creation form (auto-fills bezeichnung + artikelnummer) Internal orders (Ausruestungsanfrage): - fix(ausruestung): untracked items with zuweisung_typ='keine' now appear in Nicht-zugewiesen tab (frontend filter was too strict) - feat(ausruestung): load user-specific personal items when ordering for another user - feat(ausruestung): auto-set ist_ersatz=true for items from personal equipment list; add toggle for catalog/free-text items - feat(ausruestung): load item eigenschaften when personal item with artikel_id is checked Ausbildungen display: - feat(mitglieder): show kursname (full), kurs_kurzbezeichnung chip, erfolgscode chip (color-coded) per Ausbildung entry Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -487,7 +487,6 @@ export default function BestellungDetail() {
|
||||
curY += 5;
|
||||
row('Bezeichnung', bestellung.bezeichnung);
|
||||
row('Erstellt am', formatDate(bestellung.erstellt_am));
|
||||
if (bestellung.bestellt_am) row('Bestelldatum', formatDate(bestellung.bestellt_am));
|
||||
curY += 5;
|
||||
|
||||
// ── Place and date ──
|
||||
@@ -807,10 +806,10 @@ export default function BestellungDetail() {
|
||||
{/* ── Status Action ── */}
|
||||
{(canManageOrders || canCreate || canApprove) && (
|
||||
<Box sx={{ mb: 3 }}>
|
||||
{validTransitions.includes('abgeschlossen' as BestellungStatus) && !allCostsEntered && (
|
||||
{(['bestellt', 'teillieferung', 'lieferung_pruefen'] as BestellungStatus[]).includes(bestellung.status) && !allCostsEntered && (
|
||||
<Alert severity="warning" sx={{ mb: 2 }}>Nicht alle Positionen haben Kosten. Bitte Einzelpreise eintragen, bevor die Bestellung abgeschlossen wird.</Alert>
|
||||
)}
|
||||
{validTransitions.includes('abgeschlossen' as BestellungStatus) && !allItemsReceived && (
|
||||
{(['bestellt', 'teillieferung', 'lieferung_pruefen'] as BestellungStatus[]).includes(bestellung.status) && !allItemsReceived && (
|
||||
<Alert severity="warning" sx={{ mb: 2 }}>Nicht alle Positionen wurden vollständig empfangen. Bitte Eingangsmenge prüfen, bevor die Bestellung abgeschlossen wird.</Alert>
|
||||
)}
|
||||
<Box sx={{ display: 'flex', gap: 1, alignItems: 'center' }}>
|
||||
@@ -954,7 +953,7 @@ export default function BestellungDetail() {
|
||||
{canManageOrders ? (
|
||||
<TextField size="small" type="number" sx={{ width: 70 }} value={p.erhalten_menge}
|
||||
inputProps={{ min: 0, max: p.menge }}
|
||||
disabled={bestellung.status !== 'bestellt' && bestellung.status !== 'teillieferung'}
|
||||
disabled={!['bestellt', 'teillieferung', 'lieferung_pruefen'].includes(bestellung.status)}
|
||||
onChange={(e) => updateReceived.mutate({ itemId: p.id, menge: Number(e.target.value) })} />
|
||||
) : p.erhalten_menge}
|
||||
</TableCell>
|
||||
@@ -1026,7 +1025,7 @@ export default function BestellungDetail() {
|
||||
sx={{ width: 70 }}
|
||||
value={p.erhalten_menge}
|
||||
inputProps={{ min: 0, max: p.menge }}
|
||||
disabled={bestellung.status !== 'bestellt' && bestellung.status !== 'teillieferung'}
|
||||
disabled={!['bestellt', 'teillieferung', 'lieferung_pruefen'].includes(bestellung.status)}
|
||||
onChange={(e) => updateReceived.mutate({ itemId: p.id, menge: Number(e.target.value) })}
|
||||
/>
|
||||
) : (
|
||||
|
||||
Reference in New Issue
Block a user