From e34c4917198d9ab738a612203da16da45ce75e43 Mon Sep 17 00:00:00 2001 From: Rob Date: Tue, 21 Apr 2026 15:24:40 +0200 Subject: [PATCH] Create project structure with core models and logging --- .github/copilot-tasks.md | 10 +++--- src/taetigkeitsnachweis/__init__.py | 7 +++++ src/taetigkeitsnachweis/cli.py | 1 + src/taetigkeitsnachweis/errors.py | 14 +++++++++ src/taetigkeitsnachweis/logging_utils.py | 8 +++++ src/taetigkeitsnachweis/matcher.py | 1 + src/taetigkeitsnachweis/models.py | 39 ++++++++++++++++++++++++ src/taetigkeitsnachweis/parser.py | 1 + src/taetigkeitsnachweis/util.py | 1 + src/taetigkeitsnachweis/validator.py | 1 + src/taetigkeitsnachweis/writer.py | 1 + 11 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 src/taetigkeitsnachweis/__init__.py create mode 100644 src/taetigkeitsnachweis/cli.py create mode 100644 src/taetigkeitsnachweis/errors.py create mode 100644 src/taetigkeitsnachweis/logging_utils.py create mode 100644 src/taetigkeitsnachweis/matcher.py create mode 100644 src/taetigkeitsnachweis/models.py create mode 100644 src/taetigkeitsnachweis/parser.py create mode 100644 src/taetigkeitsnachweis/util.py create mode 100644 src/taetigkeitsnachweis/validator.py create mode 100644 src/taetigkeitsnachweis/writer.py diff --git a/.github/copilot-tasks.md b/.github/copilot-tasks.md index d1dd56f..2e1df30 100644 --- a/.github/copilot-tasks.md +++ b/.github/copilot-tasks.md @@ -20,10 +20,10 @@ Projekt vollstaendig umsetzen: aus PS_PW.xlsx und Stellenbeschreibungen.xlsx mon - [ ] Regeln fuer Monatsmarker und Datumsformat ## Phase 2 - Projektgeruest und Basiskomponenten -- [ ] T3: Python-Projektstruktur anlegen - - [ ] Modulaufteilung (cli, parser, matcher, validator, writer, model, util) - - [ ] Gemeinsame Datenmodelle (z. B. dataclasses) definieren - - [ ] Zentrales Logging/Fehlermodell vorbereiten +- [x] T3: Python-Projektstruktur anlegen + - [x] Modulaufteilung (cli, parser, matcher, validator, writer, model, util) + - [x] Gemeinsame Datenmodelle (z. B. dataclasses) definieren + - [x] Zentrales Logging/Fehlermodell vorbereiten - [ ] T4: Abhaengigkeiten und Laufzeit vorbereiten - [ ] benoetigte Pakete festlegen (z. B. openpyxl, click) - [ ] requirements-Datei pflegen @@ -111,4 +111,4 @@ Projekt vollstaendig umsetzen: aus PS_PW.xlsx und Stellenbeschreibungen.xlsx mon 8. T15 -> T16 -> T17 ## Aktueller Startpunkt -- [ ] Naechste aktive Aufgabe: T3 (Python-Projektstruktur anlegen) +- [ ] Naechste aktive Aufgabe: T4 (Abhaengigkeiten und Laufzeit vorbereiten) diff --git a/src/taetigkeitsnachweis/__init__.py b/src/taetigkeitsnachweis/__init__.py new file mode 100644 index 0000000..8f441af --- /dev/null +++ b/src/taetigkeitsnachweis/__init__.py @@ -0,0 +1,7 @@ +"""SAB Taetigkeitsnachweis generator package.""" + +__all__ = [ + "models", + "errors", + "logging_utils", +] diff --git a/src/taetigkeitsnachweis/cli.py b/src/taetigkeitsnachweis/cli.py new file mode 100644 index 0000000..2984ed6 --- /dev/null +++ b/src/taetigkeitsnachweis/cli.py @@ -0,0 +1 @@ +"""CLI entrypoint and orchestration layer.""" diff --git a/src/taetigkeitsnachweis/errors.py b/src/taetigkeitsnachweis/errors.py new file mode 100644 index 0000000..e874223 --- /dev/null +++ b/src/taetigkeitsnachweis/errors.py @@ -0,0 +1,14 @@ +class TaetigkeitsnachweisError(Exception): + """Base exception for all domain-specific failures.""" + + +class ConfigurationError(TaetigkeitsnachweisError): + """Raised when configuration is missing or invalid.""" + + +class ValidationError(TaetigkeitsnachweisError): + """Raised when source or business validation fails.""" + + +class MatchingError(TaetigkeitsnachweisError): + """Raised when records cannot be matched uniquely.""" diff --git a/src/taetigkeitsnachweis/logging_utils.py b/src/taetigkeitsnachweis/logging_utils.py new file mode 100644 index 0000000..866ae06 --- /dev/null +++ b/src/taetigkeitsnachweis/logging_utils.py @@ -0,0 +1,8 @@ +import logging + + +def configure_logging(level: int = logging.INFO) -> None: + logging.basicConfig( + level=level, + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + ) diff --git a/src/taetigkeitsnachweis/matcher.py b/src/taetigkeitsnachweis/matcher.py new file mode 100644 index 0000000..ba0dd7d --- /dev/null +++ b/src/taetigkeitsnachweis/matcher.py @@ -0,0 +1 @@ +"""Record matching logic across allocation and master data.""" diff --git a/src/taetigkeitsnachweis/models.py b/src/taetigkeitsnachweis/models.py new file mode 100644 index 0000000..38ee4cb --- /dev/null +++ b/src/taetigkeitsnachweis/models.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Optional + + +@dataclass(frozen=True) +class AllocationRecord: + employee_name: str + contract_hours_weekly: float + project_key: str + funded_hours_weekly: float + notes: str = "" + + +@dataclass(frozen=True) +class MasterDataRecord: + record_id: str + antragsnummer: str + name: str + qualifikation: str + stellenanteil_percent: float + funktion: str + taetigkeit: str + + +@dataclass(frozen=True) +class MatchedAssignment: + allocation: AllocationRecord + masterdata: MasterDataRecord + foerderquote_percent: float + + +@dataclass(frozen=True) +class ValidationIssue: + code: str + message: str + severity: str = "error" + context: Optional[str] = None diff --git a/src/taetigkeitsnachweis/parser.py b/src/taetigkeitsnachweis/parser.py new file mode 100644 index 0000000..a3314d3 --- /dev/null +++ b/src/taetigkeitsnachweis/parser.py @@ -0,0 +1 @@ +"""Parsing and normalization for source workbooks.""" diff --git a/src/taetigkeitsnachweis/util.py b/src/taetigkeitsnachweis/util.py new file mode 100644 index 0000000..f46a82a --- /dev/null +++ b/src/taetigkeitsnachweis/util.py @@ -0,0 +1 @@ +"""Shared utility helpers.""" diff --git a/src/taetigkeitsnachweis/validator.py b/src/taetigkeitsnachweis/validator.py new file mode 100644 index 0000000..967e087 --- /dev/null +++ b/src/taetigkeitsnachweis/validator.py @@ -0,0 +1 @@ +"""Source and business rule validation.""" diff --git a/src/taetigkeitsnachweis/writer.py b/src/taetigkeitsnachweis/writer.py new file mode 100644 index 0000000..d0b44b9 --- /dev/null +++ b/src/taetigkeitsnachweis/writer.py @@ -0,0 +1 @@ +"""Template-based output workbook writer."""