diff --git a/elterndienstplaner.py b/elterndienstplaner.py index a9b5d1b..75d083b 100755 --- a/elterndienstplaner.py +++ b/elterndienstplaner.py @@ -51,7 +51,11 @@ class Elterndienstplaner: self.benoetigte_dienste: Dict[date, List[Dienst]] = {} self.verfügbarkeit: Dict[Tuple[str, date], bool] = {} self.präferenzen: Dict[Tuple[str, date, Dienst], int] = {} - self.dienstfaktoren: Dict[str, Dict[date, float]] = {} + + # dienstfaktoren[eltern][tag] = faktor. + # Wenn es eltern nicht gibt -> keyerror + # Wenn es tag nicht gibt -> default 0.0 + self.dienstfaktoren: Dict[str, DefaultDict[date, float]] = {} self.alle_zeitraeume: Dict[str, List[Tuple[date, date, float]]] = {} self.vorherige_dienste: DefaultDict[str, DefaultDict[Dienst, int]] = \ defaultdict(lambda: defaultdict(int)) @@ -155,39 +159,35 @@ class Elterndienstplaner: print(f" {hist_datum}: {eltern} Faktor={dienstfaktoren_tag[eltern]} " f"-> {faire_zuteilung:.2f} von {anzahl_dienste} Diensten") - # 2. AKTUELLER MONAT: Faire Verteilung der benötigten Dienste - benoetigte_dienste_monat = sum( - dienst.personen_anzahl for tag in self.tage - if dienst in self.benoetigte_dienste.get(tag, []) - ) + # 2. AKTUELLER MONAT: Faire Verteilung der benötigten Dienste (tageweise wie bei historischen Diensten) + benoetigte_dienste_monat = 0 - if benoetigte_dienste_monat > 0: - # Gesamtdienstfaktor für aktuellen Monat - gesamt_dienstfaktor_monat = sum( - sum(self.dienstfaktoren.get(e, {}).get(tag, 0) for tag in self.tage) - for e in self.eltern - ) + # Für jeden Tag im aktuellen Monat faire Umverteilung berechnen + for tag in self.tage: + # Prüfe ob an diesem Tag der Dienst benötigt wird + if dienst not in self.benoetigte_dienste.get(tag, []): + continue - if gesamt_dienstfaktor_monat > 0: + benoetigte_dienste_monat += dienst.personen_anzahl + + # Dienstfaktoren aller Eltern für diesen Tag berechnen + dienstfaktoren_tag = {} + gesamt_dienstfaktor_tag = 0 + + for eltern in self.eltern: + faktor = self.dienstfaktoren[eltern][tag] + dienstfaktoren_tag[eltern] = faktor + gesamt_dienstfaktor_tag += faktor + + # Faire Umverteilung der an diesem Tag benötigten Dienste + if gesamt_dienstfaktor_tag > 0: for eltern in self.eltern: - monatsfaktor = sum( - self.dienstfaktoren.get(eltern, {}).get(tag, 0) - for tag in self.tage - ) - if monatsfaktor > 0: - anteil = monatsfaktor / gesamt_dienstfaktor_monat - faire_zuteilung = anteil * benoetigte_dienste_monat - ziel_dienste[eltern][dienst] += faire_zuteilung + anteil = dienstfaktoren_tag[eltern] / gesamt_dienstfaktor_tag + faire_zuteilung = anteil * dienst.personen_anzahl + ziel_dienste[eltern][dienst] += faire_zuteilung # Debug-Ausgabe für diesen Dienst - total_historisch = sum( - ziel_dienste[e][dienst] - ( - sum(self.dienstfaktoren.get(e, {}).get(tag, 0) for tag in self.tage) / - sum(sum(self.dienstfaktoren.get(e2, {}).get(tag, 0) for tag in self.tage) for e2 in self.eltern) * benoetigte_dienste_monat - if sum(sum(self.dienstfaktoren.get(e2, {}).get(tag, 0) for tag in self.tage) for e2 in self.eltern) > 0 else 0 - ) for e in self.eltern - ) if len(historische_dienste_dieses_typs) > 0 else 0 - + total_historisch = sum(ziel_dienste[e][dienst] for e in self.eltern) - benoetigte_dienste_monat print(f" {dienst.kuerzel}: Historisch faire Summe={total_historisch:.1f}, " f"Aktuell benötigt={benoetigte_dienste_monat}") @@ -213,7 +213,7 @@ class Elterndienstplaner: # Gesamtdienstfaktor für aktuellen Monat berechnen gesamt_dienstfaktor_monat = sum( - sum(self.dienstfaktoren.get(e, {}).get(tag, 0) for tag in self.tage) + sum(self.dienstfaktoren[e][tag] for tag in self.tage) for e in self.eltern ) @@ -237,7 +237,7 @@ class Elterndienstplaner: for eltern in self.eltern: # Dienstfaktor für diesen Elternteil im aktuellen Monat monatlicher_dienstfaktor = sum( - self.dienstfaktoren.get(eltern, {}).get(tag, 0) for tag in self.tage + self.dienstfaktoren[eltern][tag] for tag in self.tage ) if monatlicher_dienstfaktor > 0: @@ -274,7 +274,7 @@ class Elterndienstplaner: # weekday(): 0=Montag, 6=Sonntag # Finde Montag am oder vor dem ersten Planungstag (für historische Dienste) woche_start = erster_tag - timedelta(days=erster_tag.weekday()) - + woche_nr = 0 letzter_tag = self.tage[-1] @@ -569,7 +569,7 @@ class Elterndienstplaner: # Dienstfaktor-Analyse print(f"\nDienstfaktoren im Planungszeitraum:") for eltern in sorted(self.eltern): - faktor_summe = sum(self.dienstfaktoren.get(eltern, {}).get(tag, 0) for tag in self.tage) + faktor_summe = sum(self.dienstfaktoren[eltern][tag] for tag in self.tage) print(f" {eltern:15} {faktor_summe:.1f}")