Add PDF invoice generation: implement backend API, introduce PdfService, update frontend repository and UI with download logic, and mark roadmap task complete.

This commit is contained in:
2026-04-13 17:18:45 +02:00
parent 9b9c068e7f
commit 76d7019d30
12 changed files with 204 additions and 7 deletions
@@ -0,0 +1,27 @@
# Curator Log: 2026-04-13 - Phase 12 Implementation (Rechnungserstellung)
## 🏗️ Status Update
Die Phase 12 (Abrechnung & Billing) wurde um die zentrale Funktion der PDF-Rechnungserstellung erweitert. Damit können Teilnehmer nun direkt am Turnierort ihre Abrechnungen als PDF erhalten.
### Backend (`billing-service`)
- **PdfService:** Implementierung einer PDF-Engine basierend auf OpenPDF (`com.github.librepdf:openpdf`). Erzeugt tabellarische A4-Kontoauszüge mit Kopfzeile, Teilnehmerdaten, Buchungshistorie und Saldo-Berechnung.
- **REST-API:** Neuer Endpunkt `GET /api/v1/billing/konten/{kontoId}/rechnung` liefert das PDF mit korrektem `Content-Disposition` Header für Browser-Downloads.
- **Dependency:** `openpdf:2.0.3` zur `build.gradle.kts` und `libs.versions.toml` hinzugefügt.
### Frontend (`billing-feature`)
- **BillingRepository:** Integration der `getRechnungPdf` Methode.
- **ApiRoutes:** Neue Route `ApiRoutes.Billing.rechnung(kontoId)` definiert.
- **BillingViewModel:** State um `pdfData` erweitert. Logik zum asynchronen Laden und Zwischenspeichern des PDF-Bytes (für die spätere Anzeige/Druck) implementiert.
- **BillingScreen:** "Rechnung"-Button (PDF-Icon) neben dem Buchungs-Button eingefügt. Integration eines Preview-Dialogs zur Bestätigung des PDF-Eingangs.
## 🗺️ Roadmap Progress
- [x] **Rechnungserstellung:** In `MASTER_ROADMAP.md` als abgeschlossen markiert. ✓
- [ ] **Offene Posten & Buchungs-Logik:** Verbleiben als nächste Prioritäten in Phase 12.
## 🧹 Cleanup & Maintenance
- `libs.versions.toml` konsolidiert.
- `FakeBillingRepository` für Offline-Tests aktualisiert.
- **Hotfix:** Kompilierfehler in `PdfService.kt` behoben (`cell.padding` durch `cell.setPadding(5f)` ersetzt).
---
*Log erstellt am 13.04.2026 durch Junie (Curator Mode).*