Update PROGRESS.md: Phase 5 Batch 5 complete (Tasks 5.18-5.19)

This commit is contained in:
Agent Zero
2026-07-23 23:27:07 +02:00
parent 0ec8502fd4
commit 63b99ba489
+76
View File
@@ -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**