diff --git a/PROGRESS.md b/PROGRESS.md index a372099..4e10a9d 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -388,3 +388,79 @@ LeoCRM-Agenten können externe MCP-Server nutzen (Web-Search, Code-Execution, ex - Bestehende Patterns verwendet (apiClient, React Query hooks, PluginManifest) **Phase 5 Batch 4 Gesamt: ✅ Complete** + +--- + +## Phase 5 Batch 5: Report Generator PDF-Support & Frontend (Tasks 5.18-5.19) + +### Task 5.18: Report Generator: PDF-Support & Druck-Funktionen ✅ + +**Backend:** +- WeasyPrint 69.0 installiert in /opt/venv +- 5 Jinja2 HTML-Templates erstellt in `app/plugins/builtins/report_generator/templates/`: + - `contact_list.html.j2` — Kontaktliste (Name, E-Mail, Telefon, Typ, Firma) + - `calendar_week.html.j2` — Wochenkalender (Tage × Stunden Grid) + - `calendar_month.html.j2` — Monatskalender (Grid mit Terminen) + - `company_list.html.j2` — Firmenliste (Name, Adresse, Ansprechpartner) + - `audit_log.html.j2` — Audit-Log (Timestamp, User, Action, Entity) + - Alle Templates: A4 Landscape, @media print CSS, Seitenränder, Seitenzahlen +- `schemas.py` erweitert: `output_format` um `pdf` und `print` ergänzt + - `PresetReportRequest` und `PresetReportInfo` Schemas hinzugefügt + - `ReportGenerateRequest` um optionales `output_format` erweitert +- `pdf_generator.py` erstellt: Jinja2 + WeasyPrint Pipeline + - `render_template_file()` — File-basierte Templates + - `render_template_string()` — User-defined Templates + - `generate_pdf()` / `generate_print_pdf()` — WeasyPrint PDF-Generierung + - `generate_preset_report()` — Preset-spezifische Generierung (PDF/CSV/Excel/JSON) + - `generate_pdf_from_template_content()` — User-template Generierung + - `PRESET_META` — Metadaten für 5 Preset-Berichte +- `routes.py` modifiziert: + - `GET /presets` — Listet alle Preset-Berichte + - `POST /presets/generate` — Generiert Preset-Bericht (StreamingResponse) + - `POST /generate` — Generiert User-Template-Bericht (StreamingResponse) + - Alle Endpunkte mit RBAC (`require_permission`: reports:read, reports:generate, reports:manage_templates) + - Generate-Endpunkte returnieren Datei direkt als StreamingResponse +- `plugin.py` permissions auf Colon-Format aktualisiert (reports:read, reports:generate, reports:manage_templates) + +**Tests:** `tests/test_report_generator.py` — 7 Tests (all passing) +- test_list_presets: GET /presets returns 5 presets +- test_generate_preset_pdf: PDF generation with valid %PDF- header +- test_generate_preset_csv: CSV generation with correct content +- test_create_and_generate_pdf_template: Template CRUD + PDF generation +- test_output_format_validation: Invalid format rejected (422) +- test_unauthenticated_access_blocked: 401 without auth +- test_viewer_cannot_manage_templates: RBAC 403 for viewer role + +### Task 5.19: Report Generator: Frontend-Oberfläche ✅ + +**Frontend:** +- `frontend/src/api/reports.ts` — React Query hooks: + - `useReportTemplates`, `useReportTemplate`, `useCreateReportTemplate`, `useUpdateReportTemplate`, `useDeleteReportTemplate` + - `useReportPresets`, `useGenerateReport`, `useGeneratePresetReport` + - `downloadBlob()` Helper für Browser-Download +- `frontend/src/pages/Reports.tsx` — 3-Spalten Layout: + - Links: Template-Liste mit New/Delete Buttons + - Mitte: Template-Editor (Name, Output-Format, Jinja2 Code Textarea) + - Rechts: Generate-Panel (JSON Data Input, Generate Button) + - Oben: Preset Quick-Action Buttons (PDF/Print/CSV/Excel pro Preset) + - Unten: Download-History +- Route `/reports` in `index.tsx` registriert (lazy-loaded) +- i18n Keys in `de.json` und `en.json` (reports.* Sektion + nav.reports) + +**Tests:** `frontend/src/pages/__tests__/Reports.test.tsx` — 5 Tests (all passing) +- renders page with preset quick actions +- displays templates in template list +- clicking new template shows editor +- selecting a template loads it into editor +- shows download history section + +### Verifikation +- Alle 12 Tests passing (7 backend + 5 frontend) +- TSC: 0 neue Errors (2 pre-existing Dms.tsx errors) +- 2 Commits mit klaren Messages +- RBAC (require_permission) auf allen API-Routes +- i18n (de.json, en.json) aktualisiert +- Keine .env committet +- Bestehende Patterns verwendet (apiClient, React Query hooks, lazy-loaded pages) + +**Phase 5 Batch 5 Gesamt: ✅ Complete**