diff --git a/gen_cons.py b/gen_cons.py index 157c77c..eafdc19 100644 --- a/gen_cons.py +++ b/gen_cons.py @@ -180,6 +180,53 @@ def load_workers(): print(rota_b_assignments) # You can now use rota_b_assignments as needed + # --- Load prior allocations (targets) from CSV --- + priors_path = "cons/sep2025priors.csv" + priors_map = {} + try: + priors_df = pd.read_csv(priors_path) + for _, prow in priors_df.iterrows(): + initial = str(prow.get("Worker", "")).strip() + if not initial or initial.lower() == "nan": + continue + prev = {} + # expected columns: oncall, twilight, weekend + for col in ("oncall", "twilight", "weekend"): + raw = prow.get(col, "") + if pd.isna(raw) or raw == "" or str(raw).strip() in ("-", "nan"): + continue + s = str(raw).strip() + # Expect formats like: '4 (2.50)' or '3 (2.86)' + worked = 0.0 + allocated = 0.0 + if "(" in s: + try: + worked_part = s.split("(")[0].strip() + worked = float(worked_part) + except Exception: + worked = 0.0 + try: + inner = s.split("(", 1)[1].split(")", 1)[0] + allocated = float(inner.strip()) + except Exception: + allocated = worked + else: + try: + allocated = float(s) + except Exception: + continue + worked = 0.0 + + # store as tuple (worked, allocated) as expected by RotaBuilder + prev[col] = (worked, allocated) + + if prev: + priors_map[initial] = prev + except FileNotFoundError: + print(f"Prior allocations file not found: {priors_path}") + except Exception as e: + print(f"Error reading prior allocations: {e}") + # --- Example: Print the first few rows of each sheet --- #print("Days sheet:") #print(days_df.head()) @@ -257,6 +304,7 @@ def load_workers(): ) for req in work_requests if req["worker"] == worker ], nwds=non_working_days, + previous_shifts=priors_map.get(initial, {}), ) #if initial == "L1": @@ -336,12 +384,13 @@ def main( rota_start_date, weeks_to_rota=weeks, balance_offset_modifier=bom, + use_previous_shifts=True, name="cons rota feb 2026", allow_force_assignment_with_leave_conflict=True, constraint_options=RotaConstraintOptions( balance_weekends=True, max_shifts_per_week=6, - max_days_per_week_block=[(4, 2), (4, 3)], + max_days_per_week_block=[(4, 2), (4, 4)], balance_weekend_days=True, #weekend_day_hard_max_deviation=2, ),