rework external order tracking system

This commit is contained in:
Matthias Hochmeister
2026-03-25 13:24:52 +01:00
parent e02ada8b95
commit 561334791b
7 changed files with 148 additions and 44 deletions

View File

@@ -174,16 +174,16 @@ async function getOrderById(id: number) {
}
}
async function createOrder(data: { bezeichnung: string; lieferant_id?: number; besteller_id?: string; notizen?: string; budget?: number; positionen?: Array<{ bezeichnung: string; menge: number; einheit?: string }> }, userId: string) {
async function createOrder(data: { bezeichnung: string; lieferant_id?: number; besteller_id?: string; notizen?: string; budget?: number; steuersatz?: number; positionen?: Array<{ bezeichnung: string; menge: number; einheit?: string }> }, userId: string) {
const client = await pool.connect();
try {
await client.query('BEGIN');
const bestellerId = data.besteller_id && data.besteller_id.trim() ? data.besteller_id.trim() : null;
const result = await client.query(
`INSERT INTO bestellungen (bezeichnung, lieferant_id, besteller_id, notizen, budget, erstellt_von)
VALUES ($1, $2, $3, $4, $5, $6)
`INSERT INTO bestellungen (bezeichnung, lieferant_id, besteller_id, notizen, budget, steuersatz, erstellt_von)
VALUES ($1, $2, $3, $4, $5, $6, $7)
RETURNING *`,
[data.bezeichnung, data.lieferant_id || null, bestellerId, data.notizen || null, data.budget || null, userId]
[data.bezeichnung, data.lieferant_id || null, bestellerId, data.notizen || null, data.budget || null, data.steuersatz ?? 20, userId]
);
const order = result.rows[0];
@@ -209,7 +209,7 @@ async function createOrder(data: { bezeichnung: string; lieferant_id?: number; b
}
}
async function updateOrder(id: number, data: { bezeichnung?: string; lieferant_id?: number; notizen?: string; budget?: number; status?: string }, userId: string) {
async function updateOrder(id: number, data: { bezeichnung?: string; lieferant_id?: number; notizen?: string; budget?: number; status?: string; steuersatz?: number }, userId: string) {
try {
// Check current order for status change detection
const current = await pool.query(`SELECT * FROM bestellungen WHERE id = $1`, [id]);
@@ -239,10 +239,11 @@ async function updateOrder(id: number, data: { bezeichnung?: string; lieferant_i
status = COALESCE($5, status),
bestellt_am = $6,
abgeschlossen_am = $7,
steuersatz = COALESCE($8, steuersatz),
aktualisiert_am = NOW()
WHERE id = $8
WHERE id = $9
RETURNING *`,
[data.bezeichnung, data.lieferant_id, data.notizen, data.budget, data.status, bestellt_am, abgeschlossen_am, id]
[data.bezeichnung, data.lieferant_id, data.notizen, data.budget, data.status, bestellt_am, abgeschlossen_am, data.steuersatz, id]
);
if (result.rows.length === 0) return null;
@@ -251,6 +252,7 @@ async function updateOrder(id: number, data: { bezeichnung?: string; lieferant_i
if (data.lieferant_id) changes.push(`Lieferant geändert`);
if (data.status && data.status !== oldStatus) changes.push(`Status: ${oldStatus}${data.status}`);
if (data.budget) changes.push(`Budget geändert`);
if (data.steuersatz != null) changes.push(`Steuersatz: ${data.steuersatz}%`);
await logAction(id, 'Bestellung aktualisiert', changes.join(', ') || 'Bestellung bearbeitet', userId);
return result.rows[0];
@@ -302,15 +304,17 @@ const VALID_STATUS_TRANSITIONS: Record<string, string[]> = {
abgeschlossen: [],
};
async function updateOrderStatus(id: number, status: string, userId: string) {
async function updateOrderStatus(id: number, status: string, userId: string, force?: boolean) {
try {
const current = await pool.query(`SELECT status FROM bestellungen WHERE id = $1`, [id]);
if (current.rows.length === 0) return null;
const oldStatus = current.rows[0].status;
const allowed = VALID_STATUS_TRANSITIONS[oldStatus] || [];
if (!allowed.includes(status)) {
throw new Error(`Ungültiger Statusübergang: ${oldStatus}${status}`);
if (!force) {
const allowed = VALID_STATUS_TRANSITIONS[oldStatus] || [];
if (!allowed.includes(status)) {
throw new Error(`Ungültiger Statusübergang: ${oldStatus}${status}`);
}
}
const updates: string[] = ['status = $1', 'aktualisiert_am = NOW()'];
@@ -330,7 +334,7 @@ async function updateOrderStatus(id: number, status: string, userId: string) {
params
);
await logAction(id, 'Status geändert', `${oldStatus}${status}`, userId);
await logAction(id, 'Status geändert', `${oldStatus}${status}${force ? ' (manuell)' : ''}`, userId);
return result.rows[0];
} catch (error) {
logger.error('BestellungService.updateOrderStatus failed', { error, id });