Update PROGRESS.md: Phase 5 Batch 5 complete (Tasks 5.18-5.19)
This commit is contained in:
+76
@@ -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)
|
- Bestehende Patterns verwendet (apiClient, React Query hooks, PluginManifest)
|
||||||
|
|
||||||
**Phase 5 Batch 4 Gesamt: ✅ Complete**
|
**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**
|
||||||
|
|||||||
Reference in New Issue
Block a user