.
This commit is contained in:
+50
-1
@@ -180,6 +180,53 @@ def load_workers():
|
|||||||
print(rota_b_assignments)
|
print(rota_b_assignments)
|
||||||
# You can now use rota_b_assignments as needed
|
# 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 ---
|
# --- Example: Print the first few rows of each sheet ---
|
||||||
#print("Days sheet:")
|
#print("Days sheet:")
|
||||||
#print(days_df.head())
|
#print(days_df.head())
|
||||||
@@ -257,6 +304,7 @@ def load_workers():
|
|||||||
) for req in work_requests if req["worker"] == worker
|
) for req in work_requests if req["worker"] == worker
|
||||||
],
|
],
|
||||||
nwds=non_working_days,
|
nwds=non_working_days,
|
||||||
|
previous_shifts=priors_map.get(initial, {}),
|
||||||
)
|
)
|
||||||
|
|
||||||
#if initial == "L1":
|
#if initial == "L1":
|
||||||
@@ -336,12 +384,13 @@ def main(
|
|||||||
rota_start_date,
|
rota_start_date,
|
||||||
weeks_to_rota=weeks,
|
weeks_to_rota=weeks,
|
||||||
balance_offset_modifier=bom,
|
balance_offset_modifier=bom,
|
||||||
|
use_previous_shifts=True,
|
||||||
name="cons rota feb 2026",
|
name="cons rota feb 2026",
|
||||||
allow_force_assignment_with_leave_conflict=True,
|
allow_force_assignment_with_leave_conflict=True,
|
||||||
constraint_options=RotaConstraintOptions(
|
constraint_options=RotaConstraintOptions(
|
||||||
balance_weekends=True,
|
balance_weekends=True,
|
||||||
max_shifts_per_week=6,
|
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,
|
balance_weekend_days=True,
|
||||||
#weekend_day_hard_max_deviation=2,
|
#weekend_day_hard_max_deviation=2,
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user