Files
arbeitszeit/lib/calc.ts
T
admin 9ee78d2dcf Start-/Endzeit optional: ohne Zeiten Arbeitszeit Kunde & Mehrarbeit leer
- Start- und Endzeit nicht mehr vorbelegt (leeres Feld, Platzhalter HH:MM)
- TimeInput erlaubt Leeren eines Feldes
- Validierung: beide Zeiten zusammen angeben oder beide leer lassen
- Ohne Zeiten zeigen Vorschau und Liste "—" für Arbeitszeit Kunde und Mehrarbeit
  (Eintrag mit nur Reisezeit/Vertriebsunterstützung möglich)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 10:05:50 +02:00

62 lines
1.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Reine Hilfsfunktionen für Datum-/Zeit-Berechnungen (ohne DB-Zugriff).
const WOCHENTAGE = [
'Sonntag',
'Montag',
'Dienstag',
'Mittwoch',
'Donnerstag',
'Freitag',
'Samstag',
];
/** "HH:MM" → Minuten seit Mitternacht, oder null bei ungültiger Eingabe. */
export function parseHM(hm: string): number | null {
const m = /^(\d{1,2}):(\d{2})$/.exec(hm ?? '');
if (!m) return null;
const h = Number(m[1]);
const min = Number(m[2]);
if (h < 0 || h > 23 || min < 0 || min > 59) return null;
return h * 60 + min;
}
/**
* Differenz zwischen Beginn und Ende in dezimalen Stunden.
* Gibt 0 zurück, wenn eine Zeit ungültig ist. Ende vor Beginn ⇒ 0.
*/
export function toDecimalHours(beginn: string, ende: string): number {
const b = parseHM(beginn);
const e = parseHM(ende);
if (b === null || e === null) return 0;
const diff = e - b;
if (diff <= 0) return 0;
return diff / 60;
}
/** Mehrarbeit = Arbeitszeit 8 Stunden Pause (kann negativ sein). */
export function mehrarbeit(arbeitszeitStd: number, pauseStd: number): number {
return arbeitszeitStd - 8 - pauseStd;
}
/** True, wenn sowohl Beginn als auch Ende gültige Uhrzeiten sind (beide angegeben). */
export function hatZeiten(beginn: string, ende: string): boolean {
return parseHM(beginn) !== null && parseHM(ende) !== null;
}
/** Deutscher Wochentagsname für ein "YYYY-MM-DD"-Datum, oder "" bei ungültig. */
export function weekdayName(datum: string): string {
const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(datum ?? '');
if (!m) return '';
const d = new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));
if (isNaN(d.getTime())) return '';
return WOCHENTAGE[d.getDay()];
}
/** Dezimalstunden deutsch formatieren, z.B. 0.5 → "0,5". */
export function formatHours(value: number): string {
return value.toLocaleString('de-DE', {
minimumFractionDigits: 1,
maximumFractionDigits: 2,
});
}