- Introduced the `report_export` widget to the dashboard, allowing users to generate structured PDF reports. - Updated widget configuration to include `report_export` in the allowed widgets and added validation for its configuration. - Enhanced the widget catalog with details for the new `report_export` entry. - Implemented API endpoints for managing report profiles and generating PDFs. - Added frontend components for configuring and displaying report settings. - Updated tests to ensure proper validation and functionality of the new report generation features. - Bumped application version to reflect the addition of the new widget and related functionalities.
57 lines
2.3 KiB
Markdown
57 lines
2.3 KiB
Markdown
# Berichtsprofile & PDF (technisch)
|
||
|
||
**Stand:** 2026-04-29
|
||
|
||
## Begriffe
|
||
|
||
| Begriff | Bedeutung |
|
||
|--------|-----------|
|
||
| **Layout-Snapshot** | PDF aus gerasteter DOM-Übersicht (`html2canvas` + `jspdf`), optional Widget `report_export`. |
|
||
| **Strukturierter Bericht** | Profil mit Blöcken (`section`, `chart`, `ai_insight`), PDF serverseitig via Data Layer + Matplotlib + ReportLab. |
|
||
|
||
Die beiden Wege sind bewusst getrennt, damit das Dashboard nicht die einzige „Wahrheit“ für Dokumente wird.
|
||
|
||
## Datenbank
|
||
|
||
- Tabelle `report_profiles` (Migration `060_report_profiles.sql`): `profile_id` PK → `profiles`, `payload` JSONB, `updated_at`.
|
||
|
||
Ohne Zeile gilt ein **Code-Standard** (`default_report_profile_dict` in `report_profile_schema.py`).
|
||
|
||
## API (`/api/reports`)
|
||
|
||
| Methode | Pfad | Zweck |
|
||
|--------|------|--------|
|
||
| GET | `/catalog` | Diagramm-Katalog + Blocktypen für UI |
|
||
| GET | `/profile` | `{ stored, profile }` |
|
||
| PUT | `/profile` | Vollständiges Profil-JSON (Pydantic-validiert) |
|
||
| DELETE | `/profile` | DB-Zeile löschen → wieder Standard |
|
||
| POST | `/generate-pdf` | PDF-Download; `data_export`-Kontingent + `increment_feature_usage` |
|
||
|
||
## Schema v1 (`report_profile_schema.py`)
|
||
|
||
- `version`: nur `1`
|
||
- `document_title`: optional
|
||
- `blocks`: Liste mit Union:
|
||
- `section`: `title`
|
||
- `chart`: `chart_id` ∈ `ALLOWED_CHART_IDS`, `window_days` 7–365
|
||
- `ai_insight`: optional `insight_id` (UUID, `ai_insights.id`), optional `title`
|
||
|
||
## Diagrammdaten
|
||
|
||
`report_chart_fetch.fetch_chart_payload` ruft dieselben Bausteine auf wie `/api/charts` (ohne HTTP). Erweiterung: Eintrag in `ALLOWED_CHART_IDS`, Fetcher in `_CHART_FETCHERS`, Zeile in `CHART_CATALOG_FOR_API`.
|
||
|
||
## PDF-Rendering
|
||
|
||
`report_pdf_render.build_structured_report_pdf`: ReportLab-Flowable-Kette, Diagramme als PNG aus Chart-Payload (Matplotlib, Agg-Backend).
|
||
|
||
## Frontend
|
||
|
||
- **Einstellungen:** Karte „PDF-Bericht (strukturiert)“ — Blöcke bearbeiten, speichern, Standard, PDF erzeugen.
|
||
- **Dashboard:** Widget bleibt optionaler **Schnappschuss**; Hinweis verweist auf Einstellungen.
|
||
|
||
## Nächste sinnvolle Erweiterungen
|
||
|
||
- Dashboard-Layout → Berichtsprofil **einmalig importieren** (Mapping-Tabelle Widget-ID → chart_id).
|
||
- KI: Insights-Auswahl in der UI statt manueller UUID.
|
||
- Weitere `chart_id`-Werte / multipage Feintuning (Seitenumbrüche pro Block).
|