Add output filename generation and workbook save flow
This commit is contained in:
1 parent
10e3ec8c12
commit
5436315952
2 files changed
+58
-5
No files matched your search
@@ -71,10 +71,10 @@ Projekt vollstaendig umsetzen: aus PS_PW.xlsx und Stellenbeschreibungen.xlsx mon
|
|||||||
- [x] Template-Workbook laden
|
- [x] Template-Workbook laden
|
||||||
- [x] Sheet pro aktiver Zuordnung klonen
|
- [x] Sheet pro aktiver Zuordnung klonen
|
||||||
- [x] Inhalte assignment-spezifisch in Zielzellen schreiben
|
- [x] Inhalte assignment-spezifisch in Zielzellen schreiben
|
||||||
- [ ] T12: Dateinamen und Speichern
|
- [x] T12: Dateinamen und Speichern
|
||||||
- [ ] Muster: `Taetigkeitsnachweis_YYYY_MM_Vorname_Nachname.xlsx`
|
- [x] Muster: `Taetigkeitsnachweis_YYYY_MM_Vorname_Nachname.xlsx`
|
||||||
- [ ] Pro Mitarbeiter genau eine Datei pro Monat erzeugen
|
- [x] Pro Mitarbeiter genau eine Datei pro Monat erzeugen
|
||||||
- [ ] Bei mehreren Zuordnungen: mehrere Sheets in derselben Datei
|
- [x] Bei mehreren Zuordnungen: mehrere Sheets in derselben Datei
|
||||||
|
|
||||||
## Phase 7 - CLI und Benutzerfluss
|
## Phase 7 - CLI und Benutzerfluss
|
||||||
- [ ] T13: CLI in `generate.py` implementieren
|
- [ ] 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
|
8. T15 -> T16 -> T17
|
||||||
|
|
||||||
## Aktueller Startpunkt
|
## Aktueller Startpunkt
|
||||||
- [ ] Naechste aktive Aufgabe: T12 (Dateinamen und Speichern)
|
- [ ] Naechste aktive Aufgabe: T13 (CLI in generate.py implementieren)
|
||||||
@@ -94,3 +94,56 @@ def build_employee_workbooks(
|
|||||||
workbooks[employee_name] = workbook
|
workbooks[employee_name] = workbook
|
||||||
|
|
||||||
return workbooks
|
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
|
||||||
Reference in new issue
Block a user