From 5436315952eeb401f37cfac8878ece0d44ab824a Mon Sep 17 00:00:00 2001 From: Rob Date: Tue, 21 Apr 2026 15:37:39 +0200 Subject: [PATCH] Add output filename generation and workbook save flow --- .github/copilot-tasks.md | 10 +++--- src/taetigkeitsnachweis/writer.py | 53 +++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/.github/copilot-tasks.md b/.github/copilot-tasks.md index a43e8ed..40f5652 100644 --- a/.github/copilot-tasks.md +++ b/.github/copilot-tasks.md @@ -71,10 +71,10 @@ Projekt vollstaendig umsetzen: aus PS_PW.xlsx und Stellenbeschreibungen.xlsx mon - [x] Template-Workbook laden - [x] Sheet pro aktiver Zuordnung klonen - [x] Inhalte assignment-spezifisch in Zielzellen schreiben -- [ ] T12: Dateinamen und Speichern - - [ ] Muster: `Taetigkeitsnachweis_YYYY_MM_Vorname_Nachname.xlsx` - - [ ] Pro Mitarbeiter genau eine Datei pro Monat erzeugen - - [ ] Bei mehreren Zuordnungen: mehrere Sheets in derselben Datei +- [x] T12: Dateinamen und Speichern + - [x] Muster: `Taetigkeitsnachweis_YYYY_MM_Vorname_Nachname.xlsx` + - [x] Pro Mitarbeiter genau eine Datei pro Monat erzeugen + - [x] Bei mehreren Zuordnungen: mehrere Sheets in derselben Datei ## Phase 7 - CLI und Benutzerfluss - [ ] T13: CLI in `generate.py` implementieren @@ -111,4 +111,4 @@ Projekt vollstaendig umsetzen: aus PS_PW.xlsx und Stellenbeschreibungen.xlsx mon 8. T15 -> T16 -> T17 ## Aktueller Startpunkt -- [ ] Naechste aktive Aufgabe: T12 (Dateinamen und Speichern) +- [ ] Naechste aktive Aufgabe: T13 (CLI in generate.py implementieren) diff --git a/src/taetigkeitsnachweis/writer.py b/src/taetigkeitsnachweis/writer.py index 9a6e24b..ebcd780 100644 --- a/src/taetigkeitsnachweis/writer.py +++ b/src/taetigkeitsnachweis/writer.py @@ -94,3 +94,56 @@ def build_employee_workbooks( workbooks[employee_name] = workbook return workbooks + + +def build_output_filename( + filename_pattern: str, + employee_name: str, + report_year: int, + report_month: int, +) -> str: + first_name, last_name = _split_name_for_filename(employee_name) + safe_first = first_name.replace(" ", "_") + safe_last = last_name.replace(" ", "_") + return filename_pattern.format( + year=report_year, + month=f"{report_month:02d}", + first_name=safe_first, + last_name=safe_last, + ) + + +def save_employee_workbooks( + config: dict[str, Any], + employee_workbooks: dict[str, Workbook], + report_month: int, + report_year: int, + project_root: Path, +) -> list[Path]: + paths_cfg = config["paths"] + output_cfg = config["output"] + filename_pattern = output_cfg["filename_pattern"] + + output_dir = project_root / paths_cfg["output_dir"] + output_dir.mkdir(parents=True, exist_ok=True) + + saved_paths: list[Path] = [] + used_names: set[str] = set() + + for employee_name, workbook in employee_workbooks.items(): + filename = build_output_filename( + filename_pattern=filename_pattern, + employee_name=employee_name, + report_year=report_year, + report_month=report_month, + ) + if filename in used_names: + raise ValueError(f"Output filename collision detected: {filename}") + + used_names.add(filename) + output_path = output_dir / filename + workbook.save(output_path) + workbook.close() + saved_paths.append(output_path) + + return saved_paths