# Projektstruktur Elterndienstplaner ## Dateien ### `csv_io.py` - CSV Input/Output Module **Zweck**: Trennung von Datei-I/O und Business-Logik **Klassen**: - `EingabeParser`: Parst alle CSV-Eingabedateien - `parse_eingabe_csv()`: Lädt eingabe.csv mit Terminen und Präferenzen - `parse_eltern_csv()`: Lädt eltern.csv mit Dienstfaktoren - `parse_vorherige_ausgaben_csv()`: Lädt vorherige-ausgaben.csv für Fairness - `AusgabeWriter`: Schreibt Ergebnisse in CSV - `schreibe_ausgabe_csv()`: Schreibt Lösung in ausgabe.csv **Vorteile**: - ✅ Testbar: CSV-Parsing kann isoliert getestet werden - ✅ Wiederverwendbar: Andere Formate (JSON, Excel) leicht hinzufügbar - ✅ Klare Verantwortlichkeiten: I/O getrennt von Optimierung ### `elterndienstplaner.py` - Hauptprogramm **Zweck**: Business-Logik und Optimierung **Klassen**: - `Dienst`: Datenmodell für Diensttypen - `Elterndienstplaner`: Hauptklasse mit Optimierungslogik - Fairness-Berechnungen (global/lokal) - Optimierungsmodell-Erstellung (modular aufgeteilt) - Statistiken **Constraint-Funktionen** (modular aufgeteilt): - `_erstelle_entscheidungsvariablen()`: Erstellt binäre Variablen - `_add_constraint_ein_dienst_pro_woche()`: C1 - Max 1 Dienst pro Woche - `_add_constraint_ein_dienst_pro_tag()`: C2 - Max 1 Dienst pro Tag - `_add_constraint_verfuegbarkeit()`: C3 - Nur verfügbare Eltern - `_add_constraint_dienst_bedarf()`: C4 - Alle Dienste müssen besetzt werden - `_add_fairness_constraints()`: F1 & F2 - Erstellt Variablen und Constraints für Fairness - `_berechne_fairness_gewichte()`: Zeitabhängige Gewichtung (Sep-Jul) - `_erstelle_zielfunktion()`: Zielfunktion mit Fairness & Präferenzen **Abhängigkeiten**: - Importiert `csv_io` für Datei-Operationen - Verwendet `pulp` für lineare Optimierung ## Verbesserungen durch Refactoring ### Vorher (Monolith) ``` elterndienstplaner.py (700+ Zeilen) ├── Dienst Klasse ├── CSV Parsing (150+ Zeilen) ├── Fairness-Berechnung ├── Optimierung (200+ Zeilen inline) └── CSV Schreiben ``` ### Nachher (Modular) ``` csv_io.py (220 Zeilen) ├── EingabeParser └── AusgabeWriter elterndienstplaner.py (500 Zeilen) ├── Dienst Klasse ├── Fairness-Berechnung │ ├── berechne_faire_zielverteilung_global() │ └── berechne_faire_zielverteilung_lokal() ├── Optimierung (modular) │ ├── erstelle_optimierungsmodell() (30 Zeilen - übersichtlich!) │ ├── _erstelle_entscheidungsvariablen() │ ├── _add_constraint_ein_dienst_pro_woche() │ ├── _add_constraint_ein_dienst_pro_tag() │ ├── _add_constraint_verfuegbarkeit() │ ├── _add_constraint_dienst_bedarf() │ ├── _add_fairness_constraints() │ └── _erstelle_zielfunktion() └── Statistiken ``` ## Nächste Schritte (Optional) ### Phase 3: Fairness-Modul (optional) ``` fairness.py ├── FairnessBerechner │ ├── berechne_global() │ └── berechne_lokal() ```## Verwendung ```python from csv_io import EingabeParser, AusgabeWriter # Daten laden eltern, tage, dienste, ... = EingabeParser.parse_eingabe_csv("eingabe.csv", lookup_fn) # Ergebnis schreiben AusgabeWriter.schreibe_ausgabe_csv("ausgabe.csv", lösung, tage, dienste) ``` ## Vorteile der aktuellen Struktur 1. **Separation of Concerns**: I/O getrennt von Business-Logik 2. **Testbarkeit**: Module können unabhängig getestet werden 3. **Wartbarkeit**: Änderungen an CSV-Format betreffen nur `csv_io.py` 4. **Erweiterbarkeit**: Neue Dateiformate können leicht hinzugefügt werden 5. **Lesbarkeit**: Kürzere, fokussiertere Dateien