"""Tätigkeitsnachweis-Generator – Datenmodelle.""" from dataclasses import dataclass, field from typing import Optional @dataclass class EmployeeRecord: """Eine Zeile aus einem Monats-Sheet der Input-Datei.""" name: str antragsnummer: str qualifikation: str funktion: str stellenanteil: str monat: str # z. B. "01.2025" taetigkeit: str id: Optional[int] = None kommentar: Optional[str] = None @property def month_index(self) -> int: """Extrahiere den Monatsindex (1–12) aus dem Monatsfeld.""" try: return int(self.monat.split(".")[0]) except (ValueError, IndexError): return 0 @property def year(self) -> int: """Extrahiere das Jahr aus dem Monatsfeld.""" try: return int(self.monat.split(".")[1]) except (ValueError, IndexError): return 0 @dataclass class FieldSchema: """Definition eines Feldes aus input-fields.json.""" column: str field_name: str type: str required: bool @dataclass class OutputMapping: """Definition eines Mappings aus output-fields.json.""" source_field: str format: Optional[str] = None pdf_field: Optional[str] = None # Name des _Field-Platzhalters im PDF (z.B. "Auftragsnummer_Field") @dataclass class AppConfig: """Gesamte App-Konfiguration.""" input_dir: str template_dir: str output_dir: str filename_pattern: str input_schema: list = field(default_factory=list) output_mapping: list = field(default_factory=list) month_sheet_pattern: str = "* 20??" skip_empty_name: bool = True skip_empty_antragsnummer: bool = True @dataclass class ValidationResult: """Ergebnis einer Validierung.""" is_valid: bool errors: list = field(default_factory=list) warnings: list = field(default_factory=list) info: dict = field(default_factory=dict)