Daily Report - 02. Januar 2026
Invoices Modul - PDF-Generator & Frontend Verbesserungen
PDF-Generator komplett überarbeitet
Design & Typografie
- ✅ Roboto Font statt Helvetica implementiert
- TrueType Fonts heruntergeladen und registriert
- Alle Varianten: Regular, Bold, Italic, BoldItalic
- Fonts im Verzeichnis:
backend/app/assets/fonts/
- ✅ Fettschrift für wichtige Elemente:
- Rechnungsnummer und Datum im Header
- Position, Menge und Gesamt in der Positionstabelle
- Kontaktname bei “Bei Rückfragen”
- ✅ Zentrierung aller Tabellenspalten außer Beschreibung
- ✅ Rückfragen-Text vereinfacht (nur Name, ohne “K.I.T. Solutions”)
Intelligente Pagination
- ✅ Automatischer Table-Split bei zu vielen Positionen
- Tabelle wird intelligent bei der richtigen Zeile umgebrochen
- Header wird auf jeder Seite automatisch wiederholt (
repeatRows=1) - Funktioniert mit beliebig vielen Positionen (getestet mit 3 und 10 Positionen)
- ✅ Fortsetzungshinweise zwischen Seiten
- “Fortsetzung auf Seite 2 →” am Ende von Seite 1 (in Accent-Farbe, kursiv)
- “← Fortsetzung von Seite 1” am Anfang von Seite 2 (in Accent-Farbe, kursiv)
- ✅ Seitenzahlen im Footer
- Format: “Seite X von Y”
- Zentriert unter dem 3-Spalten-Footer
- Automatische Berechnung der Gesamtseitenzahl vor der Generierung
- In grau für dezente Darstellung
- ✅ Keine Überlappungen mehr
- Terms/Rückfragen werden automatisch auf neue Seite verschoben wenn nötig
- Footer-Collision-Detection mit Sicherheitsabstand (10mm)
- Alle Elemente haben genug Platz
Technische Details
- Neue
draw_footer()Funktion mit optionalenpage_numundtotal_pagesParametern - Two-Pass-Logik: Seitenzahl wird vor der Generierung berechnet
- Simulation der Tabellen-Höhe und Split-Positionen
- Simulation der Terms/Rückfragen-Position
- Berechnung ob neue Seite benötigt wird
table.split()für intelligentes Aufteilen großer Tabellen- Page-Counter wird bei jedem
showPage()inkrementiert - Paragraph-Styles für gemischte Font-Weights in Tabellenzellen
Storage Abstraction Layer
- ✅ Storage Factory implementiert (
backend/app/core/storage/factory.py)- Zentrale Funktion
get_storage()für flexible Backend-Auswahl - Konfiguration über Environment Variable
STORAGE_BACKEND
- Zentrale Funktion
- ✅ WebDAV Storage Adapter (
backend/app/core/storage/nextcloud.py)- Unterstützung für Nextcloud/WebDAV
- Upload, Download, Delete, Exists Operationen
- Konfiguration über
NEXTCLOUD_*Environment Variables
- ✅ Local Filesystem Storage Adapter (
backend/app/core/storage/local.py)- Fallback für lokale Entwicklung
- Speicherung in
backend/app/storage/invoices/
- ✅ Invoice PDF Storage Migration
- Alte PDFs werden jetzt im konfigurierten Storage gespeichert
- Migration-Script:
backend/scripts/migrate_invoice_pdfs_to_storage.py
Products Module (Artikel/Dienstleistungen)
- ✅ CRUD Operations für Products
backend/app/modules/backoffice/products/crud.pybackend/app/modules/backoffice/products/routes.pybackend/app/modules/backoffice/products/schemas.pybackend/app/modules/backoffice/products/models.py
- ✅ Database Migrations
backend/alembic/versions/2026_01_01_2356-d13ce3a3941e_add_products_table.pybackend/alembic/versions/2026_01_01_2359-8e3d5cbbbc47_create_products_table_manually.py
- ✅ Frontend Integration
- Product-Select Component:
ui/src/modules/invoices/components/ProductSelect.vue - useProducts Composable:
ui/src/modules/invoices/composables/useProducts.ts - Product Types:
ui/src/modules/invoices/types/product.ts
- Product-Select Component:
- ✅ Import Script
- K.I.T. Products Import:
backend/scripts/import_kit_products.py
- K.I.T. Products Import:
Frontend - Invoice Detail Verbesserungen
- ✅ Card-basiertes Layout für Positionen (
ui/src/modules/invoices/pages/InvoiceDetailPage.vue)- Ersetzt die gequetschte 8-Spalten-Tabelle
- Jede Position ist jetzt eine Card mit besserem Spacing
- Prominente Anzeige von Beschreibung und Gesamtpreis
- Details (Menge, Einzelpreis, Rabatt, MwSt) in flexibler Bottom-Row mit Badges
- Positionsnummer in rundem Badge mit blauem Gradient
- Hover-Effekte für bessere Interaktivität
Dateien geändert
Backend:
backend/app/modules/backoffice/invoices/pdf_generator.py(komplett überarbeitet, 764 Zeilen)- Neue
draw_footer()Funktion mit Seitenzahlen - Table-Split-Logik
- Two-Pass Seitenzahl-Berechnung
- Fortsetzungshinweise
- Roboto Font Integration
- Neue
backend/app/modules/backoffice/invoices/crud.py(angepasst für Storage)backend/app/modules/backoffice/invoices/routes.py(angepasst für Storage)backend/app/modules/backoffice/invoices/schemas.py(erweitert)backend/app/core/settings/config.py(Storage-Konfiguration)backend/app/main.py(Products-Routes registriert)- Neue Dateien:
backend/app/assets/fonts/Roboto-*.ttf(4 Font-Dateien, ~2MB total)backend/app/core/storage/(komplettes Package)backend/app/modules/backoffice/products/(komplettes Module)backend/scripts/(Migration & Import Scripts)
Frontend:
ui/src/modules/invoices/pages/InvoiceDetailPage.vue(Positionen-Sektion redesigned)ui/src/modules/invoices/pages/InvoiceFormPage.vue(Product-Select integriert)ui/src/modules/invoices/components/index.ts(ProductSelect exportiert)ui/src/modules/invoices/composables/index.ts(useProducts exportiert)ui/src/modules/invoices/types/index.ts(Product-Types exportiert)- Neue Dateien:
ui/src/modules/invoices/components/ProductSelect.vueui/src/modules/invoices/composables/useProducts.tsui/src/modules/invoices/types/product.ts
Ergebnis
Das PDF-System ist jetzt production-ready und kann Rechnungen/Angebote mit beliebig vielen Positionen professionell darstellen. Die Pagination funktioniert automatisch und intelligent, ohne dass Inhalte mit dem Footer überlappen oder abgeschnitten werden.
Features im Detail:
- ✅ Roboto Font (professionell und modern)
- ✅ Fettschrift für wichtige Daten
- ✅ Zentrierung und optimiertes Layout
- ✅ Intelligente Pagination mit Table-Split
- ✅ Fortsetzungshinweise zwischen Seiten
- ✅ Seitenzahlen “Seite X von Y”
- ✅ Keine Footer-Überlappungen
- ✅ Funktioniert mit 3, 10, 50+ Positionen
- ✅ Storage Abstraction für flexible Speicherung
- ✅ Products Module für Artikelverwaltung
Testing:
- ✅ PDF mit 3 Positionen: 2 Seiten (Positionen + Terms/Rückfragen auf Seite 2)
- ✅ PDF mit 10 Positionen: 2 Seiten (Split bei Position 3/4, Summen + Terms auf Seite 2)
- ✅ Seitenzahlen korrekt berechnet und angezeigt
- ✅ Fortsetzungshinweise sichtbar
- ✅ Keine Überlappungen
Git Commit: a7a290a
Branch: dev
Zeit: ~3 Stunden
Status: ✅ Abgeschlossen, getestet und gepusht