import { Link, useLoaderData } from "react-router"; import { requireUser } from "@/session.server"; import prisma from "@/lib/prisma"; import { formatCurrency } from "@/lib/tax"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Building2, FileText, Euro } from "lucide-react"; import { InvoiceStatus } from "@prisma/client"; export async function loader({ request }: { request: Request }) { const user = await requireUser(request); const userId = user.id; const [companies, invoiceStats, paidTotal, openInvoices] = await Promise.all([ prisma.company.findMany({ where: { userId }, include: { _count: { select: { invoices: true, customers: true } } }, orderBy: { name: "asc" }, }), prisma.invoice.aggregate({ where: { company: { userId } }, _count: true, _sum: { grossTotal: true }, }), prisma.invoice.aggregate({ where: { company: { userId }, status: InvoiceStatus.PAID }, _sum: { grossTotal: true }, }), prisma.invoice.count({ where: { company: { userId }, status: { in: [InvoiceStatus.SENT, InvoiceStatus.DRAFT] } }, }), ]); return { companies, totalInvoices: invoiceStats._count, paidTotal: Number(paidTotal._sum.grossTotal ?? 0), openInvoices, }; } export default function DashboardPage() { const { companies, totalInvoices, paidTotal, openInvoices } = useLoaderData(); return (

Dashboard

Übersicht aller Mandanten und Rechnungen

{companies.length}

Mandanten

{totalInvoices}

Rechnungen gesamt

{openInvoices}

Offen / Entwurf

{formatCurrency(paidTotal)}

Bezahlt (brutto)

Mandanten

Alle anzeigen →
{companies.length === 0 ? (

Noch keine Mandanten angelegt.

Mandant anlegen
) : (
{companies.map((company) => ( {company.name} {company.legalForm && (

{company.legalForm}

)}
{company._count.invoices} Rechnungen {company._count.customers} Kunden
{company.city && (

{company.zip} {company.city}

)}
))}
)}
); }