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
+103 -1
View File
@@ -14,7 +14,109 @@ Die aufgewendete Zeit wandert nach jedem Abschnitt in die Spalte
| Phase 1 — Stammdaten | 1:15 h | 1 | 03.09.2026 |
| Phase 1 — Nachtrag Geräteformular | 0:50 h | 1 | 03.09.2026 |
| Phase 2 — Wartung und Prüfung | 2:25 h | 1 | 03.09.2026 |
| **Summe** | **5:30 h** | **4** | |
| Phase 3 — Einsätze und Übungen | 2:10 h | 1 | 03.09.2026 |
| **Summe** | **7:40 h** | **5** | |
---
## 2026-09-03 · Phase 3 — Einsätze und Übungen
**12:25 – 14:35 · 2:10 h · Version 0.4.0**
### Was entstanden ist
Ab hier dokumentiert die Wehr, was sie tut. Acht neue Tabellen, ein öffentlich
erreichbares Portal und die Zahlen, nach denen die Gemeinde fragt.
**Schnellerfassung.** Im Alarmfall fragt FLORIAN drei Dinge: Stichwort, Ort,
welche Fahrzeuge raus sind. Alarmzeit ist der Moment des Anlegens. Alles
Weitere wird nachgetragen, wenn wieder Ruhe ist.
**Zeitstempel und Kennzahlen.** Sechs Stempel, je ein Knopf. Daraus rechnet
sich Ausrückzeit, Anfahrtszeit, Hilfsfrist und Einsatzdauer.
**Stärke nach FwDV 3.** Aus den Funktionen der Mannschaft, in der üblichen
Schreibweise, mit Zuordnung zur taktischen Einheit.
**Einsatzbericht.** Als PDF über Gotenberg, mit der Freigabe festgeschrieben.
Dazu der Jahresexport quer gedruckt für die Gemeinde.
**Statistik.** Kategorien nach Landesstatistik, Verteilung der Hilfsfristen mit
dem 80-Prozent-Wert, Beteiligung je Person, Auslastung je Fahrzeug.
**Portal für Fremdwehren.** Ein signierter Link ohne Anmeldung: Stand sehen,
Lagemeldung mit Foto absetzen. Zeitlich begrenzt, mengenbegrenzt, widerrufbar.
**Übungen.** Thema, Lernziele, Anwesenheit zum Abhaken — die Grundlage für die
Teilnahmequote in der Jahreshauptversammlung.
### Entscheidungen
**Die Hilfsfrist wird als 80-Prozent-Wert ausgewiesen, nicht als Durchschnitt.**
Der Durchschnitt sagt bei Eintreffzeiten nichts: ein einzelner Einsatz auf der
Autobahn zieht ihn nach oben, während neunzig Prozent der Fälle im Ort liegen.
In Bayern gilt als Ziel, in 80 Prozent der Fälle binnen zehn Minuten da zu
sein — also ist genau das die Zahl.
**Hinweise statt Sperren bei Zeiten und Stärke.** Eine verdrehte Reihenfolge
oder eine fehlende Führungskraft wird angezeigt, aber nicht verhindert.
Einsätze werden Tage später aus dem Gedächtnis nachgetragen; ein Einsatz mit
unsicheren Zeiten ist immer noch besser als einer, den niemand erfasst, weil
das Formular ihn nicht angenommen hat.
**Der freigegebene Bericht ist unveränderbar — Lagemeldungen nicht.** Der
Bericht geht an die Gemeinde, die Meldungen sind das Protokoll des Verlaufs.
Eine Meldung aus dem Portal kann eintreffen, wenn der Bericht längst
geschrieben ist; sie nachträglich abzuweisen wäre falsch.
**Das Portal zeigt bewusst wenig.** Stichwort, Ort, Zeitstempel und Meldungen —
also das, was an der Einsatzstelle ohnehin jeder sieht. Keine Namen von
Einsatzkräften, kein Bericht, keine Navigation. Der Link ist ein Fenster auf
einen Einsatz, keine Tür in die Anwendung.
**Koordinaten liegen doppelt.** Als Dezimalgrad, die Prisma lesen kann, und als
PostGIS-Punkt für die Karte ab Phase 6. Ein Trigger hält beides zusammen —
sonst wäre jede Schreiboperation Roh-SQL geworden, und ein über einen anderen
Weg angelegter Einsatz fehlte später auf der Karte.
**Geocoding nur gegen einen eigenen Nominatim.** Einsatzadressen sagen, wo es
gebrannt hat. Solche Anfragen gehören nicht an einen fremden Dienst — und die
Nutzungsbedingungen des öffentlichen Nominatim erlauben es ohnehin nicht.
### Wo es gehakt hat
| Problem | Ursache | Lösung |
|---|---|---|
| Prisma wollte wieder die Suchindizes löschen | wie in Phase 2: gin_trgm und gist kennt das Schema nicht | DROP INDEX-Zeilen aus der erzeugten Migration entfernt, mit Kommentar |
| Der Prisma-Client ließ sich nicht neu erzeugen | die Engine-DLL war vom laufenden Entwicklungsserver gesperrt | Server und Worker beenden, dann erzeugen — unter Windows unvermeidlich |
| Die Anwesenheitsliste blieb leer | sie forderte 300 Mitglieder an, erlaubt sind 200 je Seite | auf 200 gesetzt; aufgefallen in der Server-Ausgabe während der E2E-Tests |
| Zwei E2E-Tests schlugen im Gesamtlauf fehl, einzeln aber nicht | die erste Übersetzung einer Route dauert unter Last länger als das Erwartungslimit | Limit von 15 auf 25 Sekunden — Wartezeit des Entwicklungsservers, kein Fehler der Anwendung |
### Abweichung von der Vorgabe
**Keine.** Alle acht Tabellen tragen `organisationId` und stehen unter Row
Level Security, jede schreibende Operation protokolliert, gelöscht wird weich.
Eine Ergänzung: die Portalprozeduren sind die **ersten öffentlich erreichbaren
Endpunkte** in FLORIAN. Sie prüfen den Token selbst, laufen für die Suche des
Zugangs bewusst ohne Mandantenfilter (begründet im Code) und arbeiten danach im
Mandantenkontext der gefundenen Wehr.
### Offen und bewusst so gelassen
Die Zuordnung der Funktionen zur Stärke ist **regional unterschiedlich**. Hier
zählt der Maschinist zur Mannschaft und nur der Truppführer als Unterführer;
eine Gruppe ergibt damit 1/3/5/9. Andere Wehren rechnen anders. Die Zuordnung
steht an einer Stelle in `lib/einsatz/staerke.ts` und ist leicht zu ändern —
bestätigt ist sie noch nicht.
### Nachweise
- `npm run typecheck` — ohne Ausgabe
- `npm run test` — 207 Tests grün, davon 32 gegen eine echte Datenbank
- `npm run test:e2e` — 95 Tests grün, 2 übersprungen
- `npm run build` — 38 Routen
- `docker compose up -d` — Postgres, Redis, MinIO, Gotenberg gesund
---