import Link from 'next/link'; import { Euro, CreditCard, TrendingUp, ArrowRight } from 'lucide-react'; import { getTranslations } from 'next-intl/server'; 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 t = await getTranslations('finance'); 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 */}

{t('payments.subtitle')}

{/* Stats */}
} description={`${paidInvoices.length} ${t('payments.paidInvoices')}`} /> } description={`${openInvoices.length} ${t('invoices.title')}`} /> } description={`${overdueInvoices.length} ${t('invoices.title')}`} /> } description={`${batches.length} ${t('payments.batchUnit')}`} />
{/* Quick Links */}
{t('payments.openInvoices')} 0 ? 'default' : 'secondary'} > {openInvoices.length}

{openInvoices.length > 0 ? t('payments.invoicesOpenSummary', { count: openInvoices.length, total: formatCurrency(openTotal), }) : t('payments.noOpenInvoices')}

{t('payments.sepaBatches')} 0 ? 'default' : 'secondary'}> {batches.length}

{batches.length > 0 ? t('payments.batchSummary', { count: batches.length, total: formatCurrency(sepaTotal), }) : t('payments.noBatchesFound')}

); }