Phase 0: Fundament der Feuerwehr-Verwaltungsplattform

Legt den kompletten Unterbau an, auf dem die Fachmodule aufsetzen.

Betrieb:
- docker-compose.yml mit Traefik, App, Worker, PostgreSQL 17 + PostGIS,
  Redis, MinIO und Gotenberg; Entwicklungs-Override ohne Traefik, dafuer
  mit Mailpit und Adminer
- Mehrstufiges Dockerfile: eigener Benutzer, tini als PID 1, Healthcheck
- .env.example mit einem Kommentar zu jeder Variable

Mandantentrennung:
- Row Level Security auf allen mandantenpflichtigen Tabellen
- Zwei getrennte Datenbankverbindungen: florian_app mit aktiver RLS fuer
  die Anwendung, Eigentuemer-Zugang nur fuer Migration, Seed und Anmeldung
- fuerOrganisation() als einziger Weg zu Fachdaten

Nachvollziehbarkeit:
- AuditLog append-only per Trigger; UPDATE ist dauerhaft gesperrt, DELETE
  nur im gekennzeichneten Aufbewahrungslauf
- Geheimnisse werden vor dem Schreiben entfernt

Anmeldung:
- OIDC gegen ein extern betriebenes authentik, Rollen aus Gruppen nur als
  Vorbelegung beim ersten Login
- Lokaler E-Mail/Passwort-Login als Rueckfallweg
- Terminal per PIN und RFID mit zwei Schranken (Geraet, dann Person)

Weiteres:
- lib/authz.ts mit 9 Rollen und 38 Einzelrechten
- lib/storage.ts (MinIO), lib/audit.ts, lib/warteschlange.ts (BullMQ)
- Integrationen fuer Mail, Telegram und LLM hinter abschaltbaren Interfaces
- tRPC v11, Basis-Layout mit Seitenleiste und dunkler Darstellung
- Seed mit einer Beispielwehr: 16 Personen, 3 Fahrzeuge, 40 Geraete
- 32 Vitest-Tests (davon 8 gegen eine echte Datenbank), 10 Playwright-Tests
- README, Anleitung mit Screenshots, Roadmap, Aufwandsschaetzung, Devlog,
  Versionierungsregeln und Changelog

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-09-03 00:13:53 +02:00
co-authored by Claude Opus 5
commit 845942f36c
84 changed files with 21433 additions and 0 deletions
+28
View File
@@ -0,0 +1,28 @@
Phase 5: Atemschutzüberwachung nach FwDV 7.
WICHTIG: Jede Ansicht dieses Moduls zeigt oben dauerhaft den Hinweis:
"Ergänzendes System — die analoge Atemschutzüberwachung bleibt führend."
Dieser Hinweis ist erst über eine Konfigurationsoption abschaltbar, die
dokumentiert eine Freigabe durch den Kommandanten voraussetzt.
Modelle: Atemschutzeinsatz (Einsatz, Überwacher, Beginn, Ende),
Trupp (Truppführer, Truppmann, Auftrag, Funkrufname, Status:
bereit|im_einsatz|rueckweg|draussen), Druckmessung (Trupp, Person,
Zeitpunkt, Druck in bar, Art: eingang|zwischen|ausgang),
G26Untersuchung (Person, Datum, gueltig_bis), Belastungsuebung
(Person, Datum, Art, Ort).
Funktionen:
- Truppanlage per RFID-Scan oder Auswahl, Eingangsdruck erfassen
- Live-Timer je Trupp, serverseitig autoritativ, per Socket.IO verteilt
- Rückzugsdruck-Berechnung (konfigurierbare Formel, Standard:
Eingangsdruck-Verbrauchsrate) mit optischer Ampel und akustischem Alarm
bei Schwellwert
- Erinnerung zur Druckabfrage in konfigurierbarem Intervall (Standard 10 min)
- Notfallknopf je Trupp (Mayday) mit Protokolleintrag
- Lückenloses Protokoll als PDF, angehängt an den Einsatz
- Verwaltung: G26.3-Fristen, Belastungsübungen, Einsatzstunden je AGT,
Tauglichkeitsübersicht mit Ampel, Dashboard-Widget "verfügbare AGT"
Timer müssen einen Browser-Reload und einen Verbindungsabbruch überstehen.
Das ist die wichtigste Testanforderung.