import { useState, useEffect, useMemo } from 'react' import { FaTimes } from 'react-icons/fa' import { useEmployees } from '../hooks/useEmployees' import { databases, DATABASE_ID, COLLECTIONS, Query } from '../lib/appwrite' import { SERVICE_TYPES, todayIso, isoToGermanDate, timeToWoms, buildRequesterSuggestions, rankSuggestions, } from '../lib/ticketForm' import { priorityFor } from '../lib/ticketStatus' 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. const TICKET_TYPES = [ { value: 'Webpage', label: 'Webpage' }, { value: 'Migration', label: 'Migration (Übernahme von anderem Anbieter)' }, ] // Datum als "yyyy-mm-dd", Uhrzeit als "hh:mm" (Werte der Kalender-Felder). // Die Service-Art fragt das Formular nicht mehr ab: gespeichert wird Fernwartung. const emptyForm = () => ({ customerId: '', type: TICKET_TYPES[0].value, serviceType: SERVICE_TYPES[0].value, urgent: false, topic: '', requestedBy: '', startDate: todayIso(), startTime: '', deadline: todayIso(), endTime: '', details: '' }) export default function CreateTicketModal({ isOpen, onClose, onCreate, customers = [] }) { const { employees } = useEmployees() const [formData, setFormData] = useState(emptyForm) const [recentTickets, setRecentTickets] = useState([]) const [loading, setLoading] = useState(false) const [error, setError] = useState('') // Reset error when modal opens useEffect(() => { if (isOpen) setError('') }, [isOpen]) // Namen aus den letzten Tickets fuer die Autovervollstaendigung useEffect(() => { if (!isOpen) return let cancelled = false databases .listDocuments(DATABASE_ID, COLLECTIONS.WORKORDERS, [Query.orderDesc('$createdAt'), Query.limit(200)]) .then((response) => { if (!cancelled) setRecentTickets(response.documents || []) }) .catch((err) => console.warn('Vorschläge aus früheren Tickets nicht geladen:', err)) return () => { cancelled = true } }, [isOpen]) const suggestions = useMemo( () => buildRequesterSuggestions({ customers, employees, tickets: recentTickets }), [customers, employees, recentTickets] ) const getSuggestions = (text) => rankSuggestions(suggestions, text, { customerId: formData.customerId }) const handleChange = (field, value) => { setFormData(prev => ({ ...prev, [field]: value })) // Clear error when user makes changes if (error) setError('') } // Das Ende darf nicht vor dem Start liegen, deshalb rueckt es mit const handleStartDateChange = (value) => { setFormData(prev => ({ ...prev, startDate: value, deadline: value && prev.deadline && prev.deadline < value ? value : prev.deadline })) if (error) setError('') } const handleSubmit = async (e) => { e.preventDefault() setLoading(true) setError('') const customer = customers.find(c => c.$id === formData.customerId) const { urgent, ...fields } = formData try { const result = await onCreate({ ...fields, priority: priorityFor(urgent), customerName: customer?.name || '', customerLocation: customer?.location || '', startDate: isoToGermanDate(formData.startDate), startTime: timeToWoms(formData.startTime), deadline: isoToGermanDate(formData.deadline), endTime: timeToWoms(formData.endTime) }) if (result.success) { onClose() setFormData(emptyForm()) } else { setError(result.error || 'Fehler beim Erstellen des Tickets') } } catch (error) { console.error('Error creating ticket:', error) setError(error.message || 'Ein unerwarteter Fehler ist aufgetreten') } finally { setLoading(false) } } if (!isOpen) return null return (