import { AlertTriangle, Truck, Users, Wrench } from "lucide-react"; import { aktuelleSitzung } from "@/lib/auth"; import { fuerOrganisation } from "@/lib/db"; import { ROLLEN_BEZEICHNUNG } from "@/lib/authz"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { alsDatumZeit } from "@/lib/utils"; export const metadata = { title: "Übersicht" }; /** Startseite nach der Anmeldung. */ export default async function UebersichtSeite() { const sitzung = await aktuelleSitzung(); if (!sitzung) return null; const daten = await fuerOrganisation(sitzung.organisationId, async (db) => { const [organisation, mitglieder, fahrzeuge, geraete, pruefungFaellig, gesperrt] = await Promise.all([ db.organisation.findUnique({ where: { id: sitzung.organisationId } }), db.person.count({ where: { aktiv: true, geloeschtAm: null } }), db.fahrzeug.count({ where: { aktiv: true, geloeschtAm: null } }), db.geraet.count({ where: { geloeschtAm: null } }), db.geraet.count({ where: { status: "PRUEFUNG_FAELLIG", geloeschtAm: null } }), db.geraet.count({ where: { status: "GESPERRT", geloeschtAm: null } }), ]); return { organisation, mitglieder, fahrzeuge, geraete, pruefungFaellig, gesperrt }; }); const kacheln = [ { titel: "Aktive Mitglieder", wert: daten.mitglieder, symbol: Users }, { titel: "Fahrzeuge", wert: daten.fahrzeuge, symbol: Truck }, { titel: "Geräte", wert: daten.geraete, symbol: Wrench }, { titel: "Prüfung fällig", wert: daten.pruefungFaellig, symbol: AlertTriangle }, ]; return (

{daten.organisation?.name ?? "Feuerwehr"}

Angemeldet als {sitzung.name} —{" "} {sitzung.rollen.map((rolle) => ROLLEN_BEZEICHNUNG[rolle]).join(", ")}

{/* Sicherheitshinweis nach den Projektleitplanken. Er bleibt stehen, bis die Wehr die Anwendung ausdrücklich freigegeben hat. */}

Diese Installation ist noch nicht freigegeben.

Atemschutzüberwachung und Alarmmonitor sind sicherheitsrelevant. Solange die Wehr das System nicht ausdrücklich freigegeben hat, bleibt die analoge Überwachung führend. FLORIAN ersetzt sie nicht.

{kacheln.map((kachel) => { const Symbol = kachel.symbol; return ( {kachel.titel}

{kachel.wert}

); })}
Stand des Aufbaus Phase 1 ist abgeschlossen: Standorte, Fahrzeuge mit Geräteräumen, Gerätetypen, Geräte mit QR-Etiketten, Qualifikationen und der Import aus vorhandenen Tabellen stehen. Als Nächstes kommt das Prüfmanagement.
Phase 0 — Fundament Phase 1 — Stammdaten Phase 2 — Wartung und Prüfung Phase 3 — Einsätze Phase 4 — Terminal Phase 5 — Atemschutz
Gesperrte Geräte
{daten.gesperrt}
Zeitpunkt
{alsDatumZeit(new Date())}
); }