import { getServerSession } from 'next-auth'; import { authOptions } from '@/lib/auth'; import { redirect } from 'next/navigation'; import { prisma } from '@/lib/prisma'; import Link from 'next/link'; import { FiPlus, FiCalendar, FiTruck, FiMapPin, FiClock } from 'react-icons/fi'; export default async function ToursPage() { const session = await getServerSession(authOptions); if (!session || session.user.role !== 'ADMIN') { redirect('/login'); } // Hole alle Touren, sortiert nach Datum const tours = await prisma.tour.findMany({ include: { driver: { select: { id: true, name: true, vehiclePlate: true, }, }, bookings: { select: { id: true, bookingNumber: true, customerName: true, eventCity: true, }, }, tourStops: { select: { id: true, status: true, }, }, }, orderBy: { tourDate: 'desc', }, take: 50, }); const getStatusColor = (status: string) => { switch (status) { case 'PLANNED': return 'bg-blue-500/20 text-blue-400 border-blue-500/50'; case 'IN_PROGRESS': return 'bg-yellow-500/20 text-yellow-400 border-yellow-500/50'; case 'COMPLETED': return 'bg-green-500/20 text-green-400 border-green-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) => { switch (status) { case 'PLANNED': return 'Geplant'; case 'IN_PROGRESS': return 'Unterwegs'; case 'COMPLETED': return 'Abgeschlossen'; case 'CANCELLED': return 'Storniert'; default: return status; } }; return (
← Zurück zum Dashboard

Touren

Verwalte Fahrer-Touren und Route-Optimierung

Neue Tour erstellen
{tours.length === 0 ? (

Noch keine Touren

Erstelle deine erste Tour, um Buchungen zu Fahrern zuzuweisen.

Tour erstellen
) : (
{tours.map((tour) => { const completedStops = tour.tourStops.filter(s => s.status === 'SETUP_COMPLETE' || s.status === 'PICKUP_COMPLETE' ).length; const totalStops = tour.tourStops.length; const progress = totalStops > 0 ? (completedStops / totalStops) * 100 : 0; return (

{tour.tourNumber}

{getStatusLabel(tour.status)}
{new Date(tour.tourDate).toLocaleDateString('de-DE', { weekday: 'short', day: '2-digit', month: '2-digit', year: 'numeric' })}
{tour.driver && (
{tour.driver.name} {tour.driver.vehiclePlate && ( ({tour.driver.vehiclePlate}) )}
)}
{totalStops} {totalStops === 1 ? 'Stopp' : 'Stopps'}
{tour.estimatedDuration && (
{Math.round(tour.estimatedDuration / 60)}h
)}
{/* Fortschrittsbalken */} {totalStops > 0 && tour.status !== 'CANCELLED' && (
Fortschritt: {completedStops} von {totalStops} Stopps abgeschlossen {progress.toFixed(0)}%
)} {/* Buchungen-Preview */} {tour.bookings.length > 0 && (
Buchungen:
{tour.bookings.slice(0, 5).map((booking) => ( {booking.bookingNumber} ))} {tour.bookings.length > 5 && ( +{tour.bookings.length - 5} weitere )}
)} ); })}
)}
); }