75 lines
3.1 KiB
Markdown
75 lines
3.1 KiB
Markdown
# Copilot Plan: Windows GUI für Anwesenheit PDF Generator
|
|
|
|
## Ziel
|
|
Eine Windows-GUI mit customtkinter als zweiter Entry-Point (`gui.py`) neben dem
|
|
bestehenden CLI (`generate.py`). Die GUI wrappt direkt die vorhandenen `src/`-Module
|
|
und verändert keine Business Logic.
|
|
|
|
## Architektur
|
|
|
|
```
|
|
gui.py # GUI Entry-Point (customtkinter)
|
|
scripts/
|
|
create_icon.py # Einmaliges Script: erzeugt assets/icon.ico mit Pillow
|
|
assets/
|
|
icon.ico # Generiertes Icon (committed)
|
|
```
|
|
|
|
Bestehende Dateien die erweitert werden:
|
|
```
|
|
requirements.txt # + customtkinter>=5.2.0
|
|
requirements-dev.txt # + pyinstaller>=6.0.0
|
|
.gitignore # + build/, AnwesenheitPDF.spec, AnwesenheitPDF.exe
|
|
```
|
|
|
|
Nicht anzufassen:
|
|
```
|
|
generate.py, src/*.py, tests/, config.json, schema.json
|
|
```
|
|
|
|
## Datenfluss
|
|
|
|
```
|
|
GUI-Eingabe (Datei, Monat)
|
|
→ der Ordner Input wird gescannt, befindet sich eine Exceldatei darin, wird diese als input verwendet
|
|
→ der Ordner template wird gescannt und eine darin befindliche pdf als template datei verwendet
|
|
→ validate() [src/validators.py]
|
|
→ Vorschau-Panel aktualisieren
|
|
→ Default wird der Ordner /output als zeil für die generierten PDFs verwendet.
|
|
→ Sind schon Dateien in output ist eine Hinweis in der GUI zu sehen und vor dem Start der generierung kommt ein Hinweis (im Hinweis kann der Inhalt des Ordners gelöscht werden)
|
|
→ für eine gewählte Exceldatei + Templatedatei werden automatisch die Preview zeilen angezeigt so wie in show_preview_and_confirm()
|
|
|
|
GUI-Bestätigung (Generieren)
|
|
→ extract_persons() [src/excel_reader.py]
|
|
→ extract_year_from_filename() [src/excel_reader.py]
|
|
→ für jede Person:
|
|
extract_attendance() [src/excel_reader.py]
|
|
fill_pdf() [src/pdf_filler.py]
|
|
→ Log-Panel: [OK] / [FEHLER] pro Person
|
|
```
|
|
|
|
## Entwurfsentscheidungen
|
|
|
|
- Framework: **customtkinter** (modern, leichtgewichtig, Windows-nativ wirkend)
|
|
- CLI (`generate.py`) bleibt vollständig unverändert
|
|
- `config.json` bleibt manuell bearbeitbar — kein Settings-Tab in der GUI
|
|
- `show_preview_and_confirm()` aus `validators.py` wird **nicht** genutzt (CLI-only)
|
|
- `_resource_path()` Hilfsfunktion für PyInstaller-Kompatibilität (`sys._MEIPASS`)
|
|
- Validierung + Generierung laufen in `threading.Thread` (GUI bleibt responsiv)
|
|
- GUI-Updates aus Threads nur via `self.after(0, callback)` (thread-safe)
|
|
- `.exe` landet direkt im Root-Verzeichnis (kein `dist/`-Unterordner)
|
|
- Icon: Pillow-generierter Placeholder (`assets/icon.ico`)
|
|
|
|
## Packaging (kein Installer)
|
|
|
|
Build-Kommando (einmalig, nach Abschluss der Implementierung):
|
|
|
|
```
|
|
pyinstaller --onefile --windowed --distpath . --icon assets/icon.ico ^
|
|
--add-data "template;template" --add-data "config.json;." ^
|
|
--add-data "schema.json;." --add-data "assets;assets" ^
|
|
--name "AnwesenheitPDF" gui.py
|
|
```
|
|
|
|
Ergebnis: `AnwesenheitPDF.exe` nicht direkt im Projekt-Root, sondern mit allem was zum build der Exe benötigt wird im ordner /build und alles was zum ausführen der Exebenötigt wird im Ordner /dist.
|