rework internal order system

This commit is contained in:
Matthias Hochmeister
2026-03-24 08:11:32 +01:00
parent 742c37b8de
commit 99f02b8425
11 changed files with 792 additions and 397 deletions

View File

@@ -189,7 +189,7 @@ async function getRequestById(id: number) {
return {
...reqResult.rows[0],
positionen: positionen.rows,
bestellungen: bestellungen.rows,
linked_bestellungen: bestellungen.rows,
};
}
@@ -197,6 +197,7 @@ async function createRequest(
userId: string,
items: { artikel_id?: number; bezeichnung: string; menge: number; notizen?: string }[],
notizen?: string,
bezeichnung?: string,
) {
const client = await pool.connect();
try {
@@ -213,10 +214,10 @@ async function createRequest(
const nextNr = maxResult.rows[0].next_nr;
const anfrageResult = await client.query(
`INSERT INTO ausruestung_anfragen (anfrager_id, notizen, bestell_nummer, bestell_jahr)
VALUES ($1, $2, $3, $4)
`INSERT INTO ausruestung_anfragen (anfrager_id, notizen, bezeichnung, bestell_nummer, bestell_jahr)
VALUES ($1, $2, $3, $4, $5)
RETURNING *`,
[userId, notizen || null, nextNr, currentYear],
[userId, notizen || null, bezeichnung || null, nextNr, currentYear],
);
const anfrage = anfrageResult.rows[0];
@@ -252,6 +253,74 @@ async function createRequest(
}
}
async function updateRequest(
id: number,
data: {
bezeichnung?: string;
notizen?: string;
items?: { artikel_id?: number; bezeichnung: string; menge: number; notizen?: string }[];
},
) {
const client = await pool.connect();
try {
await client.query('BEGIN');
// Update anfrage fields
const fields: string[] = [];
const params: unknown[] = [];
if (data.bezeichnung !== undefined) {
params.push(data.bezeichnung || null);
fields.push(`bezeichnung = $${params.length}`);
}
if (data.notizen !== undefined) {
params.push(data.notizen || null);
fields.push(`notizen = $${params.length}`);
}
if (fields.length > 0) {
params.push(new Date());
fields.push(`aktualisiert_am = $${params.length}`);
params.push(id);
await client.query(
`UPDATE ausruestung_anfragen SET ${fields.join(', ')} WHERE id = $${params.length}`,
params,
);
}
// Replace items if provided
if (data.items) {
await client.query('DELETE FROM ausruestung_anfrage_positionen WHERE anfrage_id = $1', [id]);
for (const item of data.items) {
let bezeichnung = item.bezeichnung;
if (item.artikel_id) {
const artikelResult = await client.query(
'SELECT bezeichnung FROM ausruestung_artikel WHERE id = $1',
[item.artikel_id],
);
if (artikelResult.rows.length > 0) {
bezeichnung = artikelResult.rows[0].bezeichnung;
}
}
await client.query(
`INSERT INTO ausruestung_anfrage_positionen (anfrage_id, artikel_id, bezeichnung, menge, notizen)
VALUES ($1, $2, $3, $4, $5)`,
[id, item.artikel_id || null, bezeichnung, item.menge, item.notizen || null],
);
}
}
await client.query('COMMIT');
return getRequestById(id);
} catch (error) {
await client.query('ROLLBACK');
logger.error('ausruestungsanfrageService.updateRequest failed', { error });
throw error;
} finally {
client.release();
}
}
async function updateRequestStatus(
id: number,
status: string,
@@ -353,6 +422,7 @@ export default {
getMyRequests,
getRequestById,
createRequest,
updateRequest,
updateRequestStatus,
deleteRequest,
linkToOrder,