refactoring: globale Zielverteilung Personenanzahl

This commit is contained in:
Jan Hoheisel 2025-12-24 14:15:17 +01:00
parent 1a5e5904d1
commit b885388122

View File

@ -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}")