'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { FiCalendar, FiMapPin, FiUser, FiMail, FiPhone, FiEdit, FiSave, FiX, FiCamera, FiTruck, FiFileText } from 'react-icons/fi'; import Link from 'next/link'; import { formatDate, formatDateTime } from '@/lib/date-utils'; import ContractSection from './ContractSection'; interface BookingDetailProps { booking: any; emails: any[]; user: any; } export default function BookingDetail({ booking, emails, user }: BookingDetailProps) { const router = useRouter(); const [editing, setEditing] = useState(false); const [formData, setFormData] = useState(booking); const [saving, setSaving] = useState(false); const handleSave = async () => { setSaving(true); try { const res = await fetch(`/api/bookings/${booking.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData), }); if (res.ok) { alert('Gespeichert!'); setEditing(false); window.location.reload(); } else { alert('Fehler beim Speichern'); } } catch (error) { alert('Fehler beim Speichern'); } finally { setSaving(false); } }; const handleStatusChange = async (newStatus: string) => { if (!confirm(`Status zu "${newStatus}" ändern?`)) return; try { const res = await fetch(`/api/bookings/${booking.id}/status`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: newStatus }), }); if (res.ok) { alert('Status geändert!'); window.location.reload(); } else { alert('Fehler beim Ändern'); } } catch (error) { alert('Fehler beim Ändern'); } }; const getStatusColor = (status: string) => { switch (status) { case 'RESERVED': return 'bg-yellow-500/20 text-yellow-400 border-yellow-500/50'; case 'CONFIRMED': return 'bg-green-500/20 text-green-400 border-green-500/50'; case 'COMPLETED': return 'bg-blue-500/20 text-blue-400 border-blue-500/50'; case 'CANCELLED': return 'bg-red-500/20 text-red-400 border-red-500/50'; default: return 'bg-gray-500/20 text-gray-400 border-gray-500/50'; } }; const getStatusLabel = (status: string) => { const labels: any = { RESERVED: 'Reserviert', CONFIRMED: 'Bestätigt', COMPLETED: 'Abgeschlossen', CANCELLED: 'Storniert', }; return labels[status] || status; }; return (
← Zurück zu Buchungen

Buchung {booking.bookingNumber}

{!editing ? ( ) : ( <> )}

Status

{getStatusLabel(booking.status)}
{booking.status === 'RESERVED' && ( )} {booking.status === 'CONFIRMED' && ( )} {['RESERVED', 'CONFIRMED'].includes(booking.status) && ( )}

Kundendaten

{editing ? ( setFormData({ ...formData, customerName: e.target.value })} className="w-full px-3 py-2 bg-gray-700 border border-gray-600 text-white rounded-lg focus:ring-2 focus:ring-red-500" /> ) : (

{booking.customerName}

)}
{editing ? ( setFormData({ ...formData, customerEmail: e.target.value })} className="w-full px-3 py-2 bg-gray-700 border border-gray-600 text-white rounded-lg focus:ring-2 focus:ring-red-500" /> ) : (

{booking.customerEmail}

)}
{editing ? ( setFormData({ ...formData, customerPhone: e.target.value })} className="w-full px-3 py-2 bg-gray-700 border border-gray-600 text-white rounded-lg focus:ring-2 focus:ring-red-500" /> ) : (

{booking.customerPhone}

)}

{booking.invoiceType === 'BUSINESS' ? 'Geschäftlich' : 'Privat'}

{booking.companyName && (

{booking.companyName}

)}

Event-Details

{formatDate(booking.eventDate)}

{booking.location.name}

{booking.eventAddress}

{booking.eventZip} {booking.eventCity}

{booking.eventLocation && (

{booking.eventLocation}

)}

{formatDateTime(booking.setupTimeStart)}

{formatDateTime(booking.setupTimeLatest)}

{booking.notes && (

Notizen

{booking.notes}

)} {emails.length > 0 && (

E-Mail-Verlauf

{emails.map((email) => (
{email.subject} {formatDate(email.receivedAt)}

Von: {email.from}

{email.parsed && ( Automatisch verarbeitet )}
))}
)}

Fotobox

{booking.photobox ? (

Modell

{booking.photobox.model}

Seriennummer

{booking.photobox.serialNumber}

) : (

Noch nicht zugewiesen

)}
router.refresh()} />

Preis

{booking.calculatedPrice || 0}€

{booking.distance && (

+ {booking.distance} km Anfahrt

)}

Vertrag

Unterschrieben {booking.contractSigned ? 'Ja' : 'Nein'}
{booking.contractSignedAt && (

am {formatDate(booking.contractSignedAt)}

)}
{booking.tours && booking.tours.length > 0 && (

Tour

{booking.tours.map((tour: any) => (
{tour.driver ? (

Fahrer: {tour.driver.name}

) : (

Noch kein Fahrer zugewiesen

)}
))}
)}
); }