'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { FiCalendar, FiTruck, FiCheckSquare, FiSquare, FiMapPin, FiClock, FiSave, FiAlertCircle } from 'react-icons/fi'; interface Driver { id: string; name: string; email: string; vehiclePlate: string | null; vehicleModel: string | null; available: boolean; } interface Booking { id: string; bookingNumber: string; customerName: string; eventDate: string; eventAddress: string; eventCity: string; eventZip: string; setupTimeStart: string; setupTimeLatest: string; status: string; } export default function NewTourPage() { const router = useRouter(); const [loading, setLoading] = useState(true); const [creating, setCreating] = useState(false); const [error, setError] = useState(null); const [drivers, setDrivers] = useState([]); const [bookings, setBookings] = useState([]); const [tourDate, setTourDate] = useState(''); const [selectedDriver, setSelectedDriver] = useState(''); const [selectedBookings, setSelectedBookings] = useState>(new Set()); const [optimizationType, setOptimizationType] = useState<'fastest' | 'schedule'>('fastest'); useEffect(() => { loadData(); }, []); const loadData = async () => { try { setLoading(true); setError(null); const [driversRes, bookingsRes] = await Promise.all([ fetch('/api/drivers?available=true'), fetch('/api/bookings?status=READY_FOR_ASSIGNMENT,OPEN_FOR_DRIVERS'), ]); if (!driversRes.ok || !bookingsRes.ok) { throw new Error('Fehler beim Laden der Daten'); } const driversData = await driversRes.json(); const bookingsData = await bookingsRes.json(); setDrivers(driversData.drivers || []); setBookings(bookingsData.bookings || []); } catch (err: any) { setError(err.message || 'Fehler beim Laden der Daten'); } finally { setLoading(false); } }; const toggleBooking = (bookingId: string) => { const newSelected = new Set(selectedBookings); if (newSelected.has(bookingId)) { newSelected.delete(bookingId); } else { newSelected.add(bookingId); } setSelectedBookings(newSelected); }; const selectAllOnDate = () => { if (!tourDate) return; const targetDate = new Date(tourDate).toISOString().split('T')[0]; const newSelected = new Set(selectedBookings); bookings.forEach((booking) => { const bookingDate = new Date(booking.eventDate).toISOString().split('T')[0]; if (bookingDate === targetDate) { newSelected.add(booking.id); } }); setSelectedBookings(newSelected); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!tourDate) { setError('Bitte wähle ein Tourdatum'); return; } if (selectedBookings.size === 0) { setError('Bitte wähle mindestens eine Buchung aus'); return; } try { setCreating(true); setError(null); const response = await fetch('/api/tours', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ tourDate, driverId: selectedDriver || null, bookingIds: Array.from(selectedBookings), optimizationType, }), }); if (!response.ok) { const data = await response.json(); throw new Error(data.error || 'Fehler beim Erstellen der Tour'); } const { tour } = await response.json(); router.push(`/dashboard/tours/${tour.id}`); } catch (err: any) { setError(err.message || 'Fehler beim Erstellen der Tour'); setCreating(false); } }; const groupedBookings = bookings.reduce((acc, booking) => { const date = new Date(booking.eventDate).toLocaleDateString('de-DE', { weekday: 'short', day: '2-digit', month: '2-digit', year: 'numeric', }); if (!acc[date]) acc[date] = []; acc[date].push(booking); return acc; }, {} as Record); if (loading) { return (
Lade Daten...
); } return (

Neue Tour erstellen

Wähle Buchungen aus und weise sie einem Fahrer zu

{error && (
{error}
)}
setTourDate(e.target.value)} required className="w-full px-4 py-2 bg-gray-900 border border-gray-700 rounded-lg text-white focus:border-pink-500 focus:outline-none" /> {tourDate && ( )}
{drivers.length === 0 && (

Keine verfügbaren Fahrer

)}
{bookings.length === 0 ? (

Keine verfügbaren Buchungen

Buchungen müssen den Status "Bereit zur Zuweisung" oder "Offen für Fahrer" haben

) : (
{Object.entries(groupedBookings).map(([date, dateBookings]) => (
{date}
{dateBookings.map((booking) => (
toggleBooking(booking.id)} className={` p-4 rounded-lg border cursor-pointer transition-all ${selectedBookings.has(booking.id) ? 'bg-pink-500/10 border-pink-500/50' : 'bg-gray-900/50 border-gray-700 hover:border-gray-600' } `} >
{selectedBookings.has(booking.id) ? ( ) : ( )}
{booking.bookingNumber} {booking.customerName}
{booking.eventCity}
{new Date(booking.setupTimeStart).toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit', })} {' - '} {new Date(booking.setupTimeLatest).toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit', })}
{booking.eventAddress}, {booking.eventZip} {booking.eventCity}
))}
))}
)}
); }