fix(ausruestung): show untracked assignments, item traits in order wizard, receipt

gate for completion, PDF phone + last-row line
This commit is contained in:
Matthias Hochmeister
2026-04-15 10:58:51 +02:00
parent 279cc03b6b
commit 4c01683c10
5 changed files with 63 additions and 3 deletions

View File

@@ -203,6 +203,7 @@ export default function BestellungDetail() {
const canExport = hasPermission('bestellungen:export');
const validTransitions = bestellung ? STATUS_TRANSITIONS[bestellung.status] : [];
const allCostsEntered = positionen.length === 0 || positionen.every(p => p.einzelpreis != null && Number(p.einzelpreis) > 0);
const allItemsReceived = positionen.length === 0 || positionen.every(p => Number(p.erhalten_menge) >= Number(p.menge));
// All statuses except current, for force override
const ALL_STATUSES: BestellungStatus[] = ['entwurf', 'wartet_auf_genehmigung', 'bereit_zur_bestellung', 'bestellt', 'teillieferung', 'lieferung_pruefen', 'abgeschlossen'];
@@ -475,6 +476,7 @@ export default function BestellungDetail() {
: bestellung.besteller_name;
row('Name', nameWithRank);
if (bestellung.besteller_email) row('E-Mail', bestellung.besteller_email);
if (bestellung.besteller_telefon) row('Telefon', bestellung.besteller_telefon);
curY += 3;
}
@@ -563,6 +565,17 @@ export default function BestellungDetail() {
data.cell.y,
);
}
// Line at bottom of last row
if (data.row.index === rows.length - 1) {
data.doc.setDrawColor(200, 200, 200);
data.doc.setLineWidth(0.2);
data.doc.line(
data.settings.margin.left,
data.cell.y + data.cell.height,
data.doc.internal.pageSize.width - data.settings.margin.right,
data.cell.y + data.cell.height,
);
}
}
},
foot: [
@@ -616,6 +629,17 @@ export default function BestellungDetail() {
data.cell.y,
);
}
// Line at bottom of last row
if (data.row.index === rows.length - 1) {
data.doc.setDrawColor(200, 200, 200);
data.doc.setLineWidth(0.2);
data.doc.line(
data.settings.margin.left,
data.cell.y + data.cell.height,
data.doc.internal.pageSize.width - data.settings.margin.right,
data.cell.y + data.cell.height,
);
}
}
},
didDrawPage: addPdfFooter(doc, settings),
@@ -786,6 +810,9 @@ export default function BestellungDetail() {
{validTransitions.includes('abgeschlossen' as BestellungStatus) && !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 && (
<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' }}>
{validTransitions
.filter((s) => {
@@ -813,7 +840,7 @@ export default function BestellungDetail() {
key={s}
variant="contained"
color={color as 'success' | 'error' | 'primary'}
disabled={isAbgeschlossen && !allCostsEntered}
disabled={isAbgeschlossen && (!allCostsEntered || !allItemsReceived)}
onClick={() => { setStatusForce(false); setStatusConfirmTarget(s); }}
>
{label}