import Link from "next/link"; import { redirect } from "next/navigation"; import { aktuelleSitzung } from "@/lib/auth"; import { hatRecht } from "@/lib/authz"; import { fuerOrganisation } from "@/lib/db"; import { alsDatum, personName } from "@/lib/utils"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Badge } from "@/components/ui/badge"; import { NichtsGefunden } from "@/components/stammdaten/anzeige"; import { DIENSTGRAD_TEXT } from "@/lib/stammdaten/texte"; export const metadata = { title: "Mitglieder" }; /** * Mitgliederliste, nach Abteilung gruppiert. * * Aktive, Jugendfeuerwehr und Passive werden getrennt geführt — eine * durchlaufende alphabetische Liste vermischt Gruppen, die in der Wehr nichts * miteinander zu tun haben. */ export default async function MitgliederSeite() { const sitzung = await aktuelleSitzung(); if (!sitzung) redirect("/anmelden"); if (!hatRecht(sitzung, "person.lesen")) redirect("/"); const personen = await fuerOrganisation(sitzung.organisationId, (db) => db.person.findMany({ where: { geloeschtAm: null }, orderBy: [{ nachname: "asc" }, { vorname: "asc" }], select: { id: true, vorname: true, nachname: true, mitgliedsnummer: true, dienstgrad: true, abteilung: true, email: true, mobil: true, eintrittsdatum: true, aktiv: true, rollen: { select: { rolle: { select: { name: true, schluessel: true } } } }, _count: { select: { qualifikationen: true } }, }, }), ); const nachAbteilung = new Map(); for (const person of personen) { const gruppe = person.abteilung ?? "Ohne Abteilung"; if (!nachAbteilung.has(gruppe)) nachAbteilung.set(gruppe, []); nachAbteilung.get(gruppe)!.push(person); } const reihenfolge = ["Aktive", "Jugendfeuerwehr", "Passive", "Verwaltung", "Ohne Abteilung"]; const gruppen = [...nachAbteilung.entries()].sort((a, b) => { const ia = reihenfolge.indexOf(a[0]); const ib = reihenfolge.indexOf(b[0]); if (ia === -1 && ib === -1) return a[0].localeCompare(b[0], "de"); if (ia === -1) return 1; if (ib === -1) return -1; return ia - ib; }); return (

Mitglieder

{personen.length} {personen.length === 1 ? "Mitglied" : "Mitglieder"}, nach Abteilung geordnet.

{personen.length === 0 ? ( ) : ( gruppen.map(([abteilung, liste]) => (

{abteilung} ({liste.length})

Name Nr. Dienstgrad Funktion Kontakt Eintritt Qualifikationen {liste.map((person) => ( {personName(person)} {person.mitgliedsnummer ?? "—"} {DIENSTGRAD_TEXT[person.dienstgrad] ?? person.dienstgrad}
{person.rollen .filter((zuweisung) => zuweisung.rolle.schluessel !== "MITGLIED") .map((zuweisung) => ( {zuweisung.rolle.name} ))}
{person.mobil ?? person.email ?? "—"} {alsDatum(person.eintrittsdatum)} {person._count.qualifikationen}
))}
)) )}
); }