import { Link, useLoaderData } from "react-router"; import { requireUser } from "@/session.server"; import prisma from "@/lib/prisma"; import { formatCurrency } from "@/lib/tax"; import { Archive, Building2, FileText, Users, ArchiveRestore } from "lucide-react"; import { useRevalidator } from "react-router"; export const handle = { breadcrumbs: () => [{ label: "Archiv" }], }; export async function loader({ request }: { request: Request }) { const user = await requireUser(request); const companies = await prisma.company.findMany({ where: { userId: user.id, archived: true }, include: { _count: { select: { invoices: true, customers: true } }, invoices: { where: { status: "PAID" }, select: { grossTotal: true }, }, }, orderBy: { archivedAt: "desc" }, }); return { isAdmin: user.role === "ADMIN", companies: companies.map((c) => ({ ...c, archivedAt: c.archivedAt?.toISOString() ?? null, revenue: c.invoices.reduce((s, inv) => s + Number(inv.grossTotal), 0), invoices: undefined, })), }; } export default function ArchivPage() { const { companies, isAdmin } = useLoaderData(); const { revalidate } = useRevalidator(); async function restore(id: string) { if (!confirm("Archivierung aufheben?")) return; await fetch(`/api/companies/${id}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ archived: false }), }); revalidate(); } return (

Archiv

{companies.length === 0 ? "Keine archivierten Mandanten" : `${companies.length} archivierte ${companies.length === 1 ? "Mandant" : "Mandanten"}`}

{companies.length === 0 ? (

Archiv ist leer

Archivierte Mandanten erscheinen hier.

) : (
{companies.map((company) => (
{company.name} {company.legalForm && ( {company.legalForm} )}
{company._count.invoices} Rechnungen {company._count.customers} Kunden Umsatz (bezahlt): {formatCurrency(company.revenue)} {company.archivedAt && ( Archiviert: {new Date(company.archivedAt).toLocaleDateString("de-DE")} )}
Öffnen {isAdmin && ( )}
))}
)}
); }