From 95fdf0113962b9553bc42b4c38d1064f898bd7c9 Mon Sep 17 00:00:00 2001 From: Joshua Prieth <198204205+joshuaprieth@users.noreply.github.com> Date: Wed, 10 Jun 2026 10:44:45 +0200 Subject: [PATCH 1/4] Add first fairness objective --- src/cp/__init__.py | 3 + src/cp/objectives/__init__.py | 3 + src/cp/objectives/fair_preferences.py | 96 +++++++++++++++++++++++++++ src/services/solve_service.py | 2 +- src/solve.py | 2 + 5 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/cp/objectives/fair_preferences.py diff --git a/src/cp/__init__.py b/src/cp/__init__.py index bfba21c1..8d2736bb 100644 --- a/src/cp/__init__.py +++ b/src/cp/__init__.py @@ -32,6 +32,9 @@ from .objectives import ( EverySecondWeekendFreeObjective as EverySecondWeekendFreeObjective, ) +from .objectives import ( + FairPreferencesObjective as FairPreferencesObjective, +) from .objectives import ( FreeDaysAfterNightShiftPhaseObjective as FreeDaysAfterNightShiftPhaseObjective, ) diff --git a/src/cp/objectives/__init__.py b/src/cp/objectives/__init__.py index a9501c30..2e802160 100644 --- a/src/cp/objectives/__init__.py +++ b/src/cp/objectives/__init__.py @@ -1,6 +1,9 @@ from .every_second_weekend_free import ( EverySecondWeekendFreeObjective as EverySecondWeekendFreeObjective, ) +from .fair_preferences import ( + FairPreferencesObjective as FairPreferencesObjective, +) from .free_days_after_night_shift_phase import ( FreeDaysAfterNightShiftPhaseObjective as FreeDaysAfterNightShiftPhaseObjective, ) diff --git a/src/cp/objectives/fair_preferences.py b/src/cp/objectives/fair_preferences.py new file mode 100644 index 00000000..fb750873 --- /dev/null +++ b/src/cp/objectives/fair_preferences.py @@ -0,0 +1,96 @@ +from typing import cast + +from ortools.sat.python.cp_model import CpModel, LinearExpr + +from src.day import Day +from src.employee import Employee +from src.shift import Shift + +from ..variables import EmployeeWorksOnDayVariables, ShiftAssignmentVariables, Variable +from .objective import Objective + + +class FairPreferencesObjective(Objective): + @property + def KEY(cls) -> str: + return "fair-preferences" + + def create( + self, + model: CpModel, + shift_assignment_variables: ShiftAssignmentVariables, + employee_works_on_day_variables: EmployeeWorksOnDayVariables, + ) -> LinearExpr | None: + penalties: list[LinearExpr] = [] + + for employee in self._employees: + violation_bools = self._get_violation_bools_for_employee( + employee, shift_assignment_variables, employee_works_on_day_variables + ) + + if not violation_bools: + continue + + max_possible_violations = len(violation_bools) + total_violations = sum(violation_bools) + + tier_vars = [ + model.new_bool_var(f"tier_{i}_emp_{employee.get_key()}") for i in range(max_possible_violations) + ] + + model.add(sum(tier_vars) == total_violations) + + for i, tier_var in enumerate(tier_vars): + tier_weight = int((5**i) * self._weight) + # tier_var * tier_weight creates an OR-Tools LinearExpr under the hood + penalties.append(tier_var * tier_weight) + + return cast(LinearExpr, sum(penalties)) if penalties else None + + def _get_violation_bools_for_employee( + self, + employee: Employee, + shift_assignment_variables: ShiftAssignmentVariables, + employee_works_on_day_variables: EmployeeWorksOnDayVariables, + ) -> list[Variable]: + """ + Gathers all CP-SAT boolean variables representing the employee's wishes. + Since a wish means "I don't want to work", scheduling them (Variable == 1) counts as a violation. + """ + violation_bools: list[Variable] = [] + + # 1. Wish Days: The employee does not want to work ANY shift on these days. + for wish_day_int in employee.get_wish_days: + day_obj = self._find_day_by_int(wish_day_int) + if day_obj: + works_on_day_var = employee_works_on_day_variables[employee][day_obj] + violation_bools.append(works_on_day_var) + + # 2. Wish Shifts: The employee does not want to work a specific shift on a specific day. + for wish_day_int, shift_abbr in employee.get_wish_shifts: + day_obj = self._find_day_by_int(wish_day_int) + shift_obj = self._find_shift_by_abbr(shift_abbr) + + if day_obj and shift_obj: + shift_var = shift_assignment_variables[employee][day_obj][shift_obj] + violation_bools.append(shift_var) + + return violation_bools + + # --- Domain Mapping Helpers --- + + def _find_day_by_int(self, day_int: int) -> Day | None: + """Finds the Day object matching the integer from the employee's wish list.""" + for d in self._days: + # Matches the convention used in Employee.unavailable() -> day.day + if getattr(d, "day", None) == day_int: + return d + return None + + def _find_shift_by_abbr(self, shift_abbr: str) -> Shift | None: + """Finds the Shift object matching the string abbreviation from the employee's wish list.""" + for s in self._shifts: + # Matches the convention used in Employee.unavailable() -> shift.abbreviation + if getattr(s, "abbreviation", None) == shift_abbr: + return s + return None diff --git a/src/services/solve_service.py b/src/services/solve_service.py index ecf28256..09ee89be 100644 --- a/src/services/solve_service.py +++ b/src/services/solve_service.py @@ -80,7 +80,7 @@ def execute_solve( timeout: int, weight_overrides: dict[str, int] | None = None, status_callback: Callable[[str], None] | None = None, - analyzer_log: str | None = None, + analyzer_log: str | None = "solver_log.txt", ) -> SolveResult: """Executes a single solver run and processes the solution.""" diff --git a/src/solve.py b/src/solve.py index 0c215807..291af649 100644 --- a/src/solve.py +++ b/src/solve.py @@ -7,6 +7,7 @@ from src.cp import ( EverySecondWeekendFreeObjective, + FairPreferencesObjective, FreeDayAfterNightShiftPhaseConstraint, FreeDaysAfterNightShiftPhaseObjective, FreeDaysNearWeekendObjective, @@ -210,6 +211,7 @@ def main( days=days, ), # MinimizeHiddenEmployeeCountObjective(weights["hidden_count"], employees, days, shifts), + FairPreferencesObjective(weight=1000, employees=employees, days=days, shifts=shifts), ] model = Model(employees, days, shifts) From 0d5c44dddf4768c02de71401c603022895d86dfd Mon Sep 17 00:00:00 2001 From: Joshua Prieth <198204205+joshuaprieth@users.noreply.github.com> Date: Wed, 10 Jun 2026 10:43:13 +0200 Subject: [PATCH 2/4] Improve fairness by weighting days higher --- src/cp/objectives/fair_preferences.py | 41 +++++++++++++-------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/cp/objectives/fair_preferences.py b/src/cp/objectives/fair_preferences.py index fb750873..3524ed37 100644 --- a/src/cp/objectives/fair_preferences.py +++ b/src/cp/objectives/fair_preferences.py @@ -24,15 +24,19 @@ def create( penalties: list[LinearExpr] = [] for employee in self._employees: - violation_bools = self._get_violation_bools_for_employee( + day_bools, shift_bools = self._get_violation_bools_for_employee( employee, shift_assignment_variables, employee_works_on_day_variables ) - if not violation_bools: + if not day_bools and not shift_bools: continue - max_possible_violations = len(violation_bools) - total_violations = sum(violation_bools) + # A day wish counts as 3 strikes, so we scale the max potential violations + # to ensure we generate enough "tier buckets" to hold the penalties. + max_possible_violations = (len(day_bools) * 3) + len(shift_bools) + + # Here is the magic: A ruined day adds 3 strikes, a ruined shift adds 1. + total_violations = (sum(day_bools) * 3) + sum(shift_bools) tier_vars = [ model.new_bool_var(f"tier_{i}_emp_{employee.get_key()}") for i in range(max_possible_violations) @@ -41,8 +45,8 @@ def create( model.add(sum(tier_vars) == total_violations) for i, tier_var in enumerate(tier_vars): - tier_weight = int((5**i) * self._weight) - # tier_var * tier_weight creates an OR-Tools LinearExpr under the hood + # Using squares creates our steep, safe quadratic penalty curve (1, 4, 9, 16...) + tier_weight = int(((i + 1) ** 3) * self._weight) penalties.append(tier_var * tier_weight) return cast(LinearExpr, sum(penalties)) if penalties else None @@ -52,37 +56,31 @@ def _get_violation_bools_for_employee( employee: Employee, shift_assignment_variables: ShiftAssignmentVariables, employee_works_on_day_variables: EmployeeWorksOnDayVariables, - ) -> list[Variable]: - """ - Gathers all CP-SAT boolean variables representing the employee's wishes. - Since a wish means "I don't want to work", scheduling them (Variable == 1) counts as a violation. - """ - violation_bools: list[Variable] = [] - - # 1. Wish Days: The employee does not want to work ANY shift on these days. + ) -> tuple[list[Variable], list[Variable]]: + day_violation_bools: list[Variable] = [] + shift_violation_bools: list[Variable] = [] + + # 1. Day Wishes: Evaluates to 1 if they work ANY shift on this day. for wish_day_int in employee.get_wish_days: day_obj = self._find_day_by_int(wish_day_int) if day_obj: works_on_day_var = employee_works_on_day_variables[employee][day_obj] - violation_bools.append(works_on_day_var) + day_violation_bools.append(works_on_day_var) - # 2. Wish Shifts: The employee does not want to work a specific shift on a specific day. + # 2. Shift Wishes: Evaluates to 1 only if they work this specific shift. for wish_day_int, shift_abbr in employee.get_wish_shifts: day_obj = self._find_day_by_int(wish_day_int) shift_obj = self._find_shift_by_abbr(shift_abbr) if day_obj and shift_obj: shift_var = shift_assignment_variables[employee][day_obj][shift_obj] - violation_bools.append(shift_var) - - return violation_bools + shift_violation_bools.append(shift_var) - # --- Domain Mapping Helpers --- + return day_violation_bools, shift_violation_bools def _find_day_by_int(self, day_int: int) -> Day | None: """Finds the Day object matching the integer from the employee's wish list.""" for d in self._days: - # Matches the convention used in Employee.unavailable() -> day.day if getattr(d, "day", None) == day_int: return d return None @@ -90,7 +88,6 @@ def _find_day_by_int(self, day_int: int) -> Day | None: def _find_shift_by_abbr(self, shift_abbr: str) -> Shift | None: """Finds the Shift object matching the string abbreviation from the employee's wish list.""" for s in self._shifts: - # Matches the convention used in Employee.unavailable() -> shift.abbreviation if getattr(s, "abbreviation", None) == shift_abbr: return s return None From 99e40f23fe81f6fac352ad3fa72c30d84859c137 Mon Sep 17 00:00:00 2001 From: Joshua Prieth <198204205+joshuaprieth@users.noreply.github.com> Date: Wed, 10 Jun 2026 10:43:43 +0200 Subject: [PATCH 3/4] Create a sample case --- cases/77/11_2024/employees.json | 254 +- .../free_shifts_and_vacation_days.json | 851 +----- cases/77/11_2024/target_working_minutes.json | 264 +- cases/77/11_2024/wishes_and_blocked.json | 2680 +++-------------- cases/77/11_2024/worked_sundays.json | 376 +-- 5 files changed, 641 insertions(+), 3784 deletions(-) diff --git a/cases/77/11_2024/employees.json b/cases/77/11_2024/employees.json index e2de95d4..f0f8fb04 100644 --- a/cases/77/11_2024/employees.json +++ b/cases/77/11_2024/employees.json @@ -1,232 +1,112 @@ { "employees": [ { - "firstname": "Sandra", - "key": 459, - "name": "Shoemake", - "type": "Krankenschwester/-pfleger (81302-008)" - }, - { - "firstname": "Adriane", - "key": 790, - "name": "Mccomas", - "type": "Stationshilfe (81301-018)" - }, - { - "firstname": "Janett", - "key": 791, - "name": "Branz", - "type": "Altenpfleger/in (82102-002)" + "firstname": "Azubi_1", + "key": 101, + "name": "Test", + "type": "A-Pflegeassistent/in (A-81302-014)" }, { - "firstname": "Nele", - "key": 822, - "name": "Sewell", - "type": "Pflegeassistent/in (81302-014)" + "firstname": "Azubi_2", + "key": 102, + "name": "Test", + "type": "A-Pflegeassistent/in (A-81302-014)" }, { - "firstname": "Liselotte", - "key": 839, - "name": "S\u00e4uffert", - "type": "Krankenpflegehelfer/in (1 j\u00e4hrige A.) (81301-006)" + "firstname": "Azubi_3", + "key": 103, + "name": "Test", + "type": "A-Pflegeassistent/in (A-81302-014)" }, { - "firstname": "Silvia", - "key": 914, - "name": "Harkins", - "type": "Krankenpflegehelfer/in (1 j\u00e4hrige A.) (81301-006)" + "firstname": "Azubi_4", + "key": 104, + "name": "Test", + "type": "A-Pflegeassistent/in (A-81302-014)" }, { - "firstname": "Ingbert", - "key": 917, - "name": "Catoe", - "type": "Krankenschwester/-pfleger (81302-008)" + "firstname": "Hilfskraft_1", + "key": 201, + "name": "Test", + "type": "Pflegeassistent/in (81302-014)" }, { - "firstname": "Jenny", - "key": 921, - "name": "Keese", - "type": "Altenpfleger/in (82102-002)" + "firstname": "Hilfskraft_2", + "key": 202, + "name": "Test", + "type": "Pflegeassistent/in (81302-014)" }, { - "firstname": "B\u00e4rbl", - "key": 924, - "name": "Merriweather", - "type": "Gesundheits- und Krankenpfleger/in (81302-005)" + "firstname": "Hilfskraft_3", + "key": 203, + "name": "Test", + "type": "Pflegeassistent/in (81302-014)" }, { - "firstname": "Lina", - "key": 925, - "name": "Farniok", - "type": "Gesundheits- und Krankenpfleger/in (81302-005)" + "firstname": "Hilfskraft_4", + "key": 204, + "name": "Test", + "type": "Pflegeassistent/in (81302-014)" }, { - "firstname": "Margaritt", - "key": 927, - "name": "Mittrach", - "type": "Stationshilfe (81301-018)" + "firstname": "Hilfskraft_5", + "key": 205, + "name": "Test", + "type": "Pflegeassistent/in (81302-014)" }, { - "firstname": "Daniele", - "key": 928, - "name": "Wunderlich", - "type": "Gesundheits- und Krankenpfleger/in (81302-005)" + "firstname": "Hilfskraft_6", + "key": 206, + "name": "Test", + "type": "Pflegeassistent/in (81302-014)" }, { - "firstname": "Constance", - "key": 1230, - "name": "Palacio", + "firstname": "Fachkraft_1", + "key": 301, + "name": "Test", "type": "Pflegefachkraft (Krankenpflege) (81302-018)" }, { - "firstname": "Kersten", - "key": 2932, - "name": "Devers", + "firstname": "Fachkraft_2", + "key": 302, + "name": "Test", "type": "Pflegefachkraft (Krankenpflege) (81302-018)" }, { - "firstname": "Renilde", - "key": 2963, - "name": "Hoots", - "type": "Altenpfleger/in (82102-002)" - }, - { - "firstname": "Elgine", - "key": 3566, - "name": "Seligman", - "type": "Altenpfleger/in (82102-002)" - }, - { - "firstname": "Eike", - "key": 3868, - "name": "Vanfleet", + "firstname": "Fachkraft_3", + "key": 303, + "name": "Test", "type": "Pflegefachkraft (Krankenpflege) (81302-018)" }, { - "firstname": "Hannah", - "key": 4566, - "name": "Woodcock", - "type": "A-Pflegeassistent/in (A-81302-014)" - }, - { - "firstname": "Henni", - "key": 5367, - "name": "Donis", - "type": "Krankenpflegehelfer/in (1 j\u00e4hrige A.) (81301-006)" - }, - { - "firstname": "Augustin", - "key": 5920, - "name": "Carreras", + "firstname": "Fachkraft_4", + "key": 304, + "name": "Test", "type": "Pflegefachkraft (Krankenpflege) (81302-018)" }, { - "firstname": "Heinz", - "key": 6475, - "name": "Binford", - "type": "Helfer/in - station\u00e4re Krankenpflege (81301-002)" - }, - { - "firstname": "Roseliese", - "key": 6507, - "name": "Rashid", - "type": "Altenpfleger/in (82102-002)" - }, - { - "firstname": "Christfri", - "key": 6677, - "name": "Fullerton", - "type": "Krankenpflegehelfer/in (1 j\u00e4hrige A.) (81301-006)" - }, - { - "firstname": "Saskia", - "key": 6681, - "name": "Labelle", - "type": "Gesundheits- und Krankenpfleger/in (81302-005)" - }, - { - "firstname": "Lioba", - "key": 6715, - "name": "Burris", - "type": "A-Pflegefachkraft (Krankenpflege) (A-81302-018)" - }, - { - "firstname": "Trude", - "key": 6836, - "name": "Valentino", + "firstname": "Fachkraft_5", + "key": 305, + "name": "Test", "type": "Pflegefachkraft (Krankenpflege) (81302-018)" }, { - "firstname": "Annelene", - "key": 6928, - "name": "Izzo", - "type": "Medizinische/r Fachangestellte/r (81102-004)" - }, - { - "firstname": "Marcus", - "key": 7496, - "name": "Demarco", - "type": "Gesundheits- und Krankenpfleger/in (81302-005)" - }, - { - "firstname": "Ludger", - "key": 7603, - "name": "Roberson", - "type": "Altenpfleger/in (82102-002)" - }, - { - "firstname": "Sieghardt", - "key": 7741, - "name": "Tharp", - "type": "Gesundheits- und Krankenpfleger/in (81302-005)" - }, - { - "firstname": "Kilian", - "key": 7752, - "name": "Rodriques", - "type": "Bundesfreiwilligendienst (BFD)" - }, - { - "firstname": "Julia", - "key": 7770, - "name": "Yeh", - "type": "A-Pflegefachkraft (Krankenpflege) (A-81302-018)" - }, - { - "firstname": "Burkhild", - "key": 7796, - "name": "Hertzler", - "type": "A-Pflegefachkraft (Krankenpflege) (A-81302-018)" - }, - { - "firstname": "Karena", - "key": 7835, - "name": "Driggers", - "type": "A-Pflegefachkraft (Krankenpflege) (A-81302-018)" - }, - { - "firstname": "Gertraute", - "key": 7848, - "name": "Winters", - "type": "A-Pflegeassistent/in (A-81302-014)" - }, - { - "firstname": "Janett", - "key": 7877, - "name": "Staggs", - "type": "A-Pflegefachkraft (Krankenpflege) (A-81302-018)" + "firstname": "Fachkraft_6", + "key": 306, + "name": "Test", + "type": "Pflegefachkraft (Krankenpflege) (81302-018)" }, { - "firstname": "Irma", - "key": 7919, - "name": "Weathers", - "type": "Gesundheits- und Krankenpfleger/in (81302-005)" + "firstname": "Fachkraft_7", + "key": 307, + "name": "Test", + "type": "Pflegefachkraft (Krankenpflege) (81302-018)" }, { - "firstname": "Loremarie", - "key": 7990, - "name": "Milburn", - "type": "A-Pflegeassistent/in (A-81302-014)" + "firstname": "Fachkraft_8", + "key": 308, + "name": "Test", + "type": "Pflegefachkraft (Krankenpflege) (81302-018)" } ] } diff --git a/cases/77/11_2024/free_shifts_and_vacation_days.json b/cases/77/11_2024/free_shifts_and_vacation_days.json index 4fc9b95a..ca40daba 100644 --- a/cases/77/11_2024/free_shifts_and_vacation_days.json +++ b/cases/77/11_2024/free_shifts_and_vacation_days.json @@ -1,877 +1,146 @@ { "employees": [ { - "firstname": "Sandra", - "forbidden_days": [ - 18, - 22, - 23, - 24, - 25 - ], - "key": 459, - "name": "Shoemake", - "planned_shifts": [], - "vacation_days": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 12 - ] - }, - { - "firstname": "Adriane", - "forbidden_days": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30 - ], - "key": 790, - "name": "Mccomas", - "planned_shifts": [], - "vacation_days": [] - }, - { - "firstname": "Janett", + "firstname": "Azubi_1", "forbidden_days": [], - "key": 791, - "name": "Branz", + "key": 101, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Nele", - "forbidden_days": [ - 4, - 5, - 9, - 10, - 15, - 16, - 17, - 18, - 19, - 25, - 26, - 27 - ], - "key": 822, - "name": "Sewell", - "planned_shifts": [ - [ - 1, - "N5" - ], - [ - 2, - "N5" - ], - [ - 3, - "N5" - ], - [ - 6, - "S2_" - ], - [ - 7, - "S2_" - ], - [ - 8, - "S2_" - ], - [ - 11, - "F2_" - ], - [ - 12, - "F2_" - ], - [ - 13, - "F2_" - ], - [ - 14, - "F2_" - ], - [ - 20, - "S2_" - ], - [ - 21, - "N5" - ], - [ - 22, - "N5" - ], - [ - 23, - "N5" - ], - [ - 24, - "N5" - ], - [ - 29, - "N5" - ], - [ - 30, - "N5" - ] - ], - "vacation_days": [] - }, - { - "firstname": "Liselotte", - "forbidden_days": [ - 1, - 2, - 3, - 6, - 7, - 8, - 9, - 12, - 13, - 14, - 16, - 17, - 18, - 21, - 22, - 23, - 24, - 25, - 28, - 29, - 30 - ], - "key": 839, - "name": "S\u00e4uffert", - "planned_shifts": [ - [ - 10, - "N5" - ], - [ - 11, - "N5" - ], - [ - 15, - "N5" - ], - [ - 19, - "N5" - ], - [ - 20, - "N5" - ], - [ - 26, - "N5" - ], - [ - 27, - "N5" - ] - ], - "vacation_days": [] - }, - { - "firstname": "Silvia", - "forbidden_days": [ - 23, - 24, - 30 - ], - "key": 914, - "name": "Harkins", - "planned_shifts": [], - "vacation_days": [ - 21, - 22, - 25, - 26, - 27, - 28, - 29 - ] - }, - { - "firstname": "Ingbert", + "firstname": "Azubi_2", "forbidden_days": [], - "key": 917, - "name": "Catoe", - "planned_shifts": [ - [ - 15, - "S2_" - ] - ], - "vacation_days": [] - }, - { - "firstname": "Jenny", - "forbidden_days": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30 - ], - "key": 921, - "name": "Keese", + "key": 102, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "B\u00e4rbl", - "forbidden_days": [ - 1, - 2, - 3 - ], - "key": 924, - "name": "Merriweather", - "planned_shifts": [], - "vacation_days": [ - 4, - 5, - 6, - 7 - ] - }, - { - "firstname": "Lina", + "firstname": "Azubi_3", "forbidden_days": [], - "key": 925, - "name": "Farniok", + "key": 103, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Margaritt", - "forbidden_days": [], - "key": 927, - "name": "Mittrach", - "planned_shifts": [], - "vacation_days": [ - 18 - ] - }, - { - "firstname": "Daniele", - "forbidden_days": [], - "key": 928, - "name": "Wunderlich", - "planned_shifts": [], - "vacation_days": [ - 25, - 26, - 27, - 28, - 29 - ] - }, - { - "firstname": "Constance", + "firstname": "Azubi_4", "forbidden_days": [], - "key": 1230, - "name": "Palacio", - "planned_shifts": [], - "vacation_days": [ - 11 - ] - }, - { - "firstname": "Kersten", - "forbidden_days": [], - "key": 2932, - "name": "Devers", + "key": 104, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Renilde", + "firstname": "Hilfskraft_1", "forbidden_days": [], - "key": 2963, - "name": "Hoots", - "planned_shifts": [], - "vacation_days": [ - 11 - ] - }, - { - "firstname": "Elgine", - "forbidden_days": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30 - ], - "key": 3566, - "name": "Seligman", + "key": 201, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Eike", + "firstname": "Hilfskraft_2", "forbidden_days": [], - "key": 3868, - "name": "Vanfleet", - "planned_shifts": [ - [ - 25, - "S2_" - ] - ], - "vacation_days": [] - }, - { - "firstname": "Hannah", - "forbidden_days": [ - 18 - ], - "key": 4566, - "name": "Woodcock", + "key": 202, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Henni", + "firstname": "Hilfskraft_3", "forbidden_days": [], - "key": 5367, - "name": "Donis", - "planned_shifts": [], - "vacation_days": [ - 7, - 8 - ] - }, - { - "firstname": "Augustin", - "forbidden_days": [], - "key": 5920, - "name": "Carreras", + "key": 203, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Heinz", - "forbidden_days": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29 - ], - "key": 6475, - "name": "Binford", - "planned_shifts": [ - [ - 1, - "N\u20ac" - ] - ], - "vacation_days": [ - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21 - ] - }, - { - "firstname": "Roseliese", + "firstname": "Hilfskraft_4", "forbidden_days": [], - "key": 6507, - "name": "Rashid", + "key": 204, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Christfri", + "firstname": "Hilfskraft_5", "forbidden_days": [], - "key": 6677, - "name": "Fullerton", + "key": 205, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Saskia", - "forbidden_days": [ - 23, - 24 - ], - "key": 6681, - "name": "Labelle", - "planned_shifts": [], - "vacation_days": [ - 18, - 19, - 20, - 21, - 22, - 25, - 26 - ] - }, - { - "firstname": "Lioba", - "forbidden_days": [ - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30 - ], - "key": 6715, - "name": "Burris", - "planned_shifts": [], - "vacation_days": [] - }, - { - "firstname": "Trude", + "firstname": "Hilfskraft_6", "forbidden_days": [], - "key": 6836, - "name": "Valentino", - "planned_shifts": [ - [ - 17, - "F2_" - ] - ], + "key": 206, + "name": "Test", + "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Annelene", + "firstname": "Fachkraft_1", "forbidden_days": [], - "key": 6928, - "name": "Izzo", + "key": 301, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Marcus", - "forbidden_days": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 16, - 21, - 22, - 23, - 24, - 30 - ], - "key": 7496, - "name": "Demarco", - "planned_shifts": [ - [ - 15, - "S2_" - ], - [ - 17, - "F2_" - ], - [ - 18, - "F2_" - ], - [ - 19, - "N5" - ], - [ - 20, - "N5" - ], - [ - 25, - "F2_" - ], - [ - 26, - "F2_" - ], - [ - 27, - "F2_" - ], - [ - 28, - "F2_" - ], - [ - 29, - "F2_" - ] - ], - "vacation_days": [] - }, - { - "firstname": "Ludger", + "firstname": "Fachkraft_2", "forbidden_days": [], - "key": 7603, - "name": "Roberson", + "key": 302, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Sieghardt", - "forbidden_days": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 26, - 29, - 30 - ], - "key": 7741, - "name": "Tharp", - "planned_shifts": [ - [ - 27, - "S2_" - ], - [ - 28, - "S2_" - ] - ], - "vacation_days": [] - }, - { - "firstname": "Kilian", - "forbidden_days": [ - 4, - 8, - 9, - 10 - ], - "key": 7752, - "name": "Rodriques", - "planned_shifts": [ - [ - 5, - "S2_" - ], - [ - 6, - "S2_" - ], - [ - 7, - "S2_" - ], - [ - 16, - "T75_" - ], - [ - 17, - "T75_" - ] - ], - "vacation_days": [] - }, - { - "firstname": "Julia", - "forbidden_days": [ - 1, - 2, - 3, - 4, - 5, - 6, - 22, - 25 - ], - "key": 7770, - "name": "Yeh", + "firstname": "Fachkraft_3", + "forbidden_days": [], + "key": 303, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Burkhild", - "forbidden_days": [ - 1, - 2, - 3, - 4, - 5, - 6, - 28, - 29 - ], - "key": 7796, - "name": "Hertzler", + "firstname": "Fachkraft_4", + "forbidden_days": [], + "key": 304, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Karena", - "forbidden_days": [ - 1, - 2, - 3, - 4, - 5, - 6, - 22, - 25 - ], - "key": 7835, - "name": "Driggers", + "firstname": "Fachkraft_5", + "forbidden_days": [], + "key": 305, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Gertraute", + "firstname": "Fachkraft_6", "forbidden_days": [], - "key": 7848, - "name": "Winters", - "planned_shifts": [ - [ - 29, - "T75_" - ] - ], - "vacation_days": [] - }, - { - "firstname": "Janett", - "forbidden_days": [ - 1, - 2, - 3, - 4, - 5, - 6 - ], - "key": 7877, - "name": "Staggs", + "key": 306, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Irma", - "forbidden_days": [ - 1 - ], - "key": 7919, - "name": "Weathers", + "firstname": "Fachkraft_7", + "forbidden_days": [], + "key": 307, + "name": "Test", "planned_shifts": [], "vacation_days": [] }, { - "firstname": "Loremarie", - "forbidden_days": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27 - ], - "key": 7990, - "name": "Milburn", + "firstname": "Fachkraft_8", + "forbidden_days": [], + "key": 308, + "name": "Test", "planned_shifts": [], "vacation_days": [] } diff --git a/cases/77/11_2024/target_working_minutes.json b/cases/77/11_2024/target_working_minutes.json index b02157bf..18a2e2a4 100644 --- a/cases/77/11_2024/target_working_minutes.json +++ b/cases/77/11_2024/target_working_minutes.json @@ -1,270 +1,130 @@ { "employees": [ - { - "actual": 1920.0, - "firstname": "Sandra", - "key": 459, - "name": "Shoemake", - "target": 7680.0 - }, - { - "actual": 9360.0, - "firstname": "Adriane", - "key": 790, - "name": "Mccomas", - "target": 9360.0 - }, { "actual": 0.0, - "firstname": "Janett", - "key": 791, - "name": "Branz", - "target": 6930.0 - }, - { - "actual": 8765.0, - "firstname": "Nele", - "key": 822, - "name": "Sewell", + "firstname": "Azubi_1", + "key": 101, + "name": "Test", "target": 9240.0 }, - { - "actual": 3955.0, - "firstname": "Liselotte", - "key": 839, - "name": "S\u00e4uffert", - "target": 4620.0 - }, - { - "actual": 2079.0, - "firstname": "Silvia", - "key": 914, - "name": "Harkins", - "target": 8316.0 - }, - { - "actual": 460.0, - "firstname": "Ingbert", - "key": 917, - "name": "Catoe", - "target": 7680.0 - }, - { - "actual": 4620.0, - "firstname": "Jenny", - "key": 921, - "name": "Keese", - "target": 4620.0 - }, { "actual": 0.0, - "firstname": "B\u00e4rbl", - "key": 924, - "name": "Merriweather", - "target": 4561.0 - }, - { - "actual": 0.0, - "firstname": "Lina", - "key": 925, - "name": "Farniok", - "target": 5544.0 - }, - { - "actual": 468.0, - "firstname": "Margaritt", - "key": 927, - "name": "Mittrach", - "target": 9360.0 - }, - { - "actual": 832.0, - "firstname": "Daniele", - "key": 928, - "name": "Wunderlich", - "target": 5544.0 - }, - { - "actual": 462.0, - "firstname": "Constance", - "key": 1230, - "name": "Palacio", + "firstname": "Azubi_2", + "key": 102, + "name": "Test", "target": 9240.0 }, { "actual": 0.0, - "firstname": "Kersten", - "key": 2932, - "name": "Devers", + "firstname": "Azubi_3", + "key": 103, + "name": "Test", "target": 9240.0 }, { "actual": 0.0, - "firstname": "Renilde", - "key": 2963, - "name": "Hoots", - "target": 9240.0 - }, - { - "actual": 9240.0, - "firstname": "Elgine", - "key": 3566, - "name": "Seligman", - "target": 9240.0 - }, - { - "actual": 460.0, - "firstname": "Eike", - "key": 3868, - "name": "Vanfleet", - "target": 9240.0 - }, - { - "actual": 462.0, - "firstname": "Hannah", - "key": 4566, - "name": "Woodcock", + "firstname": "Azubi_4", + "key": 104, + "name": "Test", "target": 9240.0 }, { "actual": 0.0, - "firstname": "Henni", - "key": 5367, - "name": "Donis", + "firstname": "Hilfskraft_1", + "key": 201, + "name": "Test", "target": 9240.0 }, { "actual": 0.0, - "firstname": "Augustin", - "key": 5920, - "name": "Carreras", + "firstname": "Hilfskraft_2", + "key": 202, + "name": "Test", "target": 9240.0 }, - { - "actual": 1.0, - "firstname": "Heinz", - "key": 6475, - "name": "Binford", - "target": 2.0 - }, { "actual": 0.0, - "firstname": "Roseliese", - "key": 6507, - "name": "Rashid", + "firstname": "Hilfskraft_3", + "key": 203, + "name": "Test", "target": 9240.0 }, { "actual": 0.0, - "firstname": "Christfri", - "key": 6677, - "name": "Fullerton", - "target": 9240.0 - }, - { - "actual": 1848.0, - "firstname": "Saskia", - "key": 6681, - "name": "Labelle", - "target": 7392.0 - }, - { - "actual": 6930.0, - "firstname": "Lioba", - "key": 6715, - "name": "Burris", - "target": 9240.0 - }, - { - "actual": 460.0, - "firstname": "Trude", - "key": 6836, - "name": "Valentino", + "firstname": "Hilfskraft_4", + "key": 204, + "name": "Test", "target": 9240.0 }, { "actual": 0.0, - "firstname": "Annelene", - "key": 6928, - "name": "Izzo", - "target": 9360.0 - }, - { - "actual": 8950.0, - "firstname": "Marcus", - "key": 7496, - "name": "Demarco", - "target": 8400.0 + "firstname": "Hilfskraft_5", + "key": 205, + "name": "Test", + "target": 9240.0 }, { "actual": 0.0, - "firstname": "Ludger", - "key": 7603, - "name": "Roberson", + "firstname": "Hilfskraft_6", + "key": 206, + "name": "Test", "target": 9240.0 }, { - "actual": 920.0, - "firstname": "Sieghardt", - "key": 7741, - "name": "Tharp", - "target": 960.0 - }, - { - "actual": 2300.0, - "firstname": "Kilian", - "key": 7752, - "name": "Rodriques", + "actual": 0.0, + "firstname": "Fachkraft_1", + "key": 301, + "name": "Test", "target": 9240.0 }, { - "actual": 2310.0, - "firstname": "Julia", - "key": 7770, - "name": "Yeh", + "actual": 0.0, + "firstname": "Fachkraft_2", + "key": 302, + "name": "Test", "target": 9240.0 }, { - "actual": 2310.0, - "firstname": "Burkhild", - "key": 7796, - "name": "Hertzler", + "actual": 0.0, + "firstname": "Fachkraft_3", + "key": 303, + "name": "Test", "target": 9240.0 }, { - "actual": 2310.0, - "firstname": "Karena", - "key": 7835, - "name": "Driggers", + "actual": 0.0, + "firstname": "Fachkraft_4", + "key": 304, + "name": "Test", "target": 9240.0 }, { - "actual": 460.0, - "firstname": "Gertraute", - "key": 7848, - "name": "Winters", + "actual": 0.0, + "firstname": "Fachkraft_5", + "key": 305, + "name": "Test", "target": 9240.0 }, { - "actual": 1386.0, - "firstname": "Janett", - "key": 7877, - "name": "Staggs", + "actual": 0.0, + "firstname": "Fachkraft_6", + "key": 306, + "name": "Test", "target": 9240.0 }, { "actual": 0.0, - "firstname": "Irma", - "key": 7919, - "name": "Weathers", + "firstname": "Fachkraft_7", + "key": 307, + "name": "Test", "target": 9240.0 }, { "actual": 0.0, - "firstname": "Loremarie", - "key": 7990, - "name": "Milburn", - "target": 2310.0 + "firstname": "Fachkraft_8", + "key": 308, + "name": "Test", + "target": 9240.0 } ] } diff --git a/cases/77/11_2024/wishes_and_blocked.json b/cases/77/11_2024/wishes_and_blocked.json index 06df6ebd..0936b92a 100644 --- a/cases/77/11_2024/wishes_and_blocked.json +++ b/cases/77/11_2024/wishes_and_blocked.json @@ -1,2300 +1,382 @@ -{ - "employees": [ - { - "blocked_days": [], - "blocked_shifts": [], - "firstname": "Janett", - "key": 791, - "name": "Branz", - "wish_days": [], - "wish_shifts": [ - [ - 25, - "F" - ] - ] - }, - { - "blocked_days": [], - "blocked_shifts": [], - "firstname": "Ingbert", - "key": 917, - "name": "Catoe", - "wish_days": [ - 8 - ], - "wish_shifts": [ - [ - 30, - "S" - ], - [ - 30, - "N" - ] - ] - }, - { - "blocked_days": [], - "blocked_shifts": [ - [ - 1, - "N" - ], - [ - 1, - "S" - ], - [ - 1, - "Z" - ], - [ - 4, - "N" - ], - [ - 4, - "S" - ], - [ - 4, - "Z" - ], - [ - 5, - "N" - ], - [ - 5, - "S" - ], - [ - 5, - "Z" - ], - [ - 6, - "N" - ], - [ - 6, - "S" - ], - [ - 6, - "Z" - ], - [ - 7, - "N" - ], - [ - 7, - "S" - ], - [ - 7, - "Z" - ], - [ - 8, - "N" - ], - [ - 8, - "S" - ], - [ - 8, - "Z" - ], - [ - 11, - "N" - ], - [ - 11, - "S" - ], - [ - 11, - "Z" - ], - [ - 12, - "N" - ], - [ - 12, - "S" - ], - [ - 12, - "Z" - ], - [ - 13, - "N" - ], - [ - 13, - "S" - ], - [ - 13, - "Z" - ], - [ - 14, - "N" - ], - [ - 14, - "S" - ], - [ - 14, - "Z" - ], - [ - 15, - "N" - ], - [ - 15, - "S" - ], - [ - 15, - "Z" - ], - [ - 18, - "N" - ], - [ - 18, - "S" - ], - [ - 18, - "Z" - ], - [ - 19, - "N" - ], - [ - 19, - "S" - ], - [ - 19, - "Z" - ], - [ - 20, - "N" - ], - [ - 20, - "S" - ], - [ - 20, - "Z" - ], - [ - 21, - "N" - ], - [ - 21, - "S" - ], - [ - 21, - "Z" - ], - [ - 22, - "N" - ], - [ - 22, - "S" - ], - [ - 22, - "Z" - ], - [ - 25, - "N" - ], - [ - 25, - "S" - ], - [ - 25, - "Z" - ], - [ - 26, - "N" - ], - [ - 26, - "S" - ], - [ - 26, - "Z" - ], - [ - 27, - "N" - ], - [ - 27, - "S" - ], - [ - 27, - "Z" - ], - [ - 28, - "N" - ], - [ - 28, - "S" - ], - [ - 28, - "Z" - ], - [ - 29, - "N" - ], - [ - 29, - "S" - ], - [ - 29, - "Z" - ] - ], - "firstname": "Renilde", - "key": 2963, - "name": "Hoots", - "wish_days": [ - 26 - ], - "wish_shifts": [] - }, - { - "blocked_days": [], - "blocked_shifts": [ - [ - 1, - "N" - ], - [ - 2, - "N" - ], - [ - 3, - "N" - ], - [ - 4, - "N" - ], - [ - 5, - "N" - ], - [ - 6, - "N" - ], - [ - 7, - "N" - ], - [ - 8, - "N" - ], - [ - 9, - "N" - ], - [ - 10, - "N" - ], - [ - 11, - "N" - ], - [ - 12, - "N" - ], - [ - 13, - "N" - ], - [ - 14, - "N" - ], - [ - 15, - "N" - ], - [ - 16, - "N" - ], - [ - 17, - "N" - ], - [ - 18, - "N" - ], - [ - 19, - "N" - ], - [ - 20, - "N" - ], - [ - 21, - "N" - ], - [ - 22, - "N" - ], - [ - 23, - "N" - ], - [ - 24, - "N" - ], - [ - 25, - "N" - ], - [ - 26, - "N" - ], - [ - 27, - "N" - ], - [ - 28, - "N" - ], - [ - 29, - "N" - ], - [ - 30, - "N" - ] - ], - "firstname": "Ludger", - "key": 7603, - "name": "Roberson", - "wish_days": [], - "wish_shifts": [ - [ - 11, - "F" - ], - [ - 11, - "Z" - ] - ] - }, - { - "blocked_days": [], - "blocked_shifts": [], - "firstname": "Trude", - "key": 6836, - "name": "Valentino", - "wish_days": [], - "wish_shifts": [ - [ - 15, - "F" - ], - [ - 16, - "F" - ], - [ - 15, - "S" - ], - [ - 16, - "S" - ], - [ - 15, - "Z" - ], - [ - 16, - "Z" - ] - ] - }, - { - "blocked_days": [], - "blocked_shifts": [], - "firstname": "Eike", - "key": 3868, - "name": "Vanfleet", - "wish_days": [ - 11 - ], - "wish_shifts": [ - [ - 1, - "N" - ], - [ - 2, - "N" - ], - [ - 3, - "N" - ], - [ - 4, - "N" - ], - [ - 5, - "N" - ], - [ - 6, - "N" - ], - [ - 7, - "N" - ], - [ - 8, - "N" - ], - [ - 9, - "N" - ], - [ - 10, - "N" - ], - [ - 11, - "N" - ], - [ - 12, - "N" - ], - [ - 13, - "N" - ], - [ - 14, - "N" - ], - [ - 15, - "N" - ], - [ - 16, - "N" - ], - [ - 17, - "N" - ], - [ - 18, - "N" - ], - [ - 19, - "N" - ], - [ - 20, - "N" - ], - [ - 21, - "N" - ], - [ - 22, - "N" - ], - [ - 23, - "N" - ], - [ - 24, - "N" - ], - [ - 25, - "N" - ], - [ - 26, - "N" - ], - [ - 27, - "N" - ], - [ - 28, - "N" - ], - [ - 29, - "N" - ], - [ - 30, - "N" - ] - ] - }, - { - "blocked_days": [], - "blocked_shifts": [ - [ - 1, - "F" - ], - [ - 2, - "F" - ], - [ - 3, - "F" - ], - [ - 4, - "F" - ], - [ - 5, - "F" - ], - [ - 6, - "F" - ], - [ - 7, - "F" - ], - [ - 8, - "F" - ], - [ - 9, - "F" - ], - [ - 10, - "F" - ], - [ - 11, - "F" - ], - [ - 12, - "F" - ], - [ - 13, - "F" - ], - [ - 14, - "F" - ], - [ - 15, - "F" - ], - [ - 16, - "F" - ], - [ - 17, - "F" - ], - [ - 18, - "F" - ], - [ - 19, - "F" - ], - [ - 20, - "F" - ], - [ - 21, - "F" - ], - [ - 22, - "F" - ], - [ - 23, - "F" - ], - [ - 24, - "F" - ], - [ - 25, - "F" - ], - [ - 26, - "F" - ], - [ - 27, - "F" - ], - [ - 28, - "F" - ], - [ - 29, - "F" - ], - [ - 30, - "F" - ], - [ - 1, - "S" - ], - [ - 2, - "S" - ], - [ - 3, - "S" - ], - [ - 4, - "S" - ], - [ - 5, - "S" - ], - [ - 6, - "S" - ], - [ - 7, - "S" - ], - [ - 8, - "S" - ], - [ - 9, - "S" - ], - [ - 10, - "S" - ], - [ - 11, - "S" - ], - [ - 12, - "S" - ], - [ - 13, - "S" - ], - [ - 14, - "S" - ], - [ - 15, - "S" - ], - [ - 16, - "S" - ], - [ - 17, - "S" - ], - [ - 18, - "S" - ], - [ - 19, - "S" - ], - [ - 20, - "S" - ], - [ - 21, - "S" - ], - [ - 22, - "S" - ], - [ - 23, - "S" - ], - [ - 24, - "S" - ], - [ - 25, - "S" - ], - [ - 26, - "S" - ], - [ - 27, - "S" - ], - [ - 28, - "S" - ], - [ - 29, - "S" - ], - [ - 30, - "S" - ], - [ - 1, - "Z" - ], - [ - 2, - "Z" - ], - [ - 3, - "Z" - ], - [ - 4, - "Z" - ], - [ - 5, - "Z" - ], - [ - 6, - "Z" - ], - [ - 7, - "Z" - ], - [ - 8, - "Z" - ], - [ - 9, - "Z" - ], - [ - 10, - "Z" - ], - [ - 11, - "Z" - ], - [ - 12, - "Z" - ], - [ - 13, - "Z" - ], - [ - 14, - "Z" - ], - [ - 15, - "Z" - ], - [ - 16, - "Z" - ], - [ - 17, - "Z" - ], - [ - 18, - "Z" - ], - [ - 19, - "Z" - ], - [ - 20, - "Z" - ], - [ - 21, - "Z" - ], - [ - 22, - "Z" - ], - [ - 23, - "Z" - ], - [ - 24, - "Z" - ], - [ - 25, - "Z" - ], - [ - 26, - "Z" - ], - [ - 27, - "Z" - ], - [ - 28, - "Z" - ], - [ - 29, - "Z" - ], - [ - 30, - "Z" - ] - ], - "firstname": "Lina", - "key": 925, - "name": "Farniok", - "wish_days": [ - 20, - 21 - ], - "wish_shifts": [] - }, - { - "blocked_days": [], - "blocked_shifts": [], - "firstname": "Henni", - "key": 5367, - "name": "Donis", - "wish_days": [], - "wish_shifts": [ - [ - 6, - "S" - ], - [ - 6, - "N" - ], - [ - 6, - "Z" - ] - ] - }, - { - "blocked_days": [], - "blocked_shifts": [], - "firstname": "Christfri", - "key": 6677, - "name": "Fullerton", - "wish_days": [ - 28, - 29 - ], - "wish_shifts": [] - }, - { - "blocked_days": [], - "blocked_shifts": [ - [ - 1, - "F" - ], - [ - 2, - "F" - ], - [ - 3, - "F" - ], - [ - 4, - "F" - ], - [ - 5, - "F" - ], - [ - 6, - "F" - ], - [ - 7, - "F" - ], - [ - 8, - "F" - ], - [ - 9, - "F" - ], - [ - 10, - "F" - ], - [ - 11, - "F" - ], - [ - 12, - "F" - ], - [ - 13, - "F" - ], - [ - 14, - "F" - ], - [ - 15, - "F" - ], - [ - 16, - "F" - ], - [ - 17, - "F" - ], - [ - 18, - "F" - ], - [ - 19, - "F" - ], - [ - 20, - "F" - ], - [ - 21, - "F" - ], - [ - 22, - "F" - ], - [ - 23, - "F" - ], - [ - 24, - "F" - ], - [ - 25, - "F" - ], - [ - 26, - "F" - ], - [ - 27, - "F" - ], - [ - 28, - "F" - ], - [ - 29, - "F" - ], - [ - 30, - "F" - ], - [ - 1, - "S" - ], - [ - 2, - "S" - ], - [ - 3, - "S" - ], - [ - 4, - "S" - ], - [ - 5, - "S" - ], - [ - 6, - "S" - ], - [ - 7, - "S" - ], - [ - 8, - "S" - ], - [ - 9, - "S" - ], - [ - 10, - "S" - ], - [ - 11, - "S" - ], - [ - 12, - "S" - ], - [ - 13, - "S" - ], - [ - 14, - "S" - ], - [ - 15, - "S" - ], - [ - 16, - "S" - ], - [ - 17, - "S" - ], - [ - 18, - "S" - ], - [ - 19, - "S" - ], - [ - 20, - "S" - ], - [ - 21, - "S" - ], - [ - 22, - "S" - ], - [ - 23, - "S" - ], - [ - 24, - "S" - ], - [ - 25, - "S" - ], - [ - 26, - "S" - ], - [ - 27, - "S" - ], - [ - 28, - "S" - ], - [ - 29, - "S" - ], - [ - 30, - "S" - ], - [ - 1, - "Z" - ], - [ - 2, - "Z" - ], - [ - 3, - "Z" - ], - [ - 4, - "Z" - ], - [ - 5, - "Z" - ], - [ - 6, - "Z" - ], - [ - 7, - "Z" - ], - [ - 8, - "Z" - ], - [ - 9, - "Z" - ], - [ - 10, - "Z" - ], - [ - 11, - "Z" - ], - [ - 12, - "Z" - ], - [ - 13, - "Z" - ], - [ - 14, - "Z" - ], - [ - 15, - "Z" - ], - [ - 16, - "Z" - ], - [ - 17, - "Z" - ], - [ - 18, - "Z" - ], - [ - 19, - "Z" - ], - [ - 20, - "Z" - ], - [ - 21, - "Z" - ], - [ - 22, - "Z" - ], - [ - 23, - "Z" - ], - [ - 24, - "Z" - ], - [ - 25, - "Z" - ], - [ - 26, - "Z" - ], - [ - 27, - "Z" - ], - [ - 28, - "Z" - ], - [ - 29, - "Z" - ], - [ - 30, - "Z" - ] - ], - "firstname": "Saskia", - "key": 6681, - "name": "Labelle", - "wish_days": [], - "wish_shifts": [] - }, - { - "blocked_days": [ - 1, - 6, - 7, - 16, - 17, - 18, - 19, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30 - ], - "blocked_shifts": [ - [ - 1, - "F" - ], - [ - 2, - "F" - ], - [ - 3, - "F" - ], - [ - 4, - "F" - ], - [ - 5, - "F" - ], - [ - 6, - "F" - ], - [ - 7, - "F" - ], - [ - 8, - "F" - ], - [ - 9, - "F" - ], - [ - 10, - "F" - ], - [ - 11, - "F" - ], - [ - 12, - "F" - ], - [ - 13, - "F" - ], - [ - 14, - "F" - ], - [ - 15, - "F" - ], - [ - 16, - "F" - ], - [ - 17, - "F" - ], - [ - 18, - "F" - ], - [ - 19, - "F" - ], - [ - 20, - "F" - ], - [ - 21, - "F" - ], - [ - 22, - "F" - ], - [ - 23, - "F" - ], - [ - 24, - "F" - ], - [ - 25, - "F" - ], - [ - 26, - "F" - ], - [ - 27, - "F" - ], - [ - 28, - "F" - ], - [ - 29, - "F" - ], - [ - 30, - "F" - ], - [ - 1, - "S" - ], - [ - 2, - "S" - ], - [ - 3, - "S" - ], - [ - 4, - "S" - ], - [ - 5, - "S" - ], - [ - 6, - "S" - ], - [ - 7, - "S" - ], - [ - 8, - "S" - ], - [ - 9, - "S" - ], - [ - 10, - "S" - ], - [ - 11, - "S" - ], - [ - 12, - "S" - ], - [ - 13, - "S" - ], - [ - 14, - "S" - ], - [ - 15, - "S" - ], - [ - 16, - "S" - ], - [ - 17, - "S" - ], - [ - 18, - "S" - ], - [ - 19, - "S" - ], - [ - 20, - "S" - ], - [ - 21, - "S" - ], - [ - 22, - "S" - ], - [ - 23, - "S" - ], - [ - 24, - "S" - ], - [ - 25, - "S" - ], - [ - 26, - "S" - ], - [ - 27, - "S" - ], - [ - 28, - "S" - ], - [ - 29, - "S" - ], - [ - 30, - "S" - ], - [ - 1, - "Z" - ], - [ - 2, - "Z" - ], - [ - 3, - "Z" - ], - [ - 4, - "Z" - ], - [ - 5, - "Z" - ], - [ - 6, - "Z" - ], - [ - 7, - "Z" - ], - [ - 8, - "Z" - ], - [ - 9, - "Z" - ], - [ - 10, - "Z" - ], - [ - 11, - "Z" - ], - [ - 12, - "Z" - ], - [ - 13, - "Z" - ], - [ - 14, - "Z" - ], - [ - 15, - "Z" - ], - [ - 16, - "Z" - ], - [ - 17, - "Z" - ], - [ - 18, - "Z" - ], - [ - 19, - "Z" - ], - [ - 20, - "Z" - ], - [ - 21, - "Z" - ], - [ - 22, - "Z" - ], - [ - 23, - "Z" - ], - [ - 24, - "Z" - ], - [ - 25, - "Z" - ], - [ - 26, - "Z" - ], - [ - 27, - "Z" - ], - [ - 28, - "Z" - ], - [ - 29, - "Z" - ], - [ - 30, - "Z" - ] - ], - "firstname": "Daniele", - "key": 928, - "name": "Wunderlich", - "wish_days": [], - "wish_shifts": [] - }, - { - "blocked_days": [], - "blocked_shifts": [ - [ - 1, - "N" - ], - [ - 2, - "N" - ], - [ - 3, - "N" - ], - [ - 4, - "N" - ], - [ - 5, - "N" - ], - [ - 6, - "N" - ], - [ - 7, - "N" - ], - [ - 8, - "N" - ], - [ - 9, - "N" - ], - [ - 10, - "N" - ], - [ - 11, - "N" - ], - [ - 12, - "N" - ], - [ - 13, - "N" - ], - [ - 14, - "N" - ], - [ - 15, - "N" - ], - [ - 16, - "N" - ], - [ - 17, - "N" - ], - [ - 18, - "N" - ], - [ - 19, - "N" - ], - [ - 20, - "N" - ], - [ - 21, - "N" - ], - [ - 22, - "N" - ], - [ - 23, - "N" - ], - [ - 24, - "N" - ], - [ - 25, - "N" - ], - [ - 26, - "N" - ], - [ - 27, - "N" - ], - [ - 28, - "N" - ], - [ - 29, - "N" - ], - [ - 30, - "N" - ] - ], - "firstname": "Sandra", - "key": 459, - "name": "Shoemake", - "wish_days": [], - "wish_shifts": [] - }, - { - "blocked_days": [ - 8, - 14, - 15, - 21, - 22, - 28, - 29 - ], - "blocked_shifts": [ - [ - 1, - "N" - ], - [ - 2, - "N" - ], - [ - 3, - "N" - ], - [ - 4, - "N" - ], - [ - 5, - "N" - ], - [ - 6, - "N" - ], - [ - 7, - "N" - ], - [ - 8, - "N" - ], - [ - 9, - "N" - ], - [ - 10, - "N" - ], - [ - 11, - "N" - ], - [ - 12, - "N" - ], - [ - 13, - "N" - ], - [ - 14, - "N" - ], - [ - 15, - "N" - ], - [ - 16, - "N" - ], - [ - 17, - "N" - ], - [ - 18, - "N" - ], - [ - 19, - "N" - ], - [ - 20, - "N" - ], - [ - 21, - "N" - ], - [ - 22, - "N" - ], - [ - 23, - "N" - ], - [ - 24, - "N" - ], - [ - 25, - "N" - ], - [ - 26, - "N" - ], - [ - 27, - "N" - ], - [ - 28, - "N" - ], - [ - 29, - "N" - ], - [ - 30, - "N" - ] - ], - "firstname": "B\u00e4rbl", - "key": 924, - "name": "Merriweather", - "wish_days": [], - "wish_shifts": [] - }, - { - "blocked_days": [], - "blocked_shifts": [ - [ - 1, - "N" - ], - [ - 1, - "S" - ], - [ - 1, - "Z" - ], - [ - 4, - "N" - ], - [ - 4, - "S" - ], - [ - 4, - "Z" - ], - [ - 5, - "N" - ], - [ - 5, - "S" - ], - [ - 5, - "Z" - ], - [ - 6, - "N" - ], - [ - 6, - "S" - ], - [ - 6, - "Z" - ], - [ - 7, - "N" - ], - [ - 7, - "S" - ], - [ - 7, - "Z" - ], - [ - 8, - "N" - ], - [ - 8, - "S" - ], - [ - 8, - "Z" - ], - [ - 11, - "N" - ], - [ - 11, - "S" - ], - [ - 11, - "Z" - ], - [ - 12, - "N" - ], - [ - 12, - "S" - ], - [ - 12, - "Z" - ], - [ - 13, - "N" - ], - [ - 13, - "S" - ], - [ - 13, - "Z" - ], - [ - 14, - "N" - ], - [ - 14, - "S" - ], - [ - 14, - "Z" - ], - [ - 15, - "N" - ], - [ - 15, - "S" - ], - [ - 15, - "Z" - ], - [ - 18, - "N" - ], - [ - 18, - "S" - ], - [ - 18, - "Z" - ], - [ - 19, - "N" - ], - [ - 19, - "S" - ], - [ - 19, - "Z" - ], - [ - 20, - "N" - ], - [ - 20, - "S" - ], - [ - 20, - "Z" - ], - [ - 21, - "N" - ], - [ - 21, - "S" - ], - [ - 21, - "Z" - ], - [ - 22, - "N" - ], - [ - 22, - "S" - ], - [ - 22, - "Z" - ], - [ - 25, - "N" - ], - [ - 25, - "S" - ], - [ - 25, - "Z" - ], - [ - 26, - "N" - ], - [ - 26, - "S" - ], - [ - 26, - "Z" - ], - [ - 27, - "N" - ], - [ - 27, - "S" - ], - [ - 27, - "Z" - ], - [ - 28, - "N" - ], - [ - 28, - "S" - ], - [ - 28, - "Z" - ], - [ - 29, - "N" - ], - [ - 29, - "S" - ], - [ - 29, - "Z" - ] - ], - "firstname": "Roseliese", - "key": 6507, - "name": "Rashid", - "wish_days": [], - "wish_shifts": [] - } - ] +{ + "employees": [ + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Azubi_1", + "key": 101, + "name": "Test", + "wish_days": [], + "wish_shifts": [] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Azubi_2", + "key": 102, + "name": "Test", + "wish_days": [], + "wish_shifts": [] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Azubi_3", + "key": 103, + "name": "Test", + "wish_days": [], + "wish_shifts": [] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Azubi_4", + "key": 104, + "name": "Test", + "wish_days": [], + "wish_shifts": [] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Hilfskraft_1", + "key": 201, + "name": "Test", + "wish_days": [], + "wish_shifts": [] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Hilfskraft_2", + "key": 202, + "name": "Test", + "wish_days": [], + "wish_shifts": [] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Hilfskraft_3", + "key": 203, + "name": "Test", + "wish_days": [], + "wish_shifts": [] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Hilfskraft_4", + "key": 204, + "name": "Test", + "wish_days": [], + "wish_shifts": [] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Hilfskraft_5", + "key": 205, + "name": "Test", + "wish_days": [], + "wish_shifts": [] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Hilfskraft_6", + "key": 206, + "name": "Test", + "wish_days": [], + "wish_shifts": [] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Fachkraft_1", + "key": 301, + "name": "Test", + "wish_days": [ + 4, + 5, + 6, + 7, + 8 + ], + "wish_shifts": [ + [ + 11, + "F" + ], + [ + 12, + "F" + ], + [ + 13, + "F" + ], + [ + 14, + "F" + ], + [ + 15, + "F" + ] + ] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Fachkraft_2", + "key": 302, + "name": "Test", + "wish_days": [ + 4, + 5, + 6, + 7, + 8 + ], + "wish_shifts": [ + [ + 11, + "F" + ], + [ + 12, + "F" + ], + [ + 13, + "F" + ], + [ + 14, + "F" + ], + [ + 15, + "F" + ] + ] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Fachkraft_3", + "key": 303, + "name": "Test", + "wish_days": [ + 4, + 5, + 6, + 7, + 8 + ], + "wish_shifts": [ + [ + 11, + "F" + ], + [ + 12, + "F" + ], + [ + 13, + "F" + ], + [ + 14, + "F" + ], + [ + 15, + "F" + ] + ] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Fachkraft_4", + "key": 304, + "name": "Test", + "wish_days": [ + 4, + 5, + 6, + 7, + 8 + ], + "wish_shifts": [ + [ + 11, + "F" + ], + [ + 12, + "F" + ], + [ + 13, + "F" + ], + [ + 14, + "F" + ], + [ + 15, + "F" + ] + ] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Fachkraft_5", + "key": 305, + "name": "Test", + "wish_days": [ + 4, + 5, + 6, + 7, + 8 + ], + "wish_shifts": [ + [ + 11, + "F" + ], + [ + 12, + "F" + ], + [ + 13, + "F" + ], + [ + 14, + "F" + ], + [ + 15, + "F" + ] + ] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Fachkraft_6", + "key": 306, + "name": "Test", + "wish_days": [ + 4, + 5, + 6, + 7, + 8 + ], + "wish_shifts": [ + [ + 11, + "F" + ], + [ + 12, + "F" + ], + [ + 13, + "F" + ], + [ + 14, + "F" + ], + [ + 15, + "F" + ] + ] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Fachkraft_7", + "key": 307, + "name": "Test", + "wish_days": [ + 4, + 5, + 6, + 7, + 8 + ], + "wish_shifts": [ + [ + 11, + "F" + ], + [ + 12, + "F" + ], + [ + 13, + "F" + ], + [ + 14, + "F" + ], + [ + 15, + "F" + ] + ] + }, + { + "blocked_days": [], + "blocked_shifts": [], + "firstname": "Fachkraft_8", + "key": 308, + "name": "Test", + "wish_days": [ + 4, + 5, + 6, + 7, + 8 + ], + "wish_shifts": [ + [ + 11, + "F" + ], + [ + 12, + "F" + ], + [ + 13, + "F" + ], + [ + 14, + "F" + ], + [ + 15, + "F" + ] + ] + } + ] } diff --git a/cases/77/11_2024/worked_sundays.json b/cases/77/11_2024/worked_sundays.json index 626a830f..87336a5d 100644 --- a/cases/77/11_2024/worked_sundays.json +++ b/cases/77/11_2024/worked_sundays.json @@ -1,346 +1,112 @@ { "worked_sundays": [ { - "firstname": "Kersten", - "key": 2932, - "name": "Devers", - "worked_sundays": 21 - }, - { - "firstname": "Margaritt", - "key": 927, - "name": "Mittrach", - "worked_sundays": 20 - }, - { - "firstname": "Silvia", - "key": 914, - "name": "Harkins", - "worked_sundays": 19 - }, - { - "firstname": "Ingbert", - "key": 917, - "name": "Catoe", - "worked_sundays": 19 - }, - { - "firstname": "B\u00e4rbl", - "key": 924, - "name": "Merriweather", - "worked_sundays": 18 - }, - { - "firstname": "Waldfried", - "key": 637, - "name": "Heaney", - "worked_sundays": 18 - }, - { - "firstname": "Renilde", - "key": 2963, - "name": "Hoots", - "worked_sundays": 18 - }, - { - "firstname": "Roseliese", - "key": 6507, - "name": "Rashid", - "worked_sundays": 18 - }, - { - "firstname": "Saskia", - "key": 6681, - "name": "Labelle", - "worked_sundays": 17 - }, - { - "firstname": "Daniele", - "key": 928, - "name": "Wunderlich", - "worked_sundays": 17 - }, - { - "firstname": "Sandra", - "key": 459, - "name": "Shoemake", - "worked_sundays": 17 - }, - { - "firstname": "Eleonore", - "key": 3004, - "name": "Lockett", - "worked_sundays": 16 - }, - { - "firstname": "Lina", - "key": 925, - "name": "Farniok", - "worked_sundays": 16 - }, - { - "firstname": "Henni", - "key": 5367, - "name": "Donis", - "worked_sundays": 13 - }, - { - "firstname": "Constance", - "key": 1230, - "name": "Palacio", - "worked_sundays": 10 - }, - { - "firstname": "Ludger", - "key": 7603, - "name": "Roberson", - "worked_sundays": 8 - }, - { - "firstname": "Fritzi", - "key": 4088, - "name": "Mulvihill", - "worked_sundays": 7 - }, - { - "firstname": "Rebecca", - "key": 4064, - "name": "Scheuenstuhl", - "worked_sundays": 6 - }, - { - "firstname": "Janett", - "key": 791, - "name": "Branz", - "worked_sundays": 6 - }, - { - "firstname": "Mariechen", - "key": 4060, - "name": "Maloof", + "firstname": "Azubi_1", + "key": 101, + "name": "Test", "worked_sundays": 5 }, { - "firstname": "Elisabeth", - "key": 4063, - "name": "Knuth", - "worked_sundays": 4 - }, - { - "firstname": "Dahlia", - "key": 4082, - "name": "Dufour", - "worked_sundays": 4 - }, - { - "firstname": "Augustin", - "key": 5920, - "name": "Carreras", - "worked_sundays": 4 - }, - { - "firstname": "Kirstin", - "key": 6864, - "name": "Heise", - "worked_sundays": 4 - }, - { - "firstname": "Lioba", - "key": 6715, - "name": "Burris", - "worked_sundays": 4 - }, - { - "firstname": "Swantje", - "key": 5668, - "name": "Greer", - "worked_sundays": 4 - }, - { - "firstname": "Lidwina", - "key": 6671, - "name": "Dooley", - "worked_sundays": 3 - }, - { - "firstname": "Liebhardt", - "key": 6762, - "name": "Deshields", - "worked_sundays": 3 - }, - { - "firstname": "Ernestine", - "key": 5663, - "name": "Cerna", - "worked_sundays": 3 - }, - { - "firstname": "Liselotte", - "key": 839, - "name": "S\u00e4uffert", - "worked_sundays": 3 - }, - { - "firstname": "Waltraud", - "key": 918, - "name": "Ambriz", - "worked_sundays": 3 - }, - { - "firstname": "Eike", - "key": 3868, - "name": "Vanfleet", - "worked_sundays": 2 - }, - { - "firstname": "Bertram", - "key": 6180, - "name": "Putney", - "worked_sundays": 2 - }, - { - "firstname": "Hannah", - "key": 4566, - "name": "Woodcock", - "worked_sundays": 2 - }, - { - "firstname": "Liliane", - "key": 5656, - "name": "Bow", - "worked_sundays": 2 - }, - { - "firstname": "Burgel", - "key": 5657, - "name": "Sauls", - "worked_sundays": 2 - }, - { - "firstname": "Gritta", - "key": 4090, - "name": "Drucker", - "worked_sundays": 2 - }, - { - "firstname": "Sonnhilde", - "key": 6769, - "name": "Ingraham", - "worked_sundays": 2 - }, - { - "firstname": "Belinda", - "key": 6714, - "name": "Griffey", - "worked_sundays": 2 - }, - { - "firstname": "Hansmarti", - "key": 6538, - "name": "Guillaume", - "worked_sundays": 2 - }, - { - "firstname": "Noa", - "key": 6612, - "name": "Pettis", - "worked_sundays": 2 + "firstname": "Azubi_2", + "key": 102, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Edwin", - "key": 6616, - "name": "Avelar", - "worked_sundays": 2 + "firstname": "Azubi_3", + "key": 103, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Christfri", - "key": 6677, - "name": "Fullerton", - "worked_sundays": 1 + "firstname": "Azubi_4", + "key": 104, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Madita", - "key": 5895, - "name": "Kropf", - "worked_sundays": 1 + "firstname": "Hilfskraft_1", + "key": 201, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Ortrun", - "key": 6526, - "name": "Servin", - "worked_sundays": 1 + "firstname": "Hilfskraft_2", + "key": 202, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Annemargr", - "key": 7490, - "name": "Waldinger", - "worked_sundays": 1 + "firstname": "Hilfskraft_3", + "key": 203, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Trude", - "key": 6836, - "name": "Valentino", - "worked_sundays": 1 + "firstname": "Hilfskraft_4", + "key": 204, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Sieghardt", - "key": 7741, - "name": "Tharp", - "worked_sundays": 1 + "firstname": "Hilfskraft_5", + "key": 205, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Evalinde", - "key": 7802, - "name": "Long", - "worked_sundays": 1 + "firstname": "Hilfskraft_6", + "key": 206, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Veronica", - "key": 4158, - "name": "Engel", - "worked_sundays": 1 + "firstname": "Fachkraft_1", + "key": 301, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Babsi", - "key": 4078, - "name": "Mitchel", - "worked_sundays": 1 + "firstname": "Fachkraft_2", + "key": 302, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Lilli", - "key": 4079, - "name": "Corchado", - "worked_sundays": 1 + "firstname": "Fachkraft_3", + "key": 303, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Uschi", - "key": 6318, - "name": "Gamblin", - "worked_sundays": 1 + "firstname": "Fachkraft_4", + "key": 304, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Heinz", - "key": 6475, - "name": "Binford", - "worked_sundays": 1 + "firstname": "Fachkraft_5", + "key": 305, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Adelina", - "key": 941, - "name": "Mosqueda", - "worked_sundays": 1 + "firstname": "Fachkraft_6", + "key": 306, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Charlotte", - "key": 1186, - "name": "Musick", - "worked_sundays": 1 + "firstname": "Fachkraft_7", + "key": 307, + "name": "Test", + "worked_sundays": 5 }, { - "firstname": "Elia", - "key": 844, - "name": "Greenman", - "worked_sundays": 1 + "firstname": "Fachkraft_8", + "key": 308, + "name": "Test", + "worked_sundays": 5 } ] } From d6e1d81af07026db82e0921e77b3d337ac8779d2 Mon Sep 17 00:00:00 2001 From: Joshua Prieth <198204205+joshuaprieth@users.noreply.github.com> Date: Fri, 12 Jun 2026 15:20:19 +0200 Subject: [PATCH 4/4] Respect the configured weights --- src/solve.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/solve.py b/src/solve.py index 291af649..ca8fb850 100644 --- a/src/solve.py +++ b/src/solve.py @@ -167,6 +167,7 @@ def main( "after_night": 3, "second_weekend": 1, "preferred_block": 1, + "fairness": 3, } logging.info("General information:") @@ -210,8 +211,8 @@ def main( employees=employees, days=days, ), + FairPreferencesObjective(weights["fairness"], employees=employees, days=days, shifts=shifts), # MinimizeHiddenEmployeeCountObjective(weights["hidden_count"], employees, days, shifts), - FairPreferencesObjective(weight=1000, employees=employees, days=days, shifts=shifts), ] model = Model(employees, days, shifts)