Files
MABEA/arbeitskacheln/00_index.md
T
patrickandClaude Sonnet 5 977d81ddcd
CI / backend-tests (push) Failing after 2m15s
CI / frontend-build (push) Successful in 28s
feat(dokumente,identity): DOC-003 Versionierung + QR-Code-Etiketten
Dokument-Versionierung: vorgaenger_id verkettet Versionen (Migration 0027),
POST /dokumente/{id}/ersetzen legt neue Version an statt zu überschreiben,
alte Fassung bleibt als Historie erhalten. GET /dokumente/{id}/versionen
liefert die Kette (neueste zuerst), respektiert DOC-005-Zugriffsrechte.
Liste zeigt nur die jeweils aktuelle Version. Löschen der aktuellen Version
gibt automatisch den Vorgänger als neue "aktuelle" frei. Frontend:
"Ersetzen"-Button + aufklappbare Versionshistorie im DokumentePanel.

QR-Code-Etiketten: bisher nur Code128-Barcode möglich. generiere_qr_label_pdf
(reportlab-eigenes QR-Widget, keine neue Abhängigkeit) als Alternative,
?format=qr|code128 an /objekte/{id}/label.pdf und /objektpositionen/{id}/
label.pdf. AktePage bekommt "Etikett (Barcode)"/"Etikett (QR)"-Buttons
(vorher gab es dafür noch gar keinen UI-Zugang im Web-Frontend).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 11:03:46 +02:00

