From d18c5e8a911835e5a7e1f0f904124ddd376aaead Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 28 Jun 2021 12:02:47 +0100 Subject: [PATCH] Allow spliting forced blocks on nwdsAllow spliting forced blocks on nwds --- leave.csv | 6 +-- rota.csv | 126 ++++++++++++++++++++++++----------------------------- shifts.py | 92 +++++++++++++++++++++++++++++--------- test.py | 13 +++--- workers.py | 2 +- 5 files changed, 137 insertions(+), 102 deletions(-) diff --git a/leave.csv b/leave.csv index eb53102..cdd61c4 100644 --- a/leave.csv +++ b/leave.csv @@ -7,13 +7,13 @@ PROC site,,Derriford,,exeter,Torbay,Exeter,,Derriford,Derriford,Exeter,Exeter,Ex NWD,,,,,,,"Thursday,Friday",,"Tuesday,Thursday",,,Thursday,"Monday,Tuesday",,,,,,"Monday,thursday",Wednesday,,,,Friday,,,,,,Friday,,,,"monday,friday",,"thursday, friday",,,,,Monday[6/9/21-30/11/21],,"monday,thursday",,,,Friday,,,,,,,,, Flexible NWD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, End Date,,,,,,,,,,,,04/02/22,,,,,,,,,,,,,,,,,,,,15/01/22,,,,,,,,,,,,,,,,,,,,,,,, -OOP,,,,,,,6/9/21-31/3/22,,,,,,,,,,,,,,,,,,,,6/9/21-2/5/22,,,1/1/22-5/9/22,6/9/21-28/2/22,,,,,,,,,,,,6/9/21-20/9/22,,,,,,,,,,,,, +OOP,,,,,,,6/9/21-31/3/22,,,,,,,,,,,,,,,,,,,,6/9/21-2/5/22,,,1/1/22-5/9/22,6/9/21-28/2/22,,,,,,,,,,,,6/9/21-20/9/21,,,,,,,,,,,,, Group,,Y1G1,Y1G1,Y1G2,Y3G1,Y3G1,Y3G2,Y3G2,,,,,,Y2G1,Y2G2,Y2G2,Y2G2,Y3G1,Y3G1,Y3G2,Y3G2,Y3G2,,,,,,,,,,,,,Y2G1,Y2G1,Y2G2,Y2G2,Y3G2,,,,,Y2G1,Y2G2,Y3G1,Y3G1,Y3G2,,,,,,,Y2G1, ?PROC,,,,,,,,,,,,,,,,,,,,,,,NO,,,,,,,,,,No,No,,,,,,,,,,,,,,,,,,,Yes - until ST6 in dec,???,NO,NO Pair,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,2,,, Date,Exams,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -6/9/21,,,NO ONCALL,,,POST ONCALL,Mat leave,,,,,,,,A/L,,,,,A/L,,,No Oncall,POST ONCALL,POST ONCALL,POST ONCALL,Mat leave,,,,OOPT,OOPT,POST ONCALL,NO oncals,,POST ONCALL,,,,A/L,,,Mat leave,,,,,,,,A/L,POST ONCALL,,,, -7/9/21,,,NO ONCALL,,,POST ONCALL,Mat leave,,,,,,,,A/L,,,,,A/L,,,No Oncall,POST ONCALL,POST ONCALL,POST ONCALL,Mat leave,,,,OOPT,OOPT,POST ONCALL,NO oncals,,POST ONCALL,,,,A/L,,,Mat leave,,,,,,,,A/L,POST ONCALL,,,, +6/9/21,,,NO ONCALL,,,POST ONCALL,Mat leave,,exeter_twilight,,exeter_twilight,exeter_twilight,,,A/L,,,,,A/L,,,No Oncall,POST ONCALL,POST ONCALL,POST ONCALL,Mat leave,,,plymouth_twilight,OOPT,OOPT,POST ONCALL,NO oncals,,POST ONCALL,,,,A/L,torbay_twilight,torbay_twilight,Mat leave,,,,,truro_twilight,truro_twilight,,A/L,POST ONCALL,,,, +7/9/21,,,NO ONCALL,,,POST ONCALL,Mat leave,,exeter_twilight,,exeter_twilight,exeter_twilight,,,A/L,,,,,A/L,,,No Oncall,POST ONCALL,POST ONCALL,POST ONCALL,Mat leave,,,plymouth_twilight,OOPT,OOPT,POST ONCALL,NO oncals,,POST ONCALL,,,,A/L,torbay_twilight,torbay_twilight,Mat leave,,,,,truro_twilight,truro_twilight,,A/L,POST ONCALL,,,, 8/9/21,,,NO ONCALL,,,,Mat leave,,,,,,,,,,,,,A/L,,,No Oncall,,,,Mat leave,,,,OOPT,OOPT,,NO oncals,,,,,,A/L,,,Mat leave,,,,,,,,A/L,,,,, 9/9/21,,,NO ONCALL,,,,Mat leave,,,,,,,,,,,,,A/L,,,No Oncall,,,,Mat leave,,,,OOPT,OOPT,,NO oncals,,,,,,A/L,,,Mat leave,,,,,,,,A/L,,,,, 10/9/21,,,NO ONCALL,,A/L,,Mat leave,,,,,,,,,,,,,A/L,,,No Oncall,,,,Mat leave,,,A/L,OOPT,OOPT,,NO oncals,,,,,,,,,Mat leave,,,,,,,,A/L,,,,, diff --git a/rota.csv b/rota.csv index 9922123..7b4d72f 100644 --- a/rota.csv +++ b/rota.csv @@ -2,73 +2,59 @@ "Site","barnstaple","exeter","exeter","exeter","exeter","exeter","exeter","exeter","exeter","exeter","exeter","exeter","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth","plymouth_twilights","plymouth_twilights","torbay","torbay","torbay","torbay","torbay","torbay","torbay","torbay","torbay","truro","truro","truro","truro","truro","truro","truro","truro","truro","truro no proc" "Grade","3","2","2","3","3","3","3","4","4","5","5","5","2","2","2","2","3","3","3","3","3","4","4","4","4","5","5","5","5","6","6","2","2","2","2","3","4","4","4","5","2","2","3","3","3","4","4","5","5","5" "FTE","100.0","100.0","100.0","60.0","100.0","100.0","100.0","100.0","100.0","60.0","100.0","100.0","100.0","100.0","100.0","100.0","60.0","80.0","100.0","100.0","100.0","60.0","80.0","100.0","100.0","100.0","80.0","100.0","100.0","60.0","100.0","100.0","100.0","100.0","100.0","100.0","90.0","100.0","100.0","60.0","100.0","100.0","80.0","100.0","100.0","100.0","100.0","100.0","100.0","100.0" -"Week 1 Day Mon","","","","","","","","","exeter_twilight","","","","","","","","","","night_weekday","plymouth_twilight","","","","","","","","","","","","torbay_twilight","","","","","night_weekday","","","","","truro_twilight","","","","","night_weekday","","","" -"Week 1 Day Tue","","","","","","","","","exeter_twilight","","","","","","","","","","night_weekday","plymouth_twilight","","","","","","","","","","","","torbay_twilight","","","","","night_weekday","","","","","","","","","truro_twilight","night_weekday","","","" -"Week 1 Day Wed","","","","","","exeter_twilight","","","","","","","","","","plymouth_twilight","","","night_weekday","","","","","","","","","","","","","torbay_twilight","","","","","night_weekday","","","","","","","","","truro_twilight","night_weekday","","","" -"Week 1 Day Thu","","","","","exeter_twilight","","","","","","","","","plymouth_twilight","","","","","night_weekday","","","","","","","","","","","","","torbay_twilight","","","","","night_weekday","","","","truro_twilight","","","","","","night_weekday","","","" -"Week 1 Day Fri","","","","","","","","weekend_exeter","night_weekend","","","","","","","","","","","","","","","","plymouth_twilight","","","","","","","","","","","weekend_torbay","","","night_weekend","","","","","","night_weekend","weekend_truro","","","","" -"Week 1 Day Sat","","","","","","","","weekend_exeter","night_weekend","","","","","","","","","","","","","","weekend_plymouth1","weekend_plymouth2","","","","","","","","","","","","weekend_torbay","","","night_weekend","","","","","","night_weekend","weekend_truro","","","","" -"Week 1 Day Sun","","","","","","","","weekend_exeter","night_weekend","","","","","","","","","","","","","","weekend_plymouth1","weekend_plymouth2","","","","","","","","","","","","weekend_torbay","","","night_weekend","","","","","","night_weekend","weekend_truro","","","","" -"Week 2 Day Mon","night_weekday","","","","","","","","","","night_weekday","exeter_twilight","plymouth_twilight","","","","","","","","night_weekday","","","","","","","","","","","","","","","","","torbay_twilight","","","","truro_twilight","","","","","","","","" -"Week 2 Day Tue","night_weekday","exeter_twilight","","","","","","","","","night_weekday","","","","","","","","plymouth_twilight","","night_weekday","","","","","","","","","","","","","","","","","torbay_twilight","","","truro_twilight","","","","","","","","","" -"Week 2 Day Wed","night_weekday","","","","","","","exeter_twilight","","","night_weekday","","","","","","","","","","night_weekday","","","plymouth_twilight","","","","","","","","","","torbay_twilight","","","","","","","","","","","","truro_twilight","","","","" -"Week 2 Day Thu","night_weekday","","","","","","","","exeter_twilight","","night_weekday","","","","","plymouth_twilight","","","","","night_weekday","","","","","","","","","","","","","","","","","torbay_twilight","","","","","","","","","truro_twilight","","","" -"Week 2 Day Fri","","weekend_exeter","","","","night_weekend","","","","","","","","","plymouth_twilight","","","","","night_weekend","","","","","","","","","","","","","","","weekend_torbay","","","","","","","weekend_truro","","","","","","night_weekend","","" -"Week 2 Day Sat","","weekend_exeter","","","","night_weekend","","","","","","","","","","weekend_plymouth1","","","","night_weekend","","","","","","","weekend_plymouth2","","","","","","","","weekend_torbay","","","","","","","weekend_truro","","","","","","night_weekend","","" -"Week 2 Day Sun","","weekend_exeter","","","","night_weekend","","","","","","","","","","weekend_plymouth1","","","","night_weekend","","","","","","","weekend_plymouth2","","","","","","","","weekend_torbay","","","","","","","weekend_truro","","","","","","night_weekend","","" -"Week 3 Day Mon","","","","","","","","","","","exeter_twilight","","","","plymouth_twilight","","","night_weekday","","","","","","","","","","","","","","torbay_twilight","","","","night_weekday","","","","","","","","","truro_twilight","","","","night_weekday","" -"Week 3 Day Tue","","","","","","","","","","","","exeter_twilight","","","","","","night_weekday","plymouth_twilight","","","","","","","","","","","","","torbay_twilight","","","","night_weekday","","","","","truro_twilight","","","","","","","","night_weekday","" -"Week 3 Day Wed","","exeter_twilight","","","","","","","","","","","","plymouth_twilight","","","","night_weekday","","","","","","","","","","","","","","","","torbay_twilight","","night_weekday","","","","","truro_twilight","","","","","","","","night_weekday","" -"Week 3 Day Thu","","","exeter_twilight","","","","","","","","","","","","","plymouth_twilight","","night_weekday","","","","","","","","","","","","","","torbay_twilight","","","","night_weekday","","","","","","","","","","","","truro_twilight","night_weekday","" -"Week 3 Day Fri","","","","","night_weekend","","","","","","","weekend_exeter","","","","","","","","","","","","","","","","plymouth_twilight","night_weekend","","","","weekend_torbay","","","","","","","","weekend_truro","","","night_weekend","","","","","","" -"Week 3 Day Sat","","","","","night_weekend","","","","","","","weekend_exeter","","","","","","","","","weekend_plymouth2","","","","weekend_plymouth1","","","","night_weekend","","","","weekend_torbay","","","","","","","","weekend_truro","","","night_weekend","","","","","","" -"Week 3 Day Sun","","","","","night_weekend","","","","","","","weekend_exeter","","","","","","","","","weekend_plymouth2","","","","weekend_plymouth1","","","","night_weekend","","","","weekend_torbay","","","","","","","","weekend_truro","","","night_weekend","","","","","","" -"Week 4 Day Mon","","exeter_twilight","","","","night_weekday","","","","","","","","","","","","","plymouth_twilight","","","","","","","","","night_weekday","","","","","","","","torbay_twilight","","","","","","","","","","","","night_weekday","","truro_twilight" -"Week 4 Day Tue","","","","","","night_weekday","","","","","exeter_twilight","","","","","plymouth_twilight","","","","","","","","","","","","night_weekday","","","","","","","","torbay_twilight","","","","","","truro_twilight","","","","","","night_weekday","","" -"Week 4 Day Wed","","","","","","night_weekday","","","","","","exeter_twilight","plymouth_twilight","","","","","","","","","","","","","","","night_weekday","","","","","","","","torbay_twilight","","","","","","truro_twilight","","","","","","night_weekday","","" -"Week 4 Day Thu","","","","","","night_weekday","exeter_twilight","","","","","","","plymouth_twilight","","","","","","","","","","","","","","night_weekday","","","","","","","","torbay_twilight","","","","","truro_twilight","","","","","","","night_weekday","","" -"Week 4 Day Fri","night_weekend","","weekend_exeter","","","","","","","","night_weekend","","","","","","night_weekend","","","plymouth_twilight","","","","","","","","","","","","","","","weekend_torbay","","","","","","","","","","","","","","weekend_truro","" -"Week 4 Day Sat","night_weekend","","weekend_exeter","","","","","","","","night_weekend","","","weekend_plymouth2","","","night_weekend","","weekend_plymouth1","","","","","","","","","","","","","","","","weekend_torbay","","","","","","","","","","","","","","weekend_truro","" -"Week 4 Day Sun","night_weekend","","weekend_exeter","","","","","","","","night_weekend","","","weekend_plymouth2","","","night_weekend","","weekend_plymouth1","","","","","","","","","","","","","","","","weekend_torbay","","","","","","","","","","","","","","weekend_truro","" -"Week 5 Day Mon","","night_weekday","","","","exeter_twilight","","","","","","","","","","","","","","","plymouth_twilight","","night_weekday","","","","","","","","","","torbay_twilight","","","","","","","","","","","","night_weekday","","","","","truro_twilight" -"Week 5 Day Tue","","night_weekday","","","","","","","","","","exeter_twilight","","","","plymouth_twilight","","","","","","","night_weekday","","","","","","","","","","torbay_twilight","","","","","","","","","","","truro_twilight","night_weekday","","","","","" -"Week 5 Day Wed","","night_weekday","","","","exeter_twilight","","","","","","","plymouth_twilight","","","","","","","","","","night_weekday","","","","","","","","","","torbay_twilight","","","","","","","","","","","truro_twilight","night_weekday","","","","","" -"Week 5 Day Thu","","night_weekday","","","exeter_twilight","","","","","","","","","","","","","","","","plymouth_twilight","","night_weekday","","","","","","","","","","torbay_twilight","","","","","","","","","","","","night_weekday","","","","","truro_twilight" -"Week 5 Day Fri","","","","","","","weekend_exeter","","","","","night_weekend","","","","night_weekend","plymouth_twilight","","","","","","","","","","","","","","","","","weekend_torbay","","night_weekend","","","","","","","","weekend_truro","","","","","","" -"Week 5 Day Sat","","","","","","","weekend_exeter","","","","","night_weekend","","","weekend_plymouth2","night_weekend","","","","","","","","","","","","","weekend_plymouth1","","","","","weekend_torbay","","night_weekend","","","","","","","","weekend_truro","","","","","","" -"Week 5 Day Sun","","","","","","","weekend_exeter","","","","","night_weekend","","","weekend_plymouth2","night_weekend","","","","","","","","","","","","","weekend_plymouth1","","","","","weekend_torbay","","night_weekend","","","","","","","","weekend_truro","","","","","","" -"Week 6 Day Mon","","","","","","","","","exeter_twilight","","","","","","","","","","","night_weekday","","","","","","","","","","","plymouth_twilight","torbay_twilight","","","night_weekday","","","","","","","","truro_twilight","","","night_weekday","","","","" -"Week 6 Day Tue","","","","","exeter_twilight","","","","","","","","","","","","","","","night_weekday","","","","plymouth_twilight","","","","","","","","","","","night_weekday","","torbay_twilight","","","","","","","","","night_weekday","","","truro_twilight","" -"Week 6 Day Wed","","","","","","","","","exeter_twilight","","","","","","","","","","","night_weekday","","","","plymouth_twilight","","","","","","","","","","","night_weekday","","","torbay_twilight","","","","","","truro_twilight","","night_weekday","","","","" -"Week 6 Day Thu","","","","","","","","","","exeter_twilight","","","","","","","","","","night_weekday","","","","","plymouth_twilight","","","","","","","","","","night_weekday","","torbay_twilight","","","","","","","","","night_weekday","","","truro_twilight","" -"Week 6 Day Fri","","","","","weekend_exeter","","","","","","","","","","","","","","","","night_weekend","","","","","","","","","","plymouth_twilight","night_weekend","","","","","","","weekend_torbay","","","","","","weekend_truro","","night_weekend","","","" -"Week 6 Day Sat","","","","","weekend_exeter","","","","","","","","","","","","","weekend_plymouth2","","","night_weekend","","","","","","weekend_plymouth1","","","","","night_weekend","","","","","","","weekend_torbay","","","","","","weekend_truro","","night_weekend","","","" -"Week 6 Day Sun","","","","","weekend_exeter","","","","","","","","","","","","","weekend_plymouth2","","","night_weekend","","","","","","weekend_plymouth1","","","","","night_weekend","","","","","","","weekend_torbay","","","","","","weekend_truro","","night_weekend","","","" -"Week 7 Day Mon","","","","","","","exeter_twilight","","","","","","","plymouth_twilight","night_weekday","","","","","","","","","","","","","","","","","","","","torbay_twilight","","","night_weekday","","","","","night_weekday","","","","","","","truro_twilight" -"Week 7 Day Tue","","","","","","","exeter_twilight","","","","","","","","night_weekday","","","","","","","","","","","","","","plymouth_twilight","","","","","","torbay_twilight","","","night_weekday","","","","","night_weekday","truro_twilight","","","","","","" -"Week 7 Day Wed","","","","","","","","exeter_twilight","","","","","","","night_weekday","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","night_weekday","torbay_twilight","","","","night_weekday","","","","truro_twilight","","","" -"Week 7 Day Thu","","","","","","","","","","exeter_twilight","","","","","night_weekday","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","night_weekday","torbay_twilight","","","","night_weekday","","truro_twilight","","","","","" -"Week 7 Day Fri","","","","","","weekend_exeter","night_weekend","","","","","","","","","","plymouth_twilight","","","","","","","night_weekend","","","","","","","","","","night_weekend","","","weekend_torbay","","","","","","","","","","","weekend_truro","","" -"Week 7 Day Sat","","","","","","weekend_exeter","night_weekend","","","","","","weekend_plymouth1","","","","","","","","","","weekend_plymouth2","night_weekend","","","","","","","","","","night_weekend","","","weekend_torbay","","","","","","","","","","","weekend_truro","","" -"Week 7 Day Sun","","","","","","weekend_exeter","night_weekend","","","","","","weekend_plymouth1","","","","","","","","","","weekend_plymouth2","night_weekend","","","","","","","","","","night_weekend","","","weekend_torbay","","","","","","","","","","","weekend_truro","","" -"Week 8 Day Mon","","","exeter_twilight","","night_weekday","","","","","","","","","","","","","","","","plymouth_twilight","","","","night_weekday","","","","","","","","","","torbay_twilight","","","","","","","night_weekday","","","truro_twilight","","","","","" -"Week 8 Day Tue","","","exeter_twilight","","night_weekday","","","","","","","","","plymouth_twilight","","","","","","","","","","","night_weekday","","","","","","","","","","torbay_twilight","","","","","","","night_weekday","","","","","truro_twilight","","","" -"Week 8 Day Wed","","","","","night_weekday","","","","exeter_twilight","","","","","","","","plymouth_twilight","","","","","","","","night_weekday","","","","","","","","","torbay_twilight","","","","","","","","night_weekday","","","","","truro_twilight","","","" -"Week 8 Day Thu","","","","","night_weekday","","exeter_twilight","","","","","","","","","","","","plymouth_twilight","","","","","","night_weekday","","","","","","","","","torbay_twilight","","","","","","","","night_weekday","","","","","","truro_twilight","","" -"Week 8 Day Fri","","","","","","","","night_weekend","weekend_exeter","","","","","","","","","","","","","","","","","","","night_weekend","plymouth_twilight","","","","night_weekend","","","","","weekend_torbay","","","","","","","","","weekend_truro","","","" -"Week 8 Day Sat","","","","","","","","night_weekend","weekend_exeter","","","","","","","","","weekend_plymouth1","","weekend_plymouth2","","","","","","","","night_weekend","","","","","night_weekend","","","","","weekend_torbay","","","","","","","","","weekend_truro","","","" -"Week 8 Day Sun","","","","","","","","night_weekend","weekend_exeter","","","","","","","","","weekend_plymouth1","","weekend_plymouth2","","","","","","","","night_weekend","","","","","night_weekend","","","","","weekend_torbay","","","","","","","","","weekend_truro","","","" -"Week 9 Day Mon","","exeter_twilight","night_weekday","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","night_weekday","","","","","torbay_twilight","","","","","night_weekday","","","","","","","","","","","truro_twilight" -"Week 9 Day Tue","","","night_weekday","","","","","","","","exeter_twilight","","","","plymouth_twilight","","","","","","","","","","","","","","night_weekday","","","","","torbay_twilight","","","","","night_weekday","","","","","","","","","truro_twilight","","" -"Week 9 Day Wed","","","night_weekday","","","","","exeter_twilight","","","","","","","","","","","","","","","","","","","","plymouth_twilight","night_weekday","","","","","torbay_twilight","","","","","night_weekday","","truro_twilight","","","","","","","","","" -"Week 9 Day Thu","","","night_weekday","","","","","","","","","exeter_twilight","plymouth_twilight","","","","","","","","","","","","","","","","night_weekday","","","","","torbay_twilight","","","","","night_weekday","","","","","","","","","","truro_twilight","" -"Week 9 Day Fri","","","","","","","","","","night_weekend","weekend_exeter","","","night_weekend","","","","","","","","","","","","","","plymouth_twilight","","","","weekend_torbay","","","","","","","","","","","weekend_truro","","","night_weekend","","","","" -"Week 9 Day Sat","","","","","","","","","","night_weekend","weekend_exeter","","","night_weekend","","weekend_plymouth2","","","","","","","","","weekend_plymouth1","","","","","","","weekend_torbay","","","","","","","","","","","weekend_truro","","","night_weekend","","","","" -"Week 9 Day Sun","","","","","","","","","","night_weekend","weekend_exeter","","","night_weekend","","weekend_plymouth2","","","","","","","","","weekend_plymouth1","","","","","","","weekend_torbay","","","","","","","","","","","weekend_truro","","","night_weekend","","","","" -"Week 10 Day Mon","","exeter_twilight","","","","","","night_weekday","","","","","plymouth_twilight","","","","","","","","","","","","","","night_weekday","","","","","","torbay_twilight","","","","","","","","night_weekday","truro_twilight","","","","","","","","" -"Week 10 Day Tue","","exeter_twilight","","","","","","night_weekday","","","","","","","","","","","","","","","","","","","night_weekday","","","plymouth_twilight","","","torbay_twilight","","","","","","","","night_weekday","","","","","","","truro_twilight","","" -"Week 10 Day Wed","","","","","","","","night_weekday","","exeter_twilight","","","","","plymouth_twilight","","","","","","","","","","","","night_weekday","","","","","","torbay_twilight","","","","","","","","night_weekday","","truro_twilight","","","","","","","" -"Week 10 Day Thu","","","","","","","","night_weekday","","exeter_twilight","","","","","","","","","","","","","","","","","night_weekday","","","","plymouth_twilight","","torbay_twilight","","","","","","","","night_weekday","","truro_twilight","","","","","","","" -"Week 10 Day Fri","","","weekend_exeter","","","","","","","","","","night_weekend","","","","","","","","","","","","","","","","","","plymouth_twilight","","","","","","","night_weekend","weekend_torbay","","","","","","","","","","night_weekend","weekend_truro" -"Week 10 Day Sat","","","weekend_exeter","","","","","","","","","","night_weekend","","weekend_plymouth1","","","","","","","","","","","","","weekend_plymouth2","","","","","","","","","","night_weekend","weekend_torbay","","","","","","","","","","night_weekend","weekend_truro" -"Week 10 Day Sun","","","weekend_exeter","","","","","","","","","","night_weekend","","weekend_plymouth1","","","","","","","","","","","","","weekend_plymouth2","","","","","","","","","","night_weekend","weekend_torbay","","","","","","","","","","night_weekend","weekend_truro" +"Week 1 Day Mon","","","","","","","","exeter_twilight","","","","night_weekday","","","","","","","","night_weekday","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","truro_twilight","","night_weekday","","","" +"Week 1 Day Tue","","","","","","","","","","","exeter_twilight","night_weekday","","","","","","","","night_weekday","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","truro_twilight","","night_weekday","","","" +"Week 1 Day Wed","","","","","","","","","exeter_twilight","","","night_weekday","","","","","","","","night_weekday","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","","","truro_twilight","","","night_weekday","","","" +"Week 1 Day Thu","","","","","","exeter_twilight","","","","","","night_weekday","plymouth_twilight","","","","","","","night_weekday","","","","","","","","","","","","","","","","","","","","","","","","","","","night_weekday","","truro_twilight","" +"Week 1 Day Fri","","","","","","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","","","","night_weekend","","night_weekend","","","","night_weekend","","","","","","","" +"Week 1 Day Sat","","","","","","","","","","weekend_exeter","","","","","","","weekend_plymouth1","","","","","","","","","","","","weekend_plymouth2","","","","","","","","night_weekend","weekend_torbay","night_weekend","","","","night_weekend","","","weekend_truro","","","","" +"Week 1 Day Sun","","","","","","","","","","weekend_exeter","","","","","","","weekend_plymouth1","","","","","","","","","","","","weekend_plymouth2","","","","","","","","night_weekend","weekend_torbay","night_weekend","","","","night_weekend","","","weekend_truro","","","","" +"Week 2 Day Mon","night_weekday","","exeter_twilight","","","","","","","","","","","","plymouth_twilight","","","","","","","","","","night_weekday","","","","","","","","","","","night_weekday","","","","","","","","","truro_twilight","","","","","" +"Week 2 Day Tue","night_weekday","","","","","","exeter_twilight","","","","","","","","","","","","","","","","","","night_weekday","","","","","","plymouth_twilight","","","","","night_weekday","","","","","","","","","truro_twilight","","","","","" +"Week 2 Day Wed","night_weekday","","","","","","","","","","","exeter_twilight","plymouth_twilight","","","","","","","","","","","","night_weekday","","","","","","","","","","","night_weekday","","","","","","truro_twilight","","","","","","","","" +"Week 2 Day Thu","night_weekday","","","","","","","","","exeter_twilight","","","","","","","","","","plymouth_twilight","","","","","night_weekday","","","","","","","","","","","night_weekday","","","","","","","","","","","truro_twilight","","","" +"Week 2 Day Fri","","","","","","night_weekend","","","","","","","","","","","","","","","","","night_weekend","","","","","","","","plymouth_twilight","","","","","","","","","","","","","night_weekend","","","","","","" +"Week 2 Day Sat","","","","","","night_weekend","weekend_exeter","","","","","","","","","weekend_plymouth1","","","weekend_plymouth2","","","","night_weekend","","","","","","","","","","","","weekend_torbay","","","","","","weekend_truro","","","night_weekend","","","","","","" +"Week 2 Day Sun","","","","","","night_weekend","weekend_exeter","","","","","","","","","weekend_plymouth1","","","weekend_plymouth2","","","","night_weekend","","","","","","","","","","","","weekend_torbay","","","","","","weekend_truro","","","night_weekend","","","","","","" +"Week 3 Day Mon","","","exeter_twilight","","night_weekday","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","night_weekday","","","","","","","","","","","","","","","","","","","","night_weekday","truro_twilight" +"Week 3 Day Tue","","","","","night_weekday","","","","","","","exeter_twilight","","","","","plymouth_twilight","","","","","","","","","","","","night_weekday","","","","","","","","","","","","","","","","","","","truro_twilight","night_weekday","" +"Week 3 Day Wed","","","","","night_weekday","","","","","","exeter_twilight","","","","","plymouth_twilight","","","","","","","","","","","","","night_weekday","","","","","","","","","","","","","truro_twilight","","","","","","","night_weekday","" +"Week 3 Day Thu","","","","","night_weekday","exeter_twilight","","","","","","","","","","","","","","plymouth_twilight","","","","","","","","","night_weekday","","","","","","","","","","","","truro_twilight","","","","","","","","night_weekday","" +"Week 3 Day Fri","","","","","","","","","","","","","","","plymouth_twilight","","","night_weekend","","","night_weekend","","","","","","","","","","","","","","","","","","","","","","","","","","","night_weekend","","" +"Week 3 Day Sat","","","weekend_exeter","","","","","","","","","","weekend_plymouth2","","","","","night_weekend","","","night_weekend","","","","weekend_plymouth1","","","","","","","","weekend_torbay","","","","","","","","","weekend_truro","","","","","","night_weekend","","" +"Week 3 Day Sun","","","weekend_exeter","","","","","","","","","","weekend_plymouth2","","","","","night_weekend","","","night_weekend","","","","weekend_plymouth1","","","","","","","","weekend_torbay","","","","","","","","","weekend_truro","","","","","","night_weekend","","" +"Week 4 Day Mon","","exeter_twilight","","","","","","","","","night_weekday","","","","","","","","","plymouth_twilight","","","","","","","","night_weekday","","","","","","","","","","","","","truro_twilight","","","night_weekday","","","","","","" +"Week 4 Day Tue","","","","","","","","","","","night_weekday","exeter_twilight","","","","plymouth_twilight","","","","","","","","","","","","night_weekday","","","","","","","","","","","","","","","","night_weekday","","","","","truro_twilight","" +"Week 4 Day Wed","","","","","exeter_twilight","","","","","","night_weekday","","","plymouth_twilight","","","","","","","","","","","","","","night_weekday","","","","","","","","","","","","","","","","night_weekday","","","","","","truro_twilight" +"Week 4 Day Thu","","","exeter_twilight","","","","","","","","night_weekday","","","","","","","","","","","","plymouth_twilight","","","","","night_weekday","","","","","","","","","","","","","","","","night_weekday","","","","truro_twilight","","" +"Week 4 Day Fri","night_weekend","","","","","","","","","","","","","","","","","","","","plymouth_twilight","","","","","","night_weekend","","","","","","","","","","","","","","","","","","night_weekend","","","","","" +"Week 4 Day Sat","night_weekend","","","","weekend_exeter","","","","","","","","","weekend_plymouth2","","weekend_plymouth1","","","","","","","","","","","night_weekend","","","","","","","","","weekend_torbay","","","","","","","","","night_weekend","","","","weekend_truro","" +"Week 4 Day Sun","night_weekend","","","","weekend_exeter","","","","","","","","","weekend_plymouth2","","weekend_plymouth1","","","","","","","","","","","night_weekend","","","","","","","","","weekend_torbay","","","","","","","","","night_weekend","","","","weekend_truro","" +"Week 5 Day Mon","","exeter_twilight","","","","","night_weekday","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","","","","night_weekday","","","","","","","truro_twilight","","","","","","night_weekday","","" +"Week 5 Day Tue","","exeter_twilight","","","","","night_weekday","","","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","night_weekday","","","","","","","truro_twilight","","","","","","night_weekday","","" +"Week 5 Day Wed","","","","","exeter_twilight","","night_weekday","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","night_weekday","","","","","","","","","","truro_twilight","","","night_weekday","","" +"Week 5 Day Thu","","","","","","exeter_twilight","night_weekday","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","","night_weekday","","","","","","","","","","","","","night_weekday","","truro_twilight" +"Week 5 Day Fri","","","","","","","","","","","","night_weekend","","","","","night_weekend","plymouth_twilight","","","","","","","","","","","","","","night_weekend","","","","","","","","","","","","","","","","","","" +"Week 5 Day Sat","","weekend_exeter","","","","","","","","","","night_weekend","","","","","night_weekend","","","","","","","weekend_plymouth2","","","","weekend_plymouth1","","","","night_weekend","","weekend_torbay","","","","","","","","","","weekend_truro","","","","","","" +"Week 5 Day Sun","","weekend_exeter","","","","","","","","","","night_weekend","","","","","night_weekend","","","","","","","weekend_plymouth2","","","","weekend_plymouth1","","","","night_weekend","","weekend_torbay","","","","","","","","","","weekend_truro","","","","","","" +"Week 6 Day Mon","","","","","","","exeter_twilight","night_weekday","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","","","","","","night_weekday","","","night_weekday","","truro_twilight","","","","","","","" +"Week 6 Day Tue","","","","","","","","night_weekday","exeter_twilight","","","","","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","night_weekday","","","night_weekday","","","","","truro_twilight","","","","" +"Week 6 Day Wed","","","","","","","exeter_twilight","night_weekday","","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","night_weekday","","","night_weekday","","","","","","","","truro_twilight","" +"Week 6 Day Thu","","","","","","exeter_twilight","","night_weekday","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","","","","","","night_weekday","","","night_weekday","","","","","","truro_twilight","","","" +"Week 6 Day Fri","","","","","","","","","","night_weekend","","","night_weekend","","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","night_weekend","","","","","","","","","","","","","","" +"Week 6 Day Sat","","","","","","","","","weekend_exeter","night_weekend","","","night_weekend","","weekend_plymouth1","","","","","","","","","","","","","","weekend_plymouth2","","","","","","","night_weekend","","","weekend_torbay","","","","","","","","","","","weekend_truro" +"Week 6 Day Sun","","","","","","","","","weekend_exeter","night_weekend","","","night_weekend","","weekend_plymouth1","","","","","","","","","","","","","","weekend_plymouth2","","","","","","","night_weekend","","","weekend_torbay","","","","","","","","","","","weekend_truro" +"Week 7 Day Mon","","","night_weekday","","","","","exeter_twilight","","","","","","","","","","","night_weekday","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","truro_twilight","","","night_weekday","","","","" +"Week 7 Day Tue","","","night_weekday","","","","exeter_twilight","","","","","","","","","","","","night_weekday","","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","truro_twilight","","night_weekday","","","","" +"Week 7 Day Wed","","","night_weekday","","exeter_twilight","","","","","","","","","","","","","","night_weekday","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","truro_twilight","","","night_weekday","","","","" +"Week 7 Day Thu","","exeter_twilight","night_weekday","","","","","","","","","","","","","","","","night_weekday","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","truro_twilight","","","","night_weekday","","","","" +"Week 7 Day Fri","","","","","","","","","","","night_weekend","","","","","plymouth_twilight","","night_weekend","","","","","","","","","","","","","","","","night_weekend","","","","","","","","","","","","","","","","" +"Week 7 Day Sat","","","","","","weekend_exeter","","","","","night_weekend","","","weekend_plymouth1","","","","night_weekend","","","weekend_plymouth2","","","","","","","","","","","weekend_torbay","","night_weekend","","","","","","","","","","","","","weekend_truro","","","" +"Week 7 Day Sun","","","","","","weekend_exeter","","","","","night_weekend","","","weekend_plymouth1","","","","night_weekend","","","weekend_plymouth2","","","","","","","","","","","weekend_torbay","","night_weekend","","","","","","","","","","","","","weekend_truro","","","" +"Week 8 Day Mon","","","exeter_twilight","","","","","","night_weekday","","","","","","","","","","","","","","","night_weekday","","","","","","","plymouth_twilight","","","","","","","","","","","night_weekday","","","","truro_twilight","","","","" +"Week 8 Day Tue","","exeter_twilight","","","","","","","night_weekday","","","","","","","","","","plymouth_twilight","","","","","night_weekday","","","","","","","","","","","","","","","","","","night_weekday","","","","","","truro_twilight","","" +"Week 8 Day Wed","","","","","","","","","night_weekday","","exeter_twilight","","","plymouth_twilight","","","","","","","","","","night_weekday","","","","","","","","","","","","","","","","","","night_weekday","","","","","","truro_twilight","","" +"Week 8 Day Thu","","","","","","","","","night_weekday","exeter_twilight","","","","","","","","","","","","","","night_weekday","","","","","plymouth_twilight","","","","","","","","","","","","","night_weekday","","","","","truro_twilight","","","" +"Week 8 Day Fri","","","","","","","","","","","","","","","","","","","","plymouth_twilight","","","","","","","","night_weekend","","","","","night_weekend","","","","","","","","","","night_weekend","","","","","","","" +"Week 8 Day Sat","","","","","","","","weekend_exeter","","","","","weekend_plymouth1","","","","","","","","","","","","weekend_plymouth2","","","night_weekend","","","","","night_weekend","","","","weekend_torbay","","","","","","night_weekend","","weekend_truro","","","","","" +"Week 8 Day Sun","","","","","","","","weekend_exeter","","","","","weekend_plymouth1","","","","","","","","","","","","weekend_plymouth2","","","night_weekend","","","","","night_weekend","","","","weekend_torbay","","","","","","night_weekend","","weekend_truro","","","","","" diff --git a/shifts.py b/shifts.py index b6c30f7..45020ee 100644 --- a/shifts.py +++ b/shifts.py @@ -49,6 +49,7 @@ class SingleShift(object): rota_on_nwds=False, assign_as_block=False, force_as_block=False, + force_as_block_unless_nwd=False, hard_constrain_shift=True, bank_holidays_only=False, constraints=[], @@ -71,6 +72,7 @@ class SingleShift(object): self.rota_on_nwds = rota_on_nwds self.assign_as_block = assign_as_block self.force_as_block = force_as_block + self.force_as_block_unless_nwd = force_as_block_unless_nwd self.constraints = constraints self.bank_holidays_only = bank_holidays_only @@ -205,13 +207,13 @@ class RotaBuilder(object): initialize=0, ) - self.model.worker_block_shift_counts = Var( - ((worker.id, week, shift) for week in self.weeks - for shift in self.shifts_to_assign_or_force_as_blocks() - for worker in self.workers), - within=NonNegativeIntegers, - initialize=0, - ) + #self.model.worker_block_shift_counts = Var( + # ((worker.id, week, shift) for week in self.weeks + # for shift in self.shifts_to_assign_or_force_as_blocks() + # for worker in self.workers), + # within=NonNegativeIntegers, + # initialize=0, + #) self.model.blocks_worker_shift_assigned = Var( ((worker.id, week, shift) for worker in self.workers @@ -592,7 +594,7 @@ class RotaBuilder(object): for week in self.weeks: for shift_name in self.shifts_to_assign_or_force_as_blocks(): shift = self.get_shift_by_name(shift_name) - for worker in self.workers: + for worker in self.get_workers_for_shift(shift): self.model.constraints.add( 8 * self.model.blocks_worker_shift_assigned[ worker.id, week, shift_name] >= sum( @@ -607,17 +609,62 @@ class RotaBuilder(object): for worker in self.workers)) if shift.force_as_block: - self.model.constraints.add( - self.model.worker_block_shift_counts[worker.id, week, - shift.name] == - sum(self.model.works[worker.id, week, day, shift.name] - for day in self.days)) + #self.model.constraints.add( + # self.model.worker_block_shift_counts[worker.id, week, + # shift.name] == + # sum(self.model.works[worker.id, week, day, shift.name] + # for day in self.days)) + + if shift.force_as_block_unless_nwd: + workers = self.get_workers_for_shift(shift) + # Get workers who have a nwd on the shift + nwd_workers = [] + full_workers = [] + + for w in workers: + if w.nwd is not None: + l = [] + # This should take into account dates! + for nwd, d1, d2 in w.nwd: + if nwd in shift.shift_days: + l.append(w) - self.model.constraints.add( - sum(self.model.blocks_worker_shift_assigned[worker.id, - week, - shift.name] - for worker in self.workers) <= 1) + if l: + nwd_workers.append(w) + else: + full_workers.append(w) + + else: + full_workers.append(w) + print(shift.name, [n.name for n in nwd_workers]) + + if not nwd_workers: # Just do the usual + self.model.constraints.add( + sum(self.model.blocks_worker_shift_assigned[worker.id, + week, + shift.name] + for worker in self.workers) <= 1) + + else: + print(shift.name) + self.model.constraints.add( + sum(self.model.blocks_worker_shift_assigned[worker.id, + week, + shift.name] + for worker in full_workers) <= 1) + + self.model.constraints.add( + sum(self.model.blocks_worker_shift_assigned[worker.id, + week, + shift.name] + for worker in workers) <= 2) + + else: + self.model.constraints.add( + sum(self.model.blocks_worker_shift_assigned[worker.id, + week, + shift.name] + for worker in self.workers) <= 1) # Most of our constraints apply per worker for worker in self.workers: @@ -667,7 +714,7 @@ class RotaBuilder(object): worked, allocated = worker.previous_shifts[shift.name] target_shifts = target_shifts + float(allocated) - float(worked) - print(worker.name, shift.name, target_shifts) + #print(worker.name, shift.name, target_shifts) worker.shift_target_number[shift.name] = target_shifts if shift.hard_constrain_shift: @@ -848,7 +895,7 @@ class RotaBuilder(object): for week, day, shift in self.get_all_shiftclass_combinations(): for n, start, end in worker.nwd: if not shift.rota_on_nwds and day == n: - print(start, self.week_day_date_map[(week, day)], end) + #print(start, self.week_day_date_map[(week, day)], end) if start <= self.week_day_date_map[(week, day)] <= end: self.model.constraints.add( 0 == self.model.works[worker.id, week, day, @@ -1072,7 +1119,7 @@ class RotaBuilder(object): if worker_pairs[0] == worker: workers = worker_pairs - print("Workers", workers) + #print("Workers", workers) self.model.constraints.add( @@ -1484,6 +1531,9 @@ class RotaBuilder(object): s = self.shifts_to_assign_as_blocks() s.extend(self.shifts_to_force_as_blocks()) return s + + def get_workers_for_shift(self, shift): + return [worker for worker in self.workers if worker.site in shift.site] def get_workers_total_fte(self): return self.full_time_equivalent diff --git a/test.py b/test.py index d39e828..0550203 100644 --- a/test.py +++ b/test.py @@ -11,10 +11,10 @@ import datetime import sys use_neos = True -use_cplex = True +use_cplex = False solve = True -weeks_to_rota = 26 +weeks_to_rota = 8 time_to_run = 208500 #allow = 5000 @@ -83,14 +83,16 @@ Rota.add_shifts( days[4:], balance_offset=3, rota_on_nwds=True, - force_as_block=True), + force_as_block=True, + force_as_block_unless_nwd=False), SingleShift(("torbay", ), "weekend_torbay", 12.5, days[4:], balance_offset=3, rota_on_nwds=True, - force_as_block=True), + force_as_block=True, + force_as_block_unless_nwd=False), SingleShift(("plymouth", ), "weekend_plymouth1", 8, @@ -232,7 +234,6 @@ else: nwd_end_date = Rota.rota_end_date if "[" in i: - print(i, i.split("[")[1][:-1]) a, b = i.split("[")[1][:-1].split("-") nwd_start_date = datetime.datetime.strptime(a, "%d/%m/%y").date() @@ -241,7 +242,6 @@ else: nwds.append((i.split("[")[0].strip()[:3].capitalize(), nwd_start_date, nwd_end_date)) #nwds = [i.strip()[:3].capitalize() for i in nwd.split("/")] if nwd else None - print(name, nwds) end_date = end_date if end_date else None oop = oop.split("-") if oop else None @@ -295,7 +295,6 @@ else: print("Building model") Rota.build_shifts_and_workers() -print("PAIRS", Rota.worker_pairs) Rota.sites.add("plymouth_twilights") diff --git a/workers.py b/workers.py index 23a4240..4c91901 100644 --- a/workers.py +++ b/workers.py @@ -154,7 +154,7 @@ class Worker: def __str__(self): - nwd = ", ".join(self.nwd) if self.nwd != None else "" + nwd = ", ".join([str(i) for i in self.nwd]) if self.nwd is not None else "" return "{} {} [{}] PROC SITE:{} ({})".format(self.name, (self.site, self.grade, self.fte_adj), nwd, self.proc_site, self.night_at_derriford) def get_details(self):