mitai-jinkendo/.claude/docs/technical/REPORT_PROFILES_AND_PDF.md
Lars 62729d0648
All checks were successful
Deploy Development / deploy (push) Successful in 1m4s
Build Test / pytest-backend (push) Successful in 5s
Build Test / lint-backend (push) Successful in 1s
Build Test / build-frontend (push) Successful in 19s
feat: add report_export widget and enhance report generation capabilities
- 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.
2026-04-29 11:28:04 +02:00

2.3 KiB
Raw Permalink Blame History

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_idALLOWED_CHART_IDS, window_days 7365
    • 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).