Phase 3: Einsatz- und Übungserfassung #4

Merged
florian.wilde merged 1 commits from feat/phase-3-einsaetze into main 2026-09-03 12:06:23 +00:00
Owner

Ab hier dokumentiert die Wehr, was sie tut — für die Gemeinde, für die Versicherung und für die eigene Mannschaft.

Was drin ist

Schnellerfassung — im Alarmfall fragt FLORIAN drei Dinge: Stichwort, Ort, ausgerückte Fahrzeuge. Alarmzeit ist der Moment des Anlegens, alles Weitere wird nachgetragen.

Sechs Zeitstempel (alarmiert, ausgerückt, eingetroffen, Einsatzende, eingerückt, einsatzbereit) — je ein Knopf. Daraus gerechnet: Ausrückzeit, Anfahrtszeit, Hilfsfrist und Einsatzdauer.

Stärke nach FwDV 3 aus den Funktionen der Mannschaft, in der Schreibweise Führer/Unterführer/Mannschaft/Gesamt, mit Zuordnung zur taktischen Einheit.

Personalvorschlag — sortiert nach Einsatzerfahrung der letzten zwölf Monate, mit dem Qualifikationsstand daneben: eine abgelaufene G26.3 fällt auf, bevor jemand unter Atemschutz geht.

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.

Einsatzportal für Fremdwehren — ein signierter Link ohne Anmeldung. Die ersten öffentlich erreichbaren Endpunkte in FLORIAN.

Übungen mit Thema, Lernzielen und Anwesenheitsliste zum Abhaken.

Zwei Festlegungen, über die es sich zu reden lohnt

Die Hilfsfrist wird als 80-Prozent-Wert ausgewiesen, nicht als Durchschnitt. Ein einzelner Einsatz auf der Autobahn zieht den Durchschnitt nach oben, während neunzig Prozent der Fälle im Ort liegen. In Bayern gilt als Ziel, in 80 % der Fälle binnen zehn Minuten da zu sein — also ist genau das die Zahl.

Hinweise statt Sperren. Eine verdrehte Zeitreihenfolge oder eine fehlende Führungskraft wird angezeigt, aber nicht verhindert. Ein Einsatz mit unsicheren Zeiten ist besser als einer, den niemand erfasst, weil das Formular ihn nicht angenommen hat.

Sicherheit des Portals

Vier technische Schranken:

  1. 32 zufällige Bytes im Link
  2. nur der Hash liegt in der Datenbank
  3. 24 Stunden gültig, jederzeit widerrufbar, jeder Aufruf wird mitgezählt
  4. 120 Aufrufe, 30 Meldungen, 10 Fotos je Link und Stunde

Und eine fachliche: das Portal zeigt Stichwort, Ort, Zeitstempel und Lagemeldungen — keine Namen von Einsatzkräften, keinen Bericht, keinen Weg in den Rest der Anwendung. Der E2E-Test prüft das in einem Browser ohne Sitzung.

Zum Testen

git checkout feat/phase-3-einsaetze
npm install
docker compose up -d
npm run db:migrate
npm run db:seed
npm run dev          # Anwendung auf :3100
npm run worker       # zweites Fenster: erzeugt die Einsatzberichte

Anmeldung: admin@beispielwehr.de / Feuerwehr2026

  1. /einsaetze — acht Einsätze aus dem Seed. „Einsatz erfassen" ausprobieren: Stichwort, Ort, Fahrzeuge, anlegen.
  2. Im neuen Einsatz — Zeitstempel setzen (die Kennzahlen rechnen sich sofort), „Mannschaft erfassen" für den Vorschlag, Lagemeldung schreiben.
  3. Portal — rechts einen Link für „FF Nachbarhausen" erzeugen, in einem privaten Fenster öffnen (dort ist keine Sitzung), Meldung absetzen. Danach widerrufen und noch einmal aufrufen.
  4. Freigeben — Bericht schreiben, freigeben, „Bericht als PDF" (der Worker braucht ein bis zwei Sekunden). Danach ist Ändern gesperrt.
  5. /einsaetze/statistik — Jahr wählen, „Jahresexport als PDF".
  6. /uebungen — Übung anlegen, Anwesenheit abhaken.

Nachweise

  • npm run typecheck — ohne Ausgabe
  • npm run test — 207 Tests grün (davon 32 gegen eine echte Datenbank)
  • npm run test:e2e — 95 grün, 2 begründet übersprungen
  • npm run build — 38 Routen

Nebenbei

  • Der Nummernkreis JJJJ-NNNN liegt jetzt in src/lib/nummernkreis.ts und wird von Prüfprotokollen, Einsätzen und Übungen gemeinsam verwendet.
  • Behoben: die Anwesenheitsliste einer Übung forderte 300 Mitglieder an, erlaubt sind 200 je Seite — die Liste blieb leer.
  • Das Zeitlimit der E2E-Erwartungen steigt von 15 auf 25 Sekunden. Mit fünfzig Routen dauert die erste Übersetzung einer Seite im Entwicklungsserver unter Last länger; daran scheiterten gelegentlich Tests, die einzeln grün sind.

Eine offene Frage an dich

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 zählen den Maschinisten zu den Unterführern oder schreiben dreistellig ohne Unterführer (1/8/9). Wie rechnet ihr? Die Zuordnung steht an einer Stelle in src/lib/einsatz/staerke.ts und ist in zwei Zeilen geändert.

🤖 Generated with Claude Code

