4165b9fdbc91a00ae7095ddbbdd155f86284f8f1
SAB Tätigkeitsnachweise Tool
Automatisierte Generierung monatlicher Tätigkeitsnachweise (SAB Stellenförderung). Das Tool liest eine zentrale Stundenzuordnung und Stammdaten aus Excel-Dateien, ordnet Mitarbeiter zu Projekten zu und erzeugt pro Mitarbeiter eine vorausgefüllte Excel-Datei auf Basis der SAB-Vorlage.
Setup
- Create and activate a virtual environment.
- Install dependencies:
pip install -r requirements.txt
Ausführung
Haupteinstiegspunkt ist generate.py (Click-basierte CLI):
python generate.py --month 5 --year 2026
CLI-Optionen
| Option | Typ | Pflicht | Beschreibung |
|---|---|---|---|
--month |
1–12 | Ja | Berichtsmonat |
--year |
2000–2100 | Ja | Berichtsjahr |
--yes |
Flag | Nein | Interaktive Bestätigung überspringen |
--skip-errors |
Flag | Nein | Generierung trotz nicht-zuordenbarer Einträge fortsetzen |
Implementierte Features
Pipeline (generate.py)
Vollständige Generierungs-Pipeline mit folgenden Schritten:
- Konfiguration laden –
config.jsonwird eingelesen - Quellvalidierung – Prüfung der Eingabedateien auf Existenz, Sheets, Spalten, Monatsmarker
- Parsing – Stundenzuordnung und Stammdaten aus Excel einlesen
- Matching – Zuordnung der Mitarbeiter über normalisierte Namensabgleiche
- Geschäftsregel-Validierung – Duplikate, fehlende Template-Sheets, Output-Kollisionen
- Vorschau – Zusammenfassung der geplanten Ausgabe (Dry-Run-Ansicht)
- Bestätigung – Interaktive Abfrage (überspringbar mit
--yes) - Generierung – Excel-Workbooks erstellen und in
output/speichern
Parser (src/taetigkeitsnachweis/parser.py)
- Stundenzuordnung parsen (
parse_allocation_records): LiestPS_PW.xlsx, erkennt Monatsspalte über Datumsmarker (ab DD.MM.YYYY), vererbt Mitarbeiter-/Vertragsstunden-Kontext über Zeilen - Stammdaten parsen (
parse_masterdata_records): LiestStellenbeschreibungen.xlsxmit Antragsnummer, Qualifikation, Funktion, Tätigkeiten etc. - Erkennung inaktiver Werte (Elternzeit, Kündigung, etc.)
Matcher (src/taetigkeitsnachweis/matcher.py)
- Namens-Normalisierung: Trimming, Akzente entfernen, Casefolding, Leerzeichenbereinigung
- Flexible Namens-Zuordnung: Unterstützt „Nachname, Vorname" ↔ „Vorname Nachname"
- Disambiguierung: Bei mehreren Stammdaten-Treffern wird über
project_scopeaufgelöst - Förderquote-Berechnung:
(geförderte Stunden / Vertragsstunden) × 100 - Erzeugt Validierungsmeldungen:
MISSING_MASTERDATA,AMBIGUOUS_MASTERDATA,ALLOCATION_NOTE
Validator (src/taetigkeitsnachweis/validator.py)
Zweistufige Validierung:
- Quellvalidierung (
validate_sources): Datei-Existenz, Sheet-Existenz, Spaltenprüfung, Monatsmarker-Parsebarkeit, Vertragsstunden-Prüfung - Geschäftsregel-Validierung (
validate_business_rules): Keine aktiven Zuordnungen, doppelte Matches, Template-Sheet-Existenz, Template-Targets-Vollständigkeit, Dateinamen-Kollisionen
Writer (src/taetigkeitsnachweis/writer.py)
- Workbook-Generierung (
build_employee_workbooks): Lädt SAB-Vorlage, erstellt pro Zuordnung ein Sheet, befüllt konfigurierte Zielzellen (Antragsnummer, Name, Qualifikation, Funktion, Tätigkeiten, Berichtsmonat, Förderquote, Erstelldatum) - Dateinamen-Generierung (
build_output_filename): Pattern-basiert mit{year},{month},{first_name},{last_name} - Speicherung (
save_employee_workbooks): Schreibt inoutput/, erkennt Dateinamen-Kollisionen
Datenmodelle (src/taetigkeitsnachweis/models.py)
AllocationRecord– Mitarbeitername, Vertragsstunden, Projektkürzel, geförderte Stunden, AnmerkungenMasterDataRecord– Antragsnummer, Name, Qualifikation, Projektumfang, Stellenanteil, Funktion, TätigkeitMatchedAssignment– Verknüpfung Zuordnung + Stammdaten + berechnete FörderquoteValidationIssue– Code, Meldung, Schweregrad, Kontext
Fehlerbehandlung (src/taetigkeitsnachweis/errors.py)
Exception-Hierarchie: TaetigkeitsnachweisError → ConfigurationError, ValidationError, MatchingError
Konfiguration (config.json)
Zentrale Konfigurationsdatei mit:
- Pfade: Input-, Template- und Output-Verzeichnisse
- Dateien: Zuordnungs-Workbook, Stammdaten-Workbook, Template-Workbook
- Sheet-Namen: Pro Workbook konfigurierbar
- Parsing-Regeln: Spalten-Mappings, Monatsmarker-Format, inaktive Werte
- Matching-Einstellungen: Normalisierung, Toleranz
- Output-Einstellungen: Dateinamen-Pattern, ein Workbook pro Mitarbeiter, ein Sheet pro Zuordnung
- Template-Targets: Zielzellen-Adressen in der Vorlage
Projektstruktur
Tool/
├── generate.py # Haupteinstiegspunkt (Click CLI)
├── config.json # Zentrale Konfiguration
├── start.sh # Shell-Wrapper
├── requirements.txt # Python-Abhängigkeiten
├── input/ # Eingabe-Excel-Dateien (PS_PW.xlsx, Stellenbeschreibungen.xlsx)
├── output/ # Generierte Tätigkeitsnachweise
├── template/ # SAB-Vorlage (Tätigkeitsnachweis Stellenförderung.xlsx)
└── src/taetigkeitsnachweis/
├── cli.py # Legacy-Scaffold (argparse)
├── errors.py # Exception-Klassen
├── logging_utils.py # Logging-Konfiguration
├── matcher.py # Namenszuordnung & Förderquote
├── models.py # Datenklassen
├── parser.py # Excel-Parsing
├── util.py # Utilities (noch leer)
├── validator.py # Zwei-Phasen-Validierung
└── writer.py # Excel-Ausgabe
Languages
Python
92.9%
Batchfile
4.1%
Shell
3%