Commit Graph
251 Commits
Author SHA1 Message Date
patrickandClaude Sonnet 5 163c881b82 feat(personal): PERS-008 Einweisungspflicht-Warnung bei Geräteausgabe
CI / backend-tests (push) Failing after 2m53s
CI / frontend-build (push) Successful in 21s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 15:41:58 +02:00
patrickandClaude Sonnet 5 80bd79ad4d docs(arbeitskacheln): 5 neue Kacheln aus vertieftem HiOrg-Server-Vergleich (PERS-008, ASSET-011/012, MAINT-008, LOAD-007)
CI / backend-tests (push) Successful in 2m54s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 15:35:16 +02:00
patrickandClaude Sonnet 5 52bf7d9ec9 feat(assets): ASSET-007 Material-Sets (Kits), ASSET-008 Consumable-Doku korrigiert
CI / frontend-build (push) Successful in 19s
CI / backend-tests (push) Successful in 2m55s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 15:22:02 +02:00
patrickandClaude Sonnet 5 0aa5d6d249 feat(fleet): FLEET-006 Fahrzeug-Einsatzhistorie über OPS-002
CI / backend-tests (push) Successful in 2m51s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 15:11:17 +02:00
patrickandClaude Sonnet 5 7219762a4c docs(arbeitskacheln): FLEET-004 Index-Status korrigiert (war bereits vollständig umgesetzt)
CI / backend-tests (push) Successful in 2m52s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 15:08:34 +02:00
patrickandClaude Sonnet 5 ad4483e18c fix(inspections): pruefung.geraet_instanz_id FK mit ON DELETE CASCADE (CI-Fix, DELETE /geraete/{id} war blockiert)
CI / backend-tests (push) Successful in 2m50s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 15:02:10 +02:00
patrickandClaude Sonnet 5 25437ec070 feat(inspections): INSP-001..004 Phase 1 generisches Pruefart-System additiv (Dual-Write, FAILED-Ampel)
CI / backend-tests (push) Failing after 2m53s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 14:57:30 +02:00
patrickandClaude Sonnet 5 8e4c2608e3 feat(foundation): FOUND-006 strukturiertes Logging, FOUND-010 DB-Backup-Timer, IDENT-010 GTIN-Materialabgleich
CI / backend-tests (push) Successful in 2m50s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 14:07:22 +02:00
patrickandClaude Sonnet 5 fdeae8b5e3 docs(arbeitskacheln): FOUND-013 Error-Tracking (GlitchTip) geplant, Index-Statuszeilen auf Ist-Stand nachgezogen
CI / backend-tests (push) Successful in 2m50s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 13:33:01 +02:00
patrickandClaude Sonnet 5 ddd1b446a2 feat(einsatz): Epic 16 Einsatz-Nachdokumentation (OPS-001/002/003 kombiniert)
CI / backend-tests (push) Successful in 2m48s
CI / frontend-build (push) Successful in 19s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 13:07:47 +02:00
patrickandClaude Sonnet 5 46a65ba6ff feat(readiness): READY-001 an/abschaltbare Bereitschafts-Kriterien (abgespeckte Regel-Engine)
CI / backend-tests (push) Successful in 2m48s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 12:51:02 +02:00
patrickandClaude Sonnet 5 d41d04c26c feat(ui): UI2-002/003/004/005 Sheet-Navigation, FormField-Einsatz, Skeleton, Table-Wrapper
CI / backend-tests (push) Successful in 2m45s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 12:37:16 +02:00
patrickandClaude Sonnet 5 91cfb1087f feat(notif): NOTIF-003 proaktive Wartungsfälligkeits-Benachrichtigung
CI / backend-tests (push) Successful in 2m46s
CI / frontend-build (push) Successful in 17s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 12:17:57 +02:00
patrickandClaude Sonnet 5 d095db4172 docs(arbeitskacheln): FLUT-001 auf Ist-Stand nachgezogen (v0.1.0-v0.5.0), FLUT-002 als offene Frage dokumentiert
CI / frontend-build (push) Successful in 17s
CI / backend-tests (push) Successful in 2m44s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 12:06:42 +02:00
patrickandClaude Sonnet 5 1457496763 fix(tests): admin-Token für Geräteinstanz-Anlage nutzen statt mitarbeiter (CI-Fix ASSET-010)
CI / backend-tests (push) Successful in 2m43s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 11:56:43 +02:00
patrickandClaude Sonnet 5 24db5a056f feat(custody): ASSET-010 Gerät-Ausgabe/Rücknahme mit optionalem QR-Signier-Flow
CI / backend-tests (push) Failing after 2m42s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 11:52:07 +02:00
patrickandClaude Sonnet 5 1147ec0872 feat(ui): UI2-001/006/007/009/010 Design-Tokens, Toast, AlertDialog, Formular-a11y
CI / backend-tests (push) Successful in 2m38s
CI / frontend-build (push) Successful in 17s
chore(agents): Flutter/iOS/Swift-Subagenten aus claude-subagents-Repo übernommen

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 11:36:42 +02:00
patrickandClaude Sonnet 5 eeb87d889d feat(permission): ZUST-003 Standort-Scoping für granulare Rollen-Berechtigungen
CI / backend-tests (push) Successful in 2m38s
CI / frontend-build (push) Successful in 17s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 11:22:34 +02:00
patrickandClaude Sonnet 5 e7e6c4c8af fix(tests): hash-Feld bei direkter Historie()-Konstruktion ergänzen, Erwartungswert korrigiert (CI-Fix FILE-008)
CI / backend-tests (push) Successful in 2m33s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 11:12:10 +02:00
patrickandClaude Sonnet 5 429ece3c65 feat(historie): FILE-008 manipulationssicheres Audit-Journal (Hash-Kette je Ressource)
CI / backend-tests (push) Failing after 2m34s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 11:08:07 +02:00
patrickandClaude Sonnet 5 a1ad2d6cef feat(readiness): READY-006 täglicher Bereitschafts-Snapshot mit Trend-Dashboard und Akte-Historie
CI / backend-tests (push) Successful in 2m32s
CI / frontend-build (push) Successful in 19s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 10:54:08 +02:00
patrickandClaude Sonnet 5 bb0c601b2f feat(foundation): FOUND-008 gemeinsame Fristen-Normalisierung (Dringlichkeits-Ampel)
CI / backend-tests (push) Successful in 2m28s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 10:42:06 +02:00
patrickandClaude Sonnet 5 04a255429d feat(wartung): MAINT-007 Tankbuch/Kraftstoffverbrauch je Fahrzeug
CI / backend-tests (push) Successful in 2m30s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 10:32:10 +02:00
patrickandClaude Sonnet 5 96499d655f fix(api): import_export-Router vor objekte/geraet_instanz registriert (Routenkonflikt /objekte/export, CI-Fix)
CI / backend-tests (push) Successful in 2m28s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 10:13:56 +02:00
patrickandClaude Sonnet 5 76a984ad56 fix(tests): login als Helper-Funktion statt Fixture importieren (CI-Fix FOUND-007)
CI / backend-tests (push) Failing after 2m26s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 10:09:15 +02:00
patrickandClaude Sonnet 5 807c818405 feat(foundation): FOUND-007 CSV-Import/Export für Objekte und Geräteinstanzen
CI / backend-tests (push) Failing after 2m28s
CI / frontend-build (push) Successful in 18s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 10:04:56 +02:00
patrickandClaude Sonnet 5 eaafeeb89c fix(admin): Download-Link auf aktuelle APK-Version v0.5 korrigiert
CI / backend-tests (push) Successful in 2m28s
CI / frontend-build (push) Successful in 17s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 08:38:50 +02:00
patrickandClaude Sonnet 5 15bbab258b feat(admin): Download-Link für FLUT-001 Scan-Prototyp im Portal
CI / backend-tests (push) Successful in 2m52s
CI / frontend-build (push) Successful in 48s
Admin-only Hinweis mit Link auf die APK unter /downloads/ - reine Sondierung,
kein Produktivstand.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 01:06:45 +02:00
patrickandClaude Sonnet 5 1e8d66f636 feat(akte): FILE-009 Freitext-Notizen an beliebiger Ressource
CI / backend-tests (push) Successful in 2m39s
CI / frontend-build (push) Successful in 20s
Polymorphes akte_notiz-Modell (gleiches entitaet_typ/entitaet_id-Muster wie
Dokument/Historie/Mangel), CRUD-Endpunkte, NotizenPanel im Akte-Grid. Löschen
nur durch Autor oder Administrator.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-10 00:49:47 +02:00
patrickandClaude Sonnet 5 9c6426190e 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
2026-09-10 00:49:32 +02:00
patrickandClaude Sonnet 5 3e39c3b7fd fix(frontend): @vitejs/plugin-react auf v6 für Vite-8-Kompatibilität
CI / backend-tests (push) Successful in 2m26s
CI / frontend-build (push) Successful in 24s
CI schlug fehl (ERESOLVE): @vitejs/plugin-react@4.7.0 kennt nur Vite
bis v7 als Peer-Dependency, lief lokal nur weil node_modules bereits
force-aufgelöst war. v6.1.1 unterstützt Vite 8 nativ, sauberes
npm install ohne --force jetzt möglich, 0 vulnerabilities.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 22:46:50 +02:00
patrickandClaude Sonnet 5 e10123fae7 chore(frontend): Vite-Major-Upgrade auf v8 (npm audit fix)
CI / backend-tests (push) Successful in 2m27s
CI / frontend-build (push) Failing after 3s
Schließt alle 6 gemeldeten Schwachstellen (esbuild-Dev-Server-CVE,
GHSA-67mh-4wv8-2f99), betraf nur den lokalen Dev-Server, kein
Produktions-Impact. Vite 5->8, vitest 2->5, vite-plugin-pwa 0.20->1.3.
tsc/build/vitest lokal geprüft, 0 vulnerabilities.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 22:41:48 +02:00
patrickandClaude Sonnet 5 7dc6446a56 feat(personal): PERS-001/002 Person fachlich von Benutzer getrennt
CI / backend-tests (push) Successful in 2m29s
CI / frontend-build (push) Successful in 28s
Neue Tabelle person (Migration 0034, Backfill bestehender Benutzer 1:1
per Zeilennummer, keine Datenverluste). Benutzer.person_id optional -
Login kann bestehende Person verknüpfen oder legt automatisch eine neue
an (Rückwärtskompatibilität zum bisherigen Anlegen-Flow). /personen-CRUD
(admin-only), neue PersonSection.tsx im Personal-Tab, BenutzerSection
um Personen-Auswahl erweitert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 22:31:46 +02:00
patrickandClaude Sonnet 5 847c303a97 feat(wartung): MAINT-005 Ersatzteile/Kosten je Wartungsauftrag
CI / backend-tests (push) Successful in 2m22s
CI / frontend-build (push) Successful in 25s
Neue Tabelle wartungsauftrag_teil (Migration 0033), CRUD-Endpunkte
/wartungsauftraege/{id}/teile, UI-Panel in WartungSection.tsx mit
Summenanzeige. Backlog Epic 22 (UI-Redesign Runde 2, Kacheln UI2-001..005)
als geplant ergänzt, Umsetzung folgt separat.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 22:06:02 +02:00
patrickandClaude Sonnet 5 3b5cf8feab feat(identity): IDENT-003 konfigurierbare Nummernschemata je Objekttyp
CI / backend-tests (push) Successful in 2m24s
CI / frontend-build (push) Successful in 27s
Neue Stammdaten-Tabelle nummernschema (Migration 0032): Präfix + Stellenzahl
einmal je Objekttyp festlegen statt bei jeder Objekt-Anlage manuell
einzutippen (Fehlerquelle - Tippfehler, uneinheitliche Schreibweise,
falsches Präfix für den Typ). GET /objekte/naechster-code akzeptiert jetzt
objekttyp_id als Alternative zu praefix; ohne konfiguriertes Schema bleibt
der bisherige manuelle Präfix-Weg nutzbar (Rückwärtskompatibilität).

