import { auth } from "@/lib/auth"; import prisma from "@/lib/prisma"; import { notFound } from "next/navigation"; import Link from "next/link"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { InvoiceStatusBadge } from "@/components/invoice/invoice-status-badge"; import { InvoiceActions } from "./invoice-actions"; import { formatCurrency, formatDate } from "@/lib/tax"; import { ChevronLeft } from "lucide-react"; export default async function InvoiceDetailPage({ params, }: { params: Promise<{ id: string; invoiceId: string }>; }) { const { id, invoiceId } = await params; const session = await auth(); const invoice = await prisma.invoice.findFirst({ where: { id: invoiceId, companyId: id, company: { userId: session!.user!.id! } }, include: { items: { orderBy: { position: "asc" } }, customer: true, company: true, }, }); if (!invoice) notFound(); // Group items by tax rate for totals block const taxGroups = invoice.items.reduce( (acc, item) => { const rate = Number(item.taxRate); if (!acc[rate]) acc[rate] = { net: 0, tax: 0 }; acc[rate].net += Number(item.netAmount); acc[rate].tax += Number(item.taxAmount); return acc; }, {} as Record ); return (
Zurück zu Rechnungen

{invoice.number}

{invoice.customer.name} · {formatDate(invoice.issueDate)}

{/* Invoice document preview */} {/* Sender & Recipient */}

Absender

{invoice.company.name}

{invoice.company.legalForm &&

{invoice.company.legalForm}

}

{invoice.company.address}

{invoice.company.zip} {invoice.company.city}

{invoice.company.taxId && (

St.-Nr.: {invoice.company.taxId}

)} {invoice.company.vatId && (

USt-IdNr.: {invoice.company.vatId}

)}

Rechnungsempfänger

{invoice.customer.name}

{invoice.customer.address}

{invoice.customer.zip} {invoice.customer.city}

{invoice.customer.vatId && (

USt-IdNr.: {invoice.customer.vatId}

)}
{/* Dates */}

Rechnungsnummer

{invoice.number}

Rechnungsdatum

{formatDate(invoice.issueDate)}

{invoice.deliveryDate && (

Leistungsdatum

{formatDate(invoice.deliveryDate)}

)}

Fällig am

{formatDate(invoice.dueDate)}

{/* Items table */}
{invoice.items.map((item) => ( ))}
# Beschreibung Menge EP (netto) MwSt. Betrag (brutto)
{item.position} {item.description} {Number(item.quantity)} {item.unit && {item.unit}} {formatCurrency(Number(item.unitPrice))} {Number(item.taxRate)}% {formatCurrency(Number(item.grossAmount))}
{/* Totals */}
Nettobetrag {formatCurrency(Number(invoice.netTotal))}
{Object.entries(taxGroups).map(([rate, { net, tax }]) => (
MwSt. {rate}% auf {formatCurrency(net)} {formatCurrency(tax)}
))}
Gesamtbetrag (brutto) {formatCurrency(Number(invoice.grossTotal))}
{invoice.notes && (

Hinweise

{invoice.notes}

)} {/* Bank details */} {invoice.company.bankIban && (

Bankverbindung: {invoice.company.bankName && `${invoice.company.bankName} · `} IBAN: {invoice.company.bankIban} {invoice.company.bankBic && ` · BIC: ${invoice.company.bankBic}`}

)}
{/* Sidebar */}
Zusammenfassung

Netto

{formatCurrency(Number(invoice.netTotal))}

MwSt.

{formatCurrency(Number(invoice.taxTotal))}

Brutto

{formatCurrency(Number(invoice.grossTotal))}

); }