'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { formatDate } from '@/lib/date-utils'; import DashboardSidebar from '@/components/DashboardSidebar'; import { useSession } from 'next-auth/react'; export default function TourDetailPage({ params }: { params: { id: string } }) { const router = useRouter(); const { data: session } = useSession(); const [tour, setTour] = useState(null); const [loading, setLoading] = useState(true); const [optimizing, setOptimizing] = useState(false); useEffect(() => { fetchTour(); }, [params.id]); const fetchTour = async () => { try { const res = await fetch(`/api/tours/${params.id}`); const data = await res.json(); setTour(data.tour); } catch (error) { console.error('Fetch error:', error); } finally { setLoading(false); } }; const updateStatus = async (newStatus: string) => { try { const res = await fetch(`/api/tours/${params.id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: newStatus }), }); if (res.ok) { fetchTour(); } else { alert('Fehler beim Aktualisieren'); } } catch (error) { console.error('Update error:', error); alert('Fehler beim Aktualisieren'); } }; const handleDelete = async () => { if (!confirm('Möchten Sie diese Tour wirklich löschen?')) return; try { const res = await fetch(`/api/tours/${params.id}`, { method: 'DELETE', }); if (res.ok) { router.push('/dashboard/tours'); } else { alert('Fehler beim Löschen'); } } catch (error) { console.error('Delete error:', error); alert('Fehler beim Löschen'); } }; const optimizeRoute = async () => { if (!tour || tour.bookings.length === 0) { alert('Keine Buchungen zum Optimieren vorhanden'); return; } setOptimizing(true); try { const res = await fetch(`/api/tours/${params.id}/optimize-route`, { method: 'POST', }); const data = await res.json(); if (res.ok) { alert(`Route optimiert!\nGesamtstrecke: ${data.route.totalDistance.toFixed(1)} km\nGeschätzte Dauer: ${data.route.totalDuration} Min`); fetchTour(); } else { alert(data.error || 'Fehler bei der Routenoptimierung'); } } catch (error) { console.error('Optimization error:', error); alert('Fehler bei der Routenoptimierung'); } finally { setOptimizing(false); } }; if (loading) { return (

Lädt...

); } if (!tour) { return (

Tour nicht gefunden

); } const getStatusBadge = (status: string) => { const styles: Record = { PLANNED: 'bg-blue-500/20 text-blue-400 border-blue-500/50', IN_PROGRESS: 'bg-yellow-500/20 text-yellow-400 border-yellow-500/50', COMPLETED: 'bg-green-500/20 text-green-400 border-green-500/50', CANCELLED: 'bg-red-500/20 text-red-400 border-red-500/50', }; return styles[status] || 'bg-gray-500/20 text-gray-400 border-gray-500/50'; }; return (

{tour.tourNumber}

{formatDate(tour.tourDate)}

{tour.status}

Fahrer

{tour.driver ? tour.driver.name : 'Nicht zugewiesen'}

{tour.driver?.phoneNumber && (

{tour.driver.phoneNumber}

)}

Buchungen

{tour.bookings.length}

{tour.totalDistance && (

Gesamtstrecke

{tour.totalDistance} km

)} {tour.estimatedDuration && (

Geschätzte Dauer

~{tour.estimatedDuration} Min

)}
{tour.bookings.length > 0 && ( )} {tour.status === 'PLANNED' && ( )} {tour.status === 'IN_PROGRESS' && ( )}

Buchungen ({tour.bookings.length})

{tour.bookings.length > 0 ? (
{tour.bookings.map((booking: any, index: number) => (
#{index + 1}

{booking.bookingNumber}

{booking.customerName}

{booking.eventLocation || 'Event'}

{booking.eventAddress}, {booking.eventCity}

{formatDate(booking.eventDate)}

Aufbau: {formatDate(booking.setupTimeStart)}

{booking.photobox && (

Fotobox:{' '} {booking.photobox.model} (SN: {booking.photobox.serialNumber})

)}
))}
) : (

Keine Buchungen zugeordnet

)}
); }