diff --git a/src/components/CreateTicketModal.jsx b/src/components/CreateTicketModal.jsx
index 82ab1d9..dd51a2c 100644
--- a/src/components/CreateTicketModal.jsx
+++ b/src/components/CreateTicketModal.jsx
@@ -11,7 +11,7 @@ import {
buildRequesterSuggestions,
rankSuggestions,
} from '../lib/ticketForm'
-import { AutocompleteInput } from './ui'
+import { AutocompleteInput, DateTimeInput } from './ui'
// Neue Tickets gibt es aktuell nur fuer diese Arten; alte Tickets behalten ihre Art.
// Migration = ein Kunde, den wir von einem anderen Anbieter uebernehmen.
@@ -45,15 +45,6 @@ const emptyForm = () => ({
details: ''
})
-// Klick irgendwo ins Datumsfeld oeffnet den Kalender, nicht nur das kleine Symbol
-const openCalendar = (e) => {
- try {
- e.currentTarget.showPicker?.()
- } catch {
- // aeltere Browser: Kalender bleibt ueber das Symbol erreichbar
- }
-}
-
export default function CreateTicketModal({ isOpen, onClose, onCreate, customers = [] }) {
const { config } = useAdminConfig()
const { employees } = useEmployees()
@@ -260,45 +251,27 @@ export default function CreateTicketModal({ isOpen, onClose, onCreate, customers
diff --git a/src/components/CreateWorksheetModal.jsx b/src/components/CreateWorksheetModal.jsx
index f5a27d5..89fa4f2 100644
--- a/src/components/CreateWorksheetModal.jsx
+++ b/src/components/CreateWorksheetModal.jsx
@@ -1,8 +1,8 @@
import { useState, useEffect } from 'react'
import { FaTimes } from 'react-icons/fa'
import { useAuth } from '../context/AuthContext'
-
-const SERVICE_TYPES = ['Remote', 'On Site', 'Off Site', 'COMMENT']
+import { SERVICE_TYPES, todayIso, isoToGermanDate, timeToWoms, minutesBetween } from '../lib/ticketForm'
+import { DateTimeInput } from './ui'
const STATUS_OPTIONS = [
'Open',
@@ -20,30 +20,25 @@ const STATUS_OPTIONS = [
// Akquise-Tickets: Ergebnis des Kundenkontakts (statt technischer Status)
const ACQUISITION_STATUS = ['In Kontakt', 'Zugesagt', 'Abgesagt']
+// Datum als "yyyy-mm-dd", Uhrzeit als "hh:mm" (Werte der Kalender-Felder).
+// Die Service-Art kommt vom Ticket; das alte "Off Site" zaehlt als Fernwartung.
+const initialForm = (workorder, newStatus) => ({
+ serviceType: SERVICE_TYPES.some(t => t.value === workorder?.serviceType)
+ ? workorder.serviceType
+ : SERVICE_TYPES[0].value,
+ newStatus,
+ totalTime: 0,
+ startDate: todayIso(),
+ startTime: '',
+ endDate: todayIso(),
+ endTime: '',
+ details: '',
+ isComment: false,
+ countsToPlan: false
+})
+
export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCreate }) {
const { user } = useAuth()
- const today = new Date().toLocaleDateString('de-DE', {
- day: '2-digit',
- month: '2-digit',
- year: 'numeric'
- })
-
- const [formData, setFormData] = useState({
- serviceType: 'Remote',
- newStatus: workorder?.status || 'Open',
- totalTime: 0,
- startDate: today,
- startTime: '',
- endDate: today,
- endTime: '',
- details: '',
- isComment: false,
- countsToPlan: false
- })
-
- const [loading, setLoading] = useState(false)
- const [error, setError] = useState('')
- const [autoCalculate, setAutoCalculate] = useState(true)
const isAcquisition = workorder?.type === 'Akquise'
const statusOptions = isAcquisition ? ACQUISITION_STATUS : STATUS_OPTIONS
@@ -51,66 +46,53 @@ export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCre
? (ACQUISITION_STATUS.includes(workorder?.status) ? workorder.status : 'In Kontakt')
: (workorder?.status || 'Open')
+ const [formData, setFormData] = useState(() => initialForm(workorder, defaultStatus))
+
+ const [loading, setLoading] = useState(false)
+ const [error, setError] = useState('')
+ const [autoCalculate, setAutoCalculate] = useState(true)
+
// Reset form wenn Modal geöffnet wird
useEffect(() => {
if (isOpen && workorder) {
- setFormData({
- serviceType: 'Remote',
- newStatus: defaultStatus,
- totalTime: 0,
- startDate: today,
- startTime: '',
- endDate: today,
- endTime: '',
- details: '',
- isComment: false,
- countsToPlan: false
- })
+ setFormData(initialForm(workorder, defaultStatus))
setError('')
setAutoCalculate(true)
}
- }, [isOpen, workorder, today])
+ }, [isOpen, workorder, defaultStatus])
// Automatische Zeitberechnung
useEffect(() => {
- if (autoCalculate && formData.startTime && formData.endTime && !formData.isComment) {
- try {
- const startHour = parseInt(formData.startTime.substring(0, 2))
- const startMin = parseInt(formData.startTime.substring(2, 4))
- const endHour = parseInt(formData.endTime.substring(0, 2))
- const endMin = parseInt(formData.endTime.substring(2, 4))
-
- if (!isNaN(startHour) && !isNaN(startMin) && !isNaN(endHour) && !isNaN(endMin)) {
- const startTotal = startHour * 60 + startMin
- const endTotal = endHour * 60 + endMin
-
- let diff = endTotal - startTotal
- if (diff < 0) {
- diff += 24 * 60 // Overnight
- }
-
- setFormData(prev => ({ ...prev, totalTime: diff }))
- }
- } catch (err) {
- // Ignoriere Fehler
- }
+ if (!autoCalculate || formData.isComment) return
+ const minutes = minutesBetween(formData.startTime, formData.endTime)
+ if (minutes !== null) {
+ setFormData(prev => ({ ...prev, totalTime: minutes }))
}
}, [formData.startTime, formData.endTime, formData.isComment, autoCalculate])
const handleChange = (field, value) => {
setFormData(prev => ({ ...prev, [field]: value }))
-
+
// Wenn totalTime manuell geändert wird, deaktiviere Auto-Berechnung
if (field === 'totalTime') {
setAutoCalculate(false)
}
}
+ // Das Ende darf nicht vor dem Start liegen, deshalb rueckt es mit
+ const handleStartDateChange = (value) => {
+ setFormData(prev => ({
+ ...prev,
+ startDate: value,
+ endDate: value && prev.endDate && prev.endDate < value ? value : prev.endDate
+ }))
+ }
+
const handleSubmit = async (e) => {
e.preventDefault()
setLoading(true)
setError('')
-
+
try {
if (!formData.details.trim()) {
setError('Bitte Details eingeben')
@@ -125,10 +107,10 @@ export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCre
oldStatus: workorder.status,
newStatus: formData.newStatus,
totalTime: formData.isComment ? 0 : parseInt(formData.totalTime) || 0,
- startDate: formData.startDate,
- startTime: formData.startTime,
- endDate: formData.endDate,
- endTime: formData.endTime,
+ startDate: isoToGermanDate(formData.startDate),
+ startTime: timeToWoms(formData.startTime),
+ endDate: isoToGermanDate(formData.endDate),
+ endTime: timeToWoms(formData.endTime),
details: formData.details,
isComment: formData.isComment,
countsToPlan: !formData.isComment && formData.countsToPlan,
@@ -136,7 +118,7 @@ export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCre
}
const result = await onCreate(worksheetData, user)
-
+
if (result.success) {
onClose()
} else {
@@ -159,13 +141,13 @@ export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCre
Create New Worksheet - WOID {workorder.woid}
-
+
{error && (
{error}
)}
-
+
@@ -309,8 +271,8 @@ export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCre