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>
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
import { useState } from 'react';
|
||||
import { ORTE, ARBEITSZEIT_KUNDE_FIX, type ArbeitszeitEintrag } from '@/types/arbeitszeit';
|
||||
import { toDecimalHours, mehrarbeit, weekdayName, formatHours } from '@/lib/calc';
|
||||
import { toDecimalHours, mehrarbeit, weekdayName, formatHours, hatZeiten } from '@/lib/calc';
|
||||
import CustomSelect from './CustomSelect';
|
||||
import TimeInput from './TimeInput';
|
||||
|
||||
@@ -30,8 +30,8 @@ export default function ArbeitszeitForm({ editEntry, pause, onSaved, onCancel }:
|
||||
// daher genügt eine einmalige Initialisierung aus editEntry (kein Sync-Effekt nötig).
|
||||
const [datum, setDatum] = useState(editEntry?.datum ?? todayDate());
|
||||
const [ort, setOrt] = useState<string>(editEntry?.ort ?? ORTE[0]);
|
||||
const [beginn, setBeginn] = useState(editEntry?.beginn ?? '09:00');
|
||||
const [ende, setEnde] = useState(editEntry?.ende ?? '17:00');
|
||||
const [beginn, setBeginn] = useState(editEntry?.beginn ?? '');
|
||||
const [ende, setEnde] = useState(editEntry?.ende ?? '');
|
||||
const [reisezeit, setReisezeit] = useState(editEntry ? String(editEntry.reisezeit) : '0');
|
||||
const [vertrieb, setVertrieb] = useState(editEntry ? String(editEntry.vertriebsunterstuetzung) : '2');
|
||||
const [kommentar, setKommentar] = useState(editEntry?.kommentar ?? '');
|
||||
@@ -39,6 +39,7 @@ export default function ArbeitszeitForm({ editEntry, pause, onSaved, onCancel }:
|
||||
const [error, setError] = useState('');
|
||||
const [success, setSuccess] = useState(false);
|
||||
|
||||
const zeiten = hatZeiten(beginn, ende);
|
||||
const arbeitszeit = toDecimalHours(beginn, ende);
|
||||
const mehr = mehrarbeit(arbeitszeit, pause);
|
||||
|
||||
@@ -47,7 +48,13 @@ export default function ArbeitszeitForm({ editEntry, pause, onSaved, onCancel }:
|
||||
setError('');
|
||||
setSuccess(false);
|
||||
|
||||
if (arbeitszeit <= 0) {
|
||||
const beginnLeer = beginn === '';
|
||||
const endeLeer = ende === '';
|
||||
if (beginnLeer !== endeLeer) {
|
||||
setError('Bitte Start- und Endzeit gemeinsam angeben oder beide leer lassen.');
|
||||
return;
|
||||
}
|
||||
if (!beginnLeer && !endeLeer && arbeitszeit <= 0) {
|
||||
setError('Endzeit muss nach der Startzeit liegen.');
|
||||
return;
|
||||
}
|
||||
@@ -172,16 +179,19 @@ export default function ArbeitszeitForm({ editEntry, pause, onSaved, onCancel }:
|
||||
{/* Berechnungs-Vorschau */}
|
||||
<div className="flex flex-wrap gap-x-6 gap-y-1 text-sm bg-[#EEF7EE] border border-green-200 rounded-lg px-3 py-2">
|
||||
<span>
|
||||
Arbeitszeit: <strong>{formatHours(arbeitszeit)} h</strong>
|
||||
Arbeitszeit: <strong>{zeiten ? `${formatHours(arbeitszeit)} h` : '—'}</strong>
|
||||
</span>
|
||||
<span>
|
||||
Arbeitszeit Kunde: <strong>{formatHours(ARBEITSZEIT_KUNDE_FIX)} h</strong>
|
||||
Arbeitszeit Kunde: <strong>{zeiten ? `${formatHours(ARBEITSZEIT_KUNDE_FIX)} h` : '—'}</strong>
|
||||
</span>
|
||||
<span>
|
||||
Pause: <strong>{formatHours(pause)} h</strong>
|
||||
</span>
|
||||
<span>
|
||||
Mehrarbeit: <strong className={mehr < 0 ? 'text-red-600' : 'text-green-800'}>{formatHours(mehr)} h</strong>
|
||||
Mehrarbeit:{' '}
|
||||
<strong className={zeiten ? (mehr < 0 ? 'text-red-600' : 'text-green-800') : ''}>
|
||||
{zeiten ? `${formatHours(mehr)} h` : '—'}
|
||||
</strong>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user