From 899c125a6237d4f76d7d58a4124c71a46c77ab9e Mon Sep 17 00:00:00 2001 From: CCS Admin Date: Fri, 27 Feb 2026 15:32:30 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20show=20individual=20case=20data=20in=20W?= =?UTF-8?q?ochen=C3=BCbersicht=20preview=20instead=20of=20aggregated=20sum?= =?UTF-8?q?maries?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Preview now mirrors the Excel export content: KVNR, Datum, x-markers for Erstgespräch/Abbruch/Unterlagen/Gutachten/FG, and ICD-10 per case, grouped by KW blocks. Co-Authored-By: Claude Opus 4.6 --- backend/app/api/reports.py | 30 +++-- frontend/src/pages/WochenuebersichtPage.tsx | 127 ++++++++++---------- 2 files changed, 82 insertions(+), 75 deletions(-) diff --git a/backend/app/api/reports.py b/backend/app/api/reports.py index 09dda82..0042c6d 100644 --- a/backend/app/api/reports.py +++ b/backend/app/api/reports.py @@ -360,20 +360,26 @@ def generate_wochenuebersicht( ) .first() ) - # Build per-KW summary for frontend preview + # Build per-KW case data for frontend preview (mirrors Excel content) fg1, fg2 = fallgruppen fg1_label, fg2_label = type_cfg["fg_labels"] - weeks_summary = [] + weeks_data = [] for kw in sorted(cases_by_kw.keys(), reverse=True): - kw_cases = cases_by_kw[kw] - weeks_summary.append({ - "kw": kw, - "count": len(kw_cases), - "with_icd": sum(1 for c in kw_cases if c.icd), - "fg1_count": sum(1 for c in kw_cases if c.fallgruppe == fg1), - "fg2_count": sum(1 for c in kw_cases if c.fallgruppe == fg2), - "gutachten": sum(1 for c in kw_cases if c.gutachten), - }) + kw_cases = sorted(cases_by_kw[kw], key=lambda c: (c.datum or date.min)) + rows = [] + for c in kw_cases: + rows.append({ + "kvnr": c.kvnr or "", + "datum": c.datum.strftime("%d.%m.%Y") if c.datum else "", + "erstgespraech": True, + "abbruch": bool(c.ablehnung or c.abbruch), + "unterlagen": bool(c.unterlagen and not c.ablehnung and not c.abbruch), + "gutachten": bool(c.gutachten), + "fg1": c.fallgruppe == fg1, + "fg2": c.fallgruppe == fg2, + "icd": c.icd or "", + }) + weeks_data.append({"kw": kw, "cases": rows}) report_data = { "export_type": export_type, @@ -382,7 +388,7 @@ def generate_wochenuebersicht( "case_count": len(cases), "fg1_label": fg1_label, "fg2_label": fg2_label, - "weeks": weeks_summary, + "weeks": weeks_data, } if report: report.report_date = date.today() diff --git a/frontend/src/pages/WochenuebersichtPage.tsx b/frontend/src/pages/WochenuebersichtPage.tsx index 84bd899..b9f9501 100644 --- a/frontend/src/pages/WochenuebersichtPage.tsx +++ b/frontend/src/pages/WochenuebersichtPage.tsx @@ -17,7 +17,7 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { - Table, TableBody, TableCell, TableFooter, TableHead, TableHeader, TableRow, + Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { Skeleton } from '@/components/ui/skeleton' import { Alert, AlertDescription } from '@/components/ui/alert' @@ -487,28 +487,33 @@ export function WochenuebersichtPage() { // --------------------------------------------------------------------------- -// Wochenübersicht Viewer (inline preview) +// Wochenübersicht Viewer (inline preview — individual cases per KW) // --------------------------------------------------------------------------- -interface WeekSummary { +interface CaseRow { + kvnr: string + datum: string + erstgespraech: boolean + abbruch: boolean + unterlagen: boolean + gutachten: boolean + fg1: boolean + fg2: boolean + icd: string +} + +interface WeekBlock { kw: number - count: number - with_icd: number - fg1_count: number - fg2_count: number - gutachten: number + cases: CaseRow[] } // eslint-disable-next-line @typescript-eslint/no-explicit-any function WochenuebersichtViewer({ data }: { data: Record }) { - const weeks: WeekSummary[] = data?.weeks ?? [] + const weeks: WeekBlock[] = data?.weeks ?? [] const fg1Label: string = data?.fg1_label ?? 'FG1' const fg2Label: string = data?.fg2_label ?? 'FG2' - const kwVon: number = data?.kw_von ?? '?' - const kwBis: number = data?.kw_bis ?? '?' - const totalCases: number = data?.case_count ?? 0 - if (!weeks.length) { + if (!weeks.length || weeks.every((w) => w.cases.length === 0)) { return (

Keine Vorschaudaten verfügbar. @@ -516,62 +521,58 @@ function WochenuebersichtViewer({ data }: { data: Record }) { ) } - const totals = weeks.reduce( - (acc, w) => ({ - count: acc.count + w.count, - with_icd: acc.with_icd + w.with_icd, - fg1: acc.fg1 + w.fg1_count, - fg2: acc.fg2 + w.fg2_count, - gutachten: acc.gutachten + w.gutachten, - }), - { count: 0, with_icd: 0, fg1: 0, fg2: 0, gutachten: 0 }, + const totalCases = weeks.reduce((sum, w) => sum + w.cases.length, 0) + const totalIcd = weeks.reduce( + (sum, w) => sum + w.cases.filter((c) => c.icd).length, 0, ) return ( -

+
- KW {kwVon}–{kwBis} {totalCases} Fälle gesamt - {totals.with_icd} mit ICD + {totalIcd} mit ICD
- - - - KW - Fälle - {fg1Label} - {fg2Label} - Gutachten - mit ICD - - - - {weeks.map((w) => ( - - KW {w.kw} - {w.count} - {w.fg1_count} - {w.fg2_count} - {w.gutachten} - - {w.with_icd}/{w.count} - - - ))} - - - - Gesamt - {totals.count} - {totals.fg1} - {totals.fg2} - {totals.gutachten} - - {totals.with_icd}/{totals.count} - - - -
+ {weeks.map((week) => ( +
+

+ KW {week.kw} — {week.cases.length} Fälle +

+ {week.cases.length > 0 ? ( + + + + KVNR + Datum + Erstgespräch + Abbruch + Unterlagen + Gutachten + {fg1Label} + {fg2Label} + ICD-10 + + + + {week.cases.map((c, i) => ( + + {c.kvnr || '—'} + {c.datum} + {c.erstgespraech ? 'x' : ''} + {c.abbruch ? 'x' : ''} + {c.unterlagen ? 'x' : ''} + {c.gutachten ? 'x' : ''} + {c.fg1 ? 'x' : ''} + {c.fg2 ? 'x' : ''} + {c.icd || ''} + + ))} + +
+ ) : ( +

Keine Fälle in dieser KW.

+ )} +
+ ))}
) }