import Link from 'next/link'; import { BedDouble, CalendarCheck, Plus, Euro } from 'lucide-react'; import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { Badge } from '@kit/ui/badge'; import { Button } from '@kit/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card'; import { createBookingManagementApi } from '@kit/booking-management/api'; import { CmsPageShell } from '~/components/cms-page-shell'; import { EmptyState } from '~/components/empty-state'; import { StatsCard } from '~/components/stats-card'; interface PageProps { params: Promise<{ account: string }>; } const STATUS_BADGE_VARIANT: Record< string, 'secondary' | 'default' | 'info' | 'outline' | 'destructive' > = { pending: 'secondary', confirmed: 'default', checked_in: 'info', checked_out: 'outline', cancelled: 'destructive', }; const STATUS_LABEL: Record = { pending: 'Ausstehend', confirmed: 'Bestätigt', checked_in: 'Eingecheckt', checked_out: 'Ausgecheckt', cancelled: 'Storniert', no_show: 'Nicht erschienen', }; export default async function BookingsPage({ params }: PageProps) { const { account } = await params; const client = getSupabaseServerClient(); const { data: acct } = await client .from('accounts') .select('id') .eq('slug', account) .single(); if (!acct) return
Konto nicht gefunden
; const api = createBookingManagementApi(client); const [rooms, bookings] = await Promise.all([ api.listRooms(acct.id), api.listBookings(acct.id, { page: 1 }), ]); const activeBookings = bookings.data.filter( (b: Record) => b.status === 'confirmed' || b.status === 'checked_in', ); return (
{/* Header */}

Buchungen

Zimmer und Buchungen verwalten

{/* Stats */}
} /> } /> } />
{/* Table or Empty State */} {bookings.data.length === 0 ? ( } title="Keine Buchungen vorhanden" description="Erstellen Sie Ihre erste Buchung, um loszulegen." actionLabel="Neue Buchung" actionHref={`/home/${account}/bookings/new`} /> ) : ( Alle Buchungen ({bookings.total})
{bookings.data.map((booking: Record) => ( ))}
Zimmer Gast Anreise Abreise Status Betrag
{String(booking.room_id ?? '—')} {String(booking.guest_id ?? '—')} {booking.check_in ? new Date(String(booking.check_in)).toLocaleDateString('de-DE') : '—'} {booking.check_out ? new Date(String(booking.check_out)).toLocaleDateString('de-DE') : '—'} {STATUS_LABEL[String(booking.status)] ?? String(booking.status)} {booking.total_price != null ? `${Number(booking.total_price).toFixed(2)} €` : '—'}
)}
); }