Admin-UI: Nummernschema-Pflege direkt in der Objekttyp-Verwaltung
(ObjekttypSection). ObjektAnlegenFormular versucht zuerst das Schema des
gewählten Objekttyps, fällt bei 404 auf manuelles Präfix zurück.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 20:23:14 +02:00
patrickandClaude Sonnet 5 15f783fb5e feat(personal): PERS-004 Einsatzfunktionen (Gruppenführer/Melder/...)
CI / backend-tests (push) Successful in 2m17s
CI / frontend-build (push) Successful in 26s
Neue Stammdaten-Tabelle einsatzfunktion (Migration 0031), benutzer bekommt
optionales einsatzfunktion_id-Feld - analog zu einheit_id modelliert, eine
Person hat im Regelfall genau eine primäre Einsatzfunktion. Bewusst
getrennt von den technischen App-Rollen (RolleTyp), die nur steuern, was
jemand in MABEA tun darf, nicht welche Funktion er im Einsatz hat.

CRUD-Endpunkt /einsatzfunktionen nach Kategorie-Muster, Duplikat-Prüfung
vorab (Projekt-Konvention). Admin-UI: Auswahl + Inline-Neuanlage in der
Benutzerverwaltung (BenutzerSection).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 20:07:16 +02:00
patrickandClaude Sonnet 5 b7d9581b90 feat(identity): IDENT-009 QR-/Code-Neuvergabe mit Historie
CI / backend-tests (push) Successful in 2m20s
CI / frontend-build (push) Successful in 27s
POST /objekte/{id}/code-neu-vergeben und /objektpositionen/{id}/code-neu-
vergeben (admin-only) - z.B. bei beschädigtem/verlorenem Etikett. Alter
Code bleibt über die bestehende Audit-Infrastruktur (Historie-Tabelle,
Prompt 13) nachvollziehbar statt eine eigene Versions-Tabelle zu brauchen:
GET /historie?entitaet_typ=objekt&entitaet_id=... zeigt alter_wert/
neuer_wert des Codes. Duplikat-Prüfung explizit vorab (Projekt-Konvention,
siehe geraet_instanz.py::erstelle).

