move the whole app in subfolder
This commit is contained in:
1 parent
fa3e99dec0
commit
94e245a3a0
27 files changed
No files matched your search
@@ -0,0 +1,137 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Cold-Run Tätigkeitsnachweis-Generator.
|
||||
|
||||
Nimmt automatisch die erste Input-Datei und das erste Template,
|
||||
erzeugt einen Tätigkeitsnachweis für die erste gelistete Person
|
||||
und öffnet das Ergebnis (macOS) – ohne GUI, ohne Fragen.
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Projekt-Root
|
||||
PROJECT_ROOT = Path(__file__).resolve().parent
|
||||
sys.path.insert(0, str(PROJECT_ROOT))
|
||||
|
||||
from src.config import (
|
||||
load_settings,
|
||||
load_input_schema,
|
||||
load_output_mapping,
|
||||
get_available_input_files,
|
||||
get_available_templates,
|
||||
)
|
||||
from src.parser import parse_input_file, group_by_employee, get_unique_employees
|
||||
from src.validator import validate_input_file, validate_template
|
||||
from src.writer import generate_activity_reports
|
||||
|
||||
|
||||
def main():
|
||||
print("=" * 50)
|
||||
print(" Tätigkeitsnachweis-Generator (Cold Run)")
|
||||
print("=" * 50)
|
||||
print()
|
||||
|
||||
# ── Konfiguration laden ──────────────────────────────────────────
|
||||
config_dir = PROJECT_ROOT / "config"
|
||||
config = load_settings(config_dir, PROJECT_ROOT)
|
||||
config.input_schema = load_input_schema(config_dir)
|
||||
config.output_mapping = load_output_mapping(config_dir)
|
||||
|
||||
# ── Erste Input-Datei ermitteln ───────────────────────────────────
|
||||
input_files = get_available_input_files(config)
|
||||
if not input_files:
|
||||
print("[FEHLER] Keine .xlsx-Dateien im input/-Ordner gefunden.")
|
||||
return 1
|
||||
|
||||
input_file = input_files[0]
|
||||
input_path = Path(config.input_dir) / input_file
|
||||
print(f"[INFO] Input-Datei: {input_file}")
|
||||
|
||||
# ── Erstes Template ermitteln ─────────────────────────────────────
|
||||
template_files = get_available_templates(config)
|
||||
if not template_files:
|
||||
print("[FEHLER] Keine .pdf-Dateien im template/-Ordner gefunden.")
|
||||
return 1
|
||||
|
||||
template_file = template_files[0]
|
||||
template_path = Path(config.template_dir) / template_file
|
||||
print(f"[INFO] Template: {template_file}")
|
||||
|
||||
# ── Template validieren ───────────────────────────────────────────
|
||||
print()
|
||||
print("[INFO] Validiere PDF-Template…")
|
||||
tpl_result = validate_template(template_path, config.output_mapping)
|
||||
if not tpl_result.is_valid:
|
||||
for err in tpl_result.errors:
|
||||
print(f"[FEHLER] {err}")
|
||||
return 1
|
||||
found = tpl_result.info.get("found_fields", "?")
|
||||
total = tpl_result.info.get("total_fields", "?")
|
||||
print(f"[OK] {found}/{total} Platzhalter im Template gefunden.")
|
||||
|
||||
# ── Input validieren ──────────────────────────────────────────────
|
||||
print()
|
||||
print("[INFO] Validiere Input-Datei…")
|
||||
inp_result = validate_input_file(input_path, config.input_schema, config.month_sheet_pattern)
|
||||
if not inp_result.is_valid:
|
||||
for err in inp_result.errors:
|
||||
print(f"[FEHLER] {err}")
|
||||
return 1
|
||||
if inp_result.warnings:
|
||||
for warn in inp_result.warnings:
|
||||
print(f"[WARN] {warn}")
|
||||
|
||||
# ── Input parsen ──────────────────────────────────────────────────
|
||||
print()
|
||||
print("[INFO] Parse Input-Datei…")
|
||||
records = parse_input_file(
|
||||
filepath=input_path,
|
||||
schema=config.input_schema,
|
||||
month_sheet_pattern=config.month_sheet_pattern,
|
||||
skip_empty_name=config.skip_empty_name,
|
||||
skip_empty_antragsnummer=config.skip_empty_antragsnummer,
|
||||
)
|
||||
|
||||
employees = get_unique_employees(records)
|
||||
print(f"[INFO] {len(records)} Einträge für {len(employees)} Personen gefunden.")
|
||||
|
||||
# ── Erste Person ermitteln ────────────────────────────────────────
|
||||
grouped = group_by_employee(records)
|
||||
first_person = sorted(grouped.keys())[0]
|
||||
first_records = grouped[first_person]
|
||||
print(f"[INFO] Erste Person: {first_person} ({len(first_records)} Monate)")
|
||||
|
||||
# ── Reports generieren ────────────────────────────────────────────
|
||||
print()
|
||||
print("[INFO] Generiere Tätigkeitsnachweis…")
|
||||
single_person = {first_person: first_records}
|
||||
output_dir = Path(config.output_dir)
|
||||
generated = generate_activity_reports(
|
||||
employee_records=single_person,
|
||||
template_path=template_path,
|
||||
mapping=config.output_mapping,
|
||||
output_dir=output_dir,
|
||||
filename_pattern=config.filename_pattern,
|
||||
fontsize=config.fontsize,
|
||||
)
|
||||
|
||||
output_file = generated[0]
|
||||
print(f"[OK] Erstellt: {output_file.name}")
|
||||
print(f" Pfad: {output_file}")
|
||||
|
||||
# ── Datei öffnen (macOS) ──────────────────────────────────────────
|
||||
if sys.platform == "darwin":
|
||||
print()
|
||||
print("[INFO] Öffne Datei im Finder…")
|
||||
subprocess.run(["open", str(output_file)], check=False)
|
||||
|
||||
print()
|
||||
print("=" * 50)
|
||||
print(" Fertig.")
|
||||
print("=" * 50)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in new issue
Block a user