|
|
|
|
@@ -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 });
|
|
|
|
|
|