Phase 3: Einsatz- und Uebungserfassung

Schnellerfassung im Alarmfall, sechs Zeitstempel mit Ausrueckzeit, Anfahrt
und Hilfsfrist, Staerke nach FwDV 3, Personalvorschlag mit
Qualifikationsstand, Einsatzbericht als PDF, Jahresexport fuer die Gemeinde,
Statistik und Uebungen mit Anwesenheitsliste.

Dazu das Einsatzportal fuer Fremdwehren: ein signierter Link ohne Anmeldung,
zeitlich und mengenbegrenzt, der Stichwort, Ort, Zeiten und Lagemeldungen
zeigt und Meldungen mit Foto annimmt. Es sind die ersten oeffentlich
erreichbaren Endpunkte in FLORIAN.

Acht neue Tabellen, alle mit organisationId und Row Level Security. Ein
freigegebener Einsatzbericht ist unveraenderlich; ein Datenbanktrigger setzt
das durch. Koordinaten liegen doppelt — als Dezimalgrad und als
PostGIS-Punkt, zusammengehalten von einem Trigger.

57 neue Tests (32 Unit, 14 gegen eine echte Datenbank, 11 E2E).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-09-03 13:50:58 +02:00
co-authored by Claude Opus 5
parent bc62a9c1e8
commit 91954c402b
100 changed files with 9667 additions and 38 deletions
+201 -8
View File
@@ -1,9 +1,9 @@
# Anleitung
Bedienung von FLORIAN, Stand Phase 2 (Version 0.3.0). Die Bilder zeigen die
Bedienung von FLORIAN, Stand Phase 3 (Version 0.4.0). Die Bilder zeigen die
Beispielwehr aus dem Seed und werden mit `npm run screenshots` neu erzeugt.
> Einsätze, Atemschutz und die Kiosk-Oberfläche kommen in den folgenden Phasen
> Atemschutz, Karten und die Kiosk-Oberfläche kommen in den folgenden Phasen
> dazu. Siehe [ROADMAP.md](ROADMAP.md).
---
@@ -70,7 +70,7 @@ derselben Installation hat, ist nicht sichtbar und nicht abfragbar.
### Die Seitenleiste
Links stehen alle Module. Was noch nicht existiert, ist ausgegraut und trägt
rechts sein Phasenkürzel — `P3` heißt „kommt in Phase 3".
rechts sein Phasenkürzel — `P4` heißt „kommt in Phase 4".
Was jemand überhaupt sieht, hängt an seinen Rechten. Ein einfaches Mitglied
sieht die Mitgliederliste, aber nicht das Protokoll. Wichtig zum Verständnis:
@@ -585,7 +585,200 @@ Ersatz da ist. Der Knopf dazu steht in der Zeile.
Voraussetzung ist, dass am Gerätetyp eine Lebensdauer hinterlegt ist
(Kapitel 5).
## 18. Rollen und was sie dürfen
---
## 18. Einen Einsatz erfassen
![Einsatzliste](screenshots/19-einsaetze-light.png)
Im Alarmfall zählt eines: dass der Einsatz überhaupt angelegt wird. Die
**Schnellerfassung** fragt deshalb nur drei Dinge:
1. **Stichwort** — das, was die Leitstelle durchgegeben hat: „B 3 Wohnhausbrand"
2. **Ort** — Straße, Hausnummer, gegebenenfalls das Objekt
3. **Fahrzeuge** — welche ausgerückt sind
Die Alarmzeit ist der Moment des Anlegens. Alles andere — Mannschaft, Zeiten,
Bericht — wird später nachgetragen. Der Einsatz bekommt sofort eine
fortlaufende Nummer im Format `JJJJ-NNNN`.
**Koordinaten** lassen sich über „Koordinaten suchen" ermitteln, wenn die Wehr
einen eigenen Nominatim betreibt (Kapitel 24). Ohne den bleibt das Feld leer —
das ist in Ordnung, die Karte kommt in Phase 6.
---
## 19. Der Einsatz von innen
![Einsatzdetail](screenshots/22-einsatz-light.png)
### Zeitstempel
Sechs Stempel beschreiben einen Einsatz vollständig:
| Stempel | wann |
|---|---|
| alarmiert | die Leitstelle hat alarmiert |
| ausgerückt | das erste Fahrzeug verlässt das Gerätehaus |
| eingetroffen | das erste Fahrzeug ist an der Einsatzstelle |
| Einsatzende | die Arbeit an der Einsatzstelle ist beendet |
| eingerückt | zurück im Gerätehaus |
| einsatzbereit | Fahrzeuge und Geräte sind wieder hergerichtet |
Jeder Stempel ist ein Knopf und setzt die aktuelle Uhrzeit. Ein Klick auf
„zurücknehmen" macht ihn wieder leer, falls er zu früh gedrückt wurde.
Daraus errechnet FLORIAN vier Zahlen:
- **Ausrückzeit** — Alarm bis Ausrücken. Sagt etwas über die Wehr aus.
- **Anfahrt** — Ausrücken bis Eintreffen. Sagt etwas über die Lage aus.
- **Hilfsfrist** — Alarm bis Eintreffen. Die Zahl, nach der die Gemeinde fragt.
- **Einsatzdauer** — Alarm bis Einrücken.
Stimmt die Reihenfolge nicht, erscheint ein Hinweis. **Gespeichert wird
trotzdem**: Zeiten werden oft Tage später aus dem Gedächtnis nachgetragen, und
ein Einsatz mit unsicheren Zeiten ist besser als einer, den niemand erfasst.
### Mannschaft
„Mannschaft erfassen" zeigt einen Vorschlag, sortiert danach, wer im letzten
Jahr am häufigsten dabei war. Daneben steht, ob die einsatzrelevanten
Qualifikationen noch gelten — eine abgelaufene G26.3 fällt so auf, **bevor**
jemand unter Atemschutz geht.
Ein Klick übernimmt die Person, danach lassen sich Funktion und Atemschutz in
der Tabelle einstellen.
Rechts steht laufend die **Stärke nach FwDV 3**:
```
1/3/5/9 entspricht einer Gruppe
│ │ │ └── gesamt
│ │ └──── Mannschaft
│ └────── Unterführer (Truppführer)
└──────── Führer (Gruppen-, Zug-, Staffelführer, Einsatzleiter)
```
> **Regional unterschiedlich.** Hier zählt der Maschinist zur Mannschaft. Manche
> Wehren rechnen ihn zu den Unterführern, andere schreiben dreistellig ohne
> Unterführer. Die Zuordnung steht an einer Stelle im Code und lässt sich
> anpassen.
### Verlauf
Lagemeldungen halten fest, was währenddessen passiert ist — mit Foto und
wahlweise als **wichtig** gekennzeichnet (Menschenrettung, Nachforderung,
Lageänderung). Meldungen bleiben auch nach der Freigabe möglich.
---
## 20. Bericht und Freigabe
Der Bericht ist der Text des Einsatzleiters: Lage bei Eintreffen, was getan
wurde, wie es endete. Er lässt sich jederzeit speichern und weiter ergänzen.
**Freigeben** schließt den Einsatz ab. Danach:
- ist der Bericht **unveränderbar** — er geht an die Gemeinde und im
Schadensfall an die Versicherung,
- entsteht im Hintergrund das PDF (Knopf „Bericht als PDF"),
- bleiben nur die Lagemeldungen weiter möglich.
Vor der Freigabe prüft FLORIAN zwei Dinge: dass eine Alarmzeit gesetzt ist und
dass mindestens eine Einsatzkraft erfasst wurde. Ein Bericht ohne Mannschaft
ist kein Nachweis.
---
## 21. Einsatzportal für Fremdwehren
![Einsatzportal](screenshots/24-portal-light.png)
Bei einer größeren Sache sind Nachbarwehren, THW oder Rettungsdienst mit vor
Ort. Die brauchen kein Konto in FLORIAN — sie bekommen einen **Link**.
So geht es:
1. Auf der Einsatzseite unter „Portal für Fremdwehren" eintragen, für wen der
Link ist („FF Nachbarhausen").
2. **Erzeugen** klicken. Der Link erscheint **einmal** — danach steht in der
Datenbank nur noch sein Hash.
3. Link kopieren und weitergeben, oder als QR-Code zeigen.
Was die Fremdwehr sieht: Stichwort, Ort, die Zeitstempel und den Verlauf. Was
sie **nicht** sieht: Namen von Einsatzkräften, den Bericht, irgendetwas
außerhalb dieses Einsatzes.
Was sie tun kann: eine Lagemeldung mit Foto absetzen.
Der Link gilt 24 Stunden, lässt sich jederzeit **widerrufen**, und jeder Aufruf
wird mitgezählt — ein Link, der nach dem Einsatz noch benutzt wird, fällt auf.
---
## 22. Statistik
![Einsatzstatistik](screenshots/20-statistik-light.png)
Zwei Fragen, eine Seite.
**Was die Gemeinde fragt:** wie viele Einsätze welcher Art, und wie schnell wart
ihr da? Dafür stehen oben die Zahlen nach der Landesstatistik und die
**Hilfsfrist als 80-Prozent-Wert**.
> Warum nicht der Durchschnitt? Weil ein einzelner Einsatz auf der Autobahn ihn
> nach oben zieht, während neunzig Prozent der Fälle im Ort liegen. In Bayern
> gilt als Ziel: in 80 Prozent der Fälle binnen zehn Minuten. Genau diese Zahl
> steht hier.
**Was die Wehr fragt:** wer trägt die Last? Dafür steht unten die Beteiligung je
Person — Einsätze, davon unter Atemschutz, und Übungen.
**Jahresexport als PDF** erzeugt das Blatt für die Gemeinde: Überblick,
Kategorien und alle Einsätze des Jahres in einer Tabelle. Es wird nicht
gespeichert, sondern jedes Mal neu gerechnet — es ist eine Auswertung, keine
Urkunde.
---
## 23. Übungen
![Übungen](screenshots/21-uebungen-light.png)
Eine Übung besteht aus Thema, Art, Datum und den **Lernzielen** — was danach
sitzen soll.
![Übung mit Anwesenheit](screenshots/23-uebung-light.png)
Die Anwesenheit wird als Liste abgehakt: alle aktiven Mitglieder auf einmal,
nicht einzeln gesucht. Bei einer Übung ist die halbe Wehr da.
Die Teilnahme fließt in die Beteiligungsstatistik ein — das ist die Zahl, nach
der in der Jahreshauptversammlung gefragt wird und die bei Beförderungen zählt.
---
## 24. Adressen zu Koordinaten (Nominatim)
FLORIAN löst Einsatzadressen nur auf, wenn die Wehr einen **eigenen** Nominatim
betreibt:
```bash
# .env
GEOCODING_ENABLED=true
NOMINATIM_URL=http://nominatim:8080
GEOCODING_LAENDER=de,at,ch
```
> **Kein öffentlicher Dienst.** Einsatzadressen sagen, wo es gebrannt hat und
> wer betroffen war. Solche Anfragen gehören nicht an einen fremden Server —
> und die Nutzungsbedingungen des öffentlichen Nominatim erlauben es ohnehin
> nicht.
Ohne Konfiguration bleibt die Suche leer. Koordinaten lassen sich dann von Hand
eintragen oder weglassen.
## 25. Rollen und was sie dürfen
Neun Rollen, jede mit einem festen Satz Rechte. Die Zuordnung steht zentral in
`src/lib/authz.ts` und wird beim Seed in die Datenbank gespiegelt — eine Wehr
@@ -614,7 +807,7 @@ Das Terminal selbst ist nur die Tür.
---
## 19. Anmeldung über authentik einrichten
## 26. Anmeldung über authentik einrichten
authentik läuft **getrennt** von FLORIAN und ist nicht Teil dieses Stacks.
@@ -667,7 +860,7 @@ ganze Wehr aus.
---
## 20. Terminal-Anmeldung im Gerätehaus
## 27. Terminal-Anmeldung im Gerätehaus
Die Oberfläche dazu kommt in Phase 4; der Anmeldeweg steht bereits.
@@ -689,7 +882,7 @@ Huber), PIN `471203`.
---
## 21. Was protokolliert wird
## 28. Was protokolliert wird
Jede schreibende Änderung erzeugt einen Eintrag mit Zeitpunkt, Person,
betroffenem Datensatz und den geänderten Feldern im Vorher-Nachher-Vergleich.
@@ -714,7 +907,7 @@ jeweiligen Detailseite sichtbar.
---
## 22. Wenn etwas nicht geht
## 29. Wenn etwas nicht geht
| Beobachtung | Wahrscheinliche Ursache | Was hilft |
|---|---|---|