376 lines
32 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Arbeitskacheln-Backlog — KatS-/BOS-Ressourcenplattform
Master-Prompt-Ergebnis (2026-09-05), Phase 1: Epic-Übersicht, vollständige Kachel-Liste,
Abhängigkeitsgraph, Priorisierung, MVP-Abgrenzung. Details je Kachel liegen in den
epic-eigenen Dateien (`01_foundation.md`, `02_identity.md`, ...), fortlaufend ergänzt.
Kachel-Template und Nutzer-Vorgaben zur Methodik: siehe Memory
`feedback_arbeitskacheln_methodik.md`.
## DECISION REQUIRED
1. **Verhältnis zu MABEA:** Dieses Backlog beschreibt großteils, was in MABEA (dieses Repo)
bereits gebaut ist. Entscheidung: **(a) MABEA-Code weiterverwenden**, Kacheln als
nachträgliche Strukturierung/Lückenfüller — nicht (b) Neustart. Begründung: vermeidet
Doppelarbeit.
2. **Techstack:** FastAPI/PostgreSQL/React-PWA beibehalten (bereits entschieden, funktioniert,
self-hosted-tauglich) statt Resgrid-(.NET)/OpenFleet-(Node) Stack zu übernehmen.
3. **QR-Code-Inhalt-Schema:** **entschieden — URL-Pfad** (`/akte/{ressourcentyp}/{id}`), kein
signierter Token, keine Volldaten im QR.
4. **Person/Benutzer-Trennung (PERS-001/002):** MABEA hat aktuell nur `Benutzer` (Login=Person
verschmolzen). Echte Trennung ist ein Datenmodell-Bruch — Umfang vorher separat abschätzen,
bevor verbindlich eingeplant.
5.**UNKNOWN-Readiness-Zustand (READY-002) — erledigt (2026-09-05):** war offen, wurde
noch am selben Tag live gefixt. Nie kontrollierte Objekte zählen jetzt als `unbekannt`
statt fälschlich als „einsatzbereit". Siehe `13_readiness.md`.
## Subagenten je Epic
Sieben Subagenten aus dem Subagenten-Repo sind für dieses Projekt bereits installiert
(siehe Memory `reference-subagents-repo`), plus `fastapi-expert`/`python-expert` passend
zum Techstack. Bei der tatsächlichen UMSETZUNG einer Kachel (nicht bei der Planung hier)
sollen die folgenden Subagenten bevorzugt herangezogen werden — als Standard-Zuordnung je
Epic, einzelne Kacheln können abweichen:
| Epic | Empfohlene Subagenten |
|---|---|
| 01 Foundation | fastapi-expert, postgres-expert, jwt-expert, docker-expert, openapi-expert |
| 02 Identity | postgres-expert (Eindeutigkeits-Constraints), owasp-top10-expert (Path-Traversal bei Codes/Labels) |
| 03 Digital File | fastapi-expert (Aggregations-Endpunkt), sql-expert (Joins über viele Tabellen) |
| 04 Assets | postgres-expert, sql-expert |
| 05 Fleet | fastapi-expert |
| 06 Inventory | postgres-expert, sql-expert (Mengen-/Chargenlogik) |
| 07 Warehouse | postgres-expert (Hierarchie-Queries, Transaktionen bei Umlagerung) |
| 08 Loadout | fastapi-expert, sql-expert |
| 09 Inspections | python-expert (Berechnungslogik Intervalle/Ampel) |
| 10 Maintenance | python-expert, postgres-expert |
| 11 Defects | fastapi-expert |
| 12 Personnel | jwt-expert/oauth-oidc-expert (bei PERS-002 Auth-Bezug), owasp-top10-expert |
| 13 Readiness | python-expert (Regel-Engine-Logik) |
| 14 Documents | owasp-top10-expert (Upload-Sicherheit/MIME-Whitelist, bereits Thema bei DOC-001), fastapi-expert |
| 15 Mobile | kein Backend-Subagent zentral (Frontend/PWA-lastig) |
| 16 Operations | noch offen, erst bei Angehen des Epics zuordnen |
| 17 Zuständigkeit | postgres-expert (n:m-Vererbungslogik) |
| 18 Notifications | fastapi-expert, owasp-top10-expert (E-Mail-Injection bei Trigger-Inhalten) |
| 19 Satelliten-Server | postgres-expert, sql-expert (Sync Insert/Upsert), docker-expert |
**Wie einbeziehen:** vor Implementierungsbeginn einer Kachel kurz prüfen, ob einer der
zugeordneten Subagenten als Review-Instanz (nach Fertigstellung) oder als Umsetzungs-
Delegation sinnvoll ist — nicht zwingend für jede einzelne Kachel, aber als Standardpfad
für sicherheitskritische (owasp/jwt/oauth) und datenbanknahe (postgres/sql) Themen.
## Epic-Übersicht
| Epic | Ziel | Priorität |
|---|---|---|
| 01 Foundation | Technisches Fundament (Repo/DB/Auth/API/Logging/CI) | P0 |
| 02 Identity | Objekt-ID/Inventarnummer/Seriennummer/QR/Barcode | P0 |
| 03 Digital File | Akte als Aggregations-Entität über alle Teilbereiche | P0 |
| 04 Assets | Generisches Ressourcenmodell (Kategorie/Typ/Instanz/Set) | P0 |
| 05 Fleet | Fahrzeug-Spezialfelder | P1 |
| 06 Inventory | Material (Einzelgerät/Verbrauchsmaterial/Chargen) | P1 |
| 07 Warehouse | Lagerplätze, Bestand, Bewegungen | P1 |
| 08 Loadout | Soll/Ist-Beladung, Kontrolle | P1 |
| 09 Inspections | Prüfungen generisch | P1 |
| 10 Maintenance | Wartung | P2 |
| 11 Defects | Mängel-Ticket | P1 |
| 12 Personnel | Person/Benutzer/Qualifikation | P1 |
| 13 Readiness | Zentrale Einsatzbereitschafts-Engine | P1 |
| 14 Documents | Dokumentenverwaltung | P2 |
| 15 Mobile | QR-Scan-Workflow, PWA | P1 |
| 16 Operations | Einsatzverwaltung (Ausblick) | P3 |
| 17 Zuständigkeit | Verantwortliche flexibel Standorten/Objekten zuordnen | P0 |
| 18 Notifications | Benachrichtigung + Eskalation bei Fehlbestand | P1 |
| 19 Satelliten-Server | Autarker Betrieb bei Verbindungsverlust (zurückgestellt) | P3 |
## Stand 2026-09-08: Code-Abgleich
Jede Kachel unten wurde gegen den tatsächlichen Code-Stand geprüft (Backend-Endpunkte in
`backend/app/api/v1/endpoints/*.py`, Models in `backend/app/models/*.py`, Migrations-
Historie `backend/alembic/versions/0001…0025`, Frontend-Seiten/Komponenten in
`frontend/src/pages/**` und `frontend/src/components/**`). Status-Werte: ✅ erledigt (im
Code klar nachweisbar), 🔶 teilweise (Grundgerüst da, aber Lücke), ⬜ offen (kein
Code-Nachweis). Bei vager Beschreibung ohne eindeutigen Code-Fund wurde konservativ ⬜
vergeben statt geraten.
**Gesamt: 111 Kacheln — 79 ✅ / 11 🔶 / 21 ⬜.**
| Epic | ✅ | 🔶 | ⬜ | Gesamt | Einschätzung |
|---|---|---|---|---|---|
| 01 Foundation | 7 | 1 | 4 | 12 | Kern (Repo/DB/Auth/API/Config/Tests) fertig, DevOps-Rand (Docker/CI/Backup/Doku) offen |
| 02 Identity | 6 | 1 | 3 | 10 | QR/Seriennummer/Inventarnummer fertig, Nummernschemata/Hersteller-Stammdaten/Neuvergabe offen |
| 03 Digital File | 7 | 0 | 0 | 7 | vollständig fertig |
| 04 Assets | 7 | 1 | 1 | 9 | Kernmodell fertig, AssetSet als eigenes Konzept fehlt |
| 05 Fleet | 4 | 1 | 1 | 6 | Kernfelder da, 5-stufiger Status teilweise, Einsatzhistorie offen |
| 06 Inventory | 7 | 0 | 0 | 7 | vollständig fertig |
| 07 Warehouse | 6 | 1 | 0 | 7 | praktisch komplett, nur eigener Inventur-Workflow fehlt |
| 08 Loadout | 6 | 0 | 0 | 6 | vollständig fertig |
| 09 Inspections | 2 | 3 | 1 | 6 | kein eigenständiges Prüfarten-Modul, nur Intervall/Termin am Gerät |
| 10 Maintenance | 5 | 0 | 1 | 6 | fast vollständig (eigenes Wartungsmodul existiert), nur Ersatzteile/Kosten offen |
| 11 Defects | 5 | 0 | 0 | 5 | vollständig fertig |
| 12 Personnel | 5 | 0 | 2 | 7 | Qualifikationen/Einheiten da, Person/Benutzer-Trennung + Einsatzfunktionen offen |
| 13 Readiness | 3 | 1 | 1 | 5 | Zustände/Dashboard/Regel-Kopplung da, aber feste Logik statt konfigurierbarer Regel-Engine |
| 14 Documents | 1 | 0 | 4 | 5 | nur Grundgerüst+Hash, Typen/Versionierung/Kopie-Kennzeichen/Rechte offen |
| 15 Mobile | 4 | 1 | 0 | 5 | PWA/QR/Kontroll-Flow da, vollständiges Offline-Grundgerüst nur teilweise |
| 16 Operations | 0 | 0 | 3 | 3 | bewusst Platzhalter |
| 17 Zuständigkeit | 2 | 0 | 0 | 2 | vollständig fertig |
| 18 Notifications | 2 | 0 | 0 | 2 | vollständig fertig |
| 19 Satelliten-Server | 0 | 1 | 0 | 1 | nur Datenmodell-Stub (`Systemknoten`), keine Sync-Logik |
## Vollständige Kachel-Liste
| ID | Modul | Kachel | Prio | Aufwand | Risiko | Abhängigkeiten | Status |
|---|---|---|---|---|---|---|---|
| FOUND-001 | Foundation | Repo & Projektstruktur | P0 | S | LOW | — | ✅ |
| FOUND-002 | Foundation | DB-Grundgerüst + Migrationen | P0 | S | LOW | FOUND-001 | ✅ (Alembic, 25 Migrationen) |
| FOUND-003 | Foundation | Authentication | P0 | M | MEDIUM | FOUND-002 | ✅ (`auth.py` Login/JWT, `core/security.py`) |
| FOUND-004 | Foundation | Authorization-Grundgerüst | P0 | M | MEDIUM | FOUND-003 | ✅ (`permission.py` Rollen/Berechtigungen) |
| FOUND-005 | Foundation | API-Grundgerüst/Konventionen | P0 | S | LOW | FOUND-002 | ✅ (`api/v1/api.py` Router-Sammlung) |
| FOUND-006 | Foundation | Logging & Audit-Grundgerüst | P0 | S | LOW | FOUND-002 | 🔶 (Historie-Modell/Audit-Trail vorhanden, kein strukturiertes Logging-Framework gefunden) |
| FOUND-007 | Foundation | Konfigurationsmanagement | P0 | XS | LOW | FOUND-001 | ✅ (`core/app_settings.py`, BaseSettings) |
| FOUND-008 | Foundation | Docker/Compose-Setup | P0 | M | MEDIUM | FOUND-001 | ⬜ (kein Dockerfile/docker-compose im Repo gefunden) |
| FOUND-009 | Foundation | CI/CD-Grundgerüst | P0 | S | LOW | FOUND-008 | ✅ (`.gitea/workflows/ci.yml` - Backend-Tests + Frontend-Build/Tests, vorheriger Abgleich hat nur `.github/` geprüft) |
| FOUND-010 | Foundation | Backup-Strategie | P1 | S | MEDIUM | FOUND-002 | ⬜ (kein Backup-Skript/-Dokumentation gefunden) |
| FOUND-011 | Foundation | Test-Grundgerüst | P0 | M | LOW | FOUND-002 | ✅ (`backend/pytest.ini`+`backend/tests/`, seit 2026-09-08 auch `frontend/vitest.config.ts`+`src/**/*.test.ts(x)`, beide in CI) |
| FOUND-012 | Foundation | Dokumentationsgerüst | P1 | XS | LOW | FOUND-001 | ✅ (`README.md` im Projektwurzelverzeichnis) |
| IDENT-001 | Identity | Objekt-ID-Schema | P0 | S | LOW | FOUND-002 | ✅ (Objekt-Code-Vergabe, `/objekte/naechster-code`) |
| IDENT-002 | Identity | Inventarnummer manuell | P0 | S | LOW | IDENT-001 | ✅ (Objektposition-Code, `objektposition.py`) |
| IDENT-003 | Identity | Inventarnummer-Nummernschemata | P1 | M | MEDIUM | IDENT-002 | ⬜ (kein konfigurierbares Schema gefunden, nur fester Code-Zähler) |
| IDENT-004 | Identity | Seriennummer + Eindeutigkeitsprüfung | P0 | S | LOW | IDENT-001 | ✅ (`geraet_instanz.py` Seriennummer-Feld/Unique) |
| IDENT-005 | Identity | Hersteller/Modell-Stammdaten | P1 | S | LOW | IDENT-004 | ⬜ (kein eigenes Hersteller/Modell-Stammdatenmodell gefunden) |
| IDENT-006 | Identity | QR-Code-Erzeugung | P0 | S | LOW | IDENT-001 | ✅ (`label.pdf`-Endpunkte für Objekt/Objektposition) |
| IDENT-007 | Identity | QR-Code-Druck (Label) | P0 | S | LOW | IDENT-006 | ✅ (`/objekte/{id}/label.pdf`, `/objektpositionen/{id}/label.pdf`) |
| IDENT-008 | Identity | QR-Scan → Akte öffnen | P0 | M | MEDIUM | IDENT-006, FILE-006 | ✅ (`BarcodeScanner.tsx`, Akte-Route `/akte/objekt/{id}`) |
| IDENT-009 | Identity | QR-Neuvergabe & -Historie | P2 | S | LOW | IDENT-006 | ⬜ (kein Nachweis für Neuvergabe-Workflow) |
| IDENT-010 | Identity | Barcode/GTIN | P3 | S | LOW | IDENT-001 | 🔶 (`BarcodeScanner.tsx` existiert, GTIN-Materialabgleich nicht nachweisbar) |
| FILE-001 | Digital File | Akte-Grundgerüst | P0 | M | MEDIUM | IDENT-001 | ✅ (`akte.py`, `services/akte.py`, docstring referenziert FILE-001) |
| FILE-002 | Digital File | Akte-Stammdatenbereich | P0 | S | LOW | FILE-001 | ✅ (Teil des Akte-Aggregats) |
| FILE-003 | Digital File | Akte-Standortbereich | P0 | S | LOW | FILE-001, WH-001 | ✅ (`admin/StandortSection.tsx`, Akte-Standortdaten) |
| FILE-004 | Digital File | Akte-Verantwortlichkeit | P1 | S | LOW | FILE-001, PERS-003 | ✅ (Zuständigkeit im Akte-Aggregat, `zustaendigkeit.py`) |
| FILE-005 | Digital File | Akte-Historienbereich | P0 | M | MEDIUM | FILE-001, FOUND-006 | ✅ (`historie.py`, `admin/HistorieSection.tsx`) |
| FILE-006 | Digital File | Akte-Übersichtsseite (UI) | P0 | M | LOW | FILE-002..005 | ✅ (`AktePage.tsx`) |
| FILE-007 | Digital File | Akte-Audit-Anbindung | P1 | S | LOW | FILE-005 | ✅ (Historie durchgängig in Akte eingebunden) |
| ASSET-001 | Assets | AssetCategory | P0 | XS | LOW | FOUND-002 | ✅ (`Kategorie` in `stammdaten.py`) |
| ASSET-002 | Assets | AssetType | P0 | S | LOW | ASSET-001 | ✅ (`Objekttyp` in `stammdaten.py`) |
| ASSET-003 | Assets | Asset/AssetInstance | P0 | M | MEDIUM | ASSET-002, IDENT-001/002/004 | ✅ (`objekt.py`, `objektposition.py`, `geraet_instanz.py`) |
| ASSET-004 | Assets | Asset-Status-Modell | P0 | S | LOW | ASSET-003 | ✅ (`ObjektStatus`, `GeraetStatus`, `ObjektpositionStatus` Enums) |
| ASSET-005 | Assets | Asset-Suche & Liste | P1 | S | LOW | ASSET-003 | ✅ (`ObjektListPage.tsx`, `suche.py` Endpunkt) |
| ASSET-006 | Assets | Asset-Bewegungshistorie | P1 | S | LOW | ASSET-003, WH-001 | ✅ (`lagerbewegung.py`, `historie.py`) |
| ASSET-007 | Assets | AssetSet | P2 | M | MEDIUM | ASSET-003 | ⬜ (kein eigenständiges Set-Konzept über Objekt/Objektposition hinaus gefunden) |
| ASSET-008 | Assets | Consumable | P1 | M | MEDIUM | ASSET-002 | 🔶 (Verbrauchsmaterial über `MaterialTyp`/Mengenlogik abgebildet, kein eigenes Consumable-Modell) |
| ASSET-009 | Assets | Nutzungszähler (Kilometer/Betriebsstunden generisch) | P1 | S | LOW | ASSET-003 | ✅ (`fahrzeugdetails.py` Kilometerstand, MAINT-002 nutzt es) |
| FLEET-001 | Fleet | Fahrzeugtypen | P1 | XS | LOW | ASSET-002 | ✅ (Objekttyp deckt Fahrzeugtypen ab) |
| FLEET-002 | Fleet | Fahrzeuge (Kennzeichen/Funkrufname) | P1 | S | LOW | ASSET-003, FLEET-001 | ✅ (`fahrzeugdetails.py`: Kennzeichen, Funkrufname, OPTA/Funkkennung) |
| FLEET-003 | Fleet | Kilometerstand (Anwendung von ASSET-009) | P1 | XS | LOW | FLEET-002, ASSET-009 | ✅ (Kilometerstand-Feld + Wartungsintervall-Kopplung) |
| FLEET-004 | Fleet | Fahrzeugstatus (5-stufig) | P1 | S | LOW | FLEET-002, READY-002 | 🔶 (`ObjektStatus` hat nur 3 Werte, Einsatzbereitschaft wird separat mit 4 Zuständen berechnet — keine 5-stufige Enum gefunden) |
| FLEET-005 | Fleet | Fahrzeug-Dokumente | P2 | XS | LOW | FLEET-002, DOC-001 | ✅ (`Dokument` polymorph, `entitaet_typ` deckt Fahrzeug/Objekt ab) |
| FLEET-006 | Fleet | Fahrzeug-Einsatzhistorie (Platzhalter) | P3 | S | MEDIUM | FLEET-002, OPS-002 | ⬜ (kein Einsatz-Modell vorhanden, Operations-Epic ist Platzhalter) |
| INV-001 | Inventory | Materialarten/Kategorien | P1 | XS | LOW | ASSET-001 | ✅ (`MaterialTyp`, `Kategorie` in `stammdaten.py`) |
| INV-002 | Inventory | Einzelgeräte (SN-pflichtig) | P1 | S | LOW | ASSET-003, IDENT-004 | ✅ (`geraet_instanz.py`) |
| INV-003 | Inventory | Verbrauchsmaterial (Mengen) | P1 | S | LOW | ASSET-008 | ✅ (Objektposition Soll-/Istmenge, `Material`) |
| INV-004 | Inventory | Chargenverwaltung | P1 | S | MEDIUM | INV-003 | ✅ (`chargennummer` in `objektposition.py`) |
| INV-005 | Inventory | Ablaufdaten & Warnschwellen | P1 | S | LOW | INV-004 | ✅ (`ablauf_charge`-Grund, Dashboard-Tile `AblaufdatenTile.tsx`) |
| INV-006 | Inventory | Mindestbestände & Fehlbestand | P1 | M | MEDIUM | INV-003, LOAD-001 | ✅ (`fehlbestand.py`, `mindermenge.py`, `fehlbestaende.py`-Endpunkt) |
| INV-007 | Inventory | Ausgabe/Rückgabe | P2 | M | MEDIUM | INV-003 | ✅ (`ausgabe.py` Model+Endpunkt, Migration 0021 referenziert INV-007) |
| WH-001 | Warehouse | Lager-Stammdaten (Hierarchie) | P1 | S | LOW | FOUND-002 | ✅ (`Lagerort`, Migration 0019/Modell referenziert WH-001) |
| WH-002 | Warehouse | Lagerplätze | P1 | S | LOW | WH-001 | ✅ (`Lagerplatz` referenziert WH-002) |
| WH-003 | Warehouse | Bestand je Lagerplatz | P1 | M | MEDIUM | WH-002, INV-003 | ✅ (`Bestand`-Modell referenziert WH-003) |
| WH-004 | Warehouse | Einlagerung/Auslagerung | P1 | M | MEDIUM | WH-003 | ✅ (`services/lager.py` Ein-/Auslagerungsfunktionen referenzieren WH-004) |
| WH-005 | Warehouse | Umlagerung | P1 | S | LOW | WH-004 | ✅ (`/lagerplaetze/.../umlagerung`-Endpunkt referenziert WH-005) |
| WH-006 | Warehouse | Inventur & Bestandskorrektur | P2 | M | MEDIUM | WH-003 | 🔶 (Bestandskorrektur über Ein-/Auslagerung möglich, kein eigener Inventur-Workflow/Zählliste gefunden) |
| WH-007 | Warehouse | Materialbewegungsprotokoll | P1 | S | LOW | WH-004, FOUND-006 | ✅ (`Materialbewegung`, `lagerbewegung.py`, referenziert WH-007) |
| LOAD-001 | Loadout | Soll-Beladung/Beladungsplan | P1 | M | MEDIUM | ASSET-003, INV-002/003 | ✅ (`vorlage.py` Beladungsvorlage, `BeladungsplanerBoard.tsx`) |
| LOAD-002 | Loadout | Ist-Beladung | P1 | S | LOW | LOAD-001 | ✅ (Objektposition-Istmenge, `GeraeteInstanzenListe.tsx`) |
| LOAD-003 | Loadout | Abweichungserkennung | P1 | S | MEDIUM | LOAD-002 | ✅ (Fehlbestand-Erkennung bei Ist<Soll, `fehlbestand.py`) |
| LOAD-004 | Loadout | Digitale Beladungskontrolle | P1 | M | MEDIUM | LOAD-003 | ✅ (`kontrollen.py`, `KontrollPage.tsx`) |
| LOAD-005 | Loadout | Kontrollhistorie | P1 | S | LOW | LOAD-004, FOUND-006 | ✅ (`Kontrolle`-Modell append-only, Historie-Anbindung) |
| LOAD-006 | Loadout | Readiness-Kopplung | P1 | S | MEDIUM | LOAD-003, READY-001 | ✅ (Fehlbestand fließt in `einsatzbereitschaft()`-Berechnung ein) |
| INSP-001 | Inspections | Prüfarten-Stammdaten | P1 | S | LOW | ASSET-002 | ⬜ (kein eigenständiges Prüfart-Stammdatenmodell gefunden) |
| INSP-002 | Inspections | Prüfintervalle | P1 | S | LOW | INSP-001 | 🔶 (`pruefintervall_monate` an Objektposition, aber nicht generisch je Prüfart) |
| INSP-003 | Inspections | Prüfdurchführung/-ergebnis | P1 | M | MEDIUM | INSP-002 | 🔶 (Statuswechsel an Geräteinstanz inkl. `naechste_pruefung`, kein separates Prüfergebnis-Protokoll) |
| INSP-004 | Inspections | Status-Ampel (VALID/DUE_SOON/OVERDUE/FAILED) | P1 | S | LOW | INSP-003 | 🔶 (Prüftermine im Dashboard, aber keine 4-stufige Ampel-Enum gefunden) |
| INSP-005 | Inspections | Prüfdokument-Anbindung | P2 | XS | LOW | INSP-003, DOC-001 | ✅ (Dokument polymorph, `entitaet_typ` deckt Geräteinstanz ab) |
| INSP-006 | Inspections | Prüftermin-Übersicht | P1 | S | LOW | INSP-004 | ✅ (`PrueftermineTile.tsx`, `/dashboard/prueftermine`) |
| MAINT-001 | Maintenance | Wartungspläne | P2 | S | LOW | ASSET-002 | ✅ (`Wartungsplan`, Migration 0022 referenziert MAINT-001) |
| MAINT-002 | Maintenance | Wartungsintervalle | P2 | S | MEDIUM | MAINT-001, ASSET-009 | ✅ (`services/wartung.py` referenziert MAINT-002, Zeit-/km-/Betriebsstunden-Intervalle) |
| MAINT-003 | Maintenance | Wartungsauftrag | P2 | M | MEDIUM | MAINT-002 | ✅ (`Wartungsauftrag`, `wartungsauftraege`-Endpunkte) |
| MAINT-004 | Maintenance | Wartungshistorie | P2 | S | LOW | MAINT-003, FOUND-006 | ✅ (Wartungsauftrag-Status/Erledigen-Verlauf, `WartungsplanSection.tsx`) |
| MAINT-005 | Maintenance | Ersatzteile/Kosten | P3 | M | MEDIUM | MAINT-003 | ⬜ (kein Ersatzteil-/Kosten-Feld gefunden) |
| MAINT-006 | Maintenance | Wartungsdokument-Anbindung | P2 | XS | LOW | MAINT-003, DOC-001 | ✅ (Dokument polymorph, deckt Wartungsauftrag ab) |
| DEFECT-001 | Defects | Mangelmeldung + Foto | P1 | M | LOW | ASSET-003, DOC-001 | ✅ (`mangel.py`, `MangelListePage.tsx`, Dokument-Anhang möglich) |
| DEFECT-002 | Defects | Priorität & Status-Workflow | P1 | S | LOW | DEFECT-001 | ✅ (`MangelStatus`, `MangelPrioritaet` Enums) |
| DEFECT-003 | Defects | Verantwortlicher & Reparaturzuordnung | P1 | S | LOW | DEFECT-002, PERS-002 | ✅ (Zustaendigkeit/Kontrollverantwortung koppelt an Mangel-Objekt) |
| DEFECT-004 | Defects | Abschluss & Dokumentation | P1 | S | LOW | DEFECT-003 | ✅ (`PATCH /maengel/{id}` Statuswechsel inkl. Abschluss) |
| DEFECT-005 | Defects | Readiness-Einfluss (kritisch) | P1 | S | MEDIUM | DEFECT-002, READY-001 | ✅ (`services/mangel.py`: Priorität "hoch" macht Objekt "nicht einsatzbereit") |
| PERS-001 | Personnel | Person (fachlich) | P1 | M | HIGH | FOUND-002 | ⬜ (laut DECISION-Abschnitt der Datei selbst nicht getrennt, nur `Benutzer`) |
| PERS-002 | Personnel | Benutzer (technisch, verknüpft) | P0 | M | HIGH | PERS-001, FOUND-003 | ✅ (`Benutzer`-Modell, `benutzer.py`-Endpunkt) |
| PERS-003 | Personnel | Einheiten/Organisationsstruktur | P1 | S | LOW | PERS-001 | ✅ (`Einheit`-Modell, hierarchisch, `einheiten`-Endpunkt) |
| PERS-004 | Personnel | Funktionen/Rollen im Einsatzkontext | P2 | S | LOW | PERS-003 | ⬜ (nur technische Rollen `RolleTyp` gefunden, keine Einsatzfunktionen) |
| PERS-005 | Personnel | Qualifikationen/Lehrgänge | P1 | S | LOW | PERS-001 | ✅ (`Qualifikationstyp`, `BenutzerQualifikation`) |
| PERS-006 | Personnel | Führerscheine/Berechtigungen mit Gültigkeit | P1 | M | MEDIUM | PERS-005, ASSET-002 | ✅ (`Qualifikationskategorie.fuehrerschein`, `ObjekttypQualifikationsanforderung`) |
| PERS-007 | Personnel | Qualifikationsablauf-Warnungen | P1 | S | LOW | PERS-006 | ✅ (`QualifikationTile.tsx`, `/dashboard/qualifikationsablaeufe`) |
| READY-001 | Readiness | Regel-Engine (Grundgerüst) | P1 | M | HIGH | ASSET-004 | 🔶 (Logik existiert in `services/dashboard.py`/`services/akte.py`, aber fest verdrahtet statt konfigurierbare Engine) |
| READY-002 | Readiness | Zustände READY/LIMITED/NOT_READY/UNKNOWN | P1 | S | MEDIUM | READY-001 | ✅ (bereit/eingeschränkt/unbekannt/nicht_einsatzbereit in `services/dashboard.py`, laut DECISION-Abschnitt am 2026-09-05 live gefixt) |
| READY-003 | Readiness | Regel-Kopplung (Prüfung/Wartung/Mangel/Beladung) | P1 | L | HIGH | READY-002, INSP-004, DEFECT-005, LOAD-006 | ✅ (`einsatzbereitschaft()` zieht Fehlbestand/Mangel/Gerätestatus zusammen) |
| READY-004 | Readiness | Readiness-Dashboard | P1 | S | LOW | READY-003 | ✅ (`EinsatzbereitschaftTile.tsx`, `/dashboard/einsatzbereitschaft`) |
| READY-005 | Readiness | Regel-Konfiguration-UI | P2 | M | MEDIUM | READY-003 | ⬜ (keine UI zur Regel-Konfiguration gefunden, Regeln sind Code) |
| DOC-001 | Documents | Dokument-Grundgerüst (Upload) | P1 | M | MEDIUM | FILE-001 | ✅ (`dokument.py` Model+Endpunkt, inkl. SHA-256-Duplikaterkennung, Migration 0024/0016 referenzieren DOC-001) |
| DOC-002 | Documents | Dokumenttypen | P2 | XS | LOW | DOC-001 | ✅ (`DokumentTyp`-Enum, Migration 0026, Filter beim Listen, Auswahl beim Upload) |
| DOC-003 | Documents | Versionierung | P2 | M | MEDIUM | DOC-001 | ✅ (`vorgaenger_id`-Kette, Migration 0027, `/ersetzen`+`/versionen`-Endpunkte, alte Version bleibt erhalten) |
| DOC-004 | Documents | Original-vs-Kopie-Kennzeichnung | P2 | S | LOW | DOC-001 | ⬜ (kein entsprechendes Feld gefunden) |
| DOC-005 | Documents | Zugriffsrechte je Dokument | P2 | S | MEDIUM | DOC-001, FOUND-004 | ✅ (nach Dokumenttyp: Rechnungen nur für Materialverantwortliche+, per `EINGESCHRAENKTE_DOKUMENTTYPEN`) |
| MOBILE-001 | Mobile | PWA-Grundgerüst | P1 | M | MEDIUM | FOUND-005 | ✅ (Vite-PWA-Build erzeugt `manifest.webmanifest`/`sw.js`, `vite-plugin-pwa` in package.json) |
| MOBILE-002 | Mobile | QR-Scan-Workflow (Kernablauf) | P1 | M | MEDIUM | MOBILE-001, IDENT-008 | ✅ (`BarcodeScanner.tsx` verdrahtet in `ObjektListPage.tsx`) |
| MOBILE-003 | Mobile | Offline-Grundgerüst | P2 | L | HIGH | MOBILE-001 | 🔶 (`offline/queue.ts`, `useOnlineStatus.ts`, `SyncStatus.tsx` vorhanden — Warteschlange für Kontrollen, kein vollständiges Offline-App-Grundgerüst über alle Module) |
| MOBILE-004 | Mobile | Mobile Mangelmeldung + Foto | P1 | S | LOW | MOBILE-002, DEFECT-001 | ✅ (Mangel-Erfassung inkl. Foto/Dokument-Anhang, in Kontroll-Flow verdrahtet) |
| MOBILE-005 | Mobile | Mobile Beladungskontrolle | P1 | S | MEDIUM | MOBILE-002, LOAD-004 | ✅ (`KontrollPage.tsx` mit Fach-Gruppierung, mobil-optimiert laut Memory-Feedback) |
| OPS-001 | Operations | Einsatzverwaltung (Platzhalter) | P3 | L | HIGH | FILE-001 | ⬜ (kein Einsatz-Modell im Code, bewusst Platzhalter) |
| OPS-002 | Operations | Einsatzmittel-Verknüpfung | P3 | M | MEDIUM | OPS-001, ASSET-003 | ⬜ (kein Nachweis) |
| OPS-003 | Operations | Einsatznachbereitung (Platzhalter) | P3 | L | HIGH | OPS-001 | ⬜ (kein Nachweis) |
| ZUST-001 | Zuständigkeit | Objekt/Standort ↔ Verantwortlicher | P0 | S | LOW | FOUND-002, ASSET-003 | ✅ (`Zustaendigkeit`-Modell, `zustaendigkeit.py`-Endpunkt) |
| ZUST-002 | Zuständigkeit | Objekt ↔ Benutzer/Gruppe (Kontrollzuweisung) | P1 | S | LOW | ZUST-001, PERS-003 | ✅ (`Kontrollverantwortung`-Modell, `KontrollverantwortungSection.tsx`) |
| NOTIF-001 | Notifications | Benachrichtigung bei neuem Fehlbestand | P1 | S | LOW | INV-006 | ✅ (`services/benachrichtigung.py`: `benachrichtige_neuer_fehlbestand`, E-Mail-Versand) |
| NOTIF-002 | Notifications | Eskalation lange offener Fehlbestände | P1 | M | MEDIUM | INV-006, NOTIF-001 | ✅ (`eskalation.py` Endpunkt+Konfiguration, `EskalationSection.tsx`) |
| SAT-001 | Satelliten-Server | Hauptserver mit Satelliten-Servern | P3 | L | HIGH | FOUND-002, ASSET-003, MOBILE-003 | 🔶 (`Systemknoten`-Modell mit `KnotenTyp.haupt/satellit` existiert, Docstring vermerkt aber "V1 nutzt ausschließlich den Hauptserver" — keine Sync-Logik implementiert) |
## Abhängigkeitsgraph (Epic-Ebene)
```
FOUNDATION
IDENTITY ──────────────┐
↓ │
DIGITAL FILE ←──────────┤ (Akte referenziert Identity direkt)
↓ │
ASSETS ←────────────────┘
↓ ↓ ↓
FLEET INVENTORY PERSONNEL
↓ ↓ │
│ WAREHOUSE │
│ ↓ │
│ LOADOUT │
↓ ↓ ↓
INSPECTIONS DEFECTS (Qualifikation → Readiness)
↓ ↓
MAINTENANCE │
↓ ↓
READINESS ←── (bündelt Inspections+Maintenance+Defects+Loadout)
DOCUMENTS (läuft quer durch alle Epics ab FILE-001)
MOBILE
OPERATIONS (Ausblick, P3)
```
## MVP-Abgrenzung (P0 + P1)
**P0 (zwingend, Foundation):** FOUND-001…011, IDENT-001/002/004/006/007/008,
FILE-001/002/003/005/006, ASSET-001…004, PERS-002, ZUST-001.
**P1 (MVP-Funktionsumfang):** Fleet (komplett), Inventory (komplett), Warehouse (komplett),
Loadout (komplett), Inspections (komplett), Defects (komplett), Personnel (bis auf PERS-004),
Readiness (bis auf READY-005), Mobile (bis auf MOBILE-003), DOC-001 (nur Grundgerüst,
Rest P2), ZUST-002, Notifications (komplett).
**Bewusst außerhalb MVP:** Maintenance (P2, außer Kern optional), Documents-Feinschliff
(Versionierung/Zugriffsrechte, P2), Operations komplett (P3), Satelliten-Server komplett
(P3, bewusst zurückgestellt).
Deckt sich das MVP praktisch mit dem, was in MABEA schon existiert — Lücken laut diesem
Backlog gegenüber MABEA-Ist-Stand: **PERS-001 (Person getrennt von Benutzer)**,
**AssetSet/Consumable als eigenständige Konzepte (ASSET-007/008)**, **Readiness als
konfigurierbare Regel-Engine statt fest verdrahteter Logik (READY-001/005)**, **Wartung als
eigenes Modul (MAINT-\*, MABEA hat nur Prüfung, keine Wartung)**.
## Detaillierungsstand
| Datei | Enthält Details für |
|---|---|
| `01_foundation.md` | FOUND-001 … FOUND-006 |
| `02_identity.md` | IDENT-001, 002, 004, 005 … 010 |
| `03_digital_file.md` | FILE-001 … FILE-007 (vollständig) |
| `04_assets.md` | ASSET-001 … ASSET-009 (vollständig, ASSET-009 nachträglich ergänzt) |
| `05_fleet.md` | FLEET-001 … FLEET-006 (vollständig) |
| `06_inventory.md` | INV-001 … INV-007 (vollständig) |
| `07_warehouse.md` | WH-001 … WH-007 (vollständig) |
| `08_loadout.md` | LOAD-001 … LOAD-006 (vollständig) |
| `09_inspections.md` | INSP-001 … INSP-006 (vollständig) |
| `10_maintenance.md` | MAINT-001 … MAINT-006 (vollständig) |
| `11_defects.md` | DEFECT-001 … DEFECT-005 (vollständig) |
| `12_personnel.md` | PERS-001 … PERS-007 (vollständig) |
| `13_readiness.md` | READY-001 … READY-005 (vollständig) |
| `14_documents.md` | DOC-001 … DOC-005 (vollständig) |
| `15_mobile.md` | MOBILE-001 … MOBILE-005 (vollständig) |
| `16_operations.md` | OPS-001 … OPS-003 (bewusst nur Platzhalter, siehe Datei) |
| `17_zustaendigkeit.md` | ZUST-001 … ZUST-002 (vollständig, nachträglich ergänzt) |
| `18_notifications.md` | NOTIF-001 … NOTIF-002 (vollständig, nachträglich ergänzt) |
| `19_satelliten_server.md` | SAT-001 (Platzhalter, nachträglich ergänzt, bewusst zurückgestellt) |
| `20_ui_redesign.md` | UI-001 … UI-008 (vollständig umgesetzt, 2026-09-06) |
**Alle 20 Epics durchgegangen** (16 ursprüngliche + 17 Zuständigkeit/18 Notifications/19
Satelliten-Server/20 UI-Redesign, nachträglich ergänzt). Detaillierungsphase
abgeschlossen (2026-09-05), UI-Redesign-Epic ergänzt (2026-09-06).
## Nachtrag: Externe Roadmap-Bewertung Shelf/Resgrid/Emergency Mgmt (2026-09-05)
Nutzer brachte eine extern erstellte Roadmap ein, basierend auf einem Vergleich mit den
Open-Source-Projekten Shelf, Resgrid, Emergency Management (sowie geprüft und verworfen:
Sahana Eden, InvenTree). Abgleich gegen diesen Backlog + tatsächlichen MABEA-Ist-Stand:
- **Veraltet/schon erledigt:** "Phase 0" (CI-Fix, Fahrzeug-Feldnamen-Bug, Vorlagen-Snapshot-
Prinzip) ist zu 100% bereits umgesetzt — das dort vorgeschlagene Snapshot-Prinzip ("Sollmenge
fest in objektposition kopieren, Versionierung entfernen") ist exakt das, was am
2026-09-05 in dieser Session umgesetzt wurde. "Phase 2" (FLEET-001/002/004,
PERS-001/002-Inhalte) deckt sich mit FLEET-001/002/004/005 und PERS-005/006/007, die laut
Backlog bereits live sind.
- **Widerspruch in der externen Roadmap, geklärt (2026-09-05):** Phase 4 schlug eine
Dispatch-Karte (Fahrzeug-Position/-Status auf Karte, Echtzeit) vor, während derselbe
Vorschlag unter "was nicht übernommen wird" explizit "Dispatch/Alarmierung - MABEA
braucht es nicht" ausschließt. Nutzer-Entscheidung: **keine Dispatch-Karte**, bleibt
außerhalb des Backlogs, deckt sich mit dem bestehenden Einsatz-Ausschluss (Operations-
Epic 16 bleibt Platzhalter).
- **Echte neue Punkte, noch nicht im Backlog:** visuelle Beladungsplanung (Drag&Drop von
Material auf Objekt/Fach, inspiriert von Shelf) - Nachzug zu LOAD-001; Multi-Organisationen-
Konzept (mehrere Träger wie ASB/DRK/THW mit eigenen Standorten/Objekten/Benutzern) und
Materialanforderung zwischen Organisationen - beides bisher nirgends spezifiziert, würde
am ehesten als neues Epic oder Erweiterung von FOUND-004 (Authorization) einzuordnen sein.
- **Bereits rejected, deckt sich mit bestehender Entscheidung:** GPS-Tracking, Sahana Eden,
InvenTree als Vorbild - keine Änderung nötig, Operations-Epic (16) bleibt bewusst
Platzhalter (siehe `16_operations.md`).
Noch nicht als eigene Epic-Datei ausgearbeitet - reine Protokollierung des Abgleichs, damit
die externe Roadmap nicht als eigenständiger, widersprüchlicher Plan neben diesem Backlog
weiterlebt.
**Leitlinie (Nutzer-Vorgabe 2026-09-05): MABEA positiv weiterentwickeln — gute Inhalte aus
den Vergleichsprojekten übernehmen, schlechte/unpassende bewusst klein halten.**
Übernehmen (fachlich gut, passt zu MABEAs Material-First-Fokus):
- Visuelle Beladungsplanung (Drag&Drop, Shelf) — Nachzug zu LOAD-001.
- Lagerplatz-/Bestandsdenken (Shelf) — Kern bereits umgesetzt (Warehouse-Epic).
- Qualifikationsmatrix "wer darf was bedienen" (Resgrid) — bereits umgesetzt (PERS-005/006).
- Multi-Organisationen-Konzept (Emergency Mgmt) — noch offen, siehe oben, sinnvoll für
spätere Mandantenfähigkeit, aber kein aktueller Bedarf.
Bewusst klein halten/nicht übernehmen (passt nicht zu MABEAs Scope, Material- statt
Einsatz-First):
- Dispatch/Alarmierung, GPS-Tracking, Dispatch-Karte (Resgrid) — explizit abgelehnt.
- Einsatzdokumentation/Einsatzführung (Resgrid/Emergency Mgmt) — Operations-Epic (16)
bleibt bewusst Platzhalter, kein Ausbau ohne konkreten Bedarf.
- Sahana-Eden-Komplexität (zu viel KatS-Spezifisches, das MABEA nicht braucht) und
InvenTree-Techniklastigkeit (zu wenig fachlicher Fokus) — beide nur als Ideen-Fundus,
nicht als Vorbild für Architektur/Scope.
## Nachtrag: Abgleich mit alten Arbeitskarten (2026-09-05)
Alle 14 `arbeitskarten/*.md` (Karte 0114, Vorgänger-Planungsstand) gegen dieses Backlog
geprüft und danach gelöscht — der komplette Ordner ist damit aufgelöst, `arbeitskarten/`
enthält nur noch den auf "aufgelöst" aktualisierten Index. Sieben Karten waren inhaltlich
vollständig abgedeckt (Karte 02, 03, 06, 09, 10, 11, 14 — jeweils in FOUND-003/004,
LOAD-001/002, MOBILE-001, IDENT-\*, ASSET-Grundprämisse bzw. INSP-Epic aufgegangen). Sechs
Karten enthielten Inhalte, die in keinem der 16 Epics vorkamen — daraus wurden drei neue
Epics (17 Zuständigkeit, 18 Notifications, 19 Satelliten-Server) sowie zwei Ergänzungen an
INV-006 (Sofort-Nachfüllung, Mindermengen-Gültigkeit). Quell-Karten: 01, 04, 05, 07, 08,
12, 13 — ihr Inhalt lebt jetzt in den genannten Epic-Dateien weiter.