Frontend: "Code neu vergeben"-Aktion in der Objektakte (nur Admin), inline
statt window.prompt (Accessibility-Vorgabe aus dieser Session).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 18:13:53 +02:00
patrickandClaude Sonnet 5 08ce8efe55 fix(backend): Hersteller/Modell-Duplikatprüfung vorab statt über UNIQUE-Constraint
CI / backend-tests (push) Successful in 2m17s
CI / frontend-build (push) Successful in 27s
Testsuite-get_db-Override macht kein Rollback bei Exceptions (dokumentierter
Fund 2026-09-05) - ein Flush-Fehlschlag über IntegrityError hinterlässt die
geteilte Test-Session im PendingRollbackError-Zustand für jeden folgenden
Request im selben Test. Projekt-Konvention laut geraet_instanz.py::erstelle
ist deshalb explizites Vorab-Prüfen statt Verlassen auf den DB-Constraint -
hier nachgezogen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 14:56:05 +02:00
patrickandClaude Sonnet 5 2dd7e574e6 feat(identity): IDENT-005 Hersteller/Modell-Stammdaten
CI / backend-tests (push) Failing after 2m16s
CI / frontend-build (push) Successful in 26s
Neue Tabellen hersteller/modell (Migration 0030), CRUD-Endpunkte
(/hersteller, /modelle) nach bestehendem Kategorie-Muster, inkl. 409 bei
Duplikaten (IntegrityError abgefangen wie in personal.py). geraet_instanz
bekommt optionales modell_id-Feld - verknüpft eine konkrete Geräteinstanz
(mit Seriennummer, IDENT-004) mit ihrem Hersteller/Modell.

Ergänzt Material.hersteller (bleibt unverändert als Freitext) um eine
normalisierte Variante gezielt für Geräte mit Seriennummer - keine
Datenmigration bestehender Freitext-Werte (Scope dieser Kachel).

Bewusst kein neues Admin-UI-Screen für die Pflege (Scope-Grenze der
Kachel) - Hersteller/Modell aktuell nur über die API verwaltbar.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 14:51:15 +02:00
patrickandClaude Sonnet 5 ae09433c11 feat(dokumente): DOC-004 Original-vs-Kopie-Kennzeichnung
CI / backend-tests (push) Successful in 2m16s
CI / frontend-build (push) Successful in 27s
Neues Feld ist_original (Boolean, Migration 0029) - explizit beim Upload
und beim Ersetzen (DOC-003) setzbar, kein Default in eine Richtung erraten.
Wird beim Ersetzen bewusst NICHT vom Vorgänger übernommen (neue Version
könnte ein nachgereichtes Original sein, das eine bisherige Kopie ersetzt,
oder umgekehrt). Frontend: Checkbox "Original (nicht nur Kopie/Scan)" im
Upload-Formular, "Original"-Badge in der Dokumentenliste.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 12:16:25 +02:00
patrickandClaude Sonnet 5 17cac8543f perf(db): 80 fehlende Indizes auf Fremdschlüssel-Spalten ergänzt
CI / backend-tests (push) Successful in 2m15s
CI / frontend-build (push) Successful in 27s
Postgres legt für FK-Spalten selbst KEINEN Index an (nur für die
referenzierte PK-Seite) - grep über alle Models ergab 0 explizite Indizes
im gesamten Schema trotz 86 Fremdschlüsseln. Ohne Index braucht jede
Lookup-Query von der "viele"-Seite (z.B. "alle Fehlbestände zu diesem
Objekt", "alle Kontrollen zu diesem Benutzer") einen Sequential Scan -
bei aktueller Datenmenge unauffällig, würde mit wachsendem Bestand aber
zum Problem.

5 Spalten ausgelassen, weil bereits über eine UniqueConstraint als
führende Spalte indiziert (Postgres nutzt den führenden Teil eines
zusammengesetzten Unique-Index für Einzelspalten-Lookups genauso):
objektposition.objekt_id, bestand.lagerplatz_id, beladungsvorlage.
objekttyp_id, vorlagenposition.vorlage_id, benutzer_qualifikation.
benutzer_id. dokument.vorgaenger_id hatte bereits einen Index (Migration
0027).

Fund beim Abgleich gegen die database-optimization-Checkliste aus
ai-coding-starter-kit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 11:31:49 +02:00
patrickandClaude Sonnet 5 567ce9d3c3 fix(test): Löschen-Test nutzte falsche Rolle (Mitarbeiter statt Verantwortlicher)
CI / backend-tests (push) Successful in 2m18s
CI / frontend-build (push) Successful in 28s
entferne_dokument verlangt _materialverantwortliche - Mitarbeiter-Login lief
mit 403 ins Leere, v2 blieb aktuell, Test verglich falsche ID gegen v1.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 11:23:42 +02:00
patrickandClaude Sonnet 5 977d81ddcd feat(dokumente,identity): DOC-003 Versionierung + QR-Code-Etiketten
CI / backend-tests (push) Failing after 2m15s
CI / frontend-build (push) Successful in 28s
Dokument-Versionierung: vorgaenger_id verkettet Versionen (Migration 0027),
POST /dokumente/{id}/ersetzen legt neue Version an statt zu überschreiben,
alte Fassung bleibt als Historie erhalten. GET /dokumente/{id}/versionen
liefert die Kette (neueste zuerst), respektiert DOC-005-Zugriffsrechte.
Liste zeigt nur die jeweils aktuelle Version. Löschen der aktuellen Version
gibt automatisch den Vorgänger als neue "aktuelle" frei. Frontend:
"Ersetzen"-Button + aufklappbare Versionshistorie im DokumentePanel.

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

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 11:03:46 +02:00
patrickandClaude Sonnet 5 d5d8c72d9a docs: FOUND-012 im Backlog auf erledigt gesetzt (README.md ergänzt)
CI / backend-tests (push) Successful in 2m21s
CI / frontend-build (push) Successful in 32s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 10:47:53 +02:00
patrickandClaude Sonnet 5 2c98874fc8 docs: README.md angelegt (Funktionsumfang, Techstack, lokale Entwicklung)
CI / backend-tests (push) Successful in 2m20s
CI / frontend-build (push) Successful in 33s
FOUND-012 (Dokumentationsgerüst) war laut Backlog-Abgleich offen - kein
README im Projektwurzelverzeichnis. Fasst zusammen, was MABEA kann
(Digitale Akte, Kontrolle, Fehlbestandsmanagement, Warehouse, Wartung,
Dokumente, Suche, Dashboard, PWA/Offline, ...), Techstack und wie man
Backend/Frontend lokal startet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 10:47:30 +02:00
patrickandClaude Sonnet 5 562e7c1c6f fix(test): DOC-005-Filtertest kollidierte mit eigener Rechnung-Einschränkung
CI / backend-tests (push) Successful in 2m17s
CI / frontend-build (push) Successful in 29s
test_liste_kann_nach_dokumenttyp_gefiltert_werden lief als Mitarbeiter,
einer der beiden Testtypen war "rechnung" - die DOC-005-Einschränkung
(diese Session) blendet Rechnungen für Mitarbeiter jetzt aus, Test lief auf
Materialverantwortlicher-Login um.

chore: drei Original-Excel-Rucksacklisten aus dem Repo genommen (waren nur
Referenzmaterial aus der Konzeptphase, gehören nicht ins Code-Repo) und
*.xlsx in .gitignore aufgenommen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 10:43:28 +02:00
patrickandClaude Sonnet 5 654d448e7b feat(dokumente): DOC-005 Zugriffsrechte je Dokumenttyp (Rechnungen eingeschränkt)
CI / frontend-build (push) Successful in 28s
CI / backend-tests (push) Failing after 2m17s
Rechnungen sind finanziell sensibel - nur Materialverantwortliche/
Leitungsverantwortliche/Administration dürfen sie in der Liste sehen und
herunterladen (403 bei direktem Downloadversuch), Mitarbeiter nicht.
Hochladen bleibt für alle offen (z.B. Wareneingang direkt scannen). Andere
Dokumenttypen bleiben unverändert für jeden mit Aktenzugriff sichtbar - die
werden im Feldeinsatz gebraucht. EINGESCHRAENKTE_DOKUMENTTYPEN als zentrale
Stelle für künftige weitere Einschränkungen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 10:39:42 +02:00
patrickandClaude Sonnet 5 069a1ee7ee feat(dokumente): DOC-002 feste Dokumenttypen statt Freitext
CI / backend-tests (push) Successful in 2m14s
CI / frontend-build (push) Successful in 36s
Neues Pflichtfeld dokumenttyp (Enum: Prüfprotokoll/Wartungsbericht/
Bedienungsanleitung/Rechnung/Zulassungsdokument/Sonstiges, Migration 0026)
- macht Dokumente kategorisier- und filterbar statt nur per Freitext-
Beschreibung auffindbar zu sein. Backend: Pflichtfeld beim Upload, optionaler
Query-Filter bei GET /dokumente. Frontend: Auswahl-Dropdown beim Upload,
Typ-Badge + Filter-Dropdown in der Liste (DokumentePanel).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 10:32:25 +02:00
patrickandClaude Sonnet 5 0619497a1e fix(deps): react-router-dom v6.30.6 -> v7.18.3 (CVE: Open-Redirect/Constructor-Injection)
CI / backend-tests (push) Successful in 2m11s
CI / frontend-build (push) Successful in 32s
GHSA-wrjc-x8rr-h8h6 + GHSA-337j-9hxr-rhxg betrafen die gesamte 6.x-Reihe,
kein gepatchtes 6.x verfügbar - v7 war die einzige Lösung. Projekt nutzt
nur den klassischen Declarative-Router (BrowserRouter/Routes/Route,
useNavigate/useParams/useSearchParams), keine Data-Router-APIs
(loaders/actions) - v7 ist dafür API-kompatibel, keine Code-Änderung nötig.
Typecheck/Build/alle 16 Vitest-Tests grün, npm audit --omit=dev jetzt 0
Vulnerabilities.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 10:16:03 +02:00
patrickandClaude Sonnet 5 e40dd01be9 fix(test): letzten CI-Fund gelöst - Fach-Merge-Test kollidierte mit Auto-Provisionierung
CI / backend-tests (push) Successful in 2m11s
CI / frontend-build (push) Successful in 28s
Per SSH-Debug auf dem Server (Wegwerf-Testdatenbank, echte pytest-Ausführung
- hier lokal ohne venv nicht möglich): erstelle_vorlage() legt für den
Freitext-Fachnamen einer Vorlagenposition bereits automatisch ein Fach an
(services/vorlagen.py). Der Test versuchte danach nochmal explizit ein Fach
mit fast demselben Namen anzulegen ("Reizverschlussfach Gross") - das
kollidierte case-insensitiv mit dem bereits automatisch erzeugten
("Reizverschlussfach gross") und schlug mit 409 fehl, worauf der Rest des
Tests mit falschen Annahmen weiterlief (KeyError 'id').

Fix: das automatisch angelegte Fach wird jetzt per Query als Ziel verwendet
statt nochmal angelegt zu werden. Komplette Suite (164 Tests) läuft auf dem
Server jetzt vollständig grün.

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