import type { Metadata } from "next"; import Link from "next/link"; import { EstimateActions } from "@/components/status/EstimateActions"; import { fetchOlympusRepairStatus, type OlympusEstimate, type OlympusRepairStatus, } from "@/lib/olympus/status"; type PageProps = { params: Promise<{ token: string; }>; }; export const dynamic = "force-dynamic"; export const metadata: Metadata = { title: "Reparaturstatus | Funktechnik Schubert", description: "Öffentlicher Reparaturstatus für Kunden von Funktechnik Schubert.", robots: { index: false, follow: false, }, }; function formatDate(value: string) { return new Intl.DateTimeFormat("de-DE", { dateStyle: "medium", timeStyle: "short", }).format(new Date(value)); } function formatDateOnly(value: string | null) { if (!value) { return "Nicht angegeben"; } return new Intl.DateTimeFormat("de-DE", { dateStyle: "medium", }).format(new Date(value)); } function formatMoney(cents: number, currency: string) { return new Intl.NumberFormat("de-DE", { style: "currency", currency: currency || "EUR", }).format(cents / 100); } function estimateStatusLabel(status: string) { const labels: Record = { draft: "In Vorbereitung", sent: "Zur Freigabe", approved: "Freigegeben", declined: "Abgelehnt", expired: "Abgelaufen", cancelled: "Storniert", }; return labels[status] ?? status; } function estimateStatusText(status: string) { const texts: Record = { sent: "Bitte prüfen Sie den Kostenvoranschlag. Sie können ihn freigeben, ablehnen oder eine Rückfrage senden.", approved: "Dieser Kostenvoranschlag wurde freigegeben.", declined: "Dieser Kostenvoranschlag wurde abgelehnt.", expired: "Dieser Kostenvoranschlag ist nicht mehr gültig.", cancelled: "Dieser Kostenvoranschlag wurde storniert.", }; return texts[status] ?? "Der Kostenvoranschlag ist aktuell nicht zur Bearbeitung freigegeben."; } function estimateItemTypeLabel(type: string) { const labels: Record = { labor: "Arbeitszeit", part: "Ersatzteil", material: "Material", service: "Service", shipping: "Versand", other: "Sonstiges", }; return labels[type] ?? "Position"; } function EstimateCard({ estimate, token }: { estimate: OlympusEstimate | null | undefined; token: string }) { if (!estimate) { return null; } return (

Kostenvoranschlag

{estimate.title || "Kostenvoranschlag"}

Nummer {estimate.estimate_number}

{estimateStatusLabel(estimate.status)}
{estimate.customer_message &&

{estimate.customer_message}

}
Gültig bis
{formatDateOnly(estimate.valid_until)}
Status
{estimateStatusLabel(estimate.status)}
{estimate.items.map((item, index) => (
{estimateItemTypeLabel(item.item_type)}

{item.title}

{item.description &&

{item.description}

}
{item.quantity} {item.unit} {formatMoney(item.total_cents, estimate.currency)}
))}
Zwischensumme
{formatMoney(estimate.subtotal_cents, estimate.currency)}
Mehrwertsteuer
{formatMoney(estimate.tax_cents, estimate.currency)}
Gesamt
{formatMoney(estimate.total_cents, estimate.currency)}

{estimateStatusText(estimate.status)}

{estimate.status === "sent" && }
); } function StatusError({ title, text }: { title: string; text: string }) { return (

Reparaturstatus

{title}

{text}

Reparatur anfragen Kontakt aufnehmen
); } function StatusTimeline({ status }: { status: OlympusRepairStatus }) { if (status.status_history_public.length === 0) { return

Noch keine Statushistorie vorhanden.

; } const latestIndex = status.status_history_public.length - 1; return (
    {status.status_history_public.map((item, index) => (
  1. ))}
); } export default async function RepairStatusPage({ params }: PageProps) { const { token } = await params; const result = await fetchOlympusRepairStatus(token); if (!result.ok && result.reason === "invalid") { return ( ); } if (!result.ok) { return ( ); } const status = result.status; const device = `${status.device_manufacturer} ${status.device_model}`.trim(); return (

Reparaturstatus

Reparaturstatus

Hier sehen Sie den aktuellen Stand Ihrer Reparatur.

{status.public_status_label}
Reparaturnummer
{status.repair_number}
Gerät
{device || "Nicht angegeben"}
Aktueller Status
{status.public_status_label}
Letzte Aktualisierung
{formatDate(status.updated_at)}

Statusverlauf

); }