import { createClient } from '@/lib/supabase/server' import { redirect } from 'next/navigation' import Link from 'next/link' import { CheckCircle2, Download, ExternalLink, ShoppingBag, ArrowRight, Calendar } from 'lucide-react' import { Button } from '@/components/ui/button' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Separator } from '@/components/ui/separator' import { Badge } from '@/components/ui/badge' import type { Order } from '@/lib/types' export default async function OrderSuccessPage({ searchParams, }: { searchParams: Promise<{ id?: string }> }) { const { id } = await searchParams if (!id) redirect('/') const supabase = await createClient() // Authentifizierung prüfen const { data: { user } } = await supabase.auth.getUser() if (!user) redirect('/auth/login') // 1. Hole Benutzerrolle und Company const { data: dbUser } = await supabase .from('users') .select('role, company_id') .eq('id', user.id) .single() // 2. Hole Bestellung const { data: order, error } = await supabase .from('orders') .select('*') .eq('id', id) .single() if (error || !order) redirect('/') // Berechtigung prüfen const isAdmin = dbUser?.role === 'admin' const isOwner = order.user_id === user.id const isCompanyMember = dbUser?.company_id && order.company_id === dbUser.company_id if (!isAdmin && !isOwner && !isCompanyMember) { redirect('/') } const o = order as Order const items = o.order_data?.items ?? [] const groupedItems: Record = {} items.forEach(item => { const devName = item.device_name || 'Kasse 1' if (!groupedItems[devName]) { groupedItems[devName] = [] } groupedItems[devName].push(item) }) const taxRate = o.order_data?.tax_rate ?? 19 const oneTimeItems = items.filter((item) => item.billing_interval === 'one_time') const monthlyItems = items.filter((item) => item.billing_interval === 'monthly') const oneTimeNet = oneTimeItems.reduce((sum, item) => sum + (item.item_total || 0), 0) const oneTimeTax = Math.round(oneTimeNet * (taxRate / 100) * 100) / 100 const oneTimeGross = Math.round((oneTimeNet + oneTimeTax) * 100) / 100 const monthlyNet = monthlyItems.reduce((sum, item) => sum + (item.item_total || 0), 0) const monthlyTax = Math.round(monthlyNet * (taxRate / 100) * 100) / 100 const monthlyGross = Math.round((monthlyNet + monthlyTax) * 100) / 100 const statusLabel: Record = { pending: 'Eingegangen', active: 'In Bearbeitung', cancelled: 'Storniert', rejected: 'Abgelehnt', } return (
{/* Erfolgsmeldung */}

Anfrage eingegangen!

Ihre Anfrage wurde erfolgreich gespeichert.

#{o.order_number}
{/* Anfrage-Details */} Anfrageübersicht {statusLabel[o.status] ?? o.status} {/* Produkte gruppiert nach Kasse */}
{Object.entries(groupedItems).map(([deviceName, devItems]) => (
Kasse: {deviceName}
{devItems.map((item) => (
{item.product_name} {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(item.base_price)} {item.billing_interval === 'one_time' ? 'einmalig' : '/ Monat'}
{item.selected_modules.map((mod) => (
+ {mod.module_name} {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(mod.price)}
))}
))}
))}
{/* Gesamtbetrag */} {oneTimeNet > 0 && (
{monthlyNet > 0 &&

Einmaliger Betrag

}
Netto: {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(oneTimeNet)}
zzgl. {taxRate}% MwSt.: {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(oneTimeTax)}
Brutto Gesamtbetrag: 0 ? "text-white" : "text-gradient"}> {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(oneTimeGross)}
)} {oneTimeNet > 0 && monthlyNet > 0 && ( )} {monthlyNet > 0 && (
{oneTimeNet > 0 &&

Monatlicher Betrag

}
Netto: {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(monthlyNet)} / Monat
zzgl. {taxRate}% MwSt.: {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(monthlyTax)} / Monat
Brutto Gesamtbetrag: {new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(monthlyGross)} / Monat
)} {o.order_data?.price_multiplier !== null && o.order_data?.price_multiplier !== undefined && (

Update-Rabatt angewendet:

{o.order_data.price_multiplier === 0 ? "Update (0-12 Monate): 100% Rabatt (inklusive)" : o.order_data.price_multiplier === 0.15 ? "Update (13-14 Monate): 15% vom Listenpreis" : o.order_data.price_multiplier === 0.30 ? "Update (15-25 Monate): 30% vom Listenpreis" : o.order_data.price_multiplier === 0.45 ? "Update (26-37 Monate): 45% vom Listenpreis" : o.order_data.price_multiplier === 0.60 ? "Update (38-49 Monate): 60% vom Listenpreis" : o.order_data.price_multiplier === 0.90 ? "Neukauf (>= 50 Monate): 10% Rabatt" : `Gebühr: ${o.order_data.price_multiplier * 100}%`}

{o.order_data.last_license_date && (

Letzte Lizenz vom: {new Date(o.order_data.last_license_date).toLocaleDateString('de-DE')}

)}
)} {/* Kundendaten */}

{o.customer_data?.company_name}

{o.customer_data?.first_name} {o.customer_data?.last_name}

{o.customer_data?.address}, {o.customer_data?.zip_code} {o.customer_data?.city}

{o.customer_data?.bank_iban && (

Kontoinhaber: {o.customer_data.bank_owner}

IBAN: {o.customer_data.bank_iban}

{o.customer_data.bank_bic &&

BIC: {o.customer_data.bank_bic}

} {o.customer_data.bank_name &&

Bank: {o.customer_data.bank_name}

}
)}
{/* PDF-Download */} {o.pdf_url && ( )}
{/* Aktions-Buttons */}
) }