deepseek den plan umsetzen lassen
This commit is contained in:
1 parent
6c60a72e0f
commit
044e4df783
16 files changed
+971
-55
No files matched your search
+24
-29
@@ -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
|
||||
```
|
||||
Reference in new issue
Block a user