new features

This commit is contained in:
Matthias Hochmeister
2026-03-23 16:09:42 +01:00
parent e9a9478aac
commit 8c66492b27
40 changed files with 2016 additions and 117 deletions

View File

@@ -9,6 +9,7 @@ import {
CreateAusruestungData,
UpdateAusruestungData,
CreateAusruestungWartungslogData,
UpdateAusruestungWartungslogData,
AusruestungStatus,
EquipmentStats,
VehicleEquipmentWarning,
@@ -330,6 +331,15 @@ class EquipmentService {
const entry = result.rows[0] as AusruestungWartungslog;
logger.info('Equipment wartungslog entry added', { entryId: entry.id, equipmentId, by: createdBy });
// Auto-update next inspection date on the equipment when result is 'bestanden'
if (data.ergebnis === 'bestanden' && data.naechste_pruefung_am) {
await pool.query(
`UPDATE ausruestung SET naechste_pruefung_am = $1, letzte_pruefung_am = $2 WHERE id = $3`,
[data.naechste_pruefung_am, data.datum, equipmentId]
);
}
return entry;
} catch (error) {
logger.error('EquipmentService.addWartungslog failed', { error, equipmentId });
@@ -461,6 +471,70 @@ class EquipmentService {
}
}
// =========================================================================
// WARTUNGSLOG UPDATE
// =========================================================================
async updateWartungslog(
equipmentId: string,
wartungId: number,
data: UpdateAusruestungWartungslogData,
updatedBy: string
): Promise<AusruestungWartungslog> {
try {
// Verify the wartung entry belongs to this equipment
const check = await pool.query(
`SELECT id FROM ausruestung_wartungslog WHERE id = $1 AND ausruestung_id = $2`,
[wartungId, equipmentId]
);
if (check.rows.length === 0) {
throw new Error('Wartungseintrag nicht gefunden');
}
const fields: string[] = [];
const values: unknown[] = [];
let p = 1;
const addField = (col: string, value: unknown) => {
fields.push(`${col} = $${p++}`);
values.push(value);
};
if (data.datum !== undefined) addField('datum', data.datum);
if (data.art !== undefined) addField('art', data.art);
if (data.beschreibung !== undefined) addField('beschreibung', data.beschreibung);
if (data.ergebnis !== undefined) addField('ergebnis', data.ergebnis);
if (data.kosten !== undefined) addField('kosten', data.kosten);
if (data.pruefende_stelle !== undefined) addField('pruefende_stelle', data.pruefende_stelle);
if (fields.length === 0) {
throw new Error('No fields to update');
}
values.push(wartungId);
const result = await pool.query(
`UPDATE ausruestung_wartungslog SET ${fields.join(', ')} WHERE id = $${p} RETURNING *`,
values
);
const entry = result.rows[0] as AusruestungWartungslog;
// Auto-update next inspection date on the equipment when result is 'bestanden'
if (data.ergebnis === 'bestanden' && data.naechste_pruefung_am) {
await pool.query(
`UPDATE ausruestung SET naechste_pruefung_am = $1, letzte_pruefung_am = $2 WHERE id = $3`,
[data.naechste_pruefung_am, data.datum ?? entry.datum, equipmentId]
);
}
logger.info('Equipment wartungslog entry updated', { wartungId, equipmentId, by: updatedBy });
return entry;
} catch (error) {
logger.error('EquipmentService.updateWartungslog failed', { error, wartungId, equipmentId });
throw error;
}
}
// =========================================================================
// WARTUNGSLOG FILE UPLOAD
// =========================================================================