Zweite Design-Variante des "Neuer Patient"-Interviews unter /patienten/neu-senioren
- eigene, komplett unverlinkte Route, bewusst kopiert statt geteilt, damit die
produktive Route /patienten/neu unangetastet bleibt. Grosse Schrift, hoher
Kontrast, groessere Bedienflaechen fuer aeltere Nutzer:innen.
- Skalierung per CSS `zoom` auf dem Aussen-Container statt harter Groessen-
Klassen, damit auch importierte Unterkomponenten (DateInput, EgkScan,
KrankenkasseAutocomplete, InfoTooltip) automatisch mitskalieren.
- Kontrastreichere Textfarben, dickere Rahmen, groessere Checkboxen/Buttons.
- Aktueller Schrittname jetzt als sichtbarer Text statt nur als Hover-Tooltip.
- Gelber Hinweisbanner "Testversion" oben auf der Seite.
- Verifiziert per echtem Browser-Test (lokale Docker-Instanz) durch alle 7
Schritte des Assistenten; next build/tsc/eslint fehlerfrei.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sowohl in der Patientenakte als auch auf der oeffentlichen Notfall-Card-
Seite ist jetzt ersichtlich, wann die Notfalldaten (Blutgruppe, Allergien,
Medikamente, Notfallkontakt) oder eine neue Patientenverfuegung zuletzt
geaendert wurden. Neues Feld Patient.notfallkarte_daten_aktualisiert_am,
wird nur bei echter inhaltlicher Aenderung gesetzt, nicht bei jedem
Speichern des Bearbeiten-Formulars. Changelog-Eintrag 1.18.5.
Ausserdem: neuer CLAUDE.md-Abschnitt zum kuenftigen PR-Workflow ueber
Gitea (dieser Commit ist der erste PR unter dem neuen Schema).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- T34-Anschluss/T35/T36: Pflegegrad "vermutet" vs. "bestaetigt" (Sync aus
Antrag-Rueckmeldung), ressourcenorientiertes Interview Schritt 4
(Faehigkeits-Checklisten statt Defizit-Auswahl), optionales
4-Wochen-Pflegetagebuch mit Anhang-PDF beim Musterbrief.
- T37: Notfall-Card - oeffentlicher, unauthentifizierter QR-Code-Zugriff auf
feste Notfall-Basisdaten (Blutgruppe, Allergien, Medikamente,
Notfallkontakt) + aktuelle Patientenverfuegung, Token-Hash ohne Ablauf/
Einmalgebrauch, Zugriffs-Log mit IP+Zeitstempel. Zwei Nachdeploy-Bugs
behoben (Zugriffs-Log-IP am Reverse-Proxy vorbei, kaputter
Patientenverfuegung-Link ueber ||statt ?? bei leerer NEXT_PUBLIC_API_URL).
- T30-Nachtrag: Volltextsuche jetzt auch fuer normal hochgeladene PDFs
(nicht nur Kamera-Scans), inkl. Admin-Aktion zur rueckwirkenden
Nachverarbeitung bestehender PDFs. Bugfix: seite.get_text() konnte bei
verschluesselten/beschaedigten PDFs den kompletten Upload mit 500
abbrechen lassen (Datei landete auf der Platte, aber nie in der DB) -
jetzt zweifach gegen Fehler abgesichert.
Zusaetzlich: Fortschrittsanzeige (deaktivierte Eingabe + Balken) waehrend
Upload/Texterkennung, damit Laien nicht versehentlich mehrfach hochladen.
- Sidebar ist jetzt sticky (vorher durch Flexbox-Stretch auf die Hoehe des
Hauptinhalts gedehnt, "Abmelden" nur durch Scrollen der gesamten Seite
erreichbar).
- Notfall-Card-Bereich im Bearbeiten-Formular farblich hervorgehoben statt
im Fliesstext unterzugehen.
- Neue Architektur-Uebersicht als draw.io-Datei (Sitemap + Datenfluss
Frontend/API/Backend/Datenbank je Themenbereich).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Rohfeedback (Zeilen 40-58) sowie die daraus abgeleiteten T26-T37-Punkte in
Feedbackfromtester.md aufgenommen und deren Bearbeitungsstand nachgezogen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- T26: DateWheelPicker durch reine Zahlenfeld-Eingabe TT.MM.JJJJ ersetzt
(components/DateInput.tsx), inkl. Validierung auf kalendarisch moegliche
Werte und Fix eines Folgebugs (fuehrende Null ueberschrieb laufende
Eingabe durch einen Echo-Loop im Sync-Effekt).
- T28: fuenfter Guide "Umzug ins Pflegeheim".
- T29: serverseitiger Zeitfenster-Duplikat-Schutz gegen doppelt erzeugte
Antraege/Briefe, sowie ein bis dahin komplett fehlender
DELETE /api/antraege/{aid}-Endpunkt samt Frontend-Button.
- T30: Dokumenten-Scans bekommen eine unsichtbare OCR-Textebene
(durchsuchbares PDF ueber Tesseracts eigenen PDF-Renderer + pypdf fuers
Zusammenfuegen), Volltextsuche ueber die Dokumente, "Text anzeigen"-
Button zum Markieren/Kopieren in andere Formulare.
- T32: Musterbrief nennt jetzt automatisch die Pflegeperson, sofern beim
Patienten hinterlegt.
- T33: Interview Schritt 6 braucht jetzt eine explizite Bestaetigung statt
automatisch zur naechsten Frage zu springen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fuchs-Logo (dunkle Variante fuer helle Hintergruende, weisse Variante fuer
den dunklen E-Mail-Header) in App-Sidebar, Marketing-Header, Login-Box und
als SEO-/OpenGraph-Bild eingebaut, neues Favicon ersetzt den Next.js-
Standard. In derselben Sidebar-Datei zugleich die Umbenennung von
"Krisen-Checkliste" zu "Wegweiser fuer schwierige Momente" (T27).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Katalog-Aenderungsbenachrichtigungen kamen bislang als eine Einzelmail pro
geaenderter Leistung - jetzt eine gebuendelte Mail pro Empfaenger und
Durchlauf. Alle 7 proaktiven Mailtypen bekommen ein gemeinsames HTML-Design
(app/email_templates.py) statt reinem Text, inklusive einer per Vorname
personalisierten Begruessungszeile statt einer im Fliesstext untergehenden
"Hallo X,"-Anrede.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Pflegegeld, Pflegesachleistung, Tages-/Nachtpflege, vollstationaere Pflege
(jetzt auch Pflegegrad 1) und weitere Betraege gegen die vom Betreiber
bereitgestellten BMG-Quelldokumente abgeglichen und aktualisiert. Quellen
als Referenzmaterial mit committed (gleiche Konvention wie Anleitung.md/
Leistungen.md).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
E-Mail-Versand-Protokoll (email_log) mit Erfolgs-/Fehlerquote, Systemstatus
der 4 Hintergrund-Scheduler, Speicherplatz-Uebersicht, eine neue
Statistik-Seite (Konten-Wachstum, Pflegegrad-Verteilung, Antrags-
Erfolgsquote, Umsatz, Aktivierung, Time-to-Value, Retention) mit
abhaengigkeitsfreien Inline-SVG-Balkendiagrammen, eine Test-Mail-Funktion
zum Pruefen aller proaktiven Mailtypen, sowie Hard-Delete fuer Nutzerkonten
inkl. Begruendungspflicht/Audit-Log.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Periodische Magic-Link-Erinnerungsmail ("ist der Bescheid da?"), bei
Ablehnung eines Pflegegrad-Antrags eine "Keine Sorge"-Seite mit
eingebettetem Mini-Widerspruch-Generator, sowie eine Fristeskalationsmail
kurz vor Ablauf der Widerspruchsfrist.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Neue workflow.md: ASCII-Diagramme aller sichtbaren Nutzer-Workflows in
pflegepilot_v3, zur Pruefung auf Sackgassen/Bruchstellen.
- CLAUDE.md um alle Abschnitte dieser Session ergaenzt (Produktions-Build,
Autofill, T19-T22/T24, Interview-Wizard-Ueberarbeitung, Button-Stile).
- Feedbackfromtester.md/.txt: Backlog auf T19-T22 und T24 als erledigt
aktualisiert, nur noch T25 offen.
- .gitignore: Secret.png ergaenzt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Neue geteilte Button-Stile (lib/theme.ts: buttonStyles) ersetzen das
verbreitete Muster "unterstrichener Text" bei Aktionen wie Bearbeiten,
Loeschen, PDF und allen "+"-Funktionen - wirkte optisch nach Entwicklung
und war auf Touch-Geraeten schwer treffsicher. Angewendet auf Patientenakte,
Budget-Tracker, Dashboard, Admin-Dashboard, Changelog-Admin und Aufgaben.
Zusaetzlich zwei Mobile-Responsivitaets-Fixes auf der Patientenakte: das
Dokumenttyp-Auswahlfeld bekam eine explizite volle Breite, und der native
Datei-Upload-Button (der unter Tailwind-Preflight seine Browser-Chrome
verliert und dadurch wie reiner Fliesstext wirkte) wird jetzt ueber
Tailwinds file:-Variante gezielt wie ein echter Button gestylt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Interview-Wizard-Ueberarbeitung, Kalender-Sidebar-Badge
- Neue Komponente NaechsteSchritte.tsx: dynamische Fortschritts-Checkliste
auf der Patientenakte (Antrag stellen -> Unterlagen hochladen -> Bescheid
erhalten), Zielgruppen-personalisiert, Unterlagen-Schritt bindet die
bestehende AntragCheckliste inline ein (T24).
- musterbrief-Seite unterstuetzt jetzt Query-Parameter-Vorbelegung
(?patientId=&typ=) fuer die Verlinkung aus der Checkliste.
- Interview-Wizard Schritt 4: neutralere Fragenformulierung, Zielgruppe
"Beduerftige/soziale Notlage" ueberspringt den Situationsfragen-Katalog
komplett (dort ist er fachlich meist nicht das passende Instrument).
- Interview-Wizard Schritt 6: gefuehrter Ja/Nein-Fragen-Dialog fuer die 22
Pflegekasse-Leistungen (SGB XI), waehlt passende Eintraege in der
bestehenden Liste automatisch vor statt einer unkommentierten Langliste.
- Sidebar zeigt jetzt ein Badge mit der Anzahl ueberfaelliger Aufgaben beim
Kalender-Nav-Punkt (T21).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Frontend laeuft jetzt ueber einen echten mehrstufigen next-build-Produktions-
Build (output: standalone) statt next dev/Turbopack - vermutete Ursache
fuer haengenbleibendes "Laedt..." unter iOS Safari (HMR-Websocket im
Hintergrund). Ausserdem name-/autoComplete-Attribute auf praktisch allen
Formularfeldern der eingeloggten App nachgeruestet: ohne diese Attribute
trug iOS Safaris Autofill Werte teils direkt ins DOM ein, ohne das Event
auszuloesen, auf das Reacts kontrollierte Inputs lauschen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Wiederkehrende Wiedervorlage fuer Hilfsmittel mit Erneuerungspflicht (T19),
E-Mail-Erinnerungen 7/1 Tage vor Aufgaben-Faelligkeit (T20), neutralere
Formulierung der Pflegegrad-Situationsfragen. Ausserdem ein vorbestehender
Bug behoben: Musterbrief-Subtypen Eingliederungshilfe/Grundsicherung/
Blindenhilfe wurden im Antrag-Datensatz stillschweigend als "erstantrag"
gespeichert statt ihres echten Typs.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Grosser Funktionsschub ueber mehrere Sessions: Vollmacht- und
Patientenverfuegung-Generator, Umkreissuche fuer Pflegedienste/Sanitaets-
haeuser/Wohnformen/Therapie inkl. Favoriten und Aenderungsbenachrichtigung,
Dokumenten-Scan sowie eGK-Kartenerfassung per Kamera, Budget-Tracker,
Krisen-Checklisten, PLZ-Autofill, Kalender-Export, Passwort-Reset per SMTP,
Checkliste vor Antragstellung, Leistungsauswahl/-rolle im Interview mit
Steuervorteil-Hinweis. Admin-seitig: System-Backup inkl. Wiederherstellung
aus einem hochgeladenen Archiv, ueberarbeitetes Dashboard mit Patienten-
Kacheln. Landingpage inhaltlich und fuer SEO ueberarbeitet (Server-
Metadaten, JSON-LD, robots.txt/sitemap.xml), Hero-Text und SEO-Meta ueber
die Backend-Einstellungen editierbar gemacht.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Preismodell auf Kundenfeedback umgestellt: 14,99 EUR Basispreis (1 Patient) +
4,99 EUR je zusaetzlichem Patienten statt Einheitspreis, dazu Self-Service-
Kuendigung (wirkt zum Ende der Laufzeit) und die passende Anpassung in
Admin-Dashboard/Rechnung/Landingpage. Der bisherige harte 3-Patienten-Deckel
entfaellt folgerichtig, da zusaetzliche Patienten jetzt bezahlpflichtig statt
begrenzt sind.
Neuer Ummeldung-Generator (Kundenfeedback: Umzug erfordert separate Meldung
an Krankenkasse und Rentenversicherung) erstellt beide Musterbriefe in einem
Schritt und aktualisiert die Patientenadresse. Dafuer neue Rentenversicherungs-
Stammdaten (DRV Bund + 15 Regionaltraeger) und ein Rentenversicherungsnummer-
Feld am Patienten.
Neue "Patient bearbeiten"-Seite schliesst die Luecke, dass Tippfehler bei der
Anlage bisher nicht korrigierbar waren.
Krankenkassen-Stammdaten von ~87 auf 94 deutsche GKV-Eintraege vervollstaendigt
(abgeglichen gegen die offizielle GKV-Spitzenverband-Liste) inkl. dreier dabei
gefundener Datenfehler: AOK Nordost/Berlin-Brandenburg-Duplikat mit falscher
Adresse, IKK Nord (seit 2021 umbenannt), actimonda BKK (seit 2021 fusioniert
und nicht mehr eigenstaendig).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bisher war (marketing)/page.tsx nur Titel + ein Satz + Link zur App.
Jetzt: Hero mit Value Proposition, Vorteile-Grid (Pflegegrad-Einschaetzung,
Katalog/Rechner, Widerspruch- und Musterbrief-Generator, Aufgaben/Kalender,
Pflegetagebuch/Dokumente - alles reale, bereits gebaute Features, keine
Ankuendigungen), Preis-Karte und ein DSGVO/Sicherheits-Abschnitt.
Rechtstexte (Impressum/Datenschutz/AGB) bekommen eigene oeffentliche Seiten
unter (marketing) - vorher gab es dafuer im Frontend noch gar keine Route,
nur das Admin-Formular zum Bearbeiten der Texte. Neuer Marketing-Layout
mit Header/Footer verlinkt sie auf jeder Marketing-Seite.
Backend: /api/einstellungen/public liefert jetzt zusaetzlich abo_preis/
abo_waehrung (gleiche Quelle wie /api/abo/status, das aber Login
voraussetzt), damit der Preis auf der oeffentlichen Landingpage nicht
separat hartkodiert werden muss und bei einer Preisaenderung nicht
auseinanderlaeuft.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
WEB_ORIGIN unterstuetzt jetzt eine Kommaliste statt nur einer einzigen
erlaubten Origin - noetig, weil die App jetzt sowohl per LAN-IP (lokale
Tests) als auch ueber eine externe Domain hinter Nginx Proxy Manager
erreichbar ist. Gleiches Kommaliste-Muster wie NEXT_DEV_ALLOWED_ORIGINS
im Frontend, siehe aktualisierte .env.example.
Eigentliche Blockade war NEXT_PUBLIC_API_URL, das fest auf die private
LAN-IP:Port gesetzt war - von aussen nie erreichbar, daher haengende
"Laedt..."-Seite. Fix dafuer liegt in der Deployment-Konfiguration
(.env auf der NAS) und im Nginx-Proxy-Host (API jetzt unter /api auf
derselben externen Domain durchgereicht, dokumentiert im aktualisierten
.env.example-Kommentar).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bug in allen drei Vorkommen (Widerspruch-Generator, Musterbrief-Generator,
Interview-Wizard Schritt 3): die Trefferliste wurde ausschliesslich aus
"Suchtext passt zu Treffern" abgeleitet, ohne einen echten Auf/Zu-Zustand.
Nach der Auswahl entspricht der eingefuegte Name weiterhin der eigenen
Suchanfrage, die Liste blieb also unter dem Feld sichtbar - wirkte wie eine
doppelte Anzeige der Auswahl.
Neue gemeinsame KrankenkasseAutocomplete-Komponente ersetzt den dreifach
duplizierten Code: expliziter offen/geschlossen-State, schliesst nach Klick
auf einen Treffer, onMouseDown preventDefault verhindert das uebliche
Autocomplete-Problem dass der Blur-Handler das Dropdown schliesst bevor der
Klick auf den Treffer ueberhaupt registriert wird. Haelt sich zusaetzlich
per useEffect synchron, wenn der Wert von aussen gesetzt wird (Autofill
beim Patienten-Ausw��hlen).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Farbsystem (lib/theme.ts): 12 Akzentfarben an v2 angelehnt (mint/lavender/
peach/rose erweitert), durchgehend "-700/-800-Text auf -50-Hintergrund"
fuer garantierten WCAG-AA-Kontrast unabhaengig vom Farbton. Katalog-
Kategorien bekommen darueber eine feste, deterministische Akzentfarbe
(accentForKey-Hash), Mein Abo/Was-ist-neu/Kalender/Patientenakte-Sektionen
je einen Farbverlauf statt reinweiss auf hellgrau.
DateWheelPicker-Bug behoben: der Hervorhebungsbalken hinter der Auswahl
lag durch fehlenden z-index ueber statt hinter dem Text (absolut
positionierte Elemente malen unabhaengig von der DOM-Reihenfolge ueber
normalem Flow-Inhalt) - das ausgewaehlte Datum war dadurch weiss auf
weiss unlesbar.
Neue Collapsible-Komponente (CSS-grid-template-rows-Technik fuer sauberes
Auf-/Zuklappen) angewendet auf: Patientenakte (Antraege/Pflegetagebuch/
Dokumente), Kalender-Gruppen, Katalog-Kategorien, Admin-Audit-Log -
verhindert Ueberfuellen/zu langes Scrollen bei wachsenden Listen.
Widerspruch- und Musterbrief-Generator: das lange Formular klappt nach
erfolgreicher Erstellung automatisch ein (mit "Formular bearbeiten"-Button
zum manuellen Wiederoeffnen), damit das Ergebnis besonders auf Mobilgeraeten
ohne Scrollen sichtbar ist. Widerspruchsgruende-Normgruppen bekommen
farbige Badges statt reinem Fliesstext.
Neue geteilte AufgabeModal-Komponente (Titel, volle-Breite-3-Zeilen-
Beschreibung, Patient, Prioritaet, DateWheelPicker) ersetzt das zu kleine
Inline-Formular auf der Aufgaben-Seite und ermoeglicht eine neue
Schnellerstellen-Funktion direkt auf der Kalender-Seite.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Hauptursache fuer "Text kaum lesbar": globals.css schaltete bei einem
System im Dark Mode automatisch auf helle Schrift auf dunklem Hintergrund
um (prefers-color-scheme), waehrend jede einzelne Komponente durchgehend
hartcodierte helle Tailwind-Klassen nutzt (bg-white, text-slate-800 etc.)
- keine ist dark-mode-bewusst. Ergebnis je nach Systemeinstellung: helle
Schrift auf hellem Hintergrund. Fix: die automatische Dark-Mode-Umschaltung
komplett entfernt, App rendert immer hell (passend zu allen Komponenten),
bis es einen echten Dark Mode gibt. Ausserdem: body ueberschrieb die
bereits geladene Geist-Schrift mit hartcodiertem Arial-Fallback - behoben.
Zusaetzlich alle 33 Stellen mit text-slate-400 (Kontrast ~2.9:1, faellt
WCAG AA durch) auf text-slate-500 (~4.6:1, besteht AA) angehoben.
Navigation vollstaendig neu gebaut: von einer horizontal umbrechenden
Topbar mit ~10 Textlinks (die am PC schlecht aussah und am Handy komplett
unbedienbar war, da nichts fuer Mobile vorgesehen war) zu einer echten
Sidebar mit Icons (@tabler/icons-react, wie im urspruenglichen Architektur-
plan vorgesehen aber bisher nie installiert) und gruppierten Abschnitten
(Patienten / Recht & Briefe / Verwaltung / Konto). Unter der lg-Breakpoint
wird die Sidebar zu einem Off-Canvas-Drawer mit Hamburger-Button und
Backdrop - gleiches Pattern wie die mobile Sidebar der alten App.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Beim Testen auf einem NAS per LAN-IP statt localhost blockierte Next.js'
Dev-Server standardmaessig die HMR-Websocket-Verbindung von der fremden
IP - im Turbopack-Dev-Modus haengt dadurch die Hydration komplett, die
Seite bleibt bei der server-gerenderten "Laedt..."-HTML stehen und kein
Client-JS (damit auch kein API-Fetch) laeuft je. Fix: konfigurierbare
allowedDevOrigins ueber die neue NEXT_DEV_ALLOWED_ORIGINS-Env-Var.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Pflegetagebuch-CRUD, Dokumenten-Upload mit Extension-Whitelist ueber eine
autorisierte Download-Route (statt offen gemountetem static/, gleiches
Muster wie die Briefe-PDFs aus Phase 3), Aufgaben-CRUD (bisher nur
lesend im Dashboard vorhanden), und Kalender-Aggregation (offene
Aufgaben, Widerspruchsfristen, MDK-Gutachtertermine, Archivierungsfristen,
Pflegetagebuch-Erinnerungen) - 1:1-Logik-Port aus der alten App.
Mit echten Kontenlebenszyklen verifiziert: Mandantentrennung greift auch
bei Tagebuch-Loeschung und Dokumenten-Download (404 fuer fremde Patienten-
Daten), Datei-Whitelist blockt .exe, Kalender zeigt ueberfaellige Aufgaben
und blendet die Tagebuch-Erinnerung korrekt aus sobald ein heutiger
Eintrag existiert.
Frontend: Aufgaben-Seite mit Anlegen/Erledigen, Kalender-Seite gruppiert
nach Ueberfaellig/Naechste 30 Tage/Spaeter, Pflegetagebuch- und
Dokumente-Sektionen in der Patientenakte.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Globales Abo-Gate (require_active_access) auf allen fachlichen Routern
scharf geschaltet, aber wirkungslos solange abo_pflicht (Default AUS) nicht
aktiviert ist - 1:1-Logik-Port aus _hat_aktiven_zugang(). Mit echtem
Ein/Aus-Test verifiziert: Admin/Demo immer durch, frisches Konto ohne Abo
bekommt 402, /me und /abo/status bleiben trotzdem erreichbar.
Rechnung nach § 14 UStG: fortlaufende Rechnungsnummer (Race-sicherer
Zaehler in einstellungen), serverseitige PDF-Erzeugung ueber denselben
WeasyPrint-Weg wie Widerspruch/Musterbrief, Netto/USt-Aufschluesselung
oder § 19-Kleinunternehmer-Hinweis je nach Einstellung. Bewusst keine
Persistierung der Rechnungs-PDF (nur die Nummer zaehlt, wie in der alten
App) - reiner Download.
Changelog-System 1:1 aus der alten App portiert (DB als Laufzeit-Quelle,
changelog_seed.py als Entwickler-Seed, Einweg-Sync). Dabei einen echten
Bug gefunden und behoben: Gunicorn startet 2 Worker-Prozesse, die beim
ersten Boot beide gleichzeitig die Startup-Sync ausfuehren - ohne Unique-
Constraint entstand ein doppelter Changelog-Eintrag (Race Condition,
reproduziert und mit mehreren Neustarts verifiziert). Fix: UNIQUE-
Constraint auf changelog_eintraege.version + ON CONFLICT DO NOTHING statt
eines Python-seitigen "SELECT vorhandene, dann INSERT fehlende"-Checks.
Frontend: Changelog-Modal beim Login (matcht altes UX), "Was ist neu?"-
Seite mit Admin-CRUD, "Mein Abo"-Seite, Backend-Einstellungen-Seite
(Betrieb/Rechtstexte/Abo/Rechnungsstellung), Rechnung-Button im
Admin-Dashboard.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Nutzerverwaltung (Basis-CRUD + Sperren/Entsperren/Soft-Delete-mit-
Archivierung/Abo-Freischalten) und Admin-Router 1:1-Logik-Port aus der
alten App (_berechne_archiv_frist/_archiviere_patient -> archivierung.py,
_add_monate fuer die Abo-Verlaengerung). "Loeschen" bleibt bewusst ein
Soft-Delete: Konto wird gesperrt, aktive Patienten werden archiviert
(§ 630f BGB Aufbewahrungspflicht) statt hart geloescht - zusaetzlich durch
die ON DELETE RESTRICT-FK aus Phase 0 strukturell abgesichert. Jede
Admin-Aktion verlangt eine Begruendung und wird unveraenderlich im
Audit-Log protokolliert. DSGVO-Export buendelt alle Patientendaten +
Dateien (Briefe/Dokumente/Foto) als ZIP, generisch ueber alle SQLAlchemy-
Modelle serialisiert statt Tabelle fuer Tabelle von Hand.
Admin-Router nutzt APIRouter(dependencies=[Depends(require_admin)]) -
jede Route automatisch geschuetzt, kein Route-fuer-Route-Vergessen moeglich.
Mit echten Kontenlebenszyklen verifiziert: Sperren blockt Login sofort,
Selbstsperrung/-loeschung verboten, Hard-Delete nur ohne zugeordnete
Patienten moeglich, Soft-Delete archiviert korrekt.
Frontend: Admin-Dashboard-Seite (Kontentabelle, Begruendungs-Modal fuer
alle Aktionen, DSGVO-Export-Formular, Audit-Log-Liste). Navigation zeigt
Admin nur noch Dashboard-relevante Bereiche (Nutzer-Sektionen ausgeblendet,
automatische Weiterleitung in beide Richtungen).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Leistungskatalog (82 Eintraege) und Leistungsrechner-Tabelle 1:1 aus der
alten App portiert. Anspruchsvollster Teil: Widerspruch- und Musterbrief-
Generierung wandert von client-seitigem html2pdf.js komplett ins Backend
(WeasyPrint) - Brieftext-Logik (genW()/updM()) 1:1 nach briefe_text.py
portiert, WGRUENDE-Rechtsgrund-Bausteine (28 Eintraege) nach
static_data/widerspruch.py. PDFs landen unter app/uploads/briefe/<pid>/
und sind nur ueber eine get_owned_patient-geschuetzte Download-Route
erreichbar (Verbesserung gegenueber dem offen gemounteten static/ der
alten App) - mit zwei Konten verifiziert, dass fremde PDFs 404 liefern.
require_paid_access als erste scharf geschaltete Freemium-Sperre (Anwendung
auf Antraege/Widerspruch/Musterbrief-Routen) - mit frisch registriertem
Konto ohne Abo verifiziert (402), admin-angelegte/Demo-Konten bleiben
unbetroffen (selbst_registriert=False).
Frontend: Katalog- und Rechner-Seite, vollstaendiger Widerspruch-Generator
(Gruende gruppiert nach Norm, Beweismittel-Auswahl) und Musterbrief-
Generator (5 Antragstypen), Antraege-Liste mit PDF-Links in der
Patientenakte ergaenzt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Regelbasierte (nicht KI-gestuetzte) Pflegegrad-Schaetzung 1:1 aus der alten
App portiert (NEU_FRAGEN/NEU_ZG_OPTIONEN/neuSchaetzung -> pflegegrad_regeln.py
+ POST /api/pflegegrad/schaetzen), damit die Regel nur einmal zentral im
Backend existiert statt dupliziert im Frontend. Krankenkassen-Stammdaten
(~86 Versicherer DE/AT/CH) 1:1 portiert fuer die Autocomplete in Schritt 3.
Frontend: kompletter Wizard als useReducer-State-Maschine (Schritte 1-6,
verschachtelter Sub-Wizard in Schritt 4 mit Auto-Advance je Antwort ausser
bei der letzten Frage, Zurueck-Navigation landet korrekt auf der letzten
Frage), ersetzt das Kurzformular aus Phase 1.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
get_owned_patient/scoped_patienten_query als typsichere FastAPI-Dependencies
(Ersatz fuer die alten SQL-String-Helper), Patienten-CRUD mit 3er-Cap pro
Konto, Notizen mit Aenderungshistorie, Pflegegrad-Patch, Dashboard-Route.
Frontend: ResponsiveTable/DateWheelPicker/BentoGrid als wiederverwendbare
Bausteine, Patientenliste, Patientenakte, Kurzformular fuer neue Patienten.
Isolation Ende-zu-Ende verifiziert: zweites Konto sieht/erreicht die
Patienten des ersten Kontos nicht (404 statt 403, um Existenz nicht zu
verraten), Admin sieht weiterhin alle Konten uebergreifend.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Kompletter Parallel-Neubau (open.md Punkt 6) neben der unveraenderten
Flask/SQLite-App, verifiziert per docker compose: Auth Ende-zu-Ende
(Login/Registrierung/Logout/Demo-Login), alle 11 Tabellen per Alembic
migriert, WeasyPrint-PDF-Smoke-Test, Admin-Konto gemeinsam angelegt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Alle 12 Findings aus dem Code-Review vom 2026-07-19 (open.md Punkt 5) gefixt:
Direktstart-Bindung auf 0.0.0.0 mit debug=True, fehlende Datei-Typ-Pruefung
beim Brief-Upload, ungesaeuberte X-Forwarded-For-IP im Admin-Dashboard,
fehlendes Rate-Limiting auf Login/Registrierung, fehlende Security-Header,
Freemium-Sperre umgehbar ueber /api/antraege, sowie mehrere kleinere Haertungen
(Passwort-Mindestlaenge, SVG-Upload, toter Code, unbenutzter Import).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Neue Backend-Karte "Rechnungsstellung": eigene Rechnungsanschrift und
Steuerdaten des Betreibers (Steuernummer, USt-IdNr., Kleinunternehmer-
regelung, USt-Satz) - bewusst getrennt von der Betrieb-Karte, da eine
Rechnung eine andere/vollstaendigere Anschrift braucht als das Branding.
Rechnungsnummer wird jetzt serverseitig atomar vergeben (neuer Endpoint
POST /api/admin/rechnungsnummer/naechste, Format {Jahr}-{Nummer:04d}) statt
geraten - Pflicht nach § 14 Abs. 4 Nr. 4 UStG (fortlaufend, einmalig). Die
generierte Rechnung weist je nach Kleinunternehmer-Einstellung entweder
Netto/USt-Satz/USt-Betrag/Brutto getrennt aus oder den Hinweis nach § 19
UStG - vorher fehlten Steuerdaten und Steuerausweis komplett.
Verifiziert per curl: Einstellungen speichern/lesen, fortlaufende
Rechnungsnummern ueber mehrere Aufrufe, Rechtepruefung (nur Admin), Docker-
Rebuild auf leerem Volume. Changelog-Eintrag 1.2.1 ergaenzt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- KI-Claude-API-Bereich im Backend entfernt (ungenutzt).
- Impressum/Datenschutz/Nutzungsbedingungen im Backend editierbar, oeffentlich
abrufbar, per Sidebar-Link erreichbar - Betrieb-Karte bewusst NICHT entfernt
(wird fuer PDF-Briefkopf/Sidebar-Branding aktiv gebraucht, Abweichung von
der urspruenglichen open.md-Formulierung dokumentiert).
- Admin-Sidebar zeigt nur noch admin-relevante Bereiche, Login/Reload leitet
Admin direkt auf das Admin-Dashboard statt das allgemeine Dashboard.
- Admin-Dashboard ist jetzt die vollstaendige Nutzerverwaltung: Bearbeiten-
Button (inkl. Rechnungsanschrift), Registriert-am/Letzter-Login/IP-Spalten.
- Selbstregistrierung (POST /api/auth/registrieren, oeffentlich) mit
Pflichtfeld Rechnungsanschrift; neue Konten duerfen sofort lesen, aber
Briefe/Leistungen/Kalender-Eintraege anlegen ist gesperrt bis ein Abo
vorliegt (selbst_registriert-Flag, unabhaengig vom globalen
abo_pflicht-Schalter - admin-angelegte Konten sind nicht betroffen).
- Admin kann PDF-Rechnungen pro Konto erstellen (clientseitig, gleiche
Technik wie Musterbrief/Widerspruch).
- Login-Seite zeigt keine Standard-Zugangsdaten (admin/admin) mehr an.
- Changelog-Eintrag 1.2.0 ergaenzt (siehe Aenderungs-Policy in CLAUDE.md).
Verifiziert per curl (kein Playwright, wie gewuenscht): alle vier Punkte
end-to-end getestet inkl. Schreibsperre/Freischaltung/Rechte-Trennung admin-
vs. selbstregistriert, sauberer Docker-Rebuild auf leerem Volume.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Changelog laeuft jetzt DB-gestuetzt (Tabelle changelog_eintraege) statt rein
statisch aus changelog.py: die Datei bleibt der Entwickler-Seed fuer
Release-Notes zu echten Code-Aenderungen (synct einmalig beim Start alles
Fehlende in die DB), Admin kann Eintraege zusaetzlich direkt im Admin-Bereich
anlegen/bearbeiten/loeschen (neue Route /api/admin/changelog, Steuerung auf
der bestehenden "Was ist neu?"-Seite) - z.B. fuer Ankuendigungen ohne Deploy.
App-Version wird jetzt aus dem neuesten DB-Eintrag abgeleitet statt aus einer
Konstante. Policy ergaenzt: jede kuenftige Aenderung bekommt einen
Changelog-Eintrag, nicht nur eine Commit-Message.
open.md: die 4 vom Nutzer nach dem Docker-Testlauf notierten Punkte nach
Abhaengigkeit/Aufwand sortiert und als Checkliste formatiert (KI-Claude-API
entfernen + Rechtstexte statt "Betrieb"-Karte zusammen, dann
Nutzerverwaltung-Bug + Admin-Dashboard-Fokus, dann Rechnungsanschrift +
Rechnungserstellung, Postgres/React-Migration bleibt als Punkt 5 am Ende).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Notizen zu Admin-Dashboard-Fokus (Nutzerverwaltung statt Leistungskatalog),
Ersatz der veralteten Betrieb-Sektion durch Impressum/Datenschutz/AGB, und
fehlender Funktionalitaet bei manuell angelegten Testkonten (sperren/loeschen/
Freimonate/Rechnungsanschrift) fuer die naechste Arbeitsrunde festgehalten.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Neues Datenmodul changelog.py (neueste zuerst, App-Version wird automatisch
aus dem obersten Eintrag abgeleitet - fuer ein Release reicht ein neuer
Eintrag ganz oben). Jedes Konto merkt sich per nutzer.letzte_gesehene_version,
was es schon gesehen hat; nach Login erscheint einmalig ein Hinweis-Modal mit
allem Neuen, per "Gelesen"-Button quittierbar. Neu angelegte Konten starten
bewusst auf aktuellem Stand, bestehende Konten sehen bei einem echten Update
korrekt den Hinweis - wichtig jetzt, wo die App als versionierte Docker-Images
statt eines durchlaufenden Dev-Prozesses ausgeliefert wird. Dazu ein
dauerhafter Sidebar-Eintrag "Was ist neu?" mit Verlaufsansicht.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Dockerfile, docker-compose.yml, requirements.txt und .env (gitignored) fuer
pflegepilot_alpha_v2/pflegepilot ergaenzt. Ein App-Service ueber Gunicorn,
Isolation der Daten ueber zwei benannte Volumes (db, static) statt eines
separaten DB-Containers, da SQLite eingebettet ist. Secret-Key kommt jetzt
aus der Umgebungsvariable SECRET_KEY (lokaler Fallback bleibt fuer
"python start.py" ohne Docker erhalten), Host-Port und Worker-Anzahl sind
ueber .env konfigurierbar. Bewusst keine Domain hinterlegt, da die
DynDNS-Domain erst spaeter auf die Testbench gelegt wird.
Dabei einen Bug in der DB-Migrationsreihenfolge gefunden und behoben: die
nutzer-Tabelle wurde zu spaet angelegt und liess auf einer komplett leeren
Datenbank (z.B. frisches Docker-Volume) mehrere Spalten fehlen, was den
Demo-Konto-Bootstrap zum Absturz brachte.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Server-seitiger SMTP-Versand (Zugangsdaten, /api/email/senden, /api/email/test)
vollständig entfernt und durch mailto: ersetzt: PDF wird lokal generiert und
heruntergeladen, danach öffnet sich das E-Mail-Programm des Nutzers mit
vorausgefülltem Empfänger. Vorbereitung für die Docker-Containerisierung, da
dort nur ein Admin (der Betreiber) existiert und die Lösung ohne
rollenspezifische Ausnahmen für jedes Konto gleichermassen funktionieren muss.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- nutzer.ist_demo-Spalte, permanentes Konto demo/demo wird in init_db()
automatisch angelegt
- Vorausgefuellte fiktive Patientin "Grete Musterfrau" (Pflegegrad 3,
1 Antrag, 2 Leistungen, 2 Aufgaben, 1 Pflegetagebuch-Eintrag) -
_demo_seed()
- Automatischer Reset alle 6 Stunden per Lazy-Check (kein Cron/Thread
noetig): _demo_reset_faellig()/_demo_reset() geprueft bei Login und
bei jedem Request (global_auth_check), damit auch eine laufende
Sitzung die 6h-Grenze nicht verpasst
- Demo-Konto von der Abo-Zahlungspflicht ausgenommen (_hat_aktiven_
zugang) - wurde erst beim Testen entdeckt: bei aktiver Zahlungspflicht
waere das Demo-Konto sonst mit "Zahlung erforderlich" ausgesperrt
worden, was fuer eine Vorfuehrung inakzeptabel waere
- E-Mail-Versand (api/email/senden + /test) fuer das Demo-Konto
gesperrt (403) - verhindert Missbrauch der echten SMTP-Konfiguration
durch Demo-Besucher
- Login-Screen: neuer "Demo ausprobieren"-Button; Topbar zeigt waehrend
einer Demo-Sitzung ein "Demo-Modus"-Badge
open.md: Reihenfolge sortiert (Docker-Containerisierung und React+
Postgres-Migration als getrennte Aufgaben markiert, da voellig
unterschiedlicher Umfang), Punkt 1 als erledigt markiert.
Verifiziert: Login, vorausgefuellte Patientendaten, Isolation
(Demo sieht nur eigene Patientin), erzwungener Reset (Patient-ID
aendert sich, demo_reset_at aktualisiert), E-Mail-Sperre (403),
Abo-Ausnahme (Zugriff bleibt moeglich auch bei abo_pflicht=1),
Login-Button und Demo-Badge visuell per Playwright bestaetigt.
- Akkordeon-Karten (rtable) animieren jetzt sanft statt abrupt:
display:none/block durch max-height/opacity/padding-Transition
ersetzt (display ist nicht transition-faehig, das war die Ursache
des "Hau-Ruck"-Effekts). Per Mid-Transition-Screenshot verifiziert.
- Interview Step 4 (Pflegealltag-Fragen) zeigt jetzt eine Frage nach
der anderen statt einer langen Liste: neuWiz.q4sub trackt die
Position, eigener duenner Fortschrittsbalken (.subdots) innerhalb
des Schritts. Antwort-Klick rueckt automatisch zur naechsten Frage
vor, ausser bei der letzten (dort erst per bewusstem "Weiter").
Zurueck von Schritt 5 landet korrekt auf der letzten Unterfrage.
- openGebDatumPicker generalisiert zu openDatePicker(hiddenId,dispId,
{fallback,titel,icon,yearMin,yearMax}) und beim Antragsdatum (#adt)
im Antrag-Pflegegrad-Formular eingesetzt (Default-Scrollposition:
heute, nicht heute-75 Jahre wie beim Geburtsdatum - fuer nahe
Termine ist "heute" die sinnvollere Startposition)
Verifiziert per Playwright: alle 6 Unterfragen in Step 4 einzeln
durchgeklickt (inkl. Stopp vor Step 5 bei der letzten Frage und
korrekte Zurueck-Navigation), Antragsdatum-Picker mit korrektem Titel/
Icon/Default getestet, Klapp-Animation per Mid-Transition-Screenshot
bestaetigt.
Drei gezielte Mobile-Verbesserungen nach Nutzer-Feedback:
- Audit-Log (bisher .audit-row Flex-Liste mit festen min-width, auf
Handy unlesbar zusammengequetscht) zu einer echten Tabelle mit
class="tw rtable" umgebaut - erbt automatisch das bestehende Karten-
Akkordeon (nur ein Eintrag offen, Rest kompakt gestapelt)
- Neuer Geburtsdatum-Wheel-Picker (Tag/Monat/Jahr-Spalten mit CSS
scroll-snap, openGebDatumPicker/dwConfirm/dwTriggerLabel) ersetzt
natives <input type=date> gezielt nur bei echten Geburtsdatum-Feldern
(Interview-Wizard, Widerspruch-Generator, Musterbrief) - erspart bei
60-100 Jahre zurückliegenden Daten das endlose Monat-für-Monat-
Zurückklicken, auf PC (Mausrad) wie Touch gleich schnell. Andere
Datumsfelder (Antragsdatum, Bescheiddatum etc.) bleiben nativ, da dort
ein normaler Kalender fuer nahe Termine schneller ist. Default-
Scrollposition ist heute-75 Jahre statt heute.
- Schnellzugriff-Kachel wird auf dem Dashboard unter 560px zur
fixierten Bottom-Bar (Icon-Tab-Leiste) statt Teil des scrollbaren
Bento-Grids zu sein - Hauptaktionen immer ohne Scrollen erreichbar
Verifiziert per Playwright: Wheel-Picker-Interaktion (Scroll per
Mausrad, Bestätigen, korrekter ISO-Wert im hidden Input), Audit-Log-
Karten auf 390px, Sticky-Bar sichtbar+fixiert im Viewport-Screenshot,
Widerspruch/Musterbrief-Trigger inkl. Live-Vorschau-Aktualisierung.