Ab hier dokumentiert die Wehr, was sie tut — für die Gemeinde, für die Versicherung und für die eigene Mannschaft. ## Was drin ist **Schnellerfassung** — im Alarmfall fragt FLORIAN drei Dinge: Stichwort, Ort, ausgerückte Fahrzeuge. Alarmzeit ist der Moment des Anlegens, alles Weitere wird nachgetragen. **Sechs Zeitstempel** (alarmiert, ausgerückt, eingetroffen, Einsatzende, eingerückt, einsatzbereit) — je ein Knopf. Daraus gerechnet: Ausrückzeit, Anfahrtszeit, **Hilfsfrist** und Einsatzdauer. **Stärke nach FwDV 3** aus den Funktionen der Mannschaft, in der Schreibweise `Führer/Unterführer/Mannschaft/Gesamt`, mit Zuordnung zur taktischen Einheit. **Personalvorschlag** — sortiert nach Einsatzerfahrung der letzten zwölf Monate, mit dem Qualifikationsstand daneben: eine abgelaufene G26.3 fällt auf, bevor jemand unter Atemschutz geht. **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. **Einsatzportal für Fremdwehren** — ein signierter Link ohne Anmeldung. Die ersten öffentlich erreichbaren Endpunkte in FLORIAN. **Übungen** mit Thema, Lernzielen und Anwesenheitsliste zum Abhaken. ## Zwei Festlegungen, über die es sich zu reden lohnt **Die Hilfsfrist wird als 80-Prozent-Wert ausgewiesen, nicht als Durchschnitt.** Ein einzelner Einsatz auf der Autobahn zieht den Durchschnitt nach oben, während neunzig Prozent der Fälle im Ort liegen. In Bayern gilt als Ziel, in 80 % der Fälle binnen zehn Minuten da zu sein — also ist genau das die Zahl. **Hinweise statt Sperren.** Eine verdrehte Zeitreihenfolge oder eine fehlende Führungskraft wird angezeigt, aber nicht verhindert. Ein Einsatz mit unsicheren Zeiten ist besser als einer, den niemand erfasst, weil das Formular ihn nicht angenommen hat. ## Sicherheit des Portals Vier technische Schranken: 1. 32 zufällige Bytes im Link 2. nur der Hash liegt in der Datenbank 3. 24 Stunden gültig, jederzeit widerrufbar, jeder Aufruf wird mitgezählt 4. 120 Aufrufe, 30 Meldungen, 10 Fotos je Link und Stunde Und eine fachliche: das Portal zeigt Stichwort, Ort, Zeitstempel und Lagemeldungen — **keine Namen von Einsatzkräften, keinen Bericht, keinen Weg in den Rest der Anwendung**. Der E2E-Test prüft das in einem Browser ohne Sitzung. ## Zum Testen ```bash git checkout feat/phase-3-einsaetze npm install docker compose up -d npm run db:migrate npm run db:seed npm run dev # Anwendung auf :3100 npm run worker # zweites Fenster: erzeugt die Einsatzberichte ``` Anmeldung: `admin@beispielwehr.de` / `Feuerwehr2026` 1. **`/einsaetze`** — acht Einsätze aus dem Seed. „Einsatz erfassen" ausprobieren: Stichwort, Ort, Fahrzeuge, anlegen. 2. **Im neuen Einsatz** — Zeitstempel setzen (die Kennzahlen rechnen sich sofort), „Mannschaft erfassen" für den Vorschlag, Lagemeldung schreiben. 3. **Portal** — rechts einen Link für „FF Nachbarhausen" erzeugen, in einem privaten Fenster öffnen (dort ist keine Sitzung), Meldung absetzen. Danach widerrufen und noch einmal aufrufen. 4. **Freigeben** — Bericht schreiben, freigeben, „Bericht als PDF" (der Worker braucht ein bis zwei Sekunden). Danach ist Ändern gesperrt. 5. **`/einsaetze/statistik`** — Jahr wählen, „Jahresexport als PDF". 6. **`/uebungen`** — Übung anlegen, Anwesenheit abhaken. ## Nachweise - `npm run typecheck` — ohne Ausgabe - `npm run test` — 207 Tests grün (davon 32 gegen eine echte Datenbank) - `npm run test:e2e` — 95 grün, 2 begründet übersprungen - `npm run build` — 38 Routen ## Nebenbei - Der Nummernkreis `JJJJ-NNNN` liegt jetzt in `src/lib/nummernkreis.ts` und wird von Prüfprotokollen, Einsätzen und Übungen gemeinsam verwendet. - Behoben: die Anwesenheitsliste einer Übung forderte 300 Mitglieder an, erlaubt sind 200 je Seite — die Liste blieb leer. - Das Zeitlimit der E2E-Erwartungen steigt von 15 auf 25 Sekunden. Mit fünfzig Routen dauert die erste Übersetzung einer Seite im Entwicklungsserver unter Last länger; daran scheiterten gelegentlich Tests, die einzeln grün sind. ## Eine offene Frage an dich 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 zählen den Maschinisten zu den Unterführern oder schreiben dreistellig ohne Unterführer (1/8/9). Wie rechnet ihr? Die Zuordnung steht an einer Stelle in `src/lib/einsatz/staerke.ts` und ist in zwei Zeilen geändert. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
florian.wilde added 1 commit 2026-09-03 11:51:57 +00:00
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>
florian.wilde merged commit d8d692098d into main 2026-09-03 12:06:23 +00:00
florian.wilde deleted branch feat/phase-3-einsaetze 2026-09-03 12:06:23 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: florian.wilde/FireAdministration#4