feat(ausruestungsanfrage): show vendor order status and delivery progress in request detail

This commit is contained in:
Matthias Hochmeister
2026-04-17 12:39:40 +02:00
parent d8afcc1f63
commit 169d045e4c
3 changed files with 133 additions and 9 deletions

View File

@@ -409,19 +409,64 @@ async function getRequestById(id: number) {
} catch { /* table may not exist */ }
}
// Load per-position vendor order info (anfrage_position_id FK, added in migration 096)
let positionBestellInfoMap: Record<number, {
bestellung_id: number;
bestellung_bezeichnung: string;
bestellung_status: string;
bestellung_laufende_nummer: number | null;
bestellung_erstellt_am: string;
erhalten_menge: number;
bestellt_menge: number;
}> = {};
if (positionIds.length > 0) {
try {
const bpResult = await pool.query(
`SELECT bp.anfrage_position_id,
bp.bestellung_id,
bp.erhalten_menge,
bp.menge AS bestellt_menge,
b.bezeichnung AS bestellung_bezeichnung,
b.status AS bestellung_status,
b.laufende_nummer AS bestellung_laufende_nummer,
b.erstellt_am AS bestellung_erstellt_am
FROM bestellpositionen bp
JOIN bestellungen b ON b.id = bp.bestellung_id
WHERE bp.anfrage_position_id = ANY($1)`,
[positionIds],
);
for (const row of bpResult.rows) {
positionBestellInfoMap[row.anfrage_position_id] = {
bestellung_id: row.bestellung_id,
bestellung_bezeichnung: row.bestellung_bezeichnung,
bestellung_status: row.bestellung_status,
bestellung_laufende_nummer: row.bestellung_laufende_nummer ?? null,
bestellung_erstellt_am: row.bestellung_erstellt_am,
erhalten_menge: Number(row.erhalten_menge),
bestellt_menge: Number(row.bestellt_menge),
};
}
} catch { /* bestellpositionen.anfrage_position_id may not exist */ }
}
const positionenWithEigenschaften = positionen.rows.map((p: { id: number }) => ({
...p,
eigenschaften: eigenschaftenMap[p.id] || [],
bestellung_info: positionBestellInfoMap[p.id] ?? null,
}));
// Load linked bestellungen
// Load linked bestellungen with delivery totals
let linkedBestellungen: unknown[] = [];
try {
const bestellungen = await pool.query(
`SELECT b.*
`SELECT b.id, b.bezeichnung, b.status, b.laufende_nummer, b.erstellt_am,
COALESCE(SUM(bp.erhalten_menge), 0)::int AS total_received,
COALESCE(SUM(bp.menge), 0)::int AS total_ordered
FROM ausruestung_anfrage_bestellung ab
JOIN bestellungen b ON b.id = ab.bestellung_id
WHERE ab.anfrage_id = $1`,
LEFT JOIN bestellpositionen bp ON bp.bestellung_id = b.id
WHERE ab.anfrage_id = $1
GROUP BY b.id, b.bezeichnung, b.status, b.laufende_nummer, b.erstellt_am`,
[id],
);
linkedBestellungen = bestellungen.rows;