'use client'; import { Building2, Users, CalendarDays, BookOpen, Euro, TrendingUp, } from 'lucide-react'; import { formatNumber, formatCurrencyAmount } from '@kit/shared/formatters'; import { Badge } from '@kit/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card'; interface HierarchyReportProps { summary: { total_orgs: number; total_active_members: number; total_members: number; new_members_this_year: number; total_upcoming_events: number; total_active_courses: number; total_open_invoices: number; total_open_invoice_amount: number; total_sepa_batches_this_year: number; }; report: Array<{ org_id: string; org_name: string; org_slug: string | null; depth: number; active_members: number; inactive_members: number; total_members: number; new_members_this_year: number; active_courses: number; upcoming_events: number; open_invoices: number; open_invoice_amount: number; sepa_batches_this_year: number; }>; } function getDepthLabel(depth: number) { switch (depth) { case 0: return 'Verband'; case 1: return 'Unterverband'; default: return 'Verein'; } } function getDepthVariant(depth: number) { switch (depth) { case 0: return 'default' as const; case 1: return 'secondary' as const; default: return 'outline' as const; } } export function HierarchyReport({ summary, report }: HierarchyReportProps) { return (
{/* Summary Cards */}

Organisationen

{formatNumber(summary.total_orgs)}

Aktive Mitglieder

{formatNumber(summary.total_active_members)}

von {formatNumber(summary.total_members)} gesamt

Neue Mitglieder (Jahr)

{formatNumber(summary.new_members_this_year)}

Anstehende Termine

{formatNumber(summary.total_upcoming_events)}

Aktive Kurse

{formatNumber(summary.total_active_courses)}

Offene Rechnungen

{formatCurrencyAmount(summary.total_open_invoice_amount)}

{formatNumber(summary.total_open_invoices)} Rechnungen

{/* Per-Org Report Table */} Bericht pro Organisation {report.length === 0 ? (

Keine Organisationen vorhanden

Die Hierarchie enthält noch keine Organisationen.

) : (
{report.map((row) => ( ))}
Name Ebene Aktive Mitgl. Gesamt Neu (Jahr) Kurse Termine Offene Rechn. Offener Betrag
{row.org_name} {getDepthLabel(row.depth)} {formatNumber(row.active_members)} {formatNumber(row.total_members)} {formatNumber(row.new_members_this_year)} {formatNumber(row.active_courses)} {formatNumber(row.upcoming_events)} {formatNumber(row.open_invoices)} {formatCurrencyAmount(row.open_invoice_amount)}
)}
); }