6.3 KiB
Changelog
Alle nennenswerten Änderungen an diesem Projekt werden in dieser Datei dokumentiert.
Das Format basiert auf Keep a Changelog, und dieses Projekt folgt Semantic Versioning.
[1.2.1] – 2026-06-30
Behoben
- Build-Pipeline: fix broken server start and page call
[1.2] – 2026-06-30
Hinzugefügt
-
Build-Pipeline (
1_build-pipeline/): Skripte zum Erstellen einer standalone.exe:build.bat/build.py: Orchestrierter Build mit Semantic Versioning – liest aktuelle Version ausCHANGELOG.md, bump't nach Wahl (major/minor/patch) und aktualisiert das Changelog automatischbuild.spec: PyInstaller-Spec-Datei mit allen Hidden Imports für Streamlit, openpyxl und PyMuPDFrun.py: Einstiegspunkt für die gebundelte.exe– setzt Pfade viaAPP_BASE_DIR, startet den Streamlit-Server und öffnet den Browser- Ausgabe nach
2_build/mit fertiger Ordnerstruktur (config/,input/,template/,output/)
-
app.pyunterstützt jetztAPP_BASE_DIR-Umgebungsvariable für Pfadauflösung im gebundelten Modus
Geändert
-
Statische Schriftgröße (
src/writer.py): Schriftgröße wird nicht mehr dynamisch aus dem PDF-Template extrahiert, sondern statisch aussettings.ini([font]→fontsize) gelesen, einheitlich für alle Felder.AppConfigumfontsizeerweitert,config.pylädt den Wert. -
Autoskalierung entfernt (
src/writer.py): Die automatische Schriftverkleinerung für lange Texte (Qualifikation_Field,Funktion_Field) wurde ersatzlos gestrichen – alle Texte haben exakt dieselbe Größe. -
Vertikale Textzentrierung (
src/writer.py): Einzeilige Felder werden jetzt vertikal mittig im Marker-Rechteck platziert. Mehrzeilige Felder (Tätigkeiten_Field,Dienstreisen_Field) bleiben oben ausgerichtet. -
Doppelte Felder unterstützt (
src/writer.py):Datum_Fieldund andere Marker, die mehrfach im PDF-Template vorkommen, werden jetzt alle mit demselben Wert befüllt. -
Stellenanteil-Formatierung (
src/writer.py):Stellenanteil in %wird mit deutschem Dezimalkomma und zwei Nachkommastellen ausgegeben (z. B.75→75,00).
[1.1] – 2026-06-24
Hinzugefügt
-
Streamlit-Web-UI (
app.py) mit:- Dropdown zur Auswahl der Input-Datei (
.xlsx) aus deminput/-Ordner – mit Sofort-Validierung und Anzeige von Mitarbeiteranzahl, Antragsnummern und Einträgen pro Monat - Dropdown zur Auswahl des PDF-Templates aus dem
template/-Ordner – mit Sofort-Validierung und Anzeige gefundener_Field-Platzhalter - Mitarbeiter-Multiselect-Liste mit „Alle auswählen“ / „Keine auswählen“-Buttons
- „Tätigkeitsnachweise generieren“-Button mit Fortschrittsanzeige
- Session-State-Caching für Validierung und Parsing (kein erneutes Einlesen bei UI-Reruns)
- Erfolgsmeldung mit Liste generierter Dateien und Button zum Öffnen des Output-Ordners
- Dropdown zur Auswahl der Input-Datei (
-
PDF-basierte Generierung (
src/writer.py) via PyMuPDF (fitz):- Pre-Scan aller
_Field-Platzhalter im Template-PDF über alle Seiten - Automatische Erkennung von Position (Bounding Box) und Schriftgröße jedes Platzhalters
- Redact + Insert-Text-Verfahren: Platzhalter werden geschwärzt und durch echte Daten ersetzt
- Unterstützung für mehrseitige Templates (z. B. 2 Seiten pro Monat)
- Mehrzeilige Textboxen (
Tätigkeiten_Field,Dienstreisen_Field) mit automatischem Wortumbruch - Automatische Schriftgrößen-Anpassung bei langen Texten in Qualifikation und Funktion (Autoscale)
- Prozentwerte werden als Ganzzahl ohne
%-Zeichen ausgegeben - Datumsformat
dd.mm.yyyywird automatisch aus dem Monatsfeld (MM.JJ) berechnet - Ort standardmäßig „Dresden“
- Dateiname:
{Nachname}_{Vorname}_Tätigkeitsnachweis.pdf
- Pre-Scan aller
-
Input-Parsing (
src/parser.py):- Einlesen von
.xlsx-Dateien mit openpyxl – ein Sheet pro Monat - Monats-Sheet-Erkennung per Wildcard-Pattern (
* 20??) - Prozentwert-Konvertierung: Excel-Prozentwerte (0.5 → 50) oder Ganzzahlen (50 → 50)
- Automatisches Überspringen leerer Zeilen (Name oder Antragsnummer fehlt)
- Gruppierung der Records nach Mitarbeitername (
group_by_employee) - Hilfsfunktionen:
get_unique_antragsnummern,get_unique_employees
- Einlesen von
-
Validierung (
src/validator.py):- Input-Datei: Prüft Existenz, Spaltenüberschriften (gegen
input-fields.json), Datenzeilen pro Monats-Sheet - Input-Daten: Erkennt leere Pflichtfelder pro Person und meldet betroffene Namen
- PDF-Template: Sucht alle
_Field-Platzhalter im PDF und meldet fehlende - Nicht-Monats-Sheets (z. B. „Alle Rollen“) werden ignoriert
- Input-Datei: Prüft Existenz, Spaltenüberschriften (gegen
-
Konfigurationsdateien (
config/):settings.ini: Pfade für Input/Template/Output, Dateinamen-Pattern, Monats-Sheet-Pattern, Skip-Optioneninput-fields.json: Spaltenschema der Input-Tabelle (9 Felder: ID, Kommentar, Antragsnummer, Name, Qualifikation, Funktion, Stellenanteil in %, Monat, Tätigkeit)output-fields.json: Mapping Input-Feld →_Field-Platzhalter im PDF (8 Felder)
-
Datenmodell (
src/models.py):EmployeeRecord: Dataclass für eine Mitarbeiter-Zeile mitmonth_index- undyear-PropertiesFieldSchema,OutputMapping,AppConfig,ValidationResult
-
Cold Run (
coldrun.py): Headless-Generierung für die erste Person ohne GUI, automatisch mit erster Input- und Template-Datei -
Start-Skripte:
start.bat(Windows),start.sh/start.command(macOS/Linux) -
End-to-End-Tests (
tests/test_e2e.py):- pytest-basiert mit realer Input-Datei (
2025 JM.xlsx) und realem PDF-Template - Prüft: 168 Datensätze, 19 Personen, 12 Monate
- Validiert Output-PDF: Seitenanzahl (24 Seiten = 12 × 2), Inhalte (Antragsnummer, Name, Stellenanteil, Qualifikation, Monat, Funktion, Tätigkeit), keine verbliebenen
_Field-Platzhalter
- pytest-basiert mit realer Input-Datei (
-
README.md: Vollständige Dokumentation zu Setup, Bedienung, Konfiguration, Cold Run und Tests
Geändert
- Template-Format von
.xlsxauf PDF umgestellt (ursprüngliches Excel-Template war schreibgeschützt) config/output-fields.json:target_cellentfernt – Mapping erfolgt jetzt über_Field-Platzhalter im PDFsrc/config.py:get_available_templatesfiltert jetzt.pdf-Dateien