update
This commit is contained in:
@@ -25,8 +25,12 @@ function handleZodError(res: Response, err: ZodError): void {
|
||||
}
|
||||
|
||||
function handleConflictError(res: Response, err: Error): boolean {
|
||||
if (err.message?.includes('außer Dienst')) {
|
||||
res.status(409).json({ success: false, message: err.message, reason: 'out_of_service' });
|
||||
return true;
|
||||
}
|
||||
if (err.message?.includes('bereits gebucht')) {
|
||||
res.status(409).json({ success: false, message: err.message });
|
||||
res.status(409).json({ success: false, message: err.message, reason: 'booking_conflict' });
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -88,10 +92,27 @@ class BookingController {
|
||||
.json({ success: false, message: 'fahrzeugId, from und to sind erforderlich' });
|
||||
return;
|
||||
}
|
||||
const beginn = new Date(from as string);
|
||||
const ende = new Date(to as string);
|
||||
|
||||
const outOfService = await bookingService.checkOutOfServiceConflict(
|
||||
fahrzeugId as string, beginn, ende
|
||||
);
|
||||
if (outOfService) {
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
available: false,
|
||||
reason: 'out_of_service',
|
||||
ausserDienstVon: outOfService.ausser_dienst_von.toISOString(),
|
||||
ausserDienstBis: outOfService.ausser_dienst_bis.toISOString(),
|
||||
},
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const hasConflict = await bookingService.checkConflict(
|
||||
fahrzeugId as string,
|
||||
new Date(from as string),
|
||||
new Date(to as string)
|
||||
fahrzeugId as string, beginn, ende
|
||||
);
|
||||
res.json({ success: true, data: { available: !hasConflict } });
|
||||
} catch (error) {
|
||||
|
||||
@@ -16,7 +16,6 @@ const FahrzeugStatusEnum = z.enum([
|
||||
FahrzeugStatus.Einsatzbereit,
|
||||
FahrzeugStatus.AusserDienstWartung,
|
||||
FahrzeugStatus.AusserDienstSchaden,
|
||||
FahrzeugStatus.InLehrgang,
|
||||
]);
|
||||
|
||||
const isoDate = z.string().regex(
|
||||
@@ -64,10 +63,27 @@ const UpdateFahrzeugSchema = z.object({
|
||||
naechste_wartung_am: isoDate.nullable().optional(),
|
||||
});
|
||||
|
||||
const isoDatetime = z.string().datetime({ offset: true, message: 'Erwartet ISO-8601 Datum mit Zeitzone' });
|
||||
|
||||
const UpdateStatusSchema = z.object({
|
||||
status: FahrzeugStatusEnum,
|
||||
bemerkung: z.string().max(500).optional().default(''),
|
||||
});
|
||||
status: FahrzeugStatusEnum,
|
||||
bemerkung: z.string().max(500).optional().default(''),
|
||||
ausserDienstVon: isoDatetime.optional(),
|
||||
ausserDienstBis: isoDatetime.optional(),
|
||||
}).refine(
|
||||
(d) => {
|
||||
const isAusserDienst = d.status === FahrzeugStatus.AusserDienstWartung || d.status === FahrzeugStatus.AusserDienstSchaden;
|
||||
if (!isAusserDienst) return true;
|
||||
return !!d.ausserDienstVon && !!d.ausserDienstBis;
|
||||
},
|
||||
{ message: 'Außer-Dienst-Zeitraum (von + bis) ist bei diesem Status erforderlich', path: ['ausserDienstVon'] }
|
||||
).refine(
|
||||
(d) => {
|
||||
if (!d.ausserDienstVon || !d.ausserDienstBis) return true;
|
||||
return new Date(d.ausserDienstBis) > new Date(d.ausserDienstVon);
|
||||
},
|
||||
{ message: 'Enddatum muss nach Startdatum liegen', path: ['ausserDienstBis'] }
|
||||
);
|
||||
|
||||
const CreateWartungslogSchema = z.object({
|
||||
datum: isoDate,
|
||||
@@ -211,10 +227,16 @@ class VehicleController {
|
||||
return;
|
||||
}
|
||||
const io = req.app.get('io') ?? undefined;
|
||||
await vehicleService.updateVehicleStatus(
|
||||
id, parsed.data.status, parsed.data.bemerkung, getUserId(req), io
|
||||
const result = await vehicleService.updateVehicleStatus(
|
||||
id,
|
||||
parsed.data.status,
|
||||
parsed.data.bemerkung,
|
||||
getUserId(req),
|
||||
io,
|
||||
parsed.data.ausserDienstVon ? new Date(parsed.data.ausserDienstVon) : null,
|
||||
parsed.data.ausserDienstBis ? new Date(parsed.data.ausserDienstBis) : null,
|
||||
);
|
||||
res.status(200).json({ success: true, message: 'Status aktualisiert' });
|
||||
res.status(200).json({ success: true, data: result });
|
||||
} catch (error: any) {
|
||||
if (error?.message === 'Vehicle not found') {
|
||||
res.status(404).json({ success: false, message: 'Fahrzeug nicht gefunden' });
|
||||
|
||||
Reference in New Issue
Block a user