deepseek den plan umsetzen lassen

This commit is contained in:
trnq1ll0 committed 2026-06-09 08:33:47 +02:00
1 parent 6c60a72e0f
commit 044e4df783
16 files changed
+971 -55

No files matched your search

+24 -29
View File
@@ -2,7 +2,7 @@
Eine Python + Streamlit App für Windows, die aus einer Input-Excel-Datei (ein Sheet pro Monat mit Mitarbeiterdaten) und einem Excel-Template pro Mitarbeiter eine Excel-Datei generiert (ein Sheet pro Monat, befüllt mit dessen Daten).
**Ansatz**: Wiederverwendung der bewährten openpyxl-Patterns aus dem Vorgängerprojekt (`1_Erstes-Tool-Komplizert`), aber vereinfacht für Single-Input-File + Streamlit-UI statt CLI.
**Ansatz**: Verwendung von openpyxl für Single-Input-File + Streamlit-UI.
# Aufgabe
@@ -33,19 +33,18 @@ In der README.md ist ein kleine Doku wie das Programm zu benutzen ist und welche
1. **`requirements.txt` befüllen** — `streamlit`, `openpyxl`
2. **`config/settings.ini` befüllen** — Pfade, Standardwerte
- Abschnitte: `[paths]` (input_dir, template_dir, output_dir), `[output]` (filename_pattern)
3. **`config/input-fields.json` Schema definieren** — Spaltennamen und Typen der Input-Tabelle
- Muss durch Analyse der Datei `input/2025 JM.xlsx` ermittelt werden (Spalten A–?)
- JSON-Array mit `name`, `column`, `type`, `required`
4. **`config/output-fields.json` Mapping definieren** — Welche Input-Felder in welche Template-Zellen
- JSON-Array mit `source_field`, `target_cell`, `format` (optional)
- Muss durch Analyse des Templates `template/Tätigkeitsnachweise Stellenförderung.xlsx` ermittelt werden
3. **`config/input-fields.json` Schema definieren** — Spalten der Input-Tabelle mit ihren exakten Überschriften
- Wird durch Analyse der Datei `input/2025 JM.xlsx` ermittelt: Spaltenposition (A, B, C…) und die exakte Spaltenüberschrift aus Zeile 1 der jeweiligen Sheets
- JSON-Array mit `column` (Spaltenbuchstabe), `field_name` (exakte Überschrift aus der Excel-Tabelle), `type` (string|number|date), `required` (true|false)
4. **`config/output-fields.json` Mapping definieren** — Welche Input-Felder (exakte Spaltenüberschrift) in welche Template-Zellen geschrieben werden
- JSON-Array mit `source_field` (exakte Spaltenüberschrift aus der Input-Tabelle, wie in input-fields.json definiert), `target_cell` (Zelladresse im Template, z.B. "A17"), `format` (optional, z.B. "dd.mm.yyyy")
- Muss durch Analyse des Templates `template/Tätigkeitsnachweise Stellenförderung.xlsx` ermittelt werden (welche Zellen sind zu befüllen?)
### Phase 2: Core-Module (`src/`)
5. **`src/__init__.py` + `src/models.py`** — Datenklassen
- `EmployeeRecord`: name, vorname, nachname, antragsnummer, qualifikation, funktion, taetigkeit, stellenanteil, monat, jahr, … (Felder aus input-fields.json)
- `AppConfig`: geladene settings.ini + input/output-schemas
- Referenz: `1_Erstes-Tool-Komplizert/src/taetigkeitsnachweis/models.py`
6. **`src/config.py`** — Konfigurations-Loader
- `load_settings()`: liest `config/settings.ini` mit `configparser`
- `load_input_schema()`: liest `config/input-fields.json`
@@ -57,22 +56,19 @@ In der README.md ist ein kleine Doku wie das Programm zu benutzen ist und welche
- Extrahiert Monat/Jahr aus Sheet-Namen oder Sheet-Inhalt
- Für jedes Sheet: liest Zeilen anhand des Schemas, erzeugt `EmployeeRecord`-Liste
- Rückgabe: `dict[str, list[EmployeeRecord]]` (key = Mitarbeiter-Name)
- Referenz: `1_Erstes-Tool-Komplizert/src/taetigkeitsnachweis/parser.py`
### Phase 3: Writer & Validierung
8. **`src/writer.py`** — Output generieren
- `generate_workbooks(employee_records, template_path, mapping, config)`:
- `generate_activity_reports(employee_records, template_path, mapping, config)`:
- Gruppiert Records nach Mitarbeiter
- Für jeden Mitarbeiter: lädt Template, erstellt für jeden Monat ein Sheet (kopiert Template-Sheet)
- Befüllt Zielzellen gemäß output-fields.json Mapping
- Benennt Sheets nach Monat (z.B. "01_Januar", "02_Februar", …)
- Speichert als `{nachname}_{vorname}_Tätigkeitsnachweis.xlsx` in `output/`
- Referenz: `1_Erstes-Tool-Komplizert/src/taetigkeitsnachweis/writer.py`
- Speichert als `{nachname}_{vorname}_{YYYY}_Tätigkeitsnachweis.xlsx` in `output/`
9. **`src/validator.py`** — Eingabevalidierung
- `validate_input_file(filepath, schema)`: prüft Datei-Existenz, Sheet-Anzahl, Spalten laut Schema
- `validate_template(template_path, mapping)`: prüft ob alle target_cells im Template existieren
- Referenz: `1_Erstes-Tool-Komplizert/src/taetigkeitsnachweis/validator.py`
### Phase 4: Streamlit UI
@@ -80,15 +76,22 @@ In der README.md ist ein kleine Doku wie das Programm zu benutzen ist und welche
- Layout:
- Titel + Beschreibung
- `st.selectbox` für Input-Datei (aus `input/`-Folder)
- **Sofort bei Auswahl**: Validierung + Parsing der Datei
- Anzeige: Anzahl gefundener Mitarbeiter, Auflistung aller enthaltenen Antragsnummern
- Bei Fehlern: `st.error` mit Details
- `st.selectbox` für Template (aus `template/`-Folder)
- **Sofort bei Auswahl**: Validierung des Templates gegen `output-fields.json`
- Anzeige: Anzahl gefundener Zielfelder (target_cells), fehlende/fehlerhafte Zellen
- Bei Fehlern: `st.warning` mit Details
- **Mitarbeiter-Liste** (erscheint nach erfolgreicher Input-Validierung)
- `st.multiselect` mit allen gefundenen Mitarbeiternamen, standardmäßig alle vorselektiert
- Nicht selektierte Mitarbeiter werden bei der Generierung übersprungen
- Zeigt: „X von Y Mitarbeitern ausgewählt"
- `st.button("Tätigkeitsnachweise generieren")`
- Bei Button-Click:
1. Lade Konfiguration
2. Validiere Input-Datei + Template (zeige Fehler/Warnungen via `st.warning`/`st.error`)
3. Parse Input → Employee Records
4. Gruppiere nach Mitarbeiter (zeige Vorschau: N Mitarbeiter gefunden)
5. Generiere Workbooks und speichere in `output/`
6. Zeige Erfolgsmeldung mit Liste der erstellten Dateien via `st.success`
1. Filtere Employee Records auf selektierte Mitarbeiter
2. Generiere Activity Reports nur für selektierte Mitarbeiter und speichere in `output/`
3. Zeige Erfolgsmeldung mit Liste der erstellten Dateien via `st.success`
- Status-Anzeige mit `st.spinner` und `st.progress`
### Phase 5: Start-Skript & Doku
@@ -124,14 +127,6 @@ In der README.md ist ein kleine Doku wie das Programm zu benutzen ist und welche
| `start.bat` | Neu |
| `README.md` | Überschreiben mit vollständiger Doku |
## Referenz-Code (Vorgängerprojekt)
- `1_Erstes-Tool-Komplizert/src/taetigkeitsnachweis/parser.py` — Parsing-Patterns für openpyxl
- `1_Erstes-Tool-Komplizert/src/taetigkeitsnachweis/writer.py` — Template-Befüllung, Sheet-Kopie
- `1_Erstes-Tool-Komplizert/src/taetigkeitsnachweis/validator.py` — Source-Validierung
- `1_Erstes-Tool-Komplizert/src/taetigkeitsnachweis/models.py` — Dataclass-Patterns
- `1_Erstes-Tool-Komplizert/config.json` — Konfigurationsstruktur
## Projektstruktur
```
@@ -161,8 +156,8 @@ In der README.md ist ein kleine Doku wie das Programm zu benutzen ist und welche
## Verifikation
1. **Input-Datei-Analyse**: `2025 JM.xlsx` mit openpyxl öffnen, Sheet-Namen prüfen, Spaltenüberschriften ausgeben → `input-fields.json` ableiten
2. **Template-Analyse**: `Tätigkeitsnachweise Stellenförderung.xlsx` öffnen, belegte Zellen inspizieren → `output-fields.json` ableiten
1. **Input-Datei-Analyse**: `2025 JM.xlsx` mit openpyxl öffnen, Sheet-Namen prüfen, exakte Spaltenüberschriften aus Zeile 1 jedes Sheets auslesen → `input-fields.json` ableiten (Spaltenbuchstabe + original Feldname)
2. **Template-Analyse**: `Tätigkeitsnachweise Stellenförderung.xlsx` öffnen, belegte/freie Zellen inspizieren, die befüllt werden sollen → `output-fields.json` ableiten (Mapping: Input-Spaltenüberschrift → Template-Zelladresse)
3. **Unit-Test**: App mit vorhandener Input-Datei und Template ausführen, prüfen ob Output-Dateien korrekt befüllt sind
4. **Edge Cases**: Leere Input-Zeilen, fehlende Monate, Mitarbeiter ohne Vorname, Sonderzeichen in Namen
```