dak.c2s/docs/plans/2026-02-28-excel-export-design.md
CCS Admin 002021d7c7 feat: add Excel export for filtered case list
New GET /cases/export endpoint generates .xlsx with openpyxl using the
same filters as the case list (year, fallgruppe, ICD status, search).
Role-aware columns: admins see patient names, DAK staff does not.
Frontend adds a Download button next to the filter bar with loading
state. Refactors shared query logic into _build_case_query helper.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 14:43:00 +00:00

1.9 KiB

Fallliste als Excel exportieren — Design

Ziel

Export-Button auf der Cases-Seite, der alle gefilterten Fälle als .xlsx herunterlädt. Nutzt aktive Filter (Jahr, Fallgruppe, ICD-Status, Suchbegriff).

Architektur

Backend-Endpoint GET /cases/export generiert XLSX on-demand mit openpyxl (bereits installiert). Gleiche Filter-Parameter wie GET /cases/, aber ohne Pagination. Rollenbasierte Spaltenauswahl + Masking für DAK-Mitarbeiter.

Frontend ruft den Endpoint als Blob ab und triggert Browser-Download. Bewährtes Pattern aus ReportsPage.

Backend

Endpoint: GET /cases/export

  • Datei: backend/app/api/cases.py
  • Query-Parameter: jahr, fallgruppe, has_icd, search (optional)
  • Auth: Alle authentifizierten Nutzer
  • Response: StreamingResponse mit application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  • Dateiname: Fallliste_YYYY-MM-DD.xlsx

Spalten

Admin: Fall-ID, Datum, Nachname, Vorname, KVNR, Fallgruppe, ICD, Gutachten-Typ, Therapieänderung, Unterlagen, Gutachten, Abgelehnt, Abgerechnet, Abbruch

DAK-Mitarbeiter: Fall-ID, Datum, KVNR, Fallgruppe, ICD, Gutachten-Typ, Therapieänderung, Unterlagen, Gutachten, Abgelehnt, Abgerechnet, Abbruch

Excel-Formatierung

  • Header-Zeile: fett, hellgrauer Hintergrund
  • Auto-Width für Spalten
  • Ja/Nein für Boolean-Felder
  • Datum als deutsches Format (DD.MM.YYYY)

Frontend

Button-Platzierung

Download-Icon-Button neben den bestehenden Filtern auf CasesPage. Sichtbar für alle Rollen.

Download-Flow

  1. Klick → Button zeigt Spinner
  2. api.get('/cases/export', { params, responseType: 'blob' })
  3. Blob → URL.createObjectURL<a download> → Cleanup
  4. Button kehrt zum Normalzustand zurück

Dateien

Datei Änderung
backend/app/api/cases.py Neuer GET /cases/export Endpoint
frontend/src/pages/CasesPage.tsx Download-Button + Blob-Download-Logik