diff --git a/.github/copilot-plan.md b/.github/copilot-plan.md index e69de29..a5c918c 100644 --- a/.github/copilot-plan.md +++ b/.github/copilot-plan.md @@ -0,0 +1,108 @@ +# SAB Taetigkeitsnachweise Generator - Implementierungsplan + +## Ziel +Monatliche SAB-Taetigkeitsnachweise automatisiert erzeugen auf Basis von: +- PS_PW.xlsx (monatliche gefoerderte Stunden je Projektanteil) +- Stellenbeschreibungen.xlsx (Stammdaten je Mitarbeiter/Funktion) +- Taetigkeitsnachweis Stellenfoerderung.xlsx (Ausgabevorlage) + +## Scope +- Nur Verzeichnisse unter Tool verwenden. +- Eingaben nur aus input. +- Vorlage nur aus template. +- Ausgaben nur nach output. + +## Annahmen +- PS_PW.xlsx und Stellenbeschreibungen.xlsx enthalten jeweils Tabelle1. +- Monatsmarker in PS_PW.xlsx stehen in Zeile 2 im Format ab 01.MM.YYYY. +- Name ist primaerer Match-Schluessel zwischen beiden Quellen. +- Template hat genau ein Quellblatt, das geklont wird. + +## Architektur +- cli: Kommandozeilen-Einstieg und Orchestrierung +- parser: Einlesen und Normalisierung der beiden Quelldateien +- matcher: Zuordnung und Disambiguierung +- validator: Source- und Business-Validierung +- writer: Template-Klonen, Zellen befuellen, Speichern +- model: gemeinsame Datentypen +- util: Konvertierung, Datums-/Text-Helfer, Logging + +## Reihenfolge (Task-Flow) +1. T1 Plan finalisieren +2. T2 Konfiguration definieren +3. T3 Projektgeruest anlegen +4. T4 Abhaengigkeiten einrichten +5. T5 Parser PS_PW +6. T6 Parser Stellenbeschreibungen +7. T7 Foerderquote berechnen +8. T8 Matching-Engine +9. T9 Source-Validierung +10. T10 Business-Validierung +11. T11 Template-Verarbeitung +12. T12 Dateinamen + Persistenz +13. T13 CLI Pipeline +14. T14 Vorschau + Bestaetigung +15. T15 Smoke-Test +16. T16 Fachtests +17. T17 Ergebnisabnahme + +## Definition of Done je Task + +### T1 Plan final +- DoD: Dieser Plan ist vollstaendig, nachvollziehbar und in Reihenfolge mit klarer DoD-Liste dokumentiert. + +### T2 config.json +- DoD: Alle Pfade, Dateinamen, Sheetnamen, Spalten, Zielzellen und Dateinamenregeln sind extern konfigurierbar. + +### T3 Projektgeruest +- DoD: Ordner-/Modulstruktur steht, zentrale Datentypen und Fehler-/Log-Basis sind vorhanden. + +### T4 Abhaengigkeiten +- DoD: requirements gepflegt, lokale Installation dokumentiert, Ausfuehrung startet ohne Importfehler. + +### T5 Parser PS_PW +- DoD: Monatsspalte wird eindeutig gefunden, Records sind normalisiert und Mitarbeiterkontext korrekt vererbt. + +### T6 Parser Stellenbeschreibungen +- DoD: Stammdaten sauber eingelesen, Prozentwerte robust konvertiert, Mehrfacheintraege bleiben erhalten. + +### T7 Foerderquote +- DoD: Formel korrekt implementiert, Grenz-/Rundungsfaelle dokumentiert und testsicher. + +### T8 Matching +- DoD: Eindeutige Zuordnung pro aktivem Record oder klarer Fehlerstatus (missing/ambiguous). + +### T9 Source-Validierung +- DoD: Alle Struktur- und Formatpruefungen laufen vor Verarbeitung und liefern konkrete Fehlermeldungen. + +### T10 Business-Validierung +- DoD: Aktivitaet, Eindeutigkeit, Template-Regeln und Dateinamenkollisionen werden vor dem Schreiben geprueft. + +### T11 Template-Verarbeitung +- DoD: Ein Quellblatt wird pro Zuordnung geklont und korrekt mit assignment-spezifischen Werten befuellt. + +### T12 Dateinamen/Speichern +- DoD: Ausgabedateien folgen Muster Taetigkeitsnachweis_YYYY_MM_Vorname_Nachname.xlsx und werden konfliktfrei gespeichert. + +### T13 CLI +- DoD: generate.py akzeptiert month/year, orchestriert End-to-End und liefert sinnvolle Exit-Codes. + +### T14 Vorschau/Bestaetigung +- DoD: Vor Schreibzugriff wird Vorschau angezeigt; Abbruch ist ohne Dateiaenderung moeglich. + +### T15 Smoke-Test +- DoD: Mindestens ein realer Monatslauf erzeugt valide Dateien in output. + +### T16 Fachtests +- DoD: Abdeckung fuer Mehrfachzuordnung, fehlende Matches, ungueltige Monatsmarker und fehlende Struktur. + +### T17 Ergebnisabnahme +- DoD: Pflichtfelder, Monats-/Datumswerte und Taetigkeitstexte stimmen mit Template- und Fachregeln ueberein. + +## Risiko- und Entscheidungslog +- Name-Matching kann uneinheitliche Schreibweisen enthalten; ggf. Normalisierung (Whitespace/Kommas) zentral in util. +- Prozentvergleich kann Rundungsabweichungen haben; toleranzbasierten Vergleich definieren. +- Mehrdeutige Matches nicht still aufloesen; immer sichtbar validieren. + +## Start der Umsetzung +- Aktiver Schritt: T2 (Konfiguration als naechste technische Umsetzung) diff --git a/.github/copilot-tasks.md b/.github/copilot-tasks.md index 13289d2..d1dd56f 100644 --- a/.github/copilot-tasks.md +++ b/.github/copilot-tasks.md @@ -7,10 +7,11 @@ Projekt vollstaendig umsetzen: aus PS_PW.xlsx und Stellenbeschreibungen.xlsx mon - [ ] Immer nur genau eine Aufgabe aktiv bearbeiten. - [ ] Nach Abschluss jeder Aufgabe: Ergebnis pruefen und abhaken. - [ ] Bei Blockern: Fehler dokumentieren und naechsten konkreten Schritt notieren. +- [ ] Nach jedem erledigten task einen git commit erzeugen ## Phase 1 - Planung und Konfiguration -- [ ] T1: Plan final im Plan-Dokument pflegen (Scope, Annahmen, Reihenfolge, DoD pro Aufgabe). -- [ ] T2: `config.json` Struktur festlegen +- [x] T1: Plan final im Plan-Dokument pflegen (Scope, Annahmen, Reihenfolge, DoD pro Aufgabe). +- [x] T2: `config.json` Struktur festlegen - [ ] Pfade fuer `input/`, `template/`, `output/` - [ ] Dateinamen der drei Excel-Dateien - [ ] Sheetnamen und Spaltenzuordnung je Quelle @@ -110,4 +111,4 @@ Projekt vollstaendig umsetzen: aus PS_PW.xlsx und Stellenbeschreibungen.xlsx mon 8. T15 -> T16 -> T17 ## Aktueller Startpunkt -- [ ] Naechste aktive Aufgabe: T1 (Plan final pflegen) +- [ ] Naechste aktive Aufgabe: T3 (Python-Projektstruktur anlegen) diff --git a/config.json b/config.json new file mode 100644 index 0000000..77a9e2b --- /dev/null +++ b/config.json @@ -0,0 +1,83 @@ +{ + "paths": { + "input_dir": "input", + "template_dir": "template", + "output_dir": "output" + }, + "files": { + "allocation_workbook": "PS_PW.xlsx", + "masterdata_workbook": "Stellenbeschreibungen.xlsx", + "template_workbook": "Tätigkeitsnachweis Stellenförderung.xlsx" + }, + "sheets": { + "allocation": "Tabelle1", + "masterdata": "Tabelle1", + "template_source": "Tabelle1" + }, + "allocation": { + "header_month_marker_row": 2, + "columns": { + "employee_name": "A", + "contract_hours_weekly": "B", + "project_key": "C", + "first_month_column": "D", + "remarks": "I" + }, + "month_marker": { + "prefix": "ab ", + "date_format": "%d.%m.%Y", + "exact_first_day_required": true + }, + "inactive_values": [ + "", + "-", + "0", + 0 + ] + }, + "masterdata": { + "columns": { + "id": "A", + "antragsnummer": "B", + "name": "C", + "qualifikation": "D", + "stellenanteil": "E", + "funktion": "F", + "taetigkeit": "G" + }, + "decimal": { + "decimal_separator": ",", + "thousands_separator": "." + } + }, + "matching": { + "name_normalization": { + "trim": true, + "collapse_spaces": true, + "case_insensitive": true + }, + "share_tolerance_percent": 0.5, + "prefer_function_hint": true + }, + "output": { + "filename_pattern": "Taetigkeitsnachweis_{year}_{month}_{first_name}_{last_name}.xlsx", + "one_workbook_per_employee": true, + "one_sheet_per_assignment": true, + "sheet_name_pattern": "{index}_{funktion}" + }, + "template_targets": { + "antragsnummer": "", + "name_vorname": "", + "qualifikation": "", + "funktion": "", + "taetigkeiten": "", + "reporting_month_label": "", + "foerderquote": "", + "generated_on": "" + }, + "runtime": { + "abort_on_validation_errors": true, + "preview_before_write": true, + "confirm_before_write": true + } +} \ No newline at end of file