12 KiB
offene Aufgaben: sortiere die Aufgaben nach korrekter Reihenfolge, schreibe nach dieser zeile um für KI-Lesbarkeit, fertige aufgaben durchstreichen und als erledigt markieren.
Reihenfolge unten nach Abhängigkeit/Aufwand sortiert (nicht nach ursprünglicher Nummerierung).
-
1. KI-Claude-API-Block aus dem Backend entfernen(erledigt)Der gesamte "KI – Claude API"-Kartenblock in den Backend-Einstellungen (Karte, Eingabefeld, zugehöriger Code/Route) soll komplett verschwinden – wird nicht genutzt.
-
2. Backend "Betrieb"-Karte durch Rechtstexte ersetzen (Impressum, Datenschutz, Nutzungsbedingungen)(erledigt, mit einer Abweichung)Stattdessen: drei bearbeitbare Rechtstexte-Seiten (Impressum, Datenschutzerklärung, Nutzungsbedingungen), die der Admin im Backend pflegen kann.Alle drei Seiten müssen für den Kunden (Nutzer) per 1-Klick erreichbar sein – am besten als fester Link-Block unten in der Sidebar.- Abweichung: die "Betrieb"-Karte wurde nicht entfernt, da Firmenname/Logo/Adresse dort aktiv für Sidebar-Branding und die Fußzeile generierter PDFs (Musterbrief, Widerspruch, Pflegetagebuch, Patientenakte) verwendet werden – das Entfernen hätte eine echte Funktion ersatzlos gestrichen. Die Rechtstexte-Karte kam stattdessen in den frei gewordenen Slot der KI-Claude-API-Karte. Bei Bedarf bitte Rückmeldung, falls die Betrieb-Karte trotzdem weg soll (dann bräuchte die Branding-Pflege einen neuen Platz).
- Umsetzung: 3 neue
einstellungen-Schlüssel (rechtstext_impressum/_datenschutz/_agb), öffentlich abrufbar (kein Login nötig, wie bei Impressumspflicht üblich), Sidebar-Fußzeile mit 3 Links, von der Abo-Sperre ausgenommen.
-
3. Nutzerverwaltung reparieren & Admin-Dashboard auf Nutzerverwaltung fokussieren(erledigt)Bug: bei einem manuell angelegten Test-Konto lassen sich aktuell keine Aktionen ausführen.Ursache gefunden: Sperren/Löschen/Freimonate gab es nur im separaten Admin-Dashboard, nicht in der einfacheren "Nutzerverwaltung"-Karte im Backend, in der vermutlich nachgeschaut wurde – jetzt hat das Admin-Dashboard zusätzlich einen "Bearbeiten"-Button, damit dort alles an einem Ort ist.Für die Rolle Admin sind Leistungskatalog, Formulare & Recht usw. in der Sidebar irrelevant.Sidebar blendet diese Bereiche für Admin jetzt aus, Admin landet nach Login direkt auf dem Admin-Dashboard.Nutzerverwaltung um zusätzliche Informationen je Konto erweitern.Registriert-am, Letzter Login und IP-Adresse sind jetzt in der Konten-Tabelle sichtbar (Zahlungsstatus gab es über "Abo bis"/"abgelaufen"/"kein Zugang" schon vorher).
-
4. Rechnungsanschrift & Rechnungserstellung(erledigt, erweitert um Registrierung)Admin braucht in der Nutzerverwaltung Einsicht in die hinterlegte Rechnungsanschrift jedes Kontos.Teil des neuen "Bearbeiten"-Modals im Admin-Dashboard.Admin muss auf Kundenwunsch eine Rechnung für ein Konto erstellen können (PDF).Neuer "Rechnung"-Button pro Konto, erzeugt clientseitig ein PDF (gleiche Technik wie Musterbrief/Widerspruch).- Registrierungs-Button auf dem Login-Bildschirm umgesetzt: "Noch kein Konto? Jetzt registrieren" öffnet ein Formular (Name, Zugangsdaten, Pflichtfeld Rechnungsanschrift), Konto wird direkt eingeloggt.
- Nach der Registrierung ist Lesen/Ansehen sofort möglich, aber Briefe/Widersprüche, Leistungen-Zuweisung und Kalender-Einträge sind gesperrt, bis ein Abo vorliegt (unabhängig vom globalen Zahlungspflicht-Schalter) – Admin kann über "Freischalten" manuell freigeben.
- Den Standard-Zugangsdaten-Hinweis (admin/admin) von der Login-Seite entfernt.
-
5. 🔒 Sicherheits-Audit beheben (vor Live-Gang auf der Testbench)(erledigt, ausser Session-Cookie-Punkt)-
Ergebnis eines Code-Reviews von
app.py+templates/index.htmlam 2026-07-19, am 2026-07-19 direkt im Anschluss auch behoben und verifiziert (Server-Start, Login, Admin-Nutzerliste, Rate-Limit-Test). -
Kritisch:Fix:python app.py(Direktstart) lief mitdebug=Trueundhost="0.0.0.0"– RCE-Risiko übers Netz.host="127.0.0.1".start.py/Docker unverändert (Gunicorn nutzt den__main__-Block nie).
-
Hoch:Kein Datei-Typ-Whitelist beim Brief-Upload(api_brief_speichern) – jetzt gleiche.pdf-Prüfung wie beim Dokumenten-Upload.Ungeschätzte IP-Adresse im Admin-Dashboard (Stored-XSS über– Frontend jetztX-Forwarded-For)escH(n.letzte_ip||''); zusätzlich serverseitig eine neue Hilfsfunktion_client_ip()(app.py), die den Header vor dem Speichern auf[0-9a-fA-F.:]beschränkt und auf 45 Zeichen kappt (IPv4/IPv6-safe), genutzt inapi_auth_loginundapi_auth_registrieren.
-
Mittel:Keine Rate-Limits auf Login/Registrierung– einfaches In-Memory-Rate-Limiting ergänzt (_rate_limited()in app.py, pro IP+Zweck): Login max. 10 Versuche/5 Min, Registrierung max. 5/10 Min, sonst HTTP 429. Bewusst ohne neue Abhängigkeit (keinflask-limiter), da nur ein einzelner Gunicorn-Prozess mit wenigen Workern läuft und ein einfacher Zähler reicht; Limit gilt pro Worker, nicht global über alle Worker hinweg – für die aktuelle Grössenordnung ausreichend.Keine Security-Header– neuer@app.after_request-Hook_security_headers()setztX-Frame-Options: SAMEORIGIN,X-Content-Type-Options: nosniff,Content-Security-Policy: frame-ancestors 'self'. Bewusst keinscript-src/volles CSP, datemplates/index.htmldurchgehend Inline-<script>ohne Nonce/Hash verwendet – ein strengeres CSP hätte die App sofort zerschossen.Freemium-Sperre umgehbar über–/api/antraegePOST/PUT /api/antraegesind jetzt Teil der Freemium-Sperrliste inglobal_auth_check().
-
Niedrig:Admin-angelegte Konten ohne Passwort-Mindestlänge– gleiche 6-Zeichen-Prüfung jetzt auch inPOST /api/nutzerund (zusätzlich, war im Audit nicht explizit erwähnt aber gleiche Lücke) beim Passwort-Ändern inPUT /api/nutzer/<uid>.– aus der Whitelist in.svgbeim Firmenlogo-Upload erlaubt/api/admin/logoentfernt.- Session-Cookie ist weiterhin nicht
Secure– bewusst nicht behoben, wie im Audit vermerkt erst relevant sobald TLS/Reverse-Proxy vor der Testbench steht (sieheSESSION_COOKIE_SECUREin CLAUDE.md unter "Docker deployment"). Toter Code– entfernt ausadmin_password/session["admin_pw"]api_admin_get/api_admin_save, kein Frontend-Bezug vorhanden (geprüft).Unbenutzter– Import-Zeile bereinigt.urllib.request/urllib.error-Import
-
-
6. ⚠️ Separates Grossvorhaben: Migration zu React + PostgreSQL (läuft, Phase 0-6 erledigt)
- Vollständiger Technologiewechsel weg von Flask/vanilla-JS/SQLite — deutlich grösserer Umfang als die Punkte oben, keine Nebenbei-Aufgabe
- Entscheidung: kompletter Parallel-Neubau in
pflegepilot_v3/(neuer Ordner im selben Repo), alte App (pflegepilot_alpha_v2/) bleibt unverändert online. Keine Datenmigration – frische Postgres-DB, Demo-Daten, Admin-Zugang gemeinsam interaktiv angelegt. Stack: FastAPI + PostgreSQL + Next.js. Architekturplan mit 8 Phasen liegt inC:\Users\Daniel\.claude\plans\cheerful-shimmying-pnueli.md. Phase 0 – Grundgerüst(erledigt): Docker-Setup (3 Services: db/api/web, eigene Ports 5532/8100/3100, kein Konflikt mit der alten App), 11 Postgres-Tabellen per Alembic-Migration, Auth Ende-zu-Ende (Login/Registrierung/Logout/Demo-Login, Rate-Limiting, Security-Header), WeasyPrint-PDF-Smoke-Test, Next.js-Grundgerüst mit Login-Overlay. Admin-Konto gemeinsam mit dem Betreiber angelegt (nicht hartkodiert).Phase 1 – Patienten-CRUD + Isolation + Dashboard(erledigt):get_owned_patient/scoped_patienten_queryals FastAPI-Dependencies (typsicherer Ersatz der alten SQL-String-Helper), Patienten-CRUD mit 3er-Cap pro Konto, Notizen mit Änderungshistorie, Pflegegrad-Patch, Dashboard-Route. Frontend: ResponsiveTable/DateWheelPicker/BentoGrid als wiederverwendbare Bausteine, Patientenliste mit Suche/Filter, Patientenakte-Detailseite, Kurzformular für neue Patienten (der volle Interview-Wizard folgt in Phase 2). Isolation Ende-zu-Ende mit zwei echten Konten getestet: keines sieht/erreicht die Patienten des anderen (404), Admin sieht weiterhin alles. Docker-Setup um Bind-Mounts erweitert (kein Rebuild mehr nötig bei Code-Änderungen, nur Neustart).Phase 2 – Interview-Wizard(erledigt): kompletter 6-Schritte-Wizard (Persönliche Daten → Kontakt & Adresse → Krankenversicherung mit Autocomplete → Pflegesituation als verschachtelter Sub-Wizard mit Auto-Advance → regelbasierte Pflegegrad-Einschätzung → Übersicht) alsuseReducer-State-Maschine. Die Schätzlogik (5 Fragen, nicht KI-gestützt) lebt zentral im Backend (pflegegrad_regeln.py+POST /api/pflegegrad/schaetzen), 1:1 aus der alten App portiert, statt im Frontend dupliziert zu werden. Krankenkassen-Stammdaten (~86 Versicherer DE/AT/CH) ebenfalls 1:1 portiert.Phase 3 – Katalog, Rechner, Anträge, Widerspruch & Musterbrief(erledigt): Leistungskatalog (82 Einträge) + Leistungsrechner-Tabelle 1:1 portiert. Wichtigste Architektur-Änderung: PDF-Erzeugung läuft jetzt komplett serverseitig (WeasyPrint) statt client-seitig (html2pdf.js) – Brieftext-Logik für Widerspruch/Musterbrief 1:1 aus der alten App portiert (briefe_text.py), WGRUENDE-Rechtsgrund-Bausteine (28 Einträge) ebenso. PDFs liegen unterapp/uploads/briefe/<pid>/und sind nur über eineget_owned_patient-geschützte Download-Route erreichbar (Verbesserung gegenüber dem offen gemountetenstatic/der alten App) – mit zwei Konten verifiziert, dass fremde PDFs 404 liefern.require_paid_accessals erste scharf geschaltete Freemium-Sperre (Anträge/Widerspruch/Musterbrief) – mit frisch registriertem Konto ohne Abo verifiziert (402).Phase 4 – Admin-Dashboard, Audit-Log, DSGVO-Export(erledigt): Nutzerverwaltung (Basis-CRUD + Sperren/Entsperren/Soft-Delete-mit-Archivierung/Abo-Freischalten), 1:1 aus der alten App portiert (_archiviere_patient/_add_monate→archivierung.py). "Löschen" bleibt bewusst Soft-Delete (§ 630f BGB), zusätzlich durch dieON DELETE RESTRICT-FK aus Phase 0 strukturell abgesichert. Jede Admin-Aktion verlangt eine Begründung und wird unveränderlich im Audit-Log protokolliert. DSGVO-Export bündelt alle Patientendaten + Dateien als ZIP. Mit echten Kontenlebenszyklen verifiziert: Sperren blockt Login sofort, Selbstsperrung/-löschung verboten, Hard-Delete nur ohne zugeordnete Patienten möglich.Phase 5 – Abo-Gate, Rechnung, Changelog(erledigt): Globales Abo-Gate (require_active_access) auf allen fachlichen Routern scharf geschaltet, aber wirkungslos solangeabo_pflicht(Default AUS) nicht aktiviert ist – mit echtem Ein/Aus-Test verifiziert. Rechnung nach § 14 UStG mit race-sicherem fortlaufendem Zähler, serverseitige PDF-Erzeugung, Netto/USt-Aufschlüsselung oder § 19-Kleinunternehmer-Hinweis. Changelog-System 1:1 portiert. Dabei einen echten Bug gefunden und behoben: Gunicorn startet 2 Worker-Prozesse, die beim ersten Boot beide gleichzeitig die Startup-Sync ausführen – ohne Unique-Constraint entstand ein doppelter Changelog-Eintrag (Race Condition, reproduziert und mit mehreren Neustarts verifiziert). Fix:UNIQUE-Constraint +ON CONFLICT DO NOTHINGstatt eines Python-seitigen Vorab-Checks.Phase 6 – Pflegetagebuch, Dokumente, Aufgaben & Kalender(erledigt): Pflegetagebuch-CRUD, Dokumenten-Upload mit Extension-Whitelist über eine autorisierte Download-Route (statt offen gemountetemstatic/, gleiches Muster wie die Briefe-PDFs aus Phase 3), Aufgaben-CRUD (bisher nur lesend im Dashboard), Kalender-Aggregation (offene Aufgaben, Widerspruchsfristen, MDK-Gutachtertermine, Archivierungsfristen, Pflegetagebuch-Erinnerungen) – 1:1-Logik-Port aus der alten App, mit Mandantentrennung auch bei Datei-Download verifiziert.- Noch offen: Phase 7 (Feinschliff + Deployment, u.a. Responsive-Durchgang, CSP verschärfen,
SESSION_COOKIE_SECURE+TLS sobald Deploy-Ziel feststeht) – Details im Architekturplan. Damit ist der volle Funktionsumfang der alten App im Neubau erreicht.