diff --git a/open_workshop_report/Integration_Plan.md b/open_workshop_report/Integration_Plan.md new file mode 100644 index 0000000..3ad895b --- /dev/null +++ b/open_workshop_report/Integration_Plan.md @@ -0,0 +1,306 @@ +# Integration Plan: Automatisierter Export zu DokuWiki + +## Überblick +Automatische monatliche Generierung von Statistik-Diagrammen als PNG-Dateien und Upload zu DokuWiki. + +## Ziel +- **Vollautomatische** monatliche Reports ohne manuellen Export +- **Professionelle Visualisierungen** mit Beschriftungen (wie Metabase oder besser) +- **Direkte Integration** in DokuWiki für Präsentationen und Dokumentation + +## Technische Architektur + +### 1. Graph-Renderer Modul +**Aufwand: 2-3 Stunden** + +#### Bibliotheken +- **Matplotlib** oder **Plotly** für PNG-Generierung +- Volle Kontrolle über Styling, Beschriftungen, Farben + +#### Zu generierende Diagramme + +1. **Tägliche Nutzung (Monat)** + - Balkendiagramm: Tag × Nutzer + - Wochentag (blau) vs. Wochenende (türkis) + - Zahlen auf jedem Balken + - Summe + Ø rechts oben + +2. **Jahresvergleich Buchungen** + - Gruppierte Balken: Monat × Jahre (2020-2025) + - Zahlen auf Balken + - Farbcodierung pro Jahr + - Legende mit Jahren + +3. **Ø Nutzer pro Tag (Trend)** + - Liniendiagramm über Zeit + - Datenpunkte mit Werten beschriftet + - Monatliche Granularität + - Optional: Trendlinie + +4. **Wiederholungstäter Verteilung** + - 100% gestapeltes Balkendiagramm + - Häufigkeit 1x, 2x, 3x... 17+ + - Prozentuale Beschriftung + - Monatliche Vergleiche + +5. **Nutzer pro Monat (Jahresvergleich)** + - Balkendiagramm: Monat × Jahre + - Zahlen auf Balken + - Identisch zu Buchungen, andere Metrik + +#### Datenzugriff +```python +# In models/report_generator.py +class ReportGenerator(models.Model): + _name = 'open_workshop.report.generator' + + def generate_daily_chart(self, month, year): + """Generiert Tagesdiagramm für einen Monat""" + # Hole DailyStats für den Monat + daily_stats = self.env['open_workshop.daily.stats'].search([ + ('year', '=', year), + ('month', '=', month) + ], order='date asc') + + # Matplotlib: Balkendiagramm mit Beschriftung + # Speichere als PNG in ir.attachment + pass + + def generate_yearly_comparison(self): + """Generiert Jahresvergleich Buchungen""" + # Hole UsageStats gruppiert nach Monat und Jahr + stats = self.env['open_workshop.usage.stats'].search([ + ('period_type', '=', 'month') + ], order='year, month') + + # Matplotlib: Gruppierte Balken mit Legende + pass +``` + +#### PNG-Konfiguration +- **Auflösung**: 300 DPI (Präsentationsqualität) +- **Größe**: 1920×1080 oder 1600×900 +- **Format**: PNG mit Transparenz optional +- **Speicherort**: `ir.attachment` mit Metadaten + +--- + +### 2. Scheduled Action (Cron) +**Aufwand: 30 Minuten** + +#### Konfiguration +```xml + + + Monatliche Report-Generierung für DokuWiki + + code + model.generate_and_upload_reports() + 1 + months + -1 + False + + +``` + +#### Ausführungslogik +- **Zeitpunkt**: 1. des Monats, 02:00 Uhr +- **Verarbeitet**: Vormonat (z.B. am 1. Januar → Dezember-Report) +- **Fehlerbehandlung**: Log-Eintrag bei Fehler, kein Absturz + +--- + +### 3. DokuWiki Integration +**Aufwand: 2 Stunden** + +#### Nutzt bestehendes Modul +- `open_workshop_dokuwiki` ist bereits vorhanden +- XML-RPC Verbindung konfiguriert + +#### Upload-Prozess +```python +def upload_to_dokuwiki(self, png_data, filename): + """Upload PNG zu DokuWiki via XML-RPC""" + dokuwiki = self.env['open_workshop.dokuwiki.connection'] + + # Upload zu :statistik:reports:2025: + namespace = f'statistik:reports:{year}' + dokuwiki.upload_file( + namespace=namespace, + filename=filename, + data=png_data, + overwrite=True + ) + + # Aktualisiere Wiki-Seite + page_content = f""" +====== Statistik {month_name} {year} ====== + +===== Tägliche Nutzung ===== +{{{{:statistik:reports:{year}:daily_{year}_{month:02d}.png}}}} + +===== Jahresvergleich Buchungen ===== +{{{{:statistik:reports:{year}:yearly_comparison_{year}_{month:02d}.png}}}} + +===== Durchschnittliche Nutzer pro Tag ===== +{{{{:statistik:reports:{year}:avg_users_trend_{year}_{month:02d}.png}}}} + +===== Wiederholungstäter ===== +{{{{:statistik:reports:{year}:repeat_users_{year}_{month:02d}.png}}}} + +===== Nutzer pro Monat ===== +{{{{:statistik:reports:{year}:users_per_month_{year}_{month:02d}.png}}}} +""" + + dokuwiki.save_page( + page_id=f'statistik:reports:{year}:{month:02d}', + content=page_content + ) +``` + +#### Wiki-Struktur +``` +statistik/ +├── reports/ +│ ├── 2024/ +│ │ ├── daily_2024_12.png +│ │ ├── yearly_comparison_2024_12.png +│ │ └── 12.txt (Wiki-Seite) +│ └── 2025/ +│ ├── daily_2025_01.png +│ ├── yearly_comparison_2025_01.png +│ └── 01.txt (Wiki-Seite) +``` + +--- + +## Implementierungsplan + +### Phase 1: Graph-Renderer (Tag 1-2) +- [ ] `models/report_generator.py` erstellen +- [ ] Matplotlib/Plotly Abhängigkeit hinzufügen +- [ ] Funktion: Tagesdiagramm generieren +- [ ] Funktion: Jahresvergleich generieren +- [ ] Funktion: Trenddiagramm generieren +- [ ] Funktion: Wiederholungstäter-Diagramm (100% gestapelt) +- [ ] PNG-Speicherung in `ir.attachment` +- [ ] Tests mit aktuellen Daten + +### Phase 2: DokuWiki Upload (Tag 2-3) +- [ ] XML-RPC Upload-Funktion erweitern +- [ ] Template für Wiki-Seiten erstellen +- [ ] Automatische Namespace-Erstellung +- [ ] Fehlerbehandlung (Wiki offline, etc.) +- [ ] Test-Upload mit Dummy-Daten + +### Phase 3: Scheduled Action (Tag 3) +- [ ] Cron-Job konfigurieren +- [ ] Orchestrierung: Generierung + Upload +- [ ] Logging und Monitoring +- [ ] E-Mail-Benachrichtigung bei Erfolg/Fehler (optional) +- [ ] Manueller Trigger für Backfill alter Monate + +### Phase 4: Testing & Rollout (Tag 4) +- [ ] Test-Durchlauf für letzte 3 Monate +- [ ] Validierung: Alle Diagramme korrekt? +- [ ] Wiki-Seiten lesbar und vollständig? +- [ ] Performance-Check (Generierung < 30 Sekunden) +- [ ] Produktiv-Schaltung + +--- + +## Technische Anforderungen + +### Python-Bibliotheken +```python +# requirements.txt (zu ergänzen) +matplotlib>=3.7.0 +plotly>=5.18.0 +kaleido>=0.2.1 # Für Plotly PNG-Export +``` + +### Odoo-Module +- `open_workshop_dokuwiki` (bereits vorhanden) +- `open_workshop_report` (aktuelles Modul) + +### Server-Anforderungen +- **Fonts**: Liberation Sans/DejaVu für Matplotlib +- **Speicher**: ~50 MB pro Monat für PNG-Archiv +- **CPU**: Generierung ~10-20 Sekunden pro Diagramm + +--- + +## Vorteile gegenüber Metabase + +### Was besser ist +1. **Vollautomatisch**: Kein manueller Export +2. **Konsistent**: Immer gleiche Formatierung +3. **Versioniert**: Alte Reports bleiben im Wiki +4. **Integriert**: Daten direkt aus Odoo +5. **Anpassbar**: Jedes Detail steuerbar (Farben, Beschriftungen) + +### Was gleich gut ist +- PNG-Qualität für Präsentationen +- Zahlen direkt auf Diagrammen +- Komplexe Visualisierungen (100% gestapelt) + +### Was Metabase besser kann +- Ad-hoc Abfragen ohne Code +- Interaktive Dashboards (kein Export nötig) +- Schnellere Iteration bei neuen Fragen + +--- + +## Aufwandsschätzung + +| Phase | Aufwand | Beschreibung | +|-------|---------|--------------| +| Graph-Renderer | 2-3h | Matplotlib/Plotly Implementation | +| DokuWiki Upload | 2h | XML-RPC Integration | +| Scheduled Action | 30min | Cron-Konfiguration | +| Testing | 1-2h | Validierung & Rollout | +| **GESAMT** | **5-7h** | Vollständige Implementierung | + +--- + +## Nächste Schritte + +### Entscheidung erforderlich +1. **Bibliothek wählen**: Matplotlib (einfacher) oder Plotly (moderner)? +2. **Umfang**: Alle 5 Diagramme oder erstmal 2-3 zum Testen? +3. **Zeitplan**: Wann soll die erste automatische Generierung laufen? + +### Optional: Manuelle Trigger +- Button in Odoo: "Report jetzt generieren" +- Nützlich für Ad-hoc Präsentationen +- Zusatzaufwand: +1 Stunde + +--- + +## Wartung + +### Monatlich +- Automatisch, kein Eingriff nötig + +### Bei Änderungen +- Neue Metriken → Graph-Renderer erweitern +- Neues Design → Template anpassen +- DokuWiki-Struktur → Upload-Pfade ändern + +### Monitoring +- Cron-Job-Log prüfen (Odoo UI) +- Wiki-Seiten stichprobenartig kontrollieren +- Bei Fehler: E-Mail-Benachrichtigung + +--- + +## Fazit + +Mit dieser Integration wird **Odoo zur vollständigen Reporting-Lösung**: +- Daten erfassen ✓ +- Analysieren ✓ +- Visualisieren ✓ +- Automatisch publizieren ✓ + +**Kein Metabase mehr nötig** für monatliche Standard-Reports.