Arbeitszeit nur in 15-Minuten-Schritten, berechnete Zeit wird aufgerundet

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-09-30 14:55:06 +00:00
1 parent 32bc3d7c3d
commit 3535f18a2b
5 files changed
+70 -37

No files matched your search

+17 -16
View File
@@ -3,7 +3,8 @@ import { FaTimes } from 'react-icons/fa'
import { useAuth } from '../context/AuthContext'
import { SERVICE_TYPES, todayIso, isoToGermanDate, timeToWoms, minutesBetween } from '../lib/ticketForm'
import { TICKET_STATUSES, statusLabel } from '../lib/ticketStatus'
import { DateTimeInput } from './ui'
import { DateTimeInput, DurationSelect } from './ui'
import { roundUpToStep, isValidStep } from '../lib/timeSteps'
// Akquise-Tickets: Ergebnis des Kundenkontakts (statt technischer Status)
const ACQUISITION_STATUS = ['In Kontakt', 'Zugesagt', 'Abgesagt']
@@ -57,12 +58,12 @@ export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCre
}
}, [isOpen, workorder, defaultStatus])
// Automatische Zeitberechnung
// Automatische Zeitberechnung, aufgerundet auf 15 Minuten
useEffect(() => {
if (!autoCalculate || formData.isComment) return
const minutes = minutesBetween(formData.startTime, formData.endTime)
if (minutes !== null) {
setFormData(prev => ({ ...prev, totalTime: minutes }))
setFormData(prev => ({ ...prev, totalTime: roundUpToStep(minutes) }))
}
}, [formData.startTime, formData.endTime, formData.isComment, autoCalculate])
@@ -95,6 +96,11 @@ export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCre
setLoading(false)
return
}
if (!formData.isComment && !isValidStep(formData.totalTime)) {
setError('Bitte die Arbeitszeit auswählen.')
setLoading(false)
return
}
const worksheetData = {
woid: workorder.woid,
@@ -102,7 +108,7 @@ export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCre
serviceType: formData.serviceType,
oldStatus: workorder.status,
newStatus: formData.newStatus,
totalTime: formData.isComment ? 0 : parseInt(formData.totalTime) || 0,
totalTime: formData.isComment ? 0 : Number(formData.totalTime),
startDate: isoToGermanDate(formData.startDate),
startTime: timeToWoms(formData.startTime),
endDate: isoToGermanDate(formData.endDate),
@@ -235,22 +241,17 @@ export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCre
</div>
<div className="form-group">
<label className="form-label">Arbeitszeit (Minuten)</label>
{/* Ganze Minuten: mit step 15 blockierte der Browser berechnete Zeiten wie 70 */}
<input
type="number"
className="form-control"
min="0"
step="1"
value={formData.totalTime}
onChange={(e) => handleChange('totalTime', e.target.value)}
<label className="form-label" htmlFor="worksheet-total">Arbeitszeit</label>
<DurationSelect
id="worksheet-total"
value={formData.isComment ? 0 : formData.totalTime}
onChange={(value) => handleChange('totalTime', value)}
disabled={formData.isComment}
placeholder="0"
/>
<small style={{ color: '#a0aec0', fontSize: '12px' }}>
{autoCalculate && formData.startTime && formData.endTime
? '✓ Automatisch berechnet'
: 'Manuell eingeben'}
? '✓ Aus Beginn und Ende berechnet, aufgerundet auf 15 Minuten'
: autoCalculate ? 'Beginn und Ende eintragen oder Zeit wählen' : 'Von Hand gewählt'}
</small>
</div>
</div>