refactoring: globale Zielverteilung Personenanzahl
This commit is contained in:
parent
1a5e5904d1
commit
b885388122
@ -51,7 +51,11 @@ class Elterndienstplaner:
|
|||||||
self.benoetigte_dienste: Dict[date, List[Dienst]] = {}
|
self.benoetigte_dienste: Dict[date, List[Dienst]] = {}
|
||||||
self.verfügbarkeit: Dict[Tuple[str, date], bool] = {}
|
self.verfügbarkeit: Dict[Tuple[str, date], bool] = {}
|
||||||
self.präferenzen: Dict[Tuple[str, date, Dienst], int] = {}
|
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.alle_zeitraeume: Dict[str, List[Tuple[date, date, float]]] = {}
|
||||||
self.vorherige_dienste: DefaultDict[str, DefaultDict[Dienst, int]] = \
|
self.vorherige_dienste: DefaultDict[str, DefaultDict[Dienst, int]] = \
|
||||||
defaultdict(lambda: defaultdict(int))
|
defaultdict(lambda: defaultdict(int))
|
||||||
@ -155,39 +159,35 @@ class Elterndienstplaner:
|
|||||||
print(f" {hist_datum}: {eltern} Faktor={dienstfaktoren_tag[eltern]} "
|
print(f" {hist_datum}: {eltern} Faktor={dienstfaktoren_tag[eltern]} "
|
||||||
f"-> {faire_zuteilung:.2f} von {anzahl_dienste} Diensten")
|
f"-> {faire_zuteilung:.2f} von {anzahl_dienste} Diensten")
|
||||||
|
|
||||||
# 2. AKTUELLER MONAT: Faire Verteilung der benötigten Dienste
|
# 2. AKTUELLER MONAT: Faire Verteilung der benötigten Dienste (tageweise wie bei historischen Diensten)
|
||||||
benoetigte_dienste_monat = sum(
|
benoetigte_dienste_monat = 0
|
||||||
dienst.personen_anzahl for tag in self.tage
|
|
||||||
if dienst in self.benoetigte_dienste.get(tag, [])
|
|
||||||
)
|
|
||||||
|
|
||||||
if benoetigte_dienste_monat > 0:
|
# Für jeden Tag im aktuellen Monat faire Umverteilung berechnen
|
||||||
# Gesamtdienstfaktor für aktuellen Monat
|
for tag in self.tage:
|
||||||
gesamt_dienstfaktor_monat = sum(
|
# Prüfe ob an diesem Tag der Dienst benötigt wird
|
||||||
sum(self.dienstfaktoren.get(e, {}).get(tag, 0) for tag in self.tage)
|
if dienst not in self.benoetigte_dienste.get(tag, []):
|
||||||
for e in self.eltern
|
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:
|
for eltern in self.eltern:
|
||||||
monatsfaktor = sum(
|
anteil = dienstfaktoren_tag[eltern] / gesamt_dienstfaktor_tag
|
||||||
self.dienstfaktoren.get(eltern, {}).get(tag, 0)
|
faire_zuteilung = anteil * dienst.personen_anzahl
|
||||||
for tag in self.tage
|
ziel_dienste[eltern][dienst] += faire_zuteilung
|
||||||
)
|
|
||||||
if monatsfaktor > 0:
|
|
||||||
anteil = monatsfaktor / gesamt_dienstfaktor_monat
|
|
||||||
faire_zuteilung = anteil * benoetigte_dienste_monat
|
|
||||||
ziel_dienste[eltern][dienst] += faire_zuteilung
|
|
||||||
|
|
||||||
# Debug-Ausgabe für diesen Dienst
|
# Debug-Ausgabe für diesen Dienst
|
||||||
total_historisch = sum(
|
total_historisch = sum(ziel_dienste[e][dienst] for e in self.eltern) - benoetigte_dienste_monat
|
||||||
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
|
|
||||||
|
|
||||||
print(f" {dienst.kuerzel}: Historisch faire Summe={total_historisch:.1f}, "
|
print(f" {dienst.kuerzel}: Historisch faire Summe={total_historisch:.1f}, "
|
||||||
f"Aktuell benötigt={benoetigte_dienste_monat}")
|
f"Aktuell benötigt={benoetigte_dienste_monat}")
|
||||||
|
|
||||||
@ -213,7 +213,7 @@ class Elterndienstplaner:
|
|||||||
|
|
||||||
# Gesamtdienstfaktor für aktuellen Monat berechnen
|
# Gesamtdienstfaktor für aktuellen Monat berechnen
|
||||||
gesamt_dienstfaktor_monat = sum(
|
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
|
for e in self.eltern
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -237,7 +237,7 @@ class Elterndienstplaner:
|
|||||||
for eltern in self.eltern:
|
for eltern in self.eltern:
|
||||||
# Dienstfaktor für diesen Elternteil im aktuellen Monat
|
# Dienstfaktor für diesen Elternteil im aktuellen Monat
|
||||||
monatlicher_dienstfaktor = sum(
|
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:
|
if monatlicher_dienstfaktor > 0:
|
||||||
@ -274,7 +274,7 @@ class Elterndienstplaner:
|
|||||||
# weekday(): 0=Montag, 6=Sonntag
|
# weekday(): 0=Montag, 6=Sonntag
|
||||||
# Finde Montag am oder vor dem ersten Planungstag (für historische Dienste)
|
# Finde Montag am oder vor dem ersten Planungstag (für historische Dienste)
|
||||||
woche_start = erster_tag - timedelta(days=erster_tag.weekday())
|
woche_start = erster_tag - timedelta(days=erster_tag.weekday())
|
||||||
|
|
||||||
woche_nr = 0
|
woche_nr = 0
|
||||||
letzter_tag = self.tage[-1]
|
letzter_tag = self.tage[-1]
|
||||||
|
|
||||||
@ -569,7 +569,7 @@ class Elterndienstplaner:
|
|||||||
# Dienstfaktor-Analyse
|
# Dienstfaktor-Analyse
|
||||||
print(f"\nDienstfaktoren im Planungszeitraum:")
|
print(f"\nDienstfaktoren im Planungszeitraum:")
|
||||||
for eltern in sorted(self.eltern):
|
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}")
|
print(f" {eltern:15} {faktor_summe:.1f}")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user