import Link from "next/link"; import { ShellPage } from "@/components/page-templates"; import { Badge, SectionCard } from "@/components/ui"; import { getSession } from "@/lib/auth"; import { prisma } from "@/lib/prisma"; import { redirect } from "next/navigation"; function formatDate(value: Date | null) { if (!value) { return "-"; } return new Intl.DateTimeFormat("id-ID", { day: "2-digit", month: "short", year: "numeric", hour: "2-digit", minute: "2-digit" }).format(value); } function formatMoney(value: number) { return new Intl.NumberFormat("id-ID", { style: "currency", currency: "IDR", maximumFractionDigits: 0 }).format(value); } function statusTone(status: string) { if (status === "PAID") { return "success"; } if (status === "OVERDUE") { return "danger"; } return "warning"; } export default async function BillingInvoiceDetailPage({ params }: { params: Promise<{ invoiceId: string }>; }) { const session = await getSession(); if (!session) { redirect("/login"); } const { invoiceId } = await params; const invoice = await prisma.billingInvoice.findFirst({ where: { id: invoiceId, tenantId: session.tenantId }, include: { tenant: { select: { name: true, slug: true } }, plan: { select: { name: true, code: true } } } }); if (!invoice) { redirect("/billing/history?error=invoice_not_found"); } return (

Invoice: {invoice.invoiceNumber}

Tenant:{" "} {invoice.tenant.name} ({invoice.tenant.slug})

Plan: {invoice.plan.name} ({invoice.plan.code})

Period: {formatDate(invoice.periodStart)} - {formatDate(invoice.periodEnd)}

Subtotal: {formatMoney(invoice.subtotal)} | Tax: {formatMoney(invoice.taxAmount)}

Total: {formatMoney(invoice.totalAmount)}

Status: {invoice.paymentStatus}

Issued: {formatDate(invoice.createdAt)}

Due date: {formatDate(invoice.dueDate)}

Paid at: {formatDate(invoice.paidAt)}

Updated: {formatDate(invoice.updatedAt)}

); }