import Link from 'next/link'; import { Euro, CreditCard, TrendingUp, ArrowRight } from 'lucide-react'; import { createFinanceApi } from '@kit/finance/api'; 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 { AccountNotFound } from '~/components/account-not-found'; import { CmsPageShell } from '~/components/cms-page-shell'; import { StatsCard } from '~/components/stats-card'; interface PageProps { params: Promise<{ account: string }>; } const formatCurrency = (amount: number) => new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format( amount, ); export default async function PaymentsPage({ 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 ; const api = createFinanceApi(client); const [batchesResult, invoicesResult] = await Promise.all([ api.listBatches(acct.id), api.listInvoices(acct.id), ]); const batches = batchesResult.data; const invoices = invoicesResult.data; const paidInvoices = invoices.filter( (inv: Record) => inv.status === 'paid', ); const openInvoices = invoices.filter( (inv: Record) => inv.status === 'sent' || inv.status === 'overdue', ); const overdueInvoices = invoices.filter( (inv: Record) => inv.status === 'overdue', ); const paidTotal = paidInvoices.reduce( (sum: number, inv: Record) => sum + (Number(inv.total_amount) || 0), 0, ); const openTotal = openInvoices.reduce( (sum: number, inv: Record) => sum + (Number(inv.total_amount) || 0), 0, ); const overdueTotal = overdueInvoices.reduce( (sum: number, inv: Record) => sum + (Number(inv.total_amount) || 0), 0, ); const sepaTotal = batches.reduce( (sum: number, b: Record) => sum + (Number(b.total_amount) || 0), 0, ); return (
{/* Header */}

Zahlungsübersicht

Zusammenfassung aller Zahlungen und offenen Beträge

{/* Stats */}
} description={`${paidInvoices.length} Rechnungen`} /> } description={`${openInvoices.length} Rechnungen`} /> } description={`${overdueInvoices.length} Rechnungen`} /> } description={`${batches.length} Einzüge`} />
{/* Quick Links */}
Offene Rechnungen 0 ? 'default' : 'secondary'} > {openInvoices.length}

{openInvoices.length > 0 ? `${openInvoices.length} Rechnungen mit einem Gesamtbetrag von ${formatCurrency(openTotal)} sind offen.` : 'Keine offenen Rechnungen vorhanden.'}

SEPA-Einzüge 0 ? 'default' : 'secondary'}> {batches.length}

{batches.length > 0 ? `${batches.length} SEPA-Einzüge mit einem Gesamtvolumen von ${formatCurrency(sepaTotal)}.` : 'Keine SEPA-Einzüge vorhanden.'}

); }