Vergleich mit InvenTree, Snipe-IT, Grocy, Shelf.nu, Resgrid, KP Front, FleetMS, HiOrg-Server ergibt neue Kacheln (ASSET-010 Custody, FILE-008 Hash-Audit-Journal, FILE-009 Notizen, NOTIF-003, MAINT-007 Tankbuch, ZUST-003 Standort-Scoping, FOUND-007 Import/Export, FOUND-008 Fristen-Dienst, READY-006 Statistik-Dashboard, UI2-006..010) sowie Referenz-Ergänzungen bei bestehenden Lücken. Alle Design- Entscheidungen (Datenmodell, Sicherheitsanforderungen bei ASSET-010) geklärt. Neues Epic 23 (Flutter-Begleit-App, Sondierungs-Prototyp FLUT-001) inkl. geklärtem TLS-Blocker (Domain mabea.perlbach-edv.de mit Let's-Encrypt-Zertifikat statt selbstsigniertem Server-Zertifikat). Alle Kacheln bleiben offen/ungeplant, nur ausgearbeitet, keine Implementierung. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
169 lines
7.9 KiB
Markdown
169 lines
7.9 KiB
Markdown
# Epic 12 — Personnel
|
|
|
|
Details zu PERS-001 … PERS-007 (vollständig).
|
|
|
|
---
|
|
|
|
## PERS-001 — Person (fachlich)
|
|
|
|
- **Ziel:** Fachliches Konzept einer Person, getrennt vom technischen Login.
|
|
- **Beschreibung:** Person-Entität (Name, Geburtsdatum optional, Kontaktdaten) — kann
|
|
existieren OHNE Systemzugang (z.B. Jugendgruppe, externe Kontaktperson).
|
|
- **Benutzerwert:** Nicht jede Person im System braucht einen Login (Kinder/Jugendliche,
|
|
externe Helfer ohne digitale Nutzung).
|
|
- **Abhängigkeiten:** FOUND-002
|
|
- **Datenmodell:** `person` (id, name, geburtsdatum, kontakt)
|
|
- **Backend:** CRUD
|
|
- **Frontend:** Verwaltung
|
|
- **Mobile:** Anzeige
|
|
- **QR-Code/Seriennummer/Inventarnummer:** nein (Person ist keine physische Ressource im
|
|
engeren Sinn — ein optionaler QR-Ausweis wäre ein Erweiterungspunkt, kein Kern)
|
|
- **Akte:** eigene Personen-Akte möglich (eigenes Konzept, nicht Ressourcen-Akte)
|
|
- **Rechte:** Administrator
|
|
- **Audit:** Änderung geloggt
|
|
- **Akzeptanzkriterien:** Person ohne Benutzerkonto anlegbar.
|
|
- **Tests:** CRUD-Test, Test „Person ohne Benutzer funktioniert".
|
|
- **DoD:** ✅ umgesetzt (2026-09-08) — echter Bedarf via AskUserQuestion bestätigt,
|
|
danach live deployed. `Person`-Modell (Migration 0034 mit Backfill bestehender
|
|
Benutzer), `/personen`-CRUD, Admin-UI `PersonSection.tsx`.
|
|
|
|
## PERS-002 — Benutzer (technisch, verknüpft)
|
|
|
|
- **Ziel:** Systemzugang, verknüpft mit einer Person.
|
|
- **Beschreibung:** `Benutzer` (login, passwort_hash) referenziert optional eine Person
|
|
(1:1 oder 1:0..1).
|
|
- **Benutzerwert:** Systemzugang bleibt wie gehabt, aber fachlich sauber von der
|
|
Personen-Stammdatenverwaltung getrennt.
|
|
- **Abhängigkeiten:** PERS-001, FOUND-003
|
|
- **Datenmodell:** `benutzer.person_id` (FK, optional während Übergang)
|
|
- **Backend:** Migration bestehender Benutzer zu Person-Datensätzen
|
|
- **Frontend:** Benutzeranlage erzeugt/verknüpft Person
|
|
- **Mobile:** kein Unterschied
|
|
- **QR-Code/Seriennummer/Inventarnummer:** nein
|
|
- **Akte:** nein direkt
|
|
- **Rechte:** bestehende Rechte-Logik unverändert
|
|
- **Audit:** Verknüpfung geloggt
|
|
- **Akzeptanzkriterien:** bestehende Benutzer funktionieren nach Migration unverändert.
|
|
- **Tests:** Migrationstest (keine Datenverluste), Regressionstest bestehender
|
|
Auth-Flows.
|
|
- **DoD:** ✅ umgesetzt (2026-09-08) — `Benutzer.person_id` FK (nullable), `/benutzer`
|
|
verknüpft bestehende Person oder legt automatisch neue Person an, wenn keine
|
|
`person_id` angegeben wird (Backward-Kompatibilität). Backfill bestehender Benutzer
|
|
via `ROW_NUMBER()`-1:1-Positionsmatch statt Name-Join (Namenskollisionen vermieden).
|
|
|
|
## PERS-003 — Einheiten/Organisationsstruktur
|
|
|
|
- **Ziel:** Hierarchische Gliederung von Personen in Züge/Gruppen.
|
|
- **Beschreibung:** Einheit mit optionaler übergeordneter Einheit, Person/Benutzer gehört
|
|
zu einer Einheit.
|
|
- **Benutzerwert:** Organisationsstruktur abbildbar (Zug → Gruppe → Trupp).
|
|
- **Abhängigkeiten:** PERS-001 (oder direkt Benutzer, falls PERS-001 zurückgestellt)
|
|
- **Datenmodell:** `einheit` (id, name, uebergeordnete_einheit_id, standort_id)
|
|
- **Backend:** CRUD
|
|
- **Frontend:** Verwaltung
|
|
- **Mobile:** Anzeige
|
|
- **QR-Code/Seriennummer/Inventarnummer:** nein
|
|
- **Akte:** Verantwortlichkeitsbereich (FILE-004) referenziert Einheit
|
|
- **Rechte:** Administrator
|
|
- **Audit:** Änderung geloggt
|
|
- **Akzeptanzkriterien:** mehrstufige Hierarchie anlegen (Zug→Gruppe).
|
|
- **Tests:** Baum-Test.
|
|
- **DoD:** deckt sich mit MABEA (`Einheit`-Modell bereits umgesetzt, self-referenzierend)
|
|
— allerdings bisher nur eine Ebene in der Praxis genutzt, mehrstufige Hierarchie ist
|
|
technisch möglich aber ungetestet im echten Einsatz.
|
|
|
|
## PERS-004 — Funktionen/Rollen im Einsatzkontext
|
|
|
|
- **Ziel:** Fachliche Funktion einer Person innerhalb einer Einheit (Zugführer, Melder,
|
|
Fahrer, ...) — unterscheidet sich von System-Rollen (Rechte).
|
|
- **Beschreibung:** Funktion als Stammdatum, Zuordnung Person↔Einheit↔Funktion.
|
|
- **Benutzerwert:** „Wer ist der Zugführer von Zug 3" beantwortbar, unabhängig von
|
|
Systemrechten.
|
|
- **Abhängigkeiten:** PERS-003
|
|
- **Datenmodell:** `funktion` (id, name), `einheit_mitgliedschaft` (person_id,
|
|
einheit_id, funktion_id)
|
|
- **Backend:** CRUD
|
|
- **Frontend:** Zuordnung
|
|
- **Mobile:** Anzeige
|
|
- **QR-Code/Seriennummer/Inventarnummer:** nein
|
|
- **Akte:** Verantwortlichkeitsbereich
|
|
- **Rechte:** Administrator/Zugführer
|
|
- **Audit:** Änderung geloggt
|
|
- **Akzeptanzkriterien:** Person mit Funktion in Einheit zuordnen.
|
|
- **Tests:** CRUD-Test.
|
|
- **DoD:** komplett neu in MABEA — Einheit-Zuordnung existiert (`Benutzer.einheit_id`),
|
|
aber keine fachliche Funktion/Rolle INNERHALB der Einheit (nur System-Rollen wie
|
|
„Materialverantwortlicher" existieren — das ist etwas anderes als „Zugführer von
|
|
Zug 3").
|
|
|
|
## PERS-005 — Qualifikationen/Lehrgänge
|
|
|
|
- **Ziel:** Nachgewiesene Qualifikationen einer Person.
|
|
- **Beschreibung:** Qualifikationstyp-Katalog + Zuordnung mit Erwerbsdatum/Gültigkeit.
|
|
- **Benutzerwert:** Nachweis von Ausbildungsstand.
|
|
- **Abhängigkeiten:** PERS-001
|
|
- **Datenmodell:** `qualifikationstyp`, `benutzer_qualifikation`
|
|
- **Backend:** CRUD
|
|
- **Frontend:** Verwaltung
|
|
- **Mobile:** Anzeige
|
|
- **QR-Code/Seriennummer/Inventarnummer:** nein
|
|
- **Akte:** eigener Bereich (Personen-Akte)
|
|
- **Rechte:** Administrator
|
|
- **Audit:** Änderung geloggt
|
|
- **Akzeptanzkriterien:** Qualifikation mit Gültigkeit erfassen.
|
|
- **Tests:** CRUD-Test.
|
|
- **DoD:** deckt sich 1:1 mit MABEA (`Qualifikationstyp`/`BenutzerQualifikation` bereits
|
|
umgesetzt, inkl. Ablauf-Dashboard-Kachel).
|
|
|
|
## PERS-006 — Führerscheine/Berechtigungen mit Gültigkeit
|
|
|
|
- **Ziel:** Spezialfall von PERS-005 — Fahrerlaubnis, die bestimmt, wer welches Fahrzeug
|
|
fahren darf.
|
|
- **Beschreibung:** Führerschein als Qualifikationskategorie, Verknüpfung zu
|
|
AssetType-Anforderung.
|
|
- **Benutzerwert:** „Wer darf dieses Fahrzeug fahren" automatisch beantwortbar.
|
|
- **Abhängigkeiten:** PERS-005, ASSET-002
|
|
- **Datenmodell:** `objekttyp_qualifikationsanforderung` (M:N)
|
|
- **Backend:** Berechtigungsprüfungs-Endpunkt
|
|
- **Frontend:** Anzeige „fehlende Qualifikation"
|
|
- **Mobile:** Anzeige vor Fahrtantritt
|
|
- **QR-Code/Seriennummer/Inventarnummer:** nein
|
|
- **Akte:** Fahrzeug-Akte zeigt erforderliche Qualifikation
|
|
- **Rechte:** wie Lese-Recht
|
|
- **Audit:** nein zusätzlich
|
|
- **Akzeptanzkriterien:** Prüfung liefert korrekt berechtigt/nicht berechtigt + fehlende
|
|
Typen.
|
|
- **Tests:** Berechtigungstest (mit/ohne/abgelaufene Qualifikation).
|
|
- **DoD:** deckt sich 1:1 mit MABEA — bereits umgesetzt und in dieser Session live gegen
|
|
den Produktivserver getestet (`GET /objekte/{id}/berechtigung/{benutzer_id}`).
|
|
|
|
## PERS-007 — Qualifikationsablauf-Warnungen
|
|
|
|
- **Ziel:** Frühwarnung vor ablaufenden Qualifikationen.
|
|
- **Beschreibung:** Dashboard-Kachel analog Prüftermine/Ablaufdaten.
|
|
- **Benutzerwert:** Rechtzeitig Nachschulung planen, bevor jemand mit abgelaufener
|
|
Qualifikation eingeteilt wird.
|
|
- **Abhängigkeiten:** PERS-006
|
|
- **Datenmodell:** keins neu
|
|
- **Backend:** Abfrage bevorstehender Abläufe
|
|
- **Frontend:** Dashboard-Kachel
|
|
- **Mobile:** Anzeige
|
|
- **QR-Code/Seriennummer/Inventarnummer:** nein
|
|
- **Akte:** nein (übergreifende Sicht)
|
|
- **Rechte:** Verantwortliche
|
|
- **Audit:** nein
|
|
- **Akzeptanzkriterien:** korrekte Sortierung, 60 Tage Standard-Vorlauf.
|
|
- **Tests:** Schwellenwerttest.
|
|
- **DoD:** deckt sich 1:1 mit MABEA
|
|
(`dashboard.bevorstehende_qualifikationsablaeufe()`, bereits umgesetzt).
|
|
|
|
---
|
|
|
|
**MABEA-Ist-Stand-Abgleich (aktualisiert 2026-09-09):** PERS-001…003, 005, 006, 007
|
|
sind vollständig in MABEA umgesetzt und live deployed. PERS-001/002 (Person↔Benutzer-
|
|
Trennung) waren der größte offene Architekturentscheid im gesamten Backlog — echter
|
|
Bedarf wurde am 2026-09-08 bestätigt, danach umgesetzt und deployed (Details siehe
|
|
PERS-001/002 oben). **PERS-004
|
|
(fachliche Funktion innerhalb einer Einheit, z.B. „Zugführer") fehlt komplett** — leicht
|
|
zu verwechseln mit den bestehenden System-Rollen, ist aber ein eigenständiges Konzept.
|