import { ORTE, type ArbeitszeitInput, type Ort } from '@/types/arbeitszeit'; import { parseHM } from './calc'; /** * Validiert und normalisiert einen JSON-Body zu einem ArbeitszeitInput. * Wirft Error mit deutscher Meldung bei ungültigen Daten. */ export function parseArbeitszeitInput(body: unknown): ArbeitszeitInput { const b = (body ?? {}) as Record; const datum = String(b.datum ?? ''); if (!/^\d{4}-\d{2}-\d{2}$/.test(datum)) throw new Error('Ungültiges Datum.'); const ort = String(b.ort ?? '') as Ort; if (!ORTE.includes(ort)) throw new Error('Ungültiger Ort.'); // Beginn/Ende sind optional. Wenn angegeben, müssen sie gültig sein; // entweder beide leer oder beide gesetzt. const beginn = String(b.beginn ?? ''); const ende = String(b.ende ?? ''); if (beginn !== '' && parseHM(beginn) === null) throw new Error('Ungültige Startzeit.'); if (ende !== '' && parseHM(ende) === null) throw new Error('Ungültige Endzeit.'); if ((beginn === '') !== (ende === '')) { throw new Error('Bitte Start- und Endzeit gemeinsam angeben oder beide leer lassen.'); } const reisezeit = toNumber(b.reisezeit, 0); const vertriebsunterstuetzung = toNumber(b.vertriebsunterstuetzung, 2); if (reisezeit < 0 || vertriebsunterstuetzung < 0) { throw new Error('Zeitwerte dürfen nicht negativ sein.'); } const kommentar = String(b.kommentar ?? '').slice(0, 500); return { datum, ort, beginn, ende, reisezeit, vertriebsunterstuetzung, kommentar }; } function toNumber(value: unknown, fallback: number): number { if (value === '' || value === null || value === undefined) return fallback; const n = typeof value === 'number' ? value : parseFloat(String(value).replace(',', '.')); return isNaN(n) ? fallback : n; } export { toNumber };