# Projekt: FLORIAN — Feuerwehr-Verwaltungsplattform ## Kontext Selbstgehostete Verwaltungssoftware für Freiwillige Feuerwehren in Deutschland (Bayern). Zielgruppe: Kommandant, Gerätewart, Atemschutzgerätewart, Schriftführer, Kassier, Mannschaft. Betrieb: Docker Compose auf Proxmox VE, kein Cloud-Zwang, DSGVO-konform, Daten bleiben im Gerätehaus bzw. auf eigener Hardware. ## Nicht verhandelbarer Stack - Next.js 15 App Router, TypeScript strict, React Server Components wo sinnvoll - Prisma + PostgreSQL 17 mit PostGIS - tRPC für interne Aufrufe, REST unter /api/v1 für externe Integrationen - Tailwind CSS + shadcn/ui - Redis + BullMQ für Hintergrundjobs - MinIO (S3-API) für alle Dateien — niemals lokale Pfade - Zod für jede Ein- und Ausgabevalidierung - Vitest (Unit) + Playwright (E2E) - Alles auf Deutsch: UI-Texte, Feldnamen in der UI, Kommentare. Code-Bezeichner auf Englisch, Domänenbegriffe deutsch belassen (z. B. `Atemschutztrupp`, `Pruefintervall`, `Geraetewart`). ## Architekturregeln 1. Jede Tabelle hat `organisationId` (Mandant). Postgres RLS ist aktiv. Kein Query ohne Mandantenfilter. 2. Jede schreibende Operation erzeugt einen Eintrag in `AuditLog` (Actor, Zeitpunkt, Entität, Vorher/Nachher als JSONB). Append-only. 3. Prüf-, Wartungs- und Buchungsdaten werden nie hart gelöscht (Soft-Delete + Versionierung). 4. Alle Fristen und Zeitberechnungen serverseitig, Zeitzone Europe/Berlin. 5. Berechtigungen zentral in `lib/authz.ts`. Keine Rollenprüfung in Komponenten. 6. Dateizugriff ausschließlich über `lib/storage.ts`. 7. Externe Dienste (LLM, Mail, Telegram) hinter Interfaces in `lib/integrations/`, damit sie im Test mockbar und optional abschaltbar sind. ## Domänenwissen, das zu beachten ist - DGUV-Prüffristen: Geräte haben Prüfintervalle aus Vorschrift oder Herstellervorgabe. Status: einsatzbereit | pruefung_faellig | gesperrt | ausgesondert. - Lebensdauerkategorien: Helme, Seile, Pressluftatmer, Schutzkleidung haben eine maximale Nutzungsdauer ab Herstellungs- oder Indienststellungsdatum. - FwDV 7 (Atemschutz): Überwachung dokumentiert Truppzusammensetzung, Einsatzbeginn, Druckwerte in Intervallen, Rückzugsdruck, Ende. - FwDV 3: Einsatzstärke wird als Staffel/Gruppe/Zug erfasst. - Einsatzzeitstempel: Alarmierung, Ausrücken, Eintreffen, Einsatzende, Einrücken, Einsatzbereitschaft. ## Sicherheits- und Rechtsleitplanken - Atemschutzüberwachung und Alarmmonitor sind sicherheitsrelevant. Jede entsprechende Ansicht zeigt einen Hinweis, dass die analoge Überwachung führend bleibt, solange das System nicht freigegeben ist. - Personenbezogene Daten: Löschkonzept, Export je Person, Aufbewahrungsfristen konfigurierbar. - Keine Telemetrie, keine externen CDNs, keine Google Fonts. Alles lokal. ## Arbeitsweise - Arbeite phasenweise. Fasse nie mehrere Phasen in einem Schritt zusammen. - Beginne jede Phase mit dem Prisma-Schema, dann Migration, dann Server-Logik, dann UI, dann Tests. - Nach jeder Phase: `docker compose up` muss durchlaufen, `npm run test` muss grün sein, README-Abschnitt zur Phase ergänzen. - Wenn eine Anforderung fachlich unklar ist: nachfragen statt raten. Feuerwehr-Fachlichkeit ist regional unterschiedlich.