docs(arbeitskacheln): Open-Source-/HiOrg-Vergleich ausgewertet, 14 neue Kacheln ausgearbeitet

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
This commit is contained in:
2026-09-10 00:49:32 +02:00
co-authored by Claude Sonnet 5
parent 3e39c3b7fd
commit 9c6426190e
21 changed files with 1954 additions and 50 deletions
+455
View File
@@ -11963,3 +11963,458 @@ Keine Commits in dieser Session.
- frontend/package.json | 6 +- - frontend/package.json | 6 +-
--- ---
## 2026-09-08 22:44 22:47 (2m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
- 3e39c3b fix(frontend): @vitejs/plugin-react auf v6 für Vite-8-Kompatibilität
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-08 22:47 22:47 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-08 22:49 22:49 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-08 22:49 22:50 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-08 23:28 23:28 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-08 23:30 23:30 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-08 23:33 23:33 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 08:41 08:41 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 08:41 08:41 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 08:42 08:42 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 08:43 08:44 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 08:43 08:44 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 08:43 08:44 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 08:47 08:48 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 08:48 08:48 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 08:50 08:50 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 08:54 08:54 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:19 09:19 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:20 09:20 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:23 09:24 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:24 09:24 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:25 09:25 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:26 09:26 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:26 09:27 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:27 09:27 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:27 09:28 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:30 09:31 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:32 09:33 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:34 09:35 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:35 09:35 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-10 00:12 00:13 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-10 00:15 00:15 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-10 00:16 00:16 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-10 00:19 00:22 (3m)
**Beschreibung:** Claude Code Session
**Projekt:** timemaster
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-10 00:23 00:24 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
+24 -14
View File
@@ -17,9 +17,8 @@ Kachel-Template und Nutzer-Vorgaben zur Methodik: siehe Memory
self-hosted-tauglich) statt Resgrid-(.NET)/OpenFleet-(Node) Stack zu übernehmen. self-hosted-tauglich) statt Resgrid-(.NET)/OpenFleet-(Node) Stack zu übernehmen.
3. **QR-Code-Inhalt-Schema:** **entschieden — URL-Pfad** (`/akte/{ressourcentyp}/{id}`), kein 3. **QR-Code-Inhalt-Schema:** **entschieden — URL-Pfad** (`/akte/{ressourcentyp}/{id}`), kein
signierter Token, keine Volldaten im QR. signierter Token, keine Volldaten im QR.
4. **Person/Benutzer-Trennung (PERS-001/002):** MABEA hat aktuell nur `Benutzer` (Login=Person 4. **Person/Benutzer-Trennung (PERS-001/002) — erledigt (2026-09-08):** echter Bedarf
verschmolzen). Echte Trennung ist ein Datenmodell-Bruch — Umfang vorher separat abschätzen, bestätigt, danach umgesetzt und deployed. Siehe `12_personnel.md`.
bevor verbindlich eingeplant.
5.**UNKNOWN-Readiness-Zustand (READY-002) — erledigt (2026-09-05):** war offen, wurde 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` noch am selben Tag live gefixt. Nie kontrollierte Objekte zählen jetzt als `unbekannt`
statt fälschlich als „einsatzbereit". Siehe `13_readiness.md`. statt fälschlich als „einsatzbereit". Siehe `13_readiness.md`.
@@ -82,6 +81,7 @@ für sicherheitskritische (owasp/jwt/oauth) und datenbanknahe (postgres/sql) The
| 17 Zuständigkeit | Verantwortliche flexibel Standorten/Objekten zuordnen | P0 | | 17 Zuständigkeit | Verantwortliche flexibel Standorten/Objekten zuordnen | P0 |
| 18 Notifications | Benachrichtigung + Eskalation bei Fehlbestand | P1 | | 18 Notifications | Benachrichtigung + Eskalation bei Fehlbestand | P1 |
| 19 Satelliten-Server | Autarker Betrieb bei Verbindungsverlust (zurückgestellt) | P3 | | 19 Satelliten-Server | Autarker Betrieb bei Verbindungsverlust (zurückgestellt) | P3 |
| 23 Flutter-Begleit-App | Sondierungs-Prototyp, native App vs. PWA (Kamera-Vergleich) | P3 |
## Stand 2026-09-08: Code-Abgleich ## Stand 2026-09-08: Code-Abgleich
@@ -127,6 +127,8 @@ vergeben statt geraten.
| FOUND-004 | Foundation | Authorization-Grundgerüst | P0 | M | MEDIUM | FOUND-003 | ✅ (`permission.py` Rollen/Berechtigungen) | | 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-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-006 | Foundation | Logging & Audit-Grundgerüst | P0 | S | LOW | FOUND-002 | 🔶 (Historie-Modell/Audit-Trail vorhanden, kein strukturiertes Logging-Framework gefunden) |
| FOUND-007 | Foundation | CSV/XLS-Import/Export Objektstammdaten (neu, Referenz: HiOrg-Server) | P2 | M | MEDIUM | ASSET-003 | ⬜ (kein Massen-Import/Export gefunden) |
| FOUND-008 | Foundation | Generischer Fristen-Dienst (neu, Refactoring) | P3 | M | LOW | INV-005, PERS-007, MAINT-002 | ⬜ (drei getrennte Fristen-Implementierungen, kein gemeinsamer Dienst) |
| FOUND-007 | Foundation | Konfigurationsmanagement | P0 | XS | LOW | FOUND-001 | ✅ (`core/app_settings.py`, BaseSettings) | | 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-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-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) |
@@ -150,6 +152,8 @@ vergeben statt geraten.
| FILE-005 | Digital File | Akte-Historienbereich | P0 | M | MEDIUM | FILE-001, FOUND-006 | ✅ (`historie.py`, `admin/HistorieSection.tsx`) | | 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-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) | | FILE-007 | Digital File | Akte-Audit-Anbindung | P1 | S | LOW | FILE-005 | ✅ (Historie durchgängig in Akte eingebunden) |
| FILE-008 | Digital File | Manipulationssicheres Audit-Journal (Hash-Kette, neu, Referenz: KP Front/InvenTree) | P2 | M | MEDIUM | FOUND-006, FILE-007 | ⬜ (kein Hash-Ketten-Schutz im Audit-Log gefunden) |
| FILE-009 | Digital File | Freitext-Notizen in der Akte (neu) | P2 | S | LOW | FILE-001 | ⬜ (keine Notiz-Funktion in der Akte gefunden) |
| ASSET-001 | Assets | AssetCategory | P0 | XS | LOW | FOUND-002 | ✅ (`Kategorie` in `stammdaten.py`) | | 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-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-003 | Assets | Asset/AssetInstance | P0 | M | MEDIUM | ASSET-002, IDENT-001/002/004 | ✅ (`objekt.py`, `objektposition.py`, `geraet_instanz.py`) |
@@ -159,6 +163,7 @@ vergeben statt geraten.
| ASSET-007 | Assets | AssetSet | P2 | M | MEDIUM | ASSET-003 | ⬜ (kein eigenständiges Set-Konzept über Objekt/Objektposition hinaus gefunden) | | 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-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) | | ASSET-009 | Assets | Nutzungszähler (Kilometer/Betriebsstunden generisch) | P1 | S | LOW | ASSET-003 | ✅ (`fahrzeugdetails.py` Kilometerstand, MAINT-002 nutzt es) |
| ASSET-010 | Assets | Custody/Ausgabe an GeraetInstanz (neu, Referenz: Shelf.nu) | P2 | M | MEDIUM | ASSET-003, PERS-001, DOC-001 | ⬜ (kein Ausgabe-/Rücknahme-Konzept je Person gefunden; Design vollständig geklärt 2026-09-09, bereit für Implementierung) |
| FLEET-001 | Fleet | Fahrzeugtypen | P1 | XS | LOW | ASSET-002 | ✅ (Objekttyp deckt Fahrzeugtypen ab) | | 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-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-003 | Fleet | Kilometerstand (Anwendung von ASSET-009) | P1 | XS | LOW | FLEET-002, ASSET-009 | ✅ (Kilometerstand-Feld + Wartungsintervall-Kopplung) |
@@ -177,7 +182,7 @@ vergeben statt geraten.
| WH-003 | Warehouse | Bestand je Lagerplatz | P1 | M | MEDIUM | WH-002, INV-003 | ✅ (`Bestand`-Modell referenziert WH-003) | | 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-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-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-006 | Warehouse | Inventur & Bestandskorrektur | P2 | M | MEDIUM | WH-003 | 🔶 (Bestandskorrektur über Ein-/Auslagerung möglich, kein eigener Inventur-Workflow/Zählliste gefunden; Referenz: InvenTree Rolling-Stocktake als optionale Ergänzung) |
| WH-007 | Warehouse | Materialbewegungsprotokoll | P1 | S | LOW | WH-004, FOUND-006 | ✅ (`Materialbewegung`, `lagerbewegung.py`, referenziert WH-007) | | 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-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-002 | Loadout | Ist-Beladung | P1 | S | LOW | LOAD-001 | ✅ (Objektposition-Istmenge, `GeraeteInstanzenListe.tsx`) |
@@ -197,6 +202,7 @@ vergeben statt geraten.
| MAINT-004 | Maintenance | Wartungshistorie | P2 | S | LOW | MAINT-003, FOUND-006 | ✅ (Wartungsauftrag-Status/Erledigen-Verlauf, `WartungsplanSection.tsx`) | | 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 | ✅ (`WartungsauftragTeil`, Migration 0033, `/wartungsauftraege/{id}/teile`-CRUD, UI in `WartungSection.tsx`) | | MAINT-005 | Maintenance | Ersatzteile/Kosten | P3 | M | MEDIUM | MAINT-003 | ✅ (`WartungsauftragTeil`, Migration 0033, `/wartungsauftraege/{id}/teile`-CRUD, UI in `WartungSection.tsx`) |
| MAINT-006 | Maintenance | Wartungsdokument-Anbindung | P2 | XS | LOW | MAINT-003, DOC-001 | ✅ (Dokument polymorph, deckt Wartungsauftrag ab) | | MAINT-006 | Maintenance | Wartungsdokument-Anbindung | P2 | XS | LOW | MAINT-003, DOC-001 | ✅ (Dokument polymorph, deckt Wartungsauftrag ab) |
| MAINT-007 | Maintenance | Tankbuch/Kraftstoffverbrauch (neu, Referenz: FleetMS) | P3 | S | LOW | FLEET-002, ASSET-009 | ⬜ (kein Kraftstoff-Tracking gefunden) |
| DEFECT-001 | Defects | Mangelmeldung + Foto | P1 | M | LOW | ASSET-003, DOC-001 | ✅ (`mangel.py`, `MangelListePage.tsx`, Dokument-Anhang möglich) | | 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-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-003 | Defects | Verantwortlicher & Reparaturzuordnung | P1 | S | LOW | DEFECT-002, PERS-002 | ✅ (Zustaendigkeit/Kontrollverantwortung koppelt an Mangel-Objekt) |
@@ -214,6 +220,7 @@ vergeben statt geraten.
| 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-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-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) | | READY-005 | Readiness | Regel-Konfiguration-UI | P2 | M | MEDIUM | READY-003 | ⬜ (keine UI zur Regel-Konfiguration gefunden, Regeln sind Code) |
| READY-006 | Readiness | Statistik-/Reporting-Dashboard-Kachel (neu, Referenz: HiOrg-Server) | P2 | M | MEDIUM | READY-004 | ⬜ (nur aktueller Zustand, keine Verlaufs-/Trend-Ansicht) |
| 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-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-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-003 | Documents | Versionierung | P2 | M | MEDIUM | DOC-001 | ✅ (`vorgaenger_id`-Kette, Migration 0027, `/ersetzen`+`/versionen`-Endpunkte, alte Version bleibt erhalten) |
@@ -229,8 +236,10 @@ vergeben statt geraten.
| OPS-003 | Operations | Einsatznachbereitung (Platzhalter) | P3 | L | HIGH | OPS-001 | ⬜ (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-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`) | | ZUST-002 | Zuständigkeit | Objekt ↔ Benutzer/Gruppe (Kontrollzuweisung) | P1 | S | LOW | ZUST-001, PERS-003 | ✅ (`Kontrollverantwortung`-Modell, `KontrollverantwortungSection.tsx`) |
| ZUST-003 | Zuständigkeit | Standort-Scoping für granulare Berechtigungen (neu, Referenz: keines der Vergleichsprojekte löst das) | P2 | M | MEDIUM | ZUST-001, `permission.py` | ⬜ (Berechtigungen aktuell nur global, kein Standort-Scoping gefunden) |
| NOTIF-001 | Notifications | Benachrichtigung bei neuem Fehlbestand | P1 | S | LOW | INV-006 | ✅ (`services/benachrichtigung.py`: `benachrichtige_neuer_fehlbestand`, E-Mail-Versand) | | 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`) | | NOTIF-002 | Notifications | Eskalation lange offener Fehlbestände | P1 | M | MEDIUM | INV-006, NOTIF-001 | ✅ (`eskalation.py` Endpunkt+Konfiguration, `EskalationSection.tsx`) |
| NOTIF-003 | Notifications | Proaktive Wartungsfälligkeits-Benachrichtigung (neu, Referenz: Shelf.nu) | P2 | S | LOW | MAINT-002, NOTIF-001 | ⬜ (Fälligkeit wird berechnet, aber nicht proaktiv zugestellt) |
| 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) | | 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) ## Abhängigkeitsgraph (Epic-Ebene)
@@ -287,28 +296,29 @@ eigenes Modul (MAINT-\*, MABEA hat nur Prüfung, keine Wartung)**.
| Datei | Enthält Details für | | Datei | Enthält Details für |
|---|---| |---|---|
| `01_foundation.md` | FOUND-001 … FOUND-006 | | `01_foundation.md` | FOUND-001 … FOUND-008 (001-006 vollständig/teilweise, FOUND-007/008 offen/ungeplant, Referenz HiOrg-Server, 2026-09-09) |
| `02_identity.md` | IDENT-001, 002, 004, 005 … 010 | | `02_identity.md` | IDENT-001, 002, 004, 005 … 010 |
| `03_digital_file.md` | FILE-001 … FILE-007 (vollständig) | | `03_digital_file.md` | FILE-001 … FILE-009 (001-007 vollständig, FILE-008/009 offen/ungeplant, 2026-09-09/10) |
| `04_assets.md` | ASSET-001 … ASSET-009 (vollständig, ASSET-009 nachträglich ergänzt) | | `04_assets.md` | ASSET-001 … ASSET-010 (ASSET-009 nachträglich ergänzt, ASSET-010 offen/ungeplant, Referenz Shelf.nu, 2026-09-09) |
| `05_fleet.md` | FLEET-001 … FLEET-006 (vollständig) | | `05_fleet.md` | FLEET-001 … FLEET-006 (vollständig, FLEET-006 Referenz Resgrid AVL ergänzt 2026-09-09) |
| `06_inventory.md` | INV-001 … INV-007 (vollständig) | | `06_inventory.md` | INV-001 … INV-007 (vollständig) |
| `07_warehouse.md` | WH-001 … WH-007 (vollständig) | | `07_warehouse.md` | WH-001 … WH-007 (vollständig) |
| `08_loadout.md` | LOAD-001 … LOAD-006 (vollständig) | | `08_loadout.md` | LOAD-001 … LOAD-006 (vollständig) |
| `09_inspections.md` | INSP-001 … INSP-006 (vollständig) | | `09_inspections.md` | INSP-001 … INSP-006 (vollständig) |
| `10_maintenance.md` | MAINT-001 … MAINT-006 (vollständig) | | `10_maintenance.md` | MAINT-001 … MAINT-007 (001-004+006 vollständig, 005 P3 zurückgestellt, MAINT-007 neu/offen, Referenz FleetMS, 2026-09-09) |
| `11_defects.md` | DEFECT-001 … DEFECT-005 (vollständig) | | `11_defects.md` | DEFECT-001 … DEFECT-005 (vollständig) |
| `12_personnel.md` | PERS-001 … PERS-007 (vollständig) | | `12_personnel.md` | PERS-001 … PERS-007 (vollständig) |
| `13_readiness.md` | READY-001 … READY-005 (vollständig) | | `13_readiness.md` | READY-001 … READY-006 (001-005 vollständig, READY-006 offen/ungeplant, Referenz HiOrg-Server, 2026-09-09) |
| `14_documents.md` | DOC-001 … DOC-005 (vollständig) | | `14_documents.md` | DOC-001 … DOC-005 (vollständig) |
| `15_mobile.md` | MOBILE-001 … MOBILE-005 (vollständig) | | `15_mobile.md` | MOBILE-001 … MOBILE-005 (vollständig) |
| `16_operations.md` | OPS-001 … OPS-003 (bewusst nur Platzhalter, siehe Datei) | | `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) | | `17_zustaendigkeit.md` | ZUST-001 … ZUST-003 (001/002 vollständig, ZUST-003 offen/ungeplant, Referenz Open-Source-Vergleich, 2026-09-09) |
| `18_notifications.md` | NOTIF-001 … NOTIF-002 (vollständig, nachträglich ergänzt) | | `18_notifications.md` | NOTIF-001 … NOTIF-003 (001/002 vollständig, NOTIF-003 offen/ungeplant, Referenz Shelf.nu, 2026-09-09) |
| `19_satelliten_server.md` | SAT-001 (Platzhalter, nachträglich ergänzt, bewusst zurückgestellt) | | `19_satelliten_server.md` | SAT-001 (Platzhalter, nachträglich ergänzt, bewusst zurückgestellt, Referenz Emergency Management Tool bestätigt Konzept 2026-09-09) |
| `20_ui_redesign.md` | UI-001 … UI-008 (vollständig umgesetzt, 2026-09-06) | | `20_ui_redesign.md` | UI-001 … UI-008 (vollständig umgesetzt, 2026-09-06) |
| `21_akte_redesign.md` | AKTE-001 … AKTE-003 (vollständig umgesetzt, 2026-09-06) | | `21_akte_redesign.md` | AKTE-001 … AKTE-003 (vollständig umgesetzt, 2026-09-06) |
| `22_ui_redesign_v2.md` | UI2-001 … UI2-005 (offen, ergänzt 2026-09-08, Grundlage: Subagenten-Analyse ai-coding-starter-kit-v2) | | `22_ui_redesign_v2.md` | UI2-001 … UI2-010 (alle offen, 001-005 ergänzt 2026-09-08, 006-010 ergänzt 2026-09-09 aus vertiefter Analyse, Grundlage: ai-coding-starter-kit-v2) |
| `23_flutter_begleitapp.md` | FLUT-001 (Sondierungs-Prototyp, offen, P3, 2026-09-10 — TLS-Blocker beachten) |
**Alle 22 Epics durchgegangen** (16 ursprüngliche + 17 Zuständigkeit/18 Notifications/19 **Alle 22 Epics durchgegangen** (16 ursprüngliche + 17 Zuständigkeit/18 Notifications/19
Satelliten-Server/20 UI-Redesign/21 Akte-Redesign/22 UI-Redesign Runde 2, nachträglich Satelliten-Server/20 UI-Redesign/21 Akte-Redesign/22 UI-Redesign Runde 2, nachträglich
+98 -1
View File
@@ -1,6 +1,7 @@
# Epic 01 — Foundation # Epic 01 — Foundation
Details zu FOUND-001 … FOUND-006. Übersichtstabelle mit allen FOUND-Kacheln (auch die noch Details zu FOUND-001 … FOUND-008. FOUND-007/008 ergänzt am 2026-09-09 aus
HiOrg-Server-Vergleich, offen/ungeplant. Übersichtstabelle mit allen FOUND-Kacheln (auch die noch
nicht detaillierten) siehe `00_index.md`. nicht detaillierten) siehe `00_index.md`.
--- ---
@@ -128,6 +129,102 @@ nicht detaillierten) siehe `00_index.md`.
- **Tests:** Log-Eintrag wird bei simulierter Aktion erzeugt und ist abrufbar. - **Tests:** Log-Eintrag wird bei simulierter Aktion erzeugt und ist abrufbar.
- **DoD:** mind. ein reales Ereignis (z.B. Login) wird bereits geloggt. - **DoD:** mind. ein reales Ereignis (z.B. Login) wird bereits geloggt.
## FOUND-007 — CSV/XLS-Import/Export für Objekt- und Materialstammdaten (P2, neu,
Scope geklärt 2026-09-09)
- **Ziel:** Massenpflege von Objekt- UND Materialstammdaten statt Einzelanlage per
UI.
- **Scope (entschieden 2026-09-09):** beide Ebenen — `Objekt` (Behälter-Stammdaten:
Rucksack/Fahrzeug/Standort) UND `GeraetInstanz` (Einzelgeräte mit Seriennummer
darin). Passt zum Ursprungsfall Excel-Rucksackliste, wo beide Ebenen typischerweise
in einer Tabelle stehen.
- **Beschreibung:** Export bestehender Objekte+Geräteinstanzen als CSV, Import mit
Validierung (Duplikat-Erkennung über Inventarnummer/Seriennummer, Fehlerliste bei
ungültigen Zeilen statt Alles-oder-Nichts-Abbruch). Ein Import-Vorgang kann beide
Ebenen in einer Datei abdecken (verschachtelte Struktur: Objekt-Zeile + zugehörige
Geräte-Zeilen) oder zwei getrennte Dateien — Implementierungsdetail, nicht mehr
Scope-Frage.
- **Benutzerwert:** Direkter Nutzen für den Ursprungsfall von MABEA — Migration
bestehender Excel-Rucksacklisten in Massenpflege statt Zeile für Zeile manuell
nacherfassen, inklusive der darin enthaltenen Einzelgeräte.
- **Abhängigkeiten:** ASSET-003, `GeraetInstanz`-Modell
- **Datenmodell:** keins neu (nutzt bestehende Objekt-/GeraetInstanz-Tabellen)
- **Backend:** `POST /objekte/import` + `POST /geraete/import` (oder kombinierter
Endpunkt, je nach gewählter Dateistruktur), jeweils Dry-Run-Modus + Commit-Modus;
`GET /objekte/export` + `GET /geraete/export`
- **Frontend:** Upload-Dialog mit Fehlerliste-Anzeige vor endgültigem Import,
Export-Button in Objektliste UND Geräte-/Materialansicht
- **Mobile:** nein (Desktop-Verwaltungsaufgabe)
- **QR-Code/Seriennummer/Inventarnummer:** Duplikat-Prüfung läuft darüber
- **Akte:** nein direkt
- **Rechte:** Administrator/Materialverantwortlicher
- **Audit:** Import als Sammel-Ereignis geloggt (nicht jede Zeile einzeln)
- **Akzeptanzkriterien:** Import mit teilweise fehlerhaften Zeilen zeigt genau welche
Zeilen fehlschlugen, gültige Zeilen werden trotzdem übernommen (kein Alles-oder-
Nichts); Export re-importierbar (Round-Trip-Test), sowohl für Objekte als auch
für Geräteinstanzen; Geräte-Zeilen ohne zugehöriges Objekt werden abgelehnt
(referenzielle Konsistenz).
- **Tests:** Round-Trip-Test (Export→Import ergibt identischen Bestand) für beide
Ebenen, Fehlerzeilen-Test (gemischt gültig/ungültig), Test für
Objekt+zugehörige-Geräte in einem Import-Vorgang.
- **DoD:** offen. **Referenz (HiOrg-Server-Vergleich 2026-09-09):** HiOrg bietet
Import/Export für praktisch alle Datentypen (CSV/XLS/vCard/iCal) — MABEA hat dafür
aktuell keinen erkennbaren Mechanismus außer direkter API-Nutzung.
## FOUND-008 — Generischer Fristen-Dienst (P3, neu, Schnittstelle geklärt 2026-09-09)
- **Ziel:** EINE Berechnungslogik für „läuft etwas bald ab/wird etwas bald fällig"
statt mehrfach separat implementiert.
- **Beschreibung:** MABEA hat Ablauf-/Fälligkeitslogik aktuell an drei Stellen
unabhängig voneinander gebaut: Chargen-Ablaufdatum (INV-005), Qualifikations-
Ablaufwarnung (PERS-007), Wartungsfälligkeit (MAINT-002/NOTIF-003). Ein
gemeinsamer `Fristen`-Dienst (Interface: „gib mir alle Objekte mit Frist-Typ X,
die den Dringlichkeitsgrad Y erreicht haben" — siehe Schnittstelle unten) würde
die Berechnungslogik einmal statt dreimal pflegen.
- **Benutzerwert:** Kein direkter Nutzerwert (reines Refactoring), aber weniger
Wartungsaufwand/Inkonsistenz-Risiko bei künftigen Fristen-Arten (z.B. Vertrags-
laufzeiten, TÜV-Termine).
- **Abhängigkeiten:** INV-005, PERS-007, MAINT-002 (bestehende Implementierungen als
Migrationsbasis)
- **Datenmodell:** keins neu, gemeinsame `FristTyp`-Enum als Kategorisierung
(`charge_ablauf`/`qualifikation_ablauf`/`wartung_faellig`/...)
- **Schnittstelle (entschieden 2026-09-09, korrigiert 2026-09-10):** „Tage bis
fällig" als gemeinsamer Nenner funktioniert NICHT für km/Betriebsstunden-Fristen
— MABEA verfolgt keine Verbrauchsrate über Zeit (nur den aktuellen Zählerstand),
eine Tage-Schätzung wäre erfunden/unbegründet. Stattdessen: gemeinsame
`FristTreffer`-Struktur mit **Dringlichkeits-Ampel** statt einheitlicher
Zeiteinheit — `{objekt_id, frist_typ, bezeichnung, dringlichkeit: enum
(ok/bald/kritisch/ueberfaellig), rest_anzeige: str}`. `rest_anzeige` bleibt
je Typ in seiner nativen Einheit (z.B. „in 12 Tagen" bei Datum-Fristen, „noch
340 km" bei Kilometer-Fristen, „noch 15 Bh" bei Betriebsstunden) — nur die
Ampel-Einstufung (ok/bald/kritisch/überfällig) ist typübergreifend einheitlich
vergleichbar, die Restanzeige selbst bleibt nativ und ehrlich statt einer
erfundenen Tage-Umrechnung. Jede der drei Implementierungen bringt ihre eigene
Schwellenwert-Logik mit (z.B. „< 10% der Sollstrecke übrig" = kritisch bei km),
`fristen.py` normalisiert nur auf die gemeinsame Ampel, nicht auf eine
gemeinsame Zeiteinheit.
- **Backend:** `app/services/fristen.py` als gemeinsame Schnittstelle, bestehende
drei Implementierungen (`app/services/dashboard.py`, `app/services/akte.py`,
`app/services/personal.py`, `app/services/wartung.py:faellige_wartungen_fuer_objekt`)
schrittweise darauf umstellen (nicht big-bang) — jede liefert intern weiter ihre
Rohdaten, `fristen.py` übernimmt nur die Normalisierung auf `FristTreffer`.
- **Frontend:** keine Änderung sichtbar (reines Backend-Refactoring)
- **Mobile:** keins
- **QR-Code/Seriennummer/Inventarnummer:** nein
- **Akte:** nein direkt
- **Rechte:** keine Änderung
- **Audit:** keine Änderung
- **Akzeptanzkriterien:** alle drei bestehenden Fristen-Arten liefern nach Umstellung
identische Ergebnisse wie vorher (Regressionstest), neue Fristen-Art ohne
Duplikation der Kernlogik hinzufügbar.
- **Tests:** Regressionstests der drei bestehenden Fristen-Berechnungen gegen die
neue gemeinsame Implementierung.
- **DoD:** offen, **P3 — reines Refactoring, kein MVP-Bestandteil**. Schnittstelle
geklärt (2026-09-09), bereit für Implementierung. **Referenz
(HiOrg-Server-Vergleich 2026-09-09):** HiOrg berücksichtigt Qualifikations-Ablauf
generisch bei der Diensteinteilung — technische Entsprechung wäre bei MABEA ein
gemeinsamer Fristen-Mechanismus statt drei getrennter Implementierungen.
--- ---
**MABEA-Ist-Stand-Abgleich:** FOUND-001…006 sind in MABEA vollständig vorhanden **MABEA-Ist-Stand-Abgleich:** FOUND-001…006 sind in MABEA vollständig vorhanden
+69 -1
View File
@@ -1,6 +1,8 @@
# Epic 03 — Digital File (Akte) # Epic 03 — Digital File (Akte)
Details zu FILE-001 … FILE-007 (vollständig). Details zu FILE-001 … FILE-009. FILE-001-007 vollständig, FILE-008 ergänzt am 2026-09-09
aus Open-Source-Vergleich (KP Front/InvenTree), FILE-009 (Notizen) ergänzt am
2026-09-10 — beide offen/ungeplant.
--- ---
@@ -155,6 +157,72 @@ Details zu FILE-001 … FILE-007 (vollständig).
Personal/Objekt-Änderungen ohne Audit-Eintrag) schon einmal real gefunden und gefixt Personal/Objekt-Änderungen ohne Audit-Eintrag) schon einmal real gefunden und gefixt
wurde. Diese Kachel ist der methodische Nachfolgeschritt: systematisch statt punktuell. wurde. Diese Kachel ist der methodische Nachfolgeschritt: systematisch statt punktuell.
## FILE-008 — Manipulationssicheres Audit-Journal (Hash-Kette, P2, neu)
- **Ziel:** Nachweisen können, dass ein Audit-Log-Eintrag nachträglich nicht verändert
wurde — über reines Vorhandensein (FILE-007) hinaus.
- **Beschreibung:** Jeder Audit-Log-Eintrag bekommt zusätzlich einen Hash über
(Eintragsinhalt + Hash des Vorgängereintrags) — bricht die Kette erkennbar, sobald
irgendein historischer Eintrag verändert wird. Betrifft insbesondere Kontroll-
Ergebnisse, Wartungsprotokolle und Soll/Ist-Korrekturbuchungen (WH-006), wo
BOS-Dokumentationspflichten Nachweisbarkeit verlangen.
- **Benutzerwert:** Rechtssicherer Nachweis bei Prüfungen/Vorfällen, dass Protokolle
echt und unverändert sind — nicht nur „es gibt einen Log-Eintrag", sondern „der
Log-Eintrag ist beweisbar unverändert".
- **Abhängigkeiten:** FOUND-006 (Audit-Log), FILE-007
- **Datenmodell:** `historie.hash` (SHA-256 über Inhalt+Vorgänger-Hash) — **nicht**
`audit_log`, MABEAs reale Tabelle heißt `historie` (`FOUND-006`). **Entschieden
(2026-09-09): Kette läuft pro Ressource (Objekt-ID)**, nicht global — jedes
Objekt hat seine eigene Kette, erster Eintrag je Objekt mit fixem
Genesis-Wert. Verifikations-Endpoint prüft/meldet damit je Objekt einzeln statt
eine einzige globale Bruchstelle für die ganze `historie`-Tabelle.
- **Backend:** Hash-Berechnung beim Schreiben, Verifikations-Endpoint (Kette prüfen,
Bruchstelle melden falls vorhanden)
- **Frontend:** „Integrität geprüft ✓"-Anzeige im Akte-Historienbereich (FILE-005),
Warnung bei Kettenbruch
- **Mobile:** nein
- **QR-Code/Seriennummer/Inventarnummer:** nein
- **Akte:** Vertrauensanzeige im Historienbereich
- **Rechte:** Verifikation: Administrator; Anzeige „geprüft"-Status: wie Lese-Recht
- **Audit:** ist Gegenstand dieser Kachel selbst
- **Akzeptanzkriterien:** nachträgliche Änderung eines historischen Eintrags (z.B. direkt
in der DB) wird vom Verifikations-Lauf erkannt und gemeldet.
- **Tests:** Kettenbruch-Erkennungstest (Eintrag nachträglich manipuliert → Verifikation
schlägt fehl), Normalfall-Test (unveränderte Kette → Verifikation erfolgreich).
- **DoD:** offen. **Referenz (Open-Source-Vergleich 2026-09-09):** KP Front
(`feuerwehr-oberwil/kp-front`, AGPL-3.0-or-later — nur Muster) nutzt genau dieses
Hash-Ketten-Prinzip für sein Einsatzjournal. Kombiniert mit InvenTree-Vorbild
(lückenloser Stock-History-Trail bei jeder Bestandsänderung) — WH-006-Korrekturbuchungen
sollten ebenfalls durch diese Kette laufen, sobald WH-006 umgesetzt wird.
## FILE-009 — Freitext-Notizen in der Akte (P2, neu, 2026-09-10)
- **Ziel:** Formlose, freie Notizen zu einer Ressource festhalten — Dinge, die in
keinen strukturierten Teilbereich (Prüfung/Mangel/Wartung) passen.
- **Beschreibung:** Einfaches Freitextfeld je Ressource, mehrere Notizen möglich
(chronologische Liste, nicht nur ein einzelnes Textfeld), mit Autor+Zeitstempel.
Kein Rich-Text/Formatierung nötig, reiner Text reicht.
- **Benutzerwert:** Raum für Kontext, der sonst mündlich verlorengeht (z.B.
„Funkgerät klemmt manchmal beim Einschalten, noch kein reproduzierbarer Fehler
für ein Mangel-Ticket" oder „Rücksprache mit Hersteller am 12.03. — Ersatzteil
in 2 Wochen").
- **Abhängigkeiten:** FILE-001
- **Datenmodell:** `akte_notiz` (id, entitaet_typ, entitaet_id, text, autor_id,
erstellt_am) — polymorph wie `dokument` (DOC-001), gleiches Kopplungsmuster
- **Backend:** POST/GET/DELETE (Löschen nur eigene Notiz oder Administrator)
- **Frontend:** Notiz-Panel in der Akte (FILE-006-Übersichtsseite), Eingabefeld +
chronologische Liste
- **Mobile:** Anzeige + Erfassung (einfaches Textfeld, kein Zusatzaufwand)
- **QR-Code/Seriennummer/Inventarnummer:** nein
- **Akte:** ist dieser Bereich selbst
- **Rechte:** Anlegen: Mitarbeiter+; Löschen: eigene Notiz oder Administrator
- **Audit:** Anlegen/Löschen geloggt
- **Akzeptanzkriterien:** mehrere Notizen chronologisch je Ressource sichtbar,
Löschen nur durch Autor oder Administrator möglich.
- **Tests:** CRUD-Test, Berechtigungstest (fremde Notiz nicht löschbar außer als
Administrator).
- **DoD:** offen.
--- ---
**MABEA-Ist-Stand-Abgleich (aktualisiert 2026-09-05):** FILE-001…006 sind umgesetzt und **MABEA-Ist-Stand-Abgleich (aktualisiert 2026-09-05):** FILE-001…006 sind umgesetzt und
+144 -1
View File
@@ -1,6 +1,7 @@
# Epic 04 — Assets # Epic 04 — Assets
Details zu ASSET-001 … ASSET-008 (vollständig). Details zu ASSET-001 … ASSET-010. ASSET-010 ergänzt am 2026-09-09 aus Open-Source-Vergleich
(Shelf.nu Custody-Feature), noch offen/ungeplant.
--- ---
@@ -146,6 +147,148 @@ Details zu ASSET-001 … ASSET-008 (vollständig).
- **DoD:** mind. ein Set mit 2+ Mitgliedern funktionsfähig. **Lücke gegenüber MABEA:** - **DoD:** mind. ein Set mit 2+ Mitgliedern funktionsfähig. **Lücke gegenüber MABEA:**
Beladungsvorlage ist konzeptionell ähnlich, aber fest ans Objekt gebunden — kein Beladungsvorlage ist konzeptionell ähnlich, aber fest ans Objekt gebunden — kein
eigenständiges, wiederverwendbares Set-Konzept. eigenständiges, wiederverwendbares Set-Konzept.
- **Referenz (Open-Source-Vergleich 2026-09-09):** Shelf.nu (`shelf-nu/shelf.nu`) nennt
dasselbe Konzept „Kits" — Assets zu einer wiederverwendbaren Einheit bündeln
(Laptop+Charger+Dock). Bestätigt den Bedarf, löst aber keine MABEA-spezifische Frage
zusätzlich (Set-Aufbau bleibt wie hier beschrieben).
## ASSET-010 — Custody/Ausgabe an Person (P2, neu, vollständig ausgearbeitet 2026-09-09)
- **Ziel:** Nachvollziehen, welche Person ein bestimmtes Einzelgerät aktuell
persönlich in Verwahrung hat — unabhängig vom Standort-/Objekt-bezogenen
ZUST-001 und von der reinen Kontroll-**Zuständigkeit** in ZUST-002.
- **Abgrenzung zu ZUST-002 (geklärt 2026-09-09):** ZUST-002 sagt „Max soll den
Notfallkoffer #12 kontrollieren" — das Objekt bleibt am Standort, jeder darf es
trotzdem kontrollieren, reine Empfehlung ohne Zugriffssperre. ASSET-010 sagt „Max
hat Funkgerät #7 heute persönlich dabei" — das Gerät wandert physisch mit der
Person, bis sie es zurückgibt; danach kann es an jemand anderen ausgegeben
werden. Unterschiedliche Konzepte (Kontroll-Zuständigkeit vs. physischer Besitz),
echter Bedarf bestätigt — kein Duplikat.
- **Ziel-Entität (geklärt 2026-09-09): `GeraetInstanz`, nicht generisches `Objekt`.**
`GeraetInstanz` hängt an einer `Objektposition` und trägt die eigene
Seriennummer (`backend/app/models/geraet_instanz.py`) — genau das einzelne,
seriennummerpflichtige Gerät (Funkgerät, Atemschutzgerät), das eine Person
persönlich mitführt. Ein ganzes `Objekt` (z.B. ein Fahrzeug oder ein
Materiallager) wird nicht „mitgeführt" — dafür ist Custody nicht gedacht.
- **Beschreibung:** Ausgabe-/Rücknahme-Vorgang je `GeraetInstanz` an eine `Person`
(PERS-001), mit Zeitstempel, Bestätigungsmechanismus (siehe unten) und Verlauf.
- **Benutzerwert:** Bei Verlust/Defekt sofort klar, wer das Gerät zuletzt hatte,
ohne Rückfrage-Runde.
- **Bestätigungsmechanismus bei Ausgabe (überarbeitet 2026-09-09, final 2026-09-09
— Unterschrift OPTIONAL pro Ausgabe, cross-device per QR-Scan):**
- Unterschrift/Protokoll ist **keine Pflicht für jede Ausgabe**, sondern eine
Entscheidung der ausgebenden Stelle im Moment der Ausgabe — Toggle „Mit
Protokoll+Unterschrift" im Ausgabe-Dialog. Ohne Toggle: einfache,
formlose Ausgabe wie ursprünglich geplant (nur Custody-Zeile, kein PDF, kein
QR-Signier-Flow) — schnelle Übergabe für den Alltag. Mit Toggle: voller
Signier-Flow inkl. PDF-Protokoll, gedacht für kritisches/hochwertiges
Material oder wenn die ausgebende Stelle es für nötig hält.
- **Ablauf (nur wenn „Mit Protokoll" gewählt):** Portal (Tablet/Desktop der
ausgebenden Stelle) zeigt nach Auswahl
von Gerät+Empfänger einen QR-Code an, der auf eine einmalig gültige,
kurzlebige Signier-Seite verweist (Token-basiert, kein Login nötig — die
Legitimation ist der physische Besitz des Tablets der ausgebenden Stelle +
der QR-Code selbst). Empfänger scannt den QR-Code mit dem **eigenen** Handy,
öffnet die Signier-Seite, unterschreibt dort per Touch-Canvas auf dem eigenen
Gerät (hygienischer/praktischer als eine geteilte Tablet-Oberfläche), sendet
ab. Das Portal erkennt den Abschluss (Polling auf den Ausgabe-Status) und
zeigt „unterschrieben ✓" an, danach gilt die Ausgabe als abgeschlossen.
- Signier-Token: einmalig verwendbar, kurze Lebensdauer (z.B. 5 Minuten), an
genau einen Ausgabevorgang gebunden — verhindert Wiederverwendung/Weitergabe
des Links.
- Aus Signatur + Geräte-/Personendaten + Zeitstempel wird automatisch ein
**Ausgabeprotokoll** (PDF) generiert und über den DOC-001-Mechanismus am
Custody-Eintrag UND in der Akte des Geräts abgelegt.
- Bei Rücknahme: dieselbe Wahl gilt spiegelbildlich — wurde die Ausgabe mit
Protokoll gemacht, läuft die Rücknahme ebenfalls über QR-Code→eigenes
Handy→Unterschrift→Rückgabeprotokoll. Wurde die Ausgabe formlos gemacht,
ist auch die Rücknahme formlos (kein nachträglicher Zwang zum Protokoll).
- **Sicherheitsanforderungen (Security-Review 2026-09-09, owasp-top10-expert —
verbindlich für die Implementierung, kein Nice-to-have):**
1. **Token:** `secrets.token_urlsafe(32)` (256 Bit), serverseitig nur als
SHA-256-Hash gespeichert (wie ein Passwort-Reset-Token) — Klartext existiert
nur im QR-Code/URL, nie in Logs. Access-Logs dieser Route ohne Query-String
protokollieren.
2. **Route:** Token als Pfad-Parameter (`/signieren/{token}`), nicht Query —
Query-Strings landen häufiger in Logs/Referrer/Browser-History.
`slowapi`-Rate-Limit pro IP UND pro Token (z.B. 10/Minute). Lookup
ausschließlich über Token-Hash, niemals über fortlaufende Custody-ID (IDOR).
3. **Race Condition:** Token-Verwendung als atomares DB-Update, nicht
Read-then-Write — `UPDATE ... WHERE token_hash=$1 AND status='ausstehend'`,
Rowcount prüfen statt separatem Check+Write.
4. **QR-Abfoto-Risiko:** bewusst akzeptiertes Restrisiko, **kein zusätzlicher
PIN-Schritt** (Entscheidung 2026-09-09 — Reibung im Feldeinsatz wiegt
schwerer, Ausgabe findet ohnehin unter Aufsicht der ausgebenden Stelle
statt, die den Vorgang beobachtet). 5-Minuten-Ablauf + Einmalverwendung des
Tokens bleiben als Grundschutz bestehen.
5. **Transport:** HTTPS zwingend (ohnehin nur über nginx-TLS erreichbar).
`VITE_API_BASE_URL` bleibt relativ (`/api/v1`) — Empfänger-Handy nutzt
dieselbe Domain/dasselbe TLS-Zertifikat. Explizit auf echtem Fremdgerät
testen, nicht nur localhost.
6. **Datensparsamkeit (DSGVO):** GET-Endpunkt der Signier-Seite liefert nur
Minimaldaten (Gerätebezeichnung, Empfängername, Zeitfenster) — keine
vollständige Custody-Historie, keine internen IDs. Bei ungültigem/
abgelaufenem/bereits verwendetem Token identische generische Fehlermeldung
(kein Enumerieren des Status). Signatur/PDF nach Abschluss nicht mehr über
denselben Token abrufbar — Download nur im authentifizierten Portal-Bereich.
7. **PDF-Generierung:** falls HTML-basiert (`weasyprint`) — Jinja2-Autoescape
aktiv lassen, kein `|safe` auf Nutzereingaben. Signatur-Bild serverseitig
validieren (Magic-Bytes/Größe/Dimensionen), bevor es ins PDF eingebettet
wird — keine beliebigen Datei-URLs oder SVG mit Skript zulassen.
- **Abhängigkeiten:** ASSET-003, PERS-001, DOC-001 (Ausgabeprotokoll-PDF), FOUND-002
(Signier-Token braucht eigene, kurzlebige Tabelle/Cache)
- **Datenmodell:** `geraet_instanz_custody` (geraet_instanz_id →
`geraet_instanz.id`, person_id, ausgegeben_am, ausgegeben_von_benutzer_id,
mit_protokoll: bool (Toggle-Entscheidung der ausgebenden Stelle),
ausgabeprotokoll_dokument_id nullable FK auf `dokument` (nur bei
`mit_protokoll=true`), zurueckgegeben_am nullable,
zurueckgenommen_von_benutzer_id nullable, rueckgabeprotokoll_dokument_id
nullable) — aktuelle Inhaberschaft = Zeile mit `zurueckgegeben_am IS NULL`.
`signier_token` (token, custody_id, ablauf_am, verwendet: bool) — nur relevant
wenn `mit_protokoll=true`, kurzlebig, kann nach Ablauf/Verwendung gelöscht
werden (kein Langzeit-Speicherbedarf).
- **Backend:** Ausgabe-Endpoint verzweigt nach `mit_protokoll``false`: Custody-
Zeile direkt als abgeschlossen anlegen (formlose Ausgabe, wie ursprünglich
geplant); `true`: Custody-Zeile unsigniert anlegen + Signier-Token erzeugen,
QR-Code-Inhalt zurückgeben, öffentlicher (token-authentifizierter, kein Login)
Signier-Endpoint nimmt Signatur-PNG entgegen, erzeugt PDF, markiert Custody als
abgeschlossen, Status-Polling-Endpoint fürs Portal. In beiden Fällen: verhindert
Doppel-Ausgabe (GeraetInstanz nur an eine Person gleichzeitig, DB-Constraint:
max. eine offene Zeile je `geraet_instanz_id`); bei `mit_protokoll=true`
zusätzlich Token-Ablauf serverseitig erzwungen (abgelaufene Tokens/unsignierte
Ausgaben nach Timeout verwerfen)
- **Frontend:** Ausgabe-Dialog am Gerät — Person auswählen, Toggle „Mit
Protokoll+Unterschrift"; bei aktiviertem Toggle QR-Code anzeigen →
Warten-auf-Signatur-Status, sonst sofortiger Abschluss. Separate mobile
Signier-Seite (eigenständige Route, kein Admin-Layout, funktioniert auf jedem
Handy-Browser ohne Login) nur relevant bei aktiviertem Toggle.
- **Mobile:** Ausgabe-Start per QR-Scan am Gerät selbst (wie gehabt), Signatur
läuft auf dem Empfänger-Handy über die separate Signier-Seite
- **QR-Code:** zwei unterschiedliche QR-Codes im Spiel — (1) Geräte-QR zum
Auswählen des Geräts (bestehender Mechanismus), (2) neuer Signier-Token-QR zum
Öffnen der Signier-Seite auf dem Empfänger-Handy
- **Seriennummer/Inventarnummer:** nutzt bestehende `GeraetInstanz`-Identität
- **Akte:** eigener Custody-Verlauf im Akte-Historienbereich (FILE-005)
- **Rechte:** Ausgabe/Rücknahme: Mitarbeiter+; Korrektur: Materialverantwortlicher+
- **Audit:** jede Ausgabe/Rücknahme geloggt, inkl. Zeitpunkt der Signatur
- **Akzeptanzkriterien:** Gerät kann nicht an zwei Personen gleichzeitig ausgegeben
sein; formlose Ausgabe (`mit_protokoll=false`) ist sofort abgeschlossen, kein
Signier-Flow ausgelöst; Ausgabe mit Protokoll ohne abgeschlossene Signatur gilt
nicht als abgeschlossen (Gerät bleibt bis zur Signatur „in Ausgabe schwebend",
nicht schon fest zugeordnet); abgelaufener/bereits verwendeter Signier-Token
wird abgelehnt; Ausgabeprotokoll-
PDF enthält Geräte-, Personen-, Zeit- und Signaturdaten; Verlauf zeigt lückenlose
Kette.
- **Tests:** Doppel-Ausgabe-Ablehnung, abgelaufener-Token-Ablehnungstest, bereits-
verwendeter-Token-Ablehnungstest, PDF-Generierungstest, Ausgabe→Signatur→
Rücknahme→Signatur→Neuausgabe-Zyklus, Race-Condition-Test (paralleler Request
auf denselben Token, nur einer darf gewinnen), Rate-Limit-Test, IDOR-Test
(Token-Lookup nur über Hash, keine ID-Erratbarkeit), Signatur-Bild-Validierungs-
test (ungültige/manipulierte Datei wird abgelehnt).
- **DoD:** offen — Design vollständig geklärt (2026-09-09), bereit für
Implementierung. **Referenz (Open-Source-Vergleich 2026-09-09):** Shelf.nu
(`shelf-nu/shelf.nu`, AGPL-3.0 — nur Konzeptvorbild, keine Codeübernahme wegen
Copyleft) — „Custody"-Feature, Kernaussage „know who has what at all times".
## ASSET-008 — Consumable ## ASSET-008 — Consumable
+5
View File
@@ -130,6 +130,11 @@ Details zu FLEET-001 … FLEET-006 (vollständig).
- **Tests:** TBD. - **Tests:** TBD.
- **DoD:** **DECISION REQUIRED:** diese Kachel bleibt bewusst Platzhalter, erst bei - **DoD:** **DECISION REQUIRED:** diese Kachel bleibt bewusst Platzhalter, erst bei
tatsächlichem Angehen des Operations-Epics neu aufsetzen statt jetzt blind zu spezifizieren. tatsächlichem Angehen des Operations-Epics neu aufsetzen statt jetzt blind zu spezifizieren.
- **Referenz (Open-Source-Vergleich 2026-09-09):** Resgrid (`Resgrid/Core`, .NET/Angular,
Apache-2.0) nutzt für sein Unit/Personnel-Modell zusätzlich AVL (Automatic Vehicle
Location, GPS-Tracking) und einen feingranularen Verfügbarkeits-Status. Kein aktueller
MABEA-Bedarf (Materialmanagement, nicht Einsatzführung), aber falls das Operations-Epic
je aktiviert wird, wäre AVL-Integration ein naheliegender Baustein für diese Kachel.
--- ---
+9
View File
@@ -92,6 +92,15 @@ Details zu INV-001 … INV-007 (vollständig).
Objektposition (ein Wert, keine Liste) — mehrere Chargen gleichzeitig an derselben Position Objektposition (ein Wert, keine Liste) — mehrere Chargen gleichzeitig an derselben Position
sind aktuell NICHT abbildbar. Diese Kachel wäre in MABEA kein reiner Nachzug, sondern ein sind aktuell NICHT abbildbar. Diese Kachel wäre in MABEA kein reiner Nachzug, sondern ein
Datenmodell-Umbau (1:1 → 1:n). Datenmodell-Umbau (1:1 → 1:n).
- **Referenz (Open-Source-Vergleich 2026-09-09, Grocy `grocy/grocy`, MIT — lizenzseitig
unkritisch, Stack inkompatibel):** zwei Verfeinerungen für den Umbau vormerken, falls
INV-004 angegangen wird:
1. **Umrechnungsfaktor Gebinde→Einzeleinheit** (z.B. 1 Packung = 20 Stück) statt Menge
nur in einer Einheit zu führen — vermeidet Umrechnungsfehler bei Teil-Entnahme.
2. **„Charge öffnen"-Aktion**: sobald eine Charge angebrochen wird, kann ein neues,
kürzeres Verfallsdatum gesetzt werden (viele sterile/medizinische Produkte verlieren
nach Anbruch ihre Haltbarkeit vorzeitig) — separat vom ursprünglichen
Herstellerablaufdatum der ungeöffneten Charge.
## INV-005 — Ablaufdaten & Warnschwellen ## INV-005 — Ablaufdaten & Warnschwellen
+6
View File
@@ -136,6 +136,12 @@ Details zu WH-001 … WH-007 (vollständig).
- **DoD:** ein vollständiger Inventurzyklus durchgeführt. **Lücke:** MABEA hat kein - **DoD:** ein vollständiger Inventurzyklus durchgeführt. **Lücke:** MABEA hat kein
Inventur-Konzept, nur Kontrolle (Soll/Ist je Objekt, nicht als eigener Lagerlauf mit Inventur-Konzept, nur Kontrolle (Soll/Ist je Objekt, nicht als eigener Lagerlauf mit
Korrekturbuchung). Korrekturbuchung).
- **Referenz (Open-Source-Vergleich 2026-09-09):** InvenTree (`inventree/InvenTree`) hat
als Alternative zur Stichtags-Vollinventur ein „Rolling Stocktake"-Plugin — statt
allem auf einmal wird laufend ein rotierender Teilbestand geprüft (Dashboard zeigt
automatisch das nächste fällige Item). Für weniger kritisches Verbrauchsmaterial ggf.
als optionaler zweiter Inventur-Modus neben dem hier beschriebenen Vollinventurlauf
erwägenswert — kein Ersatz, sondern Ergänzung.
## WH-007 — Materialbewegungsprotokoll ## WH-007 — Materialbewegungsprotokoll
+40 -7
View File
@@ -1,6 +1,8 @@
# Epic 10 — Maintenance # Epic 10 — Maintenance
Details zu MAINT-001 … MAINT-006 (vollständig). Details zu MAINT-001 … MAINT-007. MAINT-001-004+006 vollständig, MAINT-005 P3
zurückgestellt, MAINT-007 ergänzt am 2026-09-09 aus Open-Source-Vergleich (FleetMS),
ebenfalls P3/offen.
--- ---
@@ -104,7 +106,7 @@ Details zu MAINT-001 … MAINT-006 (vollständig).
`GET /wartungsauftraege?objekt_id=` liefert offene+erledigte, Akte zeigt `GET /wartungsauftraege?objekt_id=` liefert offene+erledigte, Akte zeigt
beide getrennt in der neuen "Wartung"-Sektion. beide getrennt in der neuen "Wartung"-Sektion.
## MAINT-005 — Ersatzteile/Kosten (P3) ## MAINT-005 — Ersatzteile/Kosten (P3, umgesetzt 2026-09-08)
- **Ziel:** Welche Teile/Kosten bei einer Wartung angefallen sind. - **Ziel:** Welche Teile/Kosten bei einer Wartung angefallen sind.
- **Beschreibung:** Ersatzteilliste + Kostenfeld je Wartungsauftrag. - **Beschreibung:** Ersatzteilliste + Kostenfeld je Wartungsauftrag.
@@ -120,7 +122,8 @@ Details zu MAINT-001 … MAINT-006 (vollständig).
- **Audit:** Änderung geloggt - **Audit:** Änderung geloggt
- **Akzeptanzkriterien:** Teile/Kosten erfassen, Summe korrekt. - **Akzeptanzkriterien:** Teile/Kosten erfassen, Summe korrekt.
- **Tests:** Summen-Test. - **Tests:** Summen-Test.
- **DoD:** **P3 — kann zurückgestellt werden**, kein MVP-Bestandteil. - **DoD:** ✅ umgesetzt (2026-09-08) — `WartungsauftragTeil` (Migration 0033),
`/wartungsauftraege/{id}/teile`-CRUD, UI in `WartungSection.tsx`.
## MAINT-006 — Wartungsdokument-Anbindung ## MAINT-006 — Wartungsdokument-Anbindung
@@ -141,10 +144,40 @@ Details zu MAINT-001 … MAINT-006 (vollständig).
- **DoD:** umgesetzt (2026-09-06). `entitaet_typ=wartungsauftrag` zur Whitelist - **DoD:** umgesetzt (2026-09-06). `entitaet_typ=wartungsauftrag` zur Whitelist
ergänzt, `DokumentePanel` in der Wartung-Sektion der Akte je Auftrag. ergänzt, `DokumentePanel` in der Wartung-Sektion der Akte je Auftrag.
## MAINT-007 — Tankbuch/Kraftstoffverbrauch (P3, neu)
- **Ziel:** Kraftstoffbetankungen je Fahrzeug erfassen, Verbrauch (l/100km) ableiten.
- **Beschreibung:** Betankungs-Log (Datum, Menge, Kosten, Kilometerstand zum
Betankungszeitpunkt) je Fahrzeug, Verbrauchsberechnung aus aufeinanderfolgenden
Einträgen.
- **Benutzerwert:** Budgetplanung, Auffälligkeiten (Mehrverbrauch als früher Hinweis auf
technisches Problem) erkennbar.
- **Abhängigkeiten:** FLEET-002 (`Fahrzeugdetails.kilometerstand`) — **nicht**
ASSET-009, das laut eigenem Ist-Stand-Abgleich in `04_assets.md` weiterhin fehlt
(kein generischer Zähler vorhanden, nur das Fahrzeug-Feld direkt)
- **Datenmodell:** `tankbuch_eintrag` (objekt_id → `objekt.id`, datum, menge_liter,
kosten, kilometerstand) — kein `asset`-Modell in MABEA, real heißt die Tabelle
`objekt`
- **Backend:** CRUD, Verbrauchsberechnung zwischen zwei Einträgen
- **Frontend:** Tankbuch-Liste je Fahrzeug, Verbrauchsanzeige
- **Mobile:** Erfassung nach dem Tanken
- **QR-Code/Seriennummer/Inventarnummer:** nein
- **Akte:** Wartungs-/Fahrzeugbereich
- **Rechte:** jeder Nutzer darf erfassen, Korrektur Materialwart+
- **Audit:** Änderung geloggt
- **Akzeptanzkriterien:** zwei Einträge ergeben korrekten l/100km-Wert.
- **Tests:** Verbrauchsberechnungstest.
- **DoD:** offen, **P3 — kein MVP-Bestandteil**, analog MAINT-005-Priorisierung.
**Referenz (Open-Source-Vergleich 2026-09-09):** FleetMS (`jmnda-dev/fleetms`,
Elixir/Phoenix, AGPL-3.0 — Projekt selbst laut eigenem README unreif/Prototyp,
nur als Ideengeber, kein Vorbild für Codequalität) führt ein einfaches Fuel-Log als
eigenständiges Fahrzeug-Modul — Konzept übertragbar, MABEA hat aktuell keinerlei
Kraftstoff-Tracking.
--- ---
**MABEA-Ist-Stand-Abgleich (aktualisiert 2026-09-06):** MAINT-001..004+006 **MABEA-Ist-Stand-Abgleich (aktualisiert 2026-09-09):** MAINT-001..006
vollständig umgesetzt — echtes Wartungskonzept existiert jetzt (Wartungspläne, vollständig umgesetzt — echtes Wartungskonzept existiert jetzt (Wartungspläne,
Intervalle, Werkstattaufträge intern/extern, Historie, Dokument-Anhang). Intervalle, Werkstattaufträge intern/extern, Historie, Dokument-Anhang,
MAINT-005 (Ersatzteile/Kosten-Detailliste) bleibt bewusst zurückgestellt (P3) — Ersatzteile/Kosten je Auftrag seit 2026-09-08). MAINT-007 (Tankbuch) neu
Kosten als einzelnes Feld am Auftrag reicht für den MVP. ergänzt am 2026-09-09, offen/ungeplant.
+12 -13
View File
@@ -23,10 +23,9 @@ Details zu PERS-001 … PERS-007 (vollständig).
- **Audit:** Änderung geloggt - **Audit:** Änderung geloggt
- **Akzeptanzkriterien:** Person ohne Benutzerkonto anlegbar. - **Akzeptanzkriterien:** Person ohne Benutzerkonto anlegbar.
- **Tests:** CRUD-Test, Test „Person ohne Benutzer funktioniert". - **Tests:** CRUD-Test, Test „Person ohne Benutzer funktioniert".
- **DoD:** **HIGH RISK** (siehe Decision Required #4 in `00_index.md`) — größter Umbau - **DoD:** ✅ umgesetzt (2026-09-08) — echter Bedarf via AskUserQuestion bestätigt,
des gesamten Personal-Bereichs, da MABEA Person=Benutzer verschmolzen hat. Vor danach live deployed. `Person`-Modell (Migration 0034 mit Backfill bestehender
Umsetzung: echten Bedarf klären (gibt es in der Praxis tatsächlich Personen ohne Benutzer), `/personen`-CRUD, Admin-UI `PersonSection.tsx`.
Login-Bedarf, die trotzdem im System geführt werden müssen?).
## PERS-002 — Benutzer (technisch, verknüpft) ## PERS-002 — Benutzer (technisch, verknüpft)
@@ -47,10 +46,10 @@ Details zu PERS-001 … PERS-007 (vollständig).
- **Akzeptanzkriterien:** bestehende Benutzer funktionieren nach Migration unverändert. - **Akzeptanzkriterien:** bestehende Benutzer funktionieren nach Migration unverändert.
- **Tests:** Migrationstest (keine Datenverluste), Regressionstest bestehender - **Tests:** Migrationstest (keine Datenverluste), Regressionstest bestehender
Auth-Flows. Auth-Flows.
- **DoD:** **DECISION REQUIRED** — das ist der eigentliche Bruch. Lohnt sich das, wenn - **DoD:** ✅ umgesetzt (2026-09-08) — `Benutzer.person_id` FK (nullable), `/benutzer`
aktuell niemand Personen ohne Login braucht? Empfehlung: zurückstellen bis konkreter verknüpft bestehende Person oder legt automatisch neue Person an, wenn keine
Bedarf auftritt (z.B. Jugendgruppen-Verwaltung), dann als eigenes fokussiertes Vorhaben `person_id` angegeben wird (Backward-Kompatibilität). Backfill bestehender Benutzer
angehen, nicht „nebenbei" im Rahmen einer anderen Kachel. via `ROW_NUMBER()`-1:1-Positionsmatch statt Name-Join (Namenskollisionen vermieden).
## PERS-003 — Einheiten/Organisationsstruktur ## PERS-003 — Einheiten/Organisationsstruktur
@@ -160,10 +159,10 @@ Details zu PERS-001 … PERS-007 (vollständig).
--- ---
**MABEA-Ist-Stand-Abgleich:** PERS-003, 005, 006, 007 sind vollständig in MABEA **MABEA-Ist-Stand-Abgleich (aktualisiert 2026-09-09):** PERS-001…003, 005, 006, 007
umgesetzt und größtenteils sogar schon live getestet. **PERS-001/002 (Person↔Benutzer- sind vollständig in MABEA umgesetzt und live deployed. PERS-001/002 (Person↔Benutzer-
Trennung) bleiben der einzige echte offene Architekturentscheid im gesamten Backlog** Trennung) waren der größte offene Architekturentscheid im gesamten Backlog — echter
bewusst nicht einfach umgesetzt, sondern als Decision Required markiert, da der Nutzen Bedarf wurde am 2026-09-08 bestätigt, danach umgesetzt und deployed (Details siehe
(Personen ohne Login) bisher nicht als konkreter Bedarf geäußert wurde. **PERS-004 PERS-001/002 oben). **PERS-004
(fachliche Funktion innerhalb einer Einheit, z.B. „Zugführer") fehlt komplett** — leicht (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. zu verwechseln mit den bestehenden System-Rollen, ist aber ein eigenständiges Konzept.
+46 -1
View File
@@ -1,6 +1,7 @@
# Epic 13 — Readiness # Epic 13 — Readiness
Details zu READY-001 … READY-005 (vollständig). Details zu READY-001 … READY-006. READY-001-005 vollständig, READY-006 ergänzt am
2026-09-09 aus HiOrg-Server-Vergleich, offen/ungeplant.
--- ---
@@ -116,6 +117,50 @@ Details zu READY-001 … READY-005 (vollständig).
kann komplett entfallen, wenn READY-001 zurückgestellt bleibt und ein fester kann komplett entfallen, wenn READY-001 zurückgestellt bleibt und ein fester
Kriterienkatalog ausreicht. Kriterienkatalog ausreicht.
## READY-006 — Statistik-/Reporting-Dashboard-Kachel (P2, neu)
- **Ziel:** Kennzahlen über Zeit statt nur Momentaufnahme des aktuellen Zustands.
- **Beschreibung:** Neue Dashboard-Kachel mit Verlaufs-Kennzahlen: Bereitschaftsquote
über Zeit (Anteil READY/LIMITED/NOT_READY/UNKNOWN je Zeitpunkt), Mängelquote je
Standort, Anzahl offener Wartungen. Nutzt bereits vorhandene Daten
(Einsatzbereitschaft, Mängel, Wartungsaufträge), aggregiert sie nur zeitlich/
gruppiert statt nur aktuellen Stand zu zeigen.
- **Benutzerwert:** Trends erkennbar („wird die Bereitschaft besser/schlechter") statt
nur Snapshot — Grundlage für Leitungsentscheidungen (z.B. wo Ressourcen fehlen).
- **Abhängigkeiten:** READY-004, `Mangel`-Modell, MAINT-003
- **Datenmodell (entschieden 2026-09-10): täglicher Snapshot**, nicht
Live-Berechnung — `readiness_snapshot` (Zeitpunkt, Standort, Zustand, Anzahl).
Begründung: Live-Berechnung würde bedeuten, die READY-003-Regel-Logik
rückwirkend auf jeden historischen Zeitpunkt anzuwenden (zeitpunktbezogener
Nachbau der Ampel-Logik) — deutlich fehleranfälliger als ein simpler täglicher
Snapshot. Tägliche Auflösung reicht für Trend-Reporting.
- **Backend:** Aggregations-Endpunkt(e), periodischer Snapshot-Job via
systemd-Timer (`mabea-readiness-snapshot.timer`, gleiches Muster wie
`mabea-eskalation.timer` bei NOTIF-002) — Zeitplan über `OnCalendar` in der
Timer-Unit auf dem Server jederzeit ohne Codeänderung/Deploy anpassbar
(`systemctl edit` + `daemon-reload`), reine Betriebskonfiguration. Standard-
Anzeigezeitraum im Frontend: letzte 90 Tage, mit Filter für längere Zeiträume.
- **Frontend:** neue Dashboard-Kachel (react-grid-layout, wie bestehende Tiles),
einfache Zeitreihen-Darstellung
- **Mobile:** Anzeige, kein Erfassungsbedarf
- **QR-Code/Seriennummer/Inventarnummer:** nein
- **Akte (ergänzt 2026-09-10):** zusätzlich zum globalen Dashboard bekommt jedes
einzelne Objekt einen Verlaufs-Abschnitt in seiner Akte (FILE-005-Bereich) —
„Bereitschaftshistorie dieses Objekts" (z.B. „in den letzten 6 Monaten X Tage
nicht einsatzbereit"). Nutzt dieselbe zugrundeliegende Datenquelle wie das
globale Dashboard, nur gefiltert auf ein Objekt statt aggregiert über alle —
andere Abfrage-Granularität, kein zweiter Datenspeicher nötig.
- **Rechte:** Leitungsverantwortliche/Administration
- **Audit:** nein (reine Auswertung)
- **Akzeptanzkriterien:** mind. eine Kennzahl (z.B. Bereitschaftsquote) über
mehrere Zeitpunkte hinweg korrekt dargestellt.
- **Tests:** Aggregations-Test mit synthetischen Daten über mehrere Zeitpunkte.
- **DoD:** offen — Design vollständig geklärt (2026-09-10), bereit für
Implementierung. **Referenz (HiOrg-Server-Vergleich 2026-09-09):** HiOrg bietet
dedizierte Statistiken über Dienste/Kurse — MABEA hat vergleichbare Rohdaten
(Einsatzbereitschaft, Mängel, Wartung), aber keine Verlaufs-/Trend-Ansicht,
nur den aktuellen Zustand (READY-004).
--- ---
**MABEA-Ist-Stand-Abgleich:** Funktional ist Readiness in MABEA bereits gut abgedeckt **MABEA-Ist-Stand-Abgleich:** Funktional ist Readiness in MABEA bereits gut abgedeckt
+10
View File
@@ -74,6 +74,16 @@ Details zu MOBILE-001 … MOBILE-005 (vollständig).
- **DoD:** **HIGH RISK, P2 — komplexestes Mobile-Thema.** MABEA hat KEINE - **DoD:** **HIGH RISK, P2 — komplexestes Mobile-Thema.** MABEA hat KEINE
Offline-Fähigkeit (nur PWA-Shell-Caching via Vite-PWA-Plugin, keine Offline-Queue für Offline-Fähigkeit (nur PWA-Shell-Caching via Vite-PWA-Plugin, keine Offline-Queue für
Schreibvorgänge) — bei Netzausfall schlägt jede Aktion einfach fehl. Schreibvorgänge) — bei Netzausfall schlägt jede Aktion einfach fehl.
- **Referenz (Open-Source-Vergleich 2026-09-09):** KP Front (`feuerwehr-oberwil/kp-front`,
identischer Stack FastAPI/PostgreSQL/React-Vite-PWA, AGPL-3.0-or-later — nur Muster,
keine Codeübernahme) löst das nicht als globale Offline-Queue, sondern als
**Draft-first-Erfassung**: jede Eingabe (`captureDraft.ts`-Muster) wird sofort lokal als
Entwurf mit eigenem Sync-Status gespeichert (statt nur bei Verbindungsverlust in eine
Warteschlange zu fallen) — der Nutzer sieht pro Datensatz „lokal/synchronisiert" statt
nur eines globalen Online-Banners. Für MABEA relevant, weil Kontrollen/Mängelmeldungen
(MOBILE-004/005) so auch bei instabiler statt komplett fehlender Verbindung robust
bleiben, nicht nur im reinen Offline-Fall. Empfehlung: MOBILE-003 auf dieses Muster hin
konkretisieren statt generischer „Offline-Queue".
## MOBILE-004 — Mobile Mangelmeldung + Foto ## MOBILE-004 — Mobile Mangelmeldung + Foto
+57 -5
View File
@@ -1,6 +1,8 @@
# Epic 17 — Zuständigkeit # Epic 17 — Zuständigkeit
Details zu ZUST-001 … ZUST-002 (vollständig). Übernommen aus `arbeitskarten/01_rollen_zuordnung.md` Details zu ZUST-001 … ZUST-003. ZUST-001/002 vollständig, ZUST-003 ergänzt am 2026-09-09
aus Open-Source-Vergleich, noch offen/ungeplant. Übernommen aus
`arbeitskarten/01_rollen_zuordnung.md`
und `arbeitskarten/04_organisationsstruktur.md` (Karte 01+04) — beide Karten hatten kein und `arbeitskarten/04_organisationsstruktur.md` (Karte 01+04) — beide Karten hatten kein
Gegenstück im ursprünglichen 16-Epic-Backlog (siehe `00_index.md`, DECISION REQUIRED Punkt 5 Gegenstück im ursprünglichen 16-Epic-Backlog (siehe `00_index.md`, DECISION REQUIRED Punkt 5
war die Vorgängerlücke, diese hier ist die zweite gefundene Lücke). war die Vorgängerlücke, diese hier ist die zweite gefundene Lücke).
@@ -62,12 +64,62 @@ war die Vorgängerlücke, diese hier ist die zweite gefundene Lücke).
- **DoD:** deckt sich 1:1 mit MABEA (`Kontrollverantwortung`-Tabelle, admin-UI bereits - **DoD:** deckt sich 1:1 mit MABEA (`Kontrollverantwortung`-Tabelle, admin-UI bereits
produktiv). produktiv).
## ZUST-003 — Standort-Scoping für granulare Berechtigungen (P2, neu, geklärt 2026-09-09)
- **Ziel:** Custom-Rollen-Berechtigungen (`Berechtigung`/`Rolle`/`RolleBerechtigung`,
Roadmap Phase 6) optional auf einen Standort/Depot einschränken können, statt immer
global zu gelten.
- **Bedarf: bestätigt (2026-09-09)** — echte Anforderung, kein rein hypothetisches
Feature.
- **Beschreibung:** Aktuell gilt jede über eine Custom-Rolle vergebene Berechtigung
systemweit — ein Nutzer mit „material.erstellen" darf das an JEDEM Standort, nicht nur
an dem, für den er zuständig ist. Erweiterung: optionales `standort_id` an
der Benutzer-Rollen-Zuordnung, `NULL` = weiterhin global (Rückwärtskompatibilität).
- **Benutzerwert:** Ein Materialwart kann Rechte für seinen Standort bekommen, ohne
automatisch auch an allen anderen Standorten schreiben zu dürfen — relevant, sobald
mehrere Standorte/Depots von unterschiedlichen Personen verantwortet werden.
- **Abhängigkeiten:** ZUST-001 (bestehendes Standort↔Verantwortlicher-Konzept), das
granulare Rechtesystem (`app/models/permission.py`)
- **Datenmodell (entschieden 2026-09-09): 1:1, einfache Spalte statt
Zwischentabelle** — `benutzer_rolle_zuordnung.standort_id` (FK, nullable),
`NULL` = global. Begründung: Personen wechseln typischerweise komplett den
Standort (dann wird der Wert einfach aktualisiert, kein Neuanlegen/Löschen
nötig) statt dauerhaft mehreren Standorten gleichzeitig zugeordnet zu sein.
Braucht eine Person doch mehrere Standorte gleichzeitig: einfach eine zweite
Rollen-Zuweisung mit anderem `standort_id` anlegen (Custom-Rollen sind bereits
mehrfach zuweisbar) — kein n:m-Konstrukt nötig, deutlich einfachere
Rechteprüfungs-Logik.
- **Backend:** Rechte-Check-Funktion (`require_roles_or_permission` o.ä.) um
Standort-Filter erweitern — prüft nicht nur „hat Berechtigung X", sondern „hat
Berechtigung X für Standort Y (oder global)"
- **Frontend:** `RolleSection.tsx` — Standort-Auswahl bei der Benutzer-Zuordnung
ergänzen (optional, Default weiterhin global)
- **Mobile:** kein Unterschied, wirkt sich nur auf Backend-Autorisierung aus
- **QR-Code/Seriennummer/Inventarnummer:** nein
- **Akte:** nein direkt
- **Rechte:** Verwaltung: Administrator
- **Audit:** Änderung der Standort-Zuordnung geloggt
- **Akzeptanzkriterien:** Nutzer mit standortgebundenem Recht kann an zugewiesenem
Standort handeln, an anderem Standort wird derselbe Endpunkt korrekt abgelehnt;
bestehende globale Zuordnungen (`standort_id IS NULL`) funktionieren unverändert.
- **Tests:** Positivtest (Standort passt), Negativtest (falscher Standort abgelehnt),
Regressionstest (bestehende globale Rechte weiterhin uneingeschränkt).
- **DoD:** offen — beide Design-Entscheidungen geklärt (2026-09-09), bereit für
Implementierung. **Referenz (Open-Source-Vergleich 2026-09-09):** keines der
verglichenen Projekte (InvenTree, Snipe-IT, Grocy, Shelf.nu, Resgrid, KP Front,
FleetMS) hat ein sauber dokumentiertes Standort-/Objekt-Ebene-Rechtesystem — Snipe-IT
nur grobes Company-Scoping, Shelf.nu nur personenbezogene Sichtbarkeits-Toggles. Wäre
bei Umsetzung eine echte Differenzierung ggü. allen verglichenen Projekten, kein
Nachbau.
--- ---
**MABEA-Ist-Stand-Abgleich:** beide Kacheln sind bereits vollständig umgesetzt und **MABEA-Ist-Stand-Abgleich (aktualisiert 2026-09-09):** ZUST-001/002 sind bereits
produktiv (`Zustaendigkeit` + `Kontrollverantwortung`, jeweils mit Admin-UI). Diese Epic- vollständig umgesetzt und produktiv (`Zustaendigkeit` + `Kontrollverantwortung`, jeweils
Datei existierte bislang nicht — reine Nachdokumentation von bereits gebauter Funktion, die mit Admin-UI). Diese Epic-Datei existierte bislang nicht — reine Nachdokumentation von
im ursprünglichen 16-Epic-Backlog übersehen wurde. bereits gebauter Funktion, die im ursprünglichen 16-Epic-Backlog übersehen wurde.
ZUST-003 (Standort-Scoping für Berechtigungen) neu ergänzt am 2026-09-09 aus
Open-Source-Vergleich, offen/ungeplant.
## Referenzen ## Referenzen
Alte Arbeitskarten (übernommen, Karten-Dateien gelöscht): Karte 01 Rollen&Zuordnung, Alte Arbeitskarten (übernommen, Karten-Dateien gelöscht): Karte 01 Rollen&Zuordnung,
+29 -1
View File
@@ -1,6 +1,8 @@
# Epic 18 — Notifications & Eskalation # Epic 18 — Notifications & Eskalation
Details zu NOTIF-001 … NOTIF-002 (vollständig). Übernommen aus `arbeitskarten/05_benachrichtigungen.md` Details zu NOTIF-001 … NOTIF-003. NOTIF-001/002 vollständig umgesetzt, NOTIF-003 ergänzt
am 2026-09-09 aus Open-Source-Vergleich (Shelf.nu), noch offen/ungeplant. Übernommen aus
`arbeitskarten/05_benachrichtigungen.md`
und `arbeitskarten/12_eskalation.md` (Karte 05+12) — beide Karten hatten kein Gegenstück im und `arbeitskarten/12_eskalation.md` (Karte 05+12) — beide Karten hatten kein Gegenstück im
ursprünglichen 16-Epic-Backlog, obwohl Karte 12 bereits vollständig implementiert ist. ursprünglichen 16-Epic-Backlog, obwohl Karte 12 bereits vollständig implementiert ist.
@@ -56,6 +58,32 @@ ursprünglichen 16-Epic-Backlog, obwohl Karte 12 bereits vollständig implementi
dem Zielserver per systemd-Timer (`mabea-eskalation.timer`), der den Prüf-Endpunkt dem Zielserver per systemd-Timer (`mabea-eskalation.timer`), der den Prüf-Endpunkt
periodisch aufruft. periodisch aufruft.
## NOTIF-003 — Proaktive Wartungsfälligkeits-Benachrichtigung (P2, neu)
- **Ziel:** Verantwortlicher erfährt von bald fälliger/überfälliger Wartung, ohne aktiv
`GET /objekte/{id}/faellige-wartungen` (MAINT-002) abfragen zu müssen.
- **Beschreibung:** Gleiches Muster wie NOTIF-001 (Dashboard + E-Mail), aber Trigger ist
Wartungsfälligkeit statt Fehlbestand. MAINT-002 berechnet die Fälligkeit bereits —
hier fehlt nur die proaktive Zustellung.
- **Benutzerwert:** Wartungstermine werden nicht verpasst, weil niemand aktiv nachschaut.
- **Abhängigkeiten:** MAINT-002, NOTIF-001 (identisches Versandmuster wiederverwenden)
- **Datenmodell:** kein neues zusätzlich zu MAINT-002; ggf. Tracking-Zeitstempel analog
NOTIF-002 zur Mehrfachversand-Vermeidung
- **Backend:** periodischer Prüflauf (systemd-Timer analog NOTIF-002), nutzt bestehende
Fälligkeitsberechnung
- **Frontend:** Dashboard-Kachel „Fällige Wartungen" (falls nicht bereits vorhanden)
- **Mobile:** Dashboard-Ansicht
- **QR-Code/Seriennummer/Inventarnummer:** nein
- **Akte:** nein direkt
- **Rechte:** Materialverantwortliche der jeweiligen Zuständigkeit
- **Audit:** Versand nicht zwingend geloggt (wie NOTIF-001)
- **Akzeptanzkriterien:** fällige Wartung löst einmalig E-Mail+Dashboard-Eintrag aus,
kein Mehrfachversand für dieselbe Fälligkeit.
- **Tests:** Trigger-Test analog NOTIF-001, Mehrfachversand-Schutz-Test analog NOTIF-002.
- **DoD:** offen. **Referenz (Open-Source-Vergleich 2026-09-09):** Shelf.nu nennt dies
„Schedule alerts for maintenance, calibration, warranty expiry" — bestätigt den
Bedarf als verbreitetes Muster, MABEA-Umsetzung folgt dem eigenen NOTIF-001/002-Stil.
--- ---
**MABEA-Ist-Stand-Abgleich (korrigiert 2026-09-06):** NOTIF-001 und NOTIF-002 sind **MABEA-Ist-Stand-Abgleich (korrigiert 2026-09-06):** NOTIF-001 und NOTIF-002 sind
+7
View File
@@ -48,6 +48,13 @@ konkreten Datenmodell-Konsequenzen, die in keinem der 16 ursprünglichen Epics e
Punkte vor Umsetzung: technischer Auslöser der Auslagerung (manuell vs. automatisch bei Punkte vor Umsetzung: technischer Auslöser der Auslagerung (manuell vs. automatisch bei
Verbindungsverlust), Vorab-Bestückung des Satelliten mit Stammdaten, Verhalten bei Verbindungsverlust), Vorab-Bestückung des Satelliten mit Stammdaten, Verhalten bei
laufender Kontrolle während Auslagerung/Rückholung, Hardware-Anforderung. laufender Kontrolle während Auslagerung/Rückholung, Hardware-Anforderung.
- **Referenz (Open-Source-Vergleich 2026-09-09):** Emergency Management Tool
(`projekt-katastrophenschutz/emergency-management-tool`, verwaist seit 2016, nur als
Konzeptbestätigung — keine brauchbare Codequalität) verfolgt unabhängig dieselbe
Grundidee (Offline-first-Netzwerkbetrieb mit späterer Auto-Synchronisation zwischen
Leitstellen-Instanzen). Bestätigt den Bedarf, liefert aber keine über SAT-001 hinausgehende
Lösung — SAT-001s Konfliktvermeidung-statt-Konfliktlösung-Ansatz (feste
Server-Zuordnung je Objekt) ist bereits ausgereifter als das, was dort skizziert ist.
--- ---
+123 -6
View File
@@ -1,7 +1,9 @@
# Epic 22 — UI-Redesign Runde 2 (Patterns aus ai-coding-starter-kit-v2) # Epic 22 — UI-Redesign Runde 2 (Patterns aus ai-coding-starter-kit-v2)
Ausgangspunkt: Subagenten-Analyse von `gitea.perlbach24.de/scripte/ai-coding-starter-kit-v2` Details zu UI2-001 … UI2-010, alle offen/ungeplant (Backlog-Planung, bewusst noch nicht
(2026-09-08), reines shadcn/ui-Komponenten-Skelett (Vite/React/TS, Tailwind v3, Radix, gestartet). Ausgangspunkt: Subagenten-Analyse von
`gitea.perlbach24.de/scripte/ai-coding-starter-kit-v2` (2026-09-08), vertieft am
2026-09-09, reines shadcn/ui-Komponenten-Skelett (Vite/React/TS, Tailwind v3, Radix,
react-hook-form+zod). Kein Framework-Wechsel, kein Neubau — Epic 20 (UI-001..008) bleibt react-hook-form+zod). Kein Framework-Wechsel, kein Neubau — Epic 20 (UI-001..008) bleibt
Grundlage, hier werden zusätzliche, im Code konkret nachgewiesene Lücken geschlossen. Grundlage, hier werden zusätzliche, im Code konkret nachgewiesene Lücken geschlossen.
**Kein kompletter Frontend-Neubau** — bewusste Entscheidung, siehe Chat 2026-09-08. **Kein kompletter Frontend-Neubau** — bewusste Entscheidung, siehe Chat 2026-09-08.
@@ -23,6 +25,13 @@ Grundlage, hier werden zusätzliche, im Code konkret nachgewiesene Lücken gesch
- **Akzeptanzkriterien:** neue Tokens vorhanden, mind. Card-Komponente nutzt sie statt - **Akzeptanzkriterien:** neue Tokens vorhanden, mind. Card-Komponente nutzt sie statt
Hardcoded-Werten. Hardcoded-Werten.
- **Tests:** keine (reines Styling). - **Tests:** keine (reines Styling).
- **ACHTUNG (QA-Review 2026-09-09, siehe CLAUDE.md „Wichtige Stolperfallen"):**
Neue Token-Namen in `tokens.css` dürfen NIEMALS denselben Namen wie ein
Tailwind-`@theme`-Token bekommen — führte in diesem Projekt bereits zweimal zu
app-weit kaputten Farben (zirkuläre Custom-Properties, guaranteed-invalid
value). Vor dem Anlegen von `--color-card` etc. gegen `tailwind.css`/`@theme`
prüfen, keine Namenskollision. Diese Warnung gilt für UI2-001 als Basis
genauso wie für UI2-010 (Dark-Mode-Vorbereitung), die direkt darauf aufbaut.
- **DoD:** offen. - **DoD:** offen.
## UI2-002 — AdminPage Sidebar/Sheet-Umschaltung ## UI2-002 — AdminPage Sidebar/Sheet-Umschaltung
@@ -61,6 +70,29 @@ Grundlage, hier werden zusätzliche, im Code konkret nachgewiesene Lücken gesch
unverändert. unverändert.
- **Tests:** bestehende Vitest-Tests bleiben grün. - **Tests:** bestehende Vitest-Tests bleiben grün.
- **DoD:** offen. - **DoD:** offen.
- **Referenz (vertiefte Starter-Kit-Analyse 2026-09-09):** `form.tsx` im Quell-Repo
verdrahtet a11y konkret statt nur visuell — `FormLabel` wird bei Fehler rot,
`FormControl` setzt `aria-invalid`, `FormMessage` nur bei vorhandenem Error gerendert,
`aria-describedby` verlinkt zur Fehlermeldung. 1:1 mit MABEAs `useState`-Ansatz
nachbaubar (kein react-hook-form/Context nötig) — sollte in den `FormField`-Baustein
mit einfließen, nicht nur reines Layout.
## UI2-009 — Formular-Fehlerzustand-Verdrahtung (a11y, ergänzt UI2-003)
- **Ziel:** `aria-invalid`/`aria-describedby`/Fehlerfarbe systematisch statt nur visuell.
- **Beschreibung:** siehe Referenz-Absatz bei UI2-003 — kein eigenständiges Feature,
sondern eine konkrete Ausbaustufe von UI2-003, aus organisatorischen Gründen als
eigene Kachel geführt (klar abhakbar, statt in UI2-003 zu verschwimmen).
- **Benutzerwert:** Bessere Screenreader-/Assistive-Tech-Unterstützung, klarere
Fehlererkennung bei schlechtem Licht/Handschuhen (Fehlerfarbe + Text statt nur Farbe).
- **Abhängigkeiten:** UI2-003
- **Backend:** keins
- **Frontend:** `components/ui/form-field.tsx`
- **Rechte:** keine Änderung
- **Akzeptanzkriterien:** Fehlerfeld hat `aria-invalid="true"` und `aria-describedby`
auf die Fehlermeldung, kein Verlust bestehender Funktionalität.
- **Tests:** keine neuen (reines Markup/Attribut).
- **DoD:** offen.
## UI2-004 — Skeleton-Loading für Dashboard-Kacheln ## UI2-004 — Skeleton-Loading für Dashboard-Kacheln
@@ -94,14 +126,99 @@ Grundlage, hier werden zusätzliche, im Code konkret nachgewiesene Lücken gesch
- **Tests:** keine neuen. - **Tests:** keine neuen.
- **DoD:** offen. - **DoD:** offen.
## UI2-006 — Toast/Benachrichtigungskomponente
- **Ziel:** Aktionsfeedback (gespeichert/Fehler/Sync-Status) ohne Modal-Unterbrechung.
- **Beschreibung:** Leichtgewichtige Toast-Komponente (kein `sonner`-Paket-Zwang,
Pattern nachbaubar: Portal + Auto-Dismiss-Timer + Stapel-Anzeige bei mehreren
gleichzeitigen Meldungen).
- **Benutzerwert:** Häufige kleine Aktionen (Kontrolle bestätigen, Position speichern)
unterbrechen den Arbeitsfluss nicht mit einem Wegklick-Dialog.
- **Abhängigkeiten:** UI2-001
- **Backend:** keins
- **Frontend:** neue `components/ui/toast.tsx`, zentrale Toast-Provider-Einbindung
- **Mobile:** Dauer konfigurierbar halten (bei schlechtem Netz/langsamer Interaktion
reicht kurze Anzeigedauer sonst nicht)
- **Rechte:** keine Änderung
- **Akzeptanzkriterien:** Toast erscheint bei Erfolg/Fehler, verschwindet automatisch,
mehrere gleichzeitige Toasts stapeln statt überschreiben.
- **Tests:** keine neuen (reines UI).
- **DoD:** offen.
## UI2-007 — Dialog/AlertDialog-Baustein für Bestätigungen
- **Ziel:** Einheitliche Bestätigungsdialoge (z.B. „Material löschen?") statt nativem
`window.confirm()`.
- **Beschreibung:** Radix-artiges Dialog-Pattern mit Fokus-Trap und Escape-zum-Schließen,
große Touch-taugliche Buttons.
- **Benutzerwert:** Konsistentes Aussehen statt Browser-natives, unstyliertes
`confirm()`-Popup; Fokus-Trap verhindert versehentliches Wegtippen auf Tablet.
- **Abhängigkeiten:** UI2-001
- **Backend:** keins
- **Frontend:** neue `components/ui/dialog.tsx`/`alert-dialog.tsx`, schrittweise
bestehende `confirm()`-Aufrufe ersetzen
- **Mobile:** Priorität — Fokus-Trap/Escape wichtig bei externer Tastatur an Tablets
mit Kartenleser
- **Rechte:** keine Änderung
- **Akzeptanzkriterien:** mind. eine bestehende `confirm()`-Stelle ersetzt, Verhalten
(Bestätigen/Abbrechen) unverändert.
- **Tests:** bestehende Tests an der ersetzten Stelle bleiben grün.
- **DoD:** offen.
## UI2-008 — Badge-Komponente für Status-Chips
- **Ziel:** Bestandsstatus/Ablaufdatum-Kennzeichnung visuell einheitlich statt
Ad-hoc-Farbklassen je Stelle.
- **Beschreibung:** Kleine `Badge`-Komponente mit Varianten (ok/warnung/kritisch/
abgelaufen), nutzt UI2-001-Tokens.
- **Benutzerwert:** Schneller visueller Überblick in Listen/Kacheln, geringer Aufwand.
- **Abhängigkeiten:** UI2-001
- **Backend:** keins
- **Frontend:** neue `components/ui/badge.tsx`, Einsatz in Materiallisten/Dashboard
- **Rechte:** keine Änderung
- **Akzeptanzkriterien:** mind. eine Liste (z.B. Ablaufdatum-Übersicht) nutzt Badge
statt Inline-Farbklassen.
- **Tests:** keine neuen.
- **DoD:** offen.
## UI2-010 — Dark-Mode-fähige Token-Struktur (Vorbereitung, kein Umschalter)
- **Ziel:** UI2-001-Tokens so anlegen, dass ein späterer Dark-Mode-Umschalter keinen
Umbau der Token-Struktur erfordert — auch wenn der Umschalter selbst kein aktueller
Bedarf ist (Tablet im Feld, meist Tageslicht).
- **Beschreibung:** Je Token aus UI2-001 (`--color-card`, `--color-popover`, etc.)
zusätzlich einen `.dark`/`[data-theme=dark]`-Override-Block in `tokens.css`
vorsehen, auch wenn er anfangs mit denselben Werten wie Light gefüllt ist.
- **Benutzerwert:** Kein nachträglicher Breaking-Umbau, falls Dark Mode später doch
gebraucht wird (z.B. Nachteinsätze).
- **Abhängigkeiten:** UI2-001
- **Backend:** keins
- **Frontend:** `styles/global/tokens.css`
- **Rechte:** keine Änderung
- **Akzeptanzkriterien:** jeder neue UI2-001-Token hat einen Dark-Override-Platzhalter,
keine funktionale Änderung im Light-Modus.
- **Tests:** keine neuen (reines CSS).
- **DoD:** offen. **Achtung MABEA-spezifisch:** Cascade-Layer-Struktur beachten
(`global-css`-Layer niedriger als Tailwind-Layer, siehe CLAUDE.md „Wichtige
Stolperfallen") — Dark-Override darf keine Layer-Kollision mit Tailwinds `@theme`
erzeugen, insbesondere keinen Tailwind-Token-Namen doppelt vergeben.
--- ---
**Reihenfolge (empfohlen, nicht blockierend zwischen 002-005):** UI2-001 zuerst **Reihenfolge (empfohlen, nicht blockierend innerhalb der Gruppen):** UI2-001 zuerst
(Basis für alle), danach UI2-002..005 in beliebiger Reihenfolge nach Nutzerpriorität. (Basis für alle). Danach zwei unabhängige Gruppen: UI2-002/003+009/010 (Struktur/
Formulare/Tokens) und UI2-004/005/006/007/008 (einzelne UI-Bausteine) — Reihenfolge
innerhalb der Gruppen nach Nutzerpriorität.
**Nicht-Ziele:** kein Wechsel auf react-hook-form/zod/Radix, kein kompletter **Nicht-Ziele:** kein Wechsel auf react-hook-form/zod/Radix, kein kompletter
Frontend-Neubau, keine Breaking Changes an bestehender Fachlogik/API. Frontend-Neubau, keine Breaking Changes an bestehender Fachlogik/API. Bewusst NICHT
übernommen (Overkill/Desktop-lastig für ein Fach-Tool, siehe vertiefte Analyse
2026-09-09): Command-Palette/Combobox, Navigation-Menu, Accordion/Collapsible, Avatar,
Pagination, Tooltip (auf Touch unzuverlässig), Sidebar-Zusatzfeatures wie
Cookie-Persistenz/Keyboard-Shortcuts.
## Referenzen ## Referenzen
Subagenten-Analyse `ai-coding-starter-kit-v2`, Chat 2026-09-08 (kein Frontend-Neubau, Subagenten-Analyse `ai-coding-starter-kit-v2`, Chat 2026-09-08 (kein Frontend-Neubau,
Patterns schrittweise als Kacheln übernehmen). Patterns schrittweise als Kacheln übernehmen). Vertiefte Analyse derselben Quelle
2026-09-09 (vollständige Komponentenliste, a11y-Patterns, Dark-Mode-Struktur) ergab
UI2-006..010.
+64
View File
@@ -0,0 +1,64 @@
# Epic 23 — Flutter-Begleit-App (Sondierung, P3)
**Bewusst nur als Sondierungs-Prototyp geplant, keine Grundsatzentscheidung.**
Motivation: PWA (Epic 15 Mobile) deckt den Tablet-Feldeinsatz bereits weitgehend ab
(MOBILE-001/002/004/005 fertig). Offen ist, ob native Kamera-API für den QR-Scan
spürbar zuverlässiger ist als Browser-`getUserMedia`/`@zxing/browser` — das soll ein
einzelner Prototyp-Screen klären, bevor irgendeine Grundsatzentscheidung
(Ergänzung vs. Ablösung der PWA) fällt.
**Build-Umgebung**: separater Server `192.168.1.236` (Hostname `aicontrol`), Flutter+
Android-SDK bereits installiert, unabhängig von MABEA-Infrastruktur — reiner
Build-Host, kein Dauerbetrieb der App dort (App läuft auf Endgeräten).
---
## FLUT-001 — QR-Scan-Prototyp gegen MABEA-Backend (P3, Sondierung)
- **Ziel:** Klären, ob native Kamera-API (Flutter, z.B. `mobile_scanner`-Paket) den
QR-Scan-Workflow spürbar zuverlässiger/schneller macht als die PWA-Lösung —
KEIN Ersatz für MOBILE-002, nur Vergleichsdatenpunkt.
- **Scope (bewusst minimal):** Login-Screen (JWT gegen `/api/v1/auth/login`) +
EIN Screen QR-Scan → Objekt-Identifikation anzeigen. Kein voller
Kontroll-Workflow, keine Offline-Fähigkeit, kein Produktionsanspruch.
- **Abhängigkeiten:** MABEA-Backend-API (bestehend, unverändert nutzbar — FastAPI/
REST ist stack-agnostisch, kein Rückbau nötig)
- **TLS/Zertifikat — entschieden 2026-09-10: Option 1 (echte Domain + Let's
Encrypt).** Domain `mabea.perlbach-edv.de` vorhanden, DNS zeigt bereits auf die
öffentliche WAN-IP, gültiges Let's-Encrypt-Zertifikat existiert bereits
(`CN=mabea.perlbach-edv.de`, Issuer Let's Encrypt) — läuft aber noch über einen
vorgelagerten Reverse-Proxy (openresty, vermutlich Nginx Proxy Manager im
Heimnetz des Nutzers), der aktuell nur auf sich selbst redirected statt auf
MABEA (`192.168.1.238`) durchzuleiten. **Nutzer kümmert sich selbst** um den
Proxy-Host-Eintrag (`mabea.perlbach-edv.de``192.168.1.238`) — liegt außerhalb
des MABEA-Server-Zugriffs. Sobald das steht: `VITE_API_BASE_URL` bleibt für die
PWA unverändert relativ (`/api/v1`, CLAUDE.md-Regel), die Flutter-App nutzt
stattdessen `https://mabea.perlbach-edv.de/api/v1` als fest hinterlegte absolute
Basis-URL — kein selbstsigniertes Zertifikat, kein Cert-Pinning, kein
Sonderweg mehr nötig.
- **Prüfschritt vor Implementierungsstart:** verifizieren, dass
`https://mabea.perlbach-edv.de/api/v1/health` tatsächlich 200 liefert (nicht
mehr den aktuell beobachteten Redirect-Loop), bevor die App-Basis-URL
festgelegt wird.
- **DECISION REQUIRED — App-Identität:** Package-Name (z.B. `de.<org>.mabea`),
Anzeigename, Icon — noch nicht festgelegt, nicht kritisch für den Prototyp
(Platzhalter-Werte reichen), aber nötig vor einem echten Android-Build.
- **DECISION REQUIRED — Test-Instanz:** gegen Prod-Backend (192.168.1.238) direkt
testen, oder separater Test-Zugang? Für einen reinen Kamera-Vergleichstest
spricht wenig gegen Prod (nur Lesezugriff: Login + QR-Scan-Anzeige, keine
Schreibaktionen im Scope).
- **Nicht-Ziele:** kein Ersatz für die PWA, keine Offline-Fähigkeit, kein
vollständiger Kontroll-Workflow, keine Store-Veröffentlichung (Sideload/interner
Test-Build reicht für die Sondierung).
- **DoD:** offen, **P3 — reine Sondierung, kein MVP-Bestandteil**. Ergebnis dieses
Prototyps entscheidet, ob ein Folge-Epic (voller Kontroll-Workflow) überhaupt
sinnvoll ist — nicht vorher committen.
---
## Referenzen
Chat 2026-09-10: Motivation/Trade-offs erstmals besprochen (Offline-Fähigkeit,
native Hardware-Zugriffe, App-Store-Distribution als Nachteil für internes
BOS-Tool). Nutzer-Entscheidung: MABEA-Begleit-App, nur Build-Server, kein
Dauerbetrieb auf `192.168.1.236`. TLS-Blocker entdeckt bei Server-Check
`192.168.1.238` (`/etc/nginx/sites-enabled/mabea.conf`).
+364
View File
@@ -12,3 +12,367 @@ Keine Commits in dieser Session.
- arbeitskacheln/16_operations.md | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - arbeitskacheln/16_operations.md | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--- ---
## 2026-09-09 09:42 09:44 (2m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:47 09:48 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:50 09:50 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:50 09:50 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:52 09:53 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:56 09:56 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 09:59 10:00 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 10:00 10:01 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 10:01 10:03 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 10:05 10:07 (2m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 10:09 10:11 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 10:47 10:47 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 11:45 11:45 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 11:46 11:46 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 11:48 11:49 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 11:50 11:50 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 12:27 12:28 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 12:38 12:38 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 12:40 12:41 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 13:04 13:05 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 13:06 13:06 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 13:10 13:12 (2m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 13:19 13:19 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 13:21 13:22 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 13:23 13:25 (2m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 13:27 13:27 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 13:32 13:32 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 13:32 13:33 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
+286
View File
@@ -438,3 +438,289 @@ Keine Commits in dieser Session.
- backend/tests/test_dokument.py | 10 +++++++--- - backend/tests/test_dokument.py | 10 +++++++---
--- ---
## 2026-09-09 12:09 12:09 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** src
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 12:12 12:12 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 12:14 12:14 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 13:51 13:54 (3m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 14:08 14:09 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 14:10 14:10 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 14:21 14:22 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 14:22 14:23 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 15:43 15:44 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 15:45 15:45 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 16:02 16:02 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 16:03 16:03 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 16:03 16:04 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 16:04 16:04 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 16:05 16:05 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 16:10 16:10 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 22:04 22:05 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 22:52 22:52 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 23:36 23:39 (2m)
**Beschreibung:** Claude Code Session
**Projekt:** timemaster
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 23:43 23:47 (3m)
**Beschreibung:** Claude Code Session
**Projekt:** timemaster
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-10 00:01 00:02 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-10 00:03 00:03 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** backend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
+78
View File
@@ -827,3 +827,81 @@ Keine Commits in dieser Session.
- frontend/src/components/WartungSection.tsx | 111 ++- - frontend/src/components/WartungSection.tsx | 111 ++-
--- ---
## 2026-09-10 00:27 00:32 (4m)
**Beschreibung:** Claude Code Session
**Projekt:** asb-material
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-10 00:32 00:34 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** frontend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-10 00:37 00:38 (1m)
**Beschreibung:** Claude Code Session
**Projekt:** frontend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-10 00:45 00:45 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** frontend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-10 00:45 00:46 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** frontend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-10 00:47 00:48 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** frontend
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
+28
View File
@@ -0,0 +1,28 @@
# src Dev Log
## 2026-09-09 11:57 11:58 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** arbeitskacheln
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---
## 2026-09-09 12:00 12:00 (0m)
**Beschreibung:** Claude Code Session
**Projekt:** src
### Commits
Keine Commits in dieser Session.
### Geänderte Dateien
- DEVLOG.md | 52 ++++++++++++++++++++++++++
- frontend/package-lock.json | 229 ++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------
- frontend/package.json | 2 +-
---