vorherige_dienste verneinfacht

This commit is contained in:
Jan Hoheisel 2025-12-25 00:06:21 +01:00
parent 33b8a0047c
commit 367e3cd316
2 changed files with 11 additions and 15 deletions

View File

@ -164,10 +164,7 @@ class EingabeParser:
datei: str, datei: str,
eltern: List[str], eltern: List[str],
dienste: List, # List[Dienst] dienste: List, # List[Dienst]
) -> Tuple[ ) -> List[Tuple[date, str, any]]: # historische_dienste (mit Dienst-Objekt)
DefaultDict[str, DefaultDict], # vorherige_dienste
List[Tuple[date, str, any]] # historische_dienste (mit Dienst-Objekt)
]:
""" """
Lädt vorherige-ausgaben.csv für Fairness-Constraints Lädt vorherige-ausgaben.csv für Fairness-Constraints
@ -177,11 +174,10 @@ class EingabeParser:
dienste: Liste der Dienst-Objekte dienste: Liste der Dienst-Objekte
Returns: Returns:
Tuple mit (vorherige_dienste, historische_dienste) Liste der historischen Dienste
""" """
print(f"Lade vorherige Ausgaben aus {datei}...") print(f"Lade vorherige Ausgaben aus {datei}...")
vorherige_dienste = defaultdict(lambda: defaultdict(int))
historische_dienste = [] historische_dienste = []
try: try:
@ -207,25 +203,22 @@ class EingabeParser:
except ValueError: except ValueError:
continue continue
# Zugeteilte Dienste zählen UND mit Datum speichern # Zugeteilte Dienste mit Datum speichern
for dienst, spalte_idx in dienst_spalten.items(): for dienst, spalte_idx in dienst_spalten.items():
if spalte_idx < len(row) and row[spalte_idx].strip(): if spalte_idx < len(row) and row[spalte_idx].strip():
# Mehrere Eltern können in einer Zelle stehen (durch " und " getrennt) # Mehrere Eltern können in einer Zelle stehen (durch " und " getrennt)
eltern_liste = row[spalte_idx].strip().split(' und ') eltern_liste = row[spalte_idx].strip().split(' und ')
for eltern_name in eltern_liste: for eltern_name in eltern_liste:
if eltern_name in eltern: if eltern_name in eltern:
# Summierung für Kompatibilität
vorherige_dienste[eltern_name][dienst] += 1
# Historische Dienste mit Datum speichern # Historische Dienste mit Datum speichern
historische_dienste.append((datum, eltern_name, dienst)) historische_dienste.append((datum, eltern_name, dienst))
except FileNotFoundError: except FileNotFoundError:
print("Keine vorherigen Ausgaben gefunden - starte ohne historische Daten") print("Keine vorherigen Ausgaben gefunden - starte ohne historische Daten")
print(f"Vorherige Dienste geladen: {dict(vorherige_dienste)}")
print(f"Historische Dienste mit Datum: {len(historische_dienste)} Einträge") print(f"Historische Dienste mit Datum: {len(historische_dienste)} Einträge")
return vorherige_dienste, historische_dienste return historische_dienste
class AusgabeWriter: class AusgabeWriter:

View File

@ -57,8 +57,6 @@ class Elterndienstplaner:
# Wenn es tag nicht gibt -> default 0.0 # Wenn es tag nicht gibt -> default 0.0
self.dienstfaktoren: Dict[str, DefaultDict[date, float]] = {} self.dienstfaktoren: Dict[str, DefaultDict[date, float]] = {}
self.alle_zeitraeume: Dict[str, List[Tuple[date, date, float]]] = {} self.alle_zeitraeume: Dict[str, List[Tuple[date, date, float]]] = {}
self.vorherige_dienste: DefaultDict[str, DefaultDict[Dienst, int]] = \
defaultdict(lambda: defaultdict(int))
self.historische_dienste: List[Tuple[date, str, Dienst]] = [] self.historische_dienste: List[Tuple[date, str, Dienst]] = []
def get_dienst(self, kuerzel: str) -> Optional[Dienst]: def get_dienst(self, kuerzel: str) -> Optional[Dienst]:
@ -92,7 +90,7 @@ class Elterndienstplaner:
def lade_vorherige_ausgaben_csv(self, datei: str) -> None: def lade_vorherige_ausgaben_csv(self, datei: str) -> None:
"""Lädt vorherige-ausgaben.csv für Fairness-Constraints""" """Lädt vorherige-ausgaben.csv für Fairness-Constraints"""
self.vorherige_dienste, self.historische_dienste = \ self.historische_dienste = \
EingabeParser.parse_vorherige_ausgaben_csv(datei, self.eltern, self.dienste) EingabeParser.parse_vorherige_ausgaben_csv(datei, self.eltern, self.dienste)
def berechne_dienstfaktor_an_datum(self, eltern: str, datum: date) -> float: def berechne_dienstfaktor_an_datum(self, eltern: str, datum: date) -> float:
@ -193,7 +191,12 @@ class Elterndienstplaner:
# 3. ABZUG DER BEREITS GELEISTETEN DIENSTE # 3. ABZUG DER BEREITS GELEISTETEN DIENSTE
# Ziehe die tatsächlich geleisteten Dienste ab, um das Ziel für den Planungszeitraum zu erhalten # Ziehe die tatsächlich geleisteten Dienste ab, um das Ziel für den Planungszeitraum zu erhalten
for eltern in self.eltern: for eltern in self.eltern:
ziel_dienste[eltern][dienst] -= self.vorherige_dienste[eltern][dienst] # Berechne vorherige Dienste on-the-fly aus historischen Diensten
vorherige_anzahl = sum(
1 for _, hist_eltern, hist_dienst in self.historische_dienste
if hist_eltern == eltern and hist_dienst == dienst
)
ziel_dienste[eltern][dienst] -= vorherige_anzahl
return ziel_dienste return ziel_dienste