diff --git a/leave.csv b/leave.csv index d20833e..93f03c8 100644 --- a/leave.csv +++ b/leave.csv @@ -1,9 +1,9 @@ Rota 2021/2022,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Name,,Stephanie Bailey,Luciana Calovi Motschenbacher,Layla Bell,Seren Peters,Alex wood,Salma Aslam,Max Ireland,Charles Finan,Paul Ward,Tom Welsh,Matt Murphey,Delilah Trimmer,Max Finzel,Zainab Sharaf,Maththew O'Brien,Kyaw Tint,Nicolas Dziadulewicz,Jean Skumar,Michael Tomek,Vilim Kalamar,Dhuvresh Patel,Khalil Madbak,Georgina Edwards,Jenn Haw fong,Paul Jenkins,Jenna Millington,Amoolya Mannava,Ross Kruger,Sophie McGlade,Rebecca Murphy,Natasha Hougham,Jon Skinner,Fiona Lyall,Joel Lim,Wijhdan Abusrewil,Mark Haley,Andrew MacCormick,Alexander Sanchez - cabello,Sayed Hashim Alqarooni,Chong Yew Ng,Matthew Thorley,Harriet Conley,Cameron Bullock,Alexander Wijnberg,Christian Greer,Alan Eccles,Hannah Lewis,Sarath Vennam,Amina Odeh,Mo Babsail,Richard Chaytor,Sherafghan,Madalina Drumea,Mark Fellows,Clement Leung -Rotation,,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Torbay,Torbay,Torbay,Torbay,Torbay,Torbay,Torbay,Torbay,Torbay,Truro,Truro,Truro,Truro,Truro,Truro,Truro,Truro,Truro,Truro,Barnstaple,Taunton,Taunton +Rotation,,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Exeter,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford,Derriford Twilights,Derriford Twilights,Torbay,Torbay,Torbay,Torbay,Torbay,Torbay,Torbay,Torbay,Torbay,Truro,Truro,Truro,Truro,Truro,Truro,Truro,Truro,Truro,Truro,Barnstaple,Taunton,Taunton Grade,,ST2,ST2,ST2,ST3,ST3,ST3,ST3,ST4,ST4,ST5,ST5,ST5,ST2,ST2,ST2,ST2,ST3,ST3,ST3,ST3,ST3,ST4,ST4,ST4,ST4,ST4,ST5,ST5,ST5,ST5,ST5,ST6,ST6,ST2,ST2,ST2,ST2,ST3,ST4,ST4,ST4,ST5,ST2,ST2,ST3,ST3,ST3,ST4,ST4,ST5,ST5,ST5 (until dec),ST3,ST2,ST4 PROC site,,Derriford,,,Torbay,Exeter,,,Derriford,,,,Derriford,Derriford,,Torbay,,,,,,,,,,Derriford,,,Derriford,,Exeter,,,,,,Derriford,Derriford,,,,,Plymouth,Exeter,,,,,,,,,Derriford,,NA,NA -%FTE,,100,100,100,100,100,60,100,100,100,100,100,60,100,100,100,100,100,60,80,100,100,100,80,100,100,60,100,100,80,100,100,0,0,100,60,100,100,100,100,100,100,60,100,100,100,80,100,100,100,100,100,100,0,0,0 +%FTE,,100,100,100,100,100,60,100,100,100,100,100,60,100,100,100,100,100,60,80,100,100,100,80,100,100,60,100,100,80,100,100,100,60,100,60,100,100,100,100,100,100,60,100,100,100,80,100,100,100,100,100,100,0,0,0 NWD,,,,,,,Thursday/Friday,,Tuesday/Thursday,,,Thursday,Monday/Tuesday,,,,,,Thursday/Friday,Wednesday,,,,Friday,,,,,,Friday,,,,,,Monday/Tuesday,,,,,,,monday/thursday,,,,Friday,,,,,,,,, Flexible NWD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, End Date,,,,,,,,,,,,04/02/22,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,01/12/21,,, diff --git a/leave.py b/leave.py index d0dde8a..ce70034 100644 --- a/leave.py +++ b/leave.py @@ -50,6 +50,9 @@ def load_leave(Rota, use_live_rota): lower_item = r[i].lower() if lower_item == "derriford": lower_item = "plymouth" + + if lower_item == "derriford twilights": + lower_item = "plymouth_twilights" if row_title == "PROC site": workers[order[i]]["site_pref"] = lower_item diff --git a/rota.csv b/rota.csv index 1d91944..60433ae 100644 --- a/rota.csv +++ b/rota.csv @@ -1,95 +1,46 @@ -"Name","Layla Bell","Luciana Calovi Motschenbacher","Stephanie Bailey","Salma Aslam","Alex wood","Max Ireland","Seren Peters","Charles Finan","Paul Ward","Delilah Trimmer","Matt Murphey","Tom Welsh","Kyaw Tint","Maththew O'Brien","Max Finzel","Zainab Sharaf","Jean Skumar","Michael Tomek","Dhuvresh Patel","Nicolas Dziadulewicz","Vilim Kalamar","Jenna Millington","Georgina Edwards","Jenn Haw fong","Khalil Madbak","Paul Jenkins","Rebecca Murphy","Sophie McGlade","Amoolya Mannava","Natasha Hougham","Ross Kruger","Wijhdan Abusrewil","Andrew MacCormick","Joel Lim","Mark Haley","Alexander Sanchez - cabello","Chong Yew Ng","Matthew Thorley","Sayed Hashim Alqarooni","Harriet Conley","Alexander Wijnberg","Cameron Bullock","Alan Eccles","Christian Greer","Hannah Lewis","Amina Odeh","Sarath Vennam","Sherafghan","Mo Babsail","Richard Chaytor" -"Site","exeter","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","plymouth","torbay","torbay","torbay","torbay","torbay","torbay","torbay","torbay","torbay","truro","truro","truro","truro","truro","truro","truro","truro","truro","truro" -"Grade","2","2","2","3","3","3","3","4","4","5","5","5","2","2","2","2","3","3","3","3","3","4","4","4","4","4","5","5","5","5","5","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","100.0","80.0","100.0","100.0","100.0","60.0","100.0","100.0","100.0","100.0","100.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","","","night_weekday","","","","","","","","","","","","","","","","","","torbay_twilight","","","","","","night_weekday","","","truro_twilight","","","","" -"Week 1 Day Tue","","","","","","","","night_weekday","","","","exeter_twilight","","","","plymouth_twilight","","","night_weekday","","","","","","","","","","","","","","torbay_twilight","","","","","","","","truro_twilight","","night_weekday","","","","","","","" -"Week 1 Day Wed","","","exeter_twilight","","","","","night_weekday","","","","","","","","","","","night_weekday","plymouth_twilight","","","","","","","","","","","","","torbay_twilight","","","","","","","","truro_twilight","","night_weekday","","","","","","","" -"Week 1 Day Thu","","","","","","exeter_twilight","","night_weekday","","","","","plymouth_twilight","","","","","","night_weekday","","","","","","","","","","","","","","","","","","torbay_twilight","","","","","","night_weekday","","","truro_twilight","","","","" -"Week 1 Day Fri","","","","","night_weekend","","","","weekend_exeter","","","","","","","","","","","","night_weekend","","","","plymouth_twilight","","","","","","","","","","","","","weekend_torbay","night_weekend","","weekend_truro","","","","","","","","","" -"Week 1 Day Sat","","","","","night_weekend","","","","weekend_exeter","","","","","","","","","","","","night_weekend","","weekend_plymouth1","","","","","weekend_plymouth2","","","","","","","","","","weekend_torbay","night_weekend","","weekend_truro","","","","","","","","","" -"Week 1 Day Sun","","","","","night_weekend","","","","weekend_exeter","","","","","","","","","","","","night_weekend","","weekend_plymouth1","","","","","weekend_plymouth2","","","","","","","","","","weekend_torbay","night_weekend","","weekend_truro","","","","","","","","","" -"Week 2 Day Mon","","","","","","","","exeter_twilight","","","","night_weekday","","","plymouth_twilight","","","","","","","","","","night_weekday","","","","","","","","","","","","torbay_twilight","","","","","","","","truro_twilight","","","night_weekday","","" -"Week 2 Day Tue","","","","","","","exeter_twilight","","","","","night_weekday","","","","","","","","","","","","","night_weekday","","","","plymouth_twilight","","","","","","","","torbay_twilight","","","","","","","","","","truro_twilight","night_weekday","","" -"Week 2 Day Wed","","","","","","","","exeter_twilight","","","","night_weekday","","","","","","","","","","","","","night_weekday","","","","","","plymouth_twilight","","","","","","torbay_twilight","","","","","truro_twilight","","","","","","night_weekday","","" -"Week 2 Day Thu","exeter_twilight","","","","","","","","","","","night_weekday","","","","","","","plymouth_twilight","","","","","","night_weekday","","","","","","","","","","","","torbay_twilight","","","","","","truro_twilight","","","","","night_weekday","","" -"Week 2 Day Fri","","","weekend_exeter","","","","","","","","","","","","","","","","","","","","","","","","","","night_weekend","","plymouth_twilight","","weekend_torbay","","","night_weekend","","","","","","weekend_truro","","","night_weekend","","","","","" -"Week 2 Day Sat","","","weekend_exeter","","","","","","","","","","","","","","","weekend_plymouth1","","","","","","","","weekend_plymouth2","","","night_weekend","","","","weekend_torbay","","","night_weekend","","","","","","weekend_truro","","","night_weekend","","","","","" -"Week 2 Day Sun","","","weekend_exeter","","","","","","","","","","","","","","","weekend_plymouth1","","","","","","","","weekend_plymouth2","","","night_weekend","","","","weekend_torbay","","","night_weekend","","","","","","weekend_truro","","","night_weekend","","","","","" -"Week 3 Day Mon","","","","","","exeter_twilight","night_weekday","","","","","","plymouth_twilight","","","","","","","","night_weekday","","","","","","","","","","","","","","torbay_twilight","","","","","","truro_twilight","","","","","","","","","night_weekday" -"Week 3 Day Tue","exeter_twilight","","","","","","night_weekday","","","","","","","","","","","","","plymouth_twilight","night_weekday","","","","","","","","","","","","","","torbay_twilight","","","","","","truro_twilight","","","","","","","","","night_weekday" -"Week 3 Day Wed","","","exeter_twilight","","","","night_weekday","","","","","","","","","","","","","plymouth_twilight","night_weekday","","","","","","","","","","","","","","torbay_twilight","","","","","","","","","","truro_twilight","","","","","night_weekday" -"Week 3 Day Thu","exeter_twilight","","","","","","night_weekday","","","","","","plymouth_twilight","","","","","","","","night_weekday","","","","","","","","","","","","","","torbay_twilight","","","","","","","","","","truro_twilight","","","","","night_weekday" -"Week 3 Day Fri","","","","","weekend_exeter","night_weekend","","","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","night_weekend","","","weekend_torbay","","","","","","","weekend_truro","","","night_weekend","","","","","","" -"Week 3 Day Sat","","","","","weekend_exeter","night_weekend","","","","","","","","","","","","","","","","","","","weekend_plymouth2","","","","","weekend_plymouth1","night_weekend","","","weekend_torbay","","","","","","","weekend_truro","","","night_weekend","","","","","","" -"Week 3 Day Sun","","","","","weekend_exeter","night_weekend","","","","","","","","","","","","","","","","","","","weekend_plymouth2","","","","","weekend_plymouth1","night_weekend","","","weekend_torbay","","","","","","","weekend_truro","","","night_weekend","","","","","","" -"Week 4 Day Mon","","","","","","","exeter_twilight","","","","","","","","","","","","","","plymouth_twilight","","night_weekday","","","","","","","","","","torbay_twilight","","","night_weekday","","","","","","truro_twilight","","","night_weekday","","","","","" -"Week 4 Day Tue","","","exeter_twilight","","","","","","","","","","","","plymouth_twilight","","","","","","","","night_weekday","","","","","","","","","","torbay_twilight","","","night_weekday","","","","","","truro_twilight","","","night_weekday","","","","","" -"Week 4 Day Wed","","exeter_twilight","","","","","","","","","","","","","","","plymouth_twilight","","","","","","night_weekday","","","","","","","","","","torbay_twilight","","","night_weekday","","","","","truro_twilight","","","","night_weekday","","","","","" -"Week 4 Day Thu","","","","","exeter_twilight","","","","","","","","","","plymouth_twilight","","","","","","","","night_weekday","","","","","","","","","","torbay_twilight","","","night_weekday","","","","","","","","truro_twilight","night_weekday","","","","","" -"Week 4 Day Fri","","weekend_exeter","","","","","","","","","night_weekend","","","","","","","","night_weekend","plymouth_twilight","","","","","","","","","","","","weekend_torbay","","","","","","","","","","","","","","","","night_weekend","","weekend_truro" -"Week 4 Day Sat","","weekend_exeter","","","","","","","","","night_weekend","","weekend_plymouth2","weekend_plymouth1","","","","","night_weekend","","","","","","","","","","","","","weekend_torbay","","","","","","","","","","","","","","","","night_weekend","","weekend_truro" -"Week 4 Day Sun","","weekend_exeter","","","","","","","","","night_weekend","","weekend_plymouth2","weekend_plymouth1","","","","","night_weekend","","","","","","","","","","","","","weekend_torbay","","","","","","","","","","","","","","","","night_weekend","","weekend_truro" -"Week 5 Day Mon","exeter_twilight","","","","","night_weekday","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","night_weekday","","","","","","torbay_twilight","","","","","night_weekday","","","truro_twilight","","","","","","" -"Week 5 Day Tue","","","","","exeter_twilight","night_weekday","","","","","","","","","","","","","","plymouth_twilight","","","","","","","","","","night_weekday","","","","","torbay_twilight","","","","","","night_weekday","","","truro_twilight","","","","","","" -"Week 5 Day Wed","","","","","","night_weekday","","","","","","exeter_twilight","","","","","","","","","","","plymouth_twilight","","","","","","","night_weekday","","","","","","torbay_twilight","","","","","night_weekday","","","","","","","truro_twilight","","" -"Week 5 Day Thu","","","exeter_twilight","","","night_weekday","","","","","","","","","","","","","","","","","plymouth_twilight","","","","","","","night_weekday","","","","","","torbay_twilight","","","","","night_weekday","","","truro_twilight","","","","","","" -"Week 5 Day Fri","weekend_exeter","","","","","","night_weekend","","","","","","plymouth_twilight","","","","","","","","","","","","","night_weekend","","","","","","","night_weekend","","weekend_torbay","","","","","","","","","","weekend_truro","","","","","" -"Week 5 Day Sat","weekend_exeter","","","","","","night_weekend","","","","","","","","weekend_plymouth1","","","","","","","","weekend_plymouth2","","","night_weekend","","","","","","","night_weekend","","weekend_torbay","","","","","","","","","","weekend_truro","","","","","" -"Week 5 Day Sun","weekend_exeter","","","","","","night_weekend","","","","","","","","weekend_plymouth1","","","","","","","","weekend_plymouth2","","","night_weekend","","","","","","","night_weekend","","weekend_torbay","","","","","","","","","","weekend_truro","","","","","" -"Week 6 Day Mon","","","","","","","","","","night_weekday","","exeter_twilight","","night_weekday","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","torbay_twilight","","","night_weekday","","","","","","","truro_twilight","","","","" -"Week 6 Day Tue","","","","","","","","","","night_weekday","","exeter_twilight","","night_weekday","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","torbay_twilight","","","night_weekday","","","","","truro_twilight","","","","","","" -"Week 6 Day Wed","","","","","","","","exeter_twilight","","night_weekday","","","","night_weekday","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","torbay_twilight","night_weekday","","","","","","truro_twilight","","","","","" -"Week 6 Day Thu","exeter_twilight","","","","","","","","","night_weekday","","","","night_weekday","","","","","","","","","","","","","","","","","plymouth_twilight","","","","","torbay_twilight","","","night_weekday","","","","","","","","","","","truro_twilight" -"Week 6 Day Fri","","","","","","","","","","","","weekend_exeter","","","","","","","","night_weekend","","","","","","plymouth_twilight","","","","","","","","","","","night_weekend","weekend_torbay","","","","night_weekend","","","","","","","weekend_truro","" -"Week 6 Day Sat","","","","","","","","","","","","weekend_exeter","weekend_plymouth2","","","","","","","night_weekend","","","","","","","","","weekend_plymouth1","","","","","","","","night_weekend","weekend_torbay","","","","night_weekend","","","","","","","weekend_truro","" -"Week 6 Day Sun","","","","","","","","","","","","weekend_exeter","weekend_plymouth2","","","","","","","night_weekend","","","","","","","","","weekend_plymouth1","","","","","","","","night_weekend","weekend_torbay","","","","night_weekend","","","","","","","weekend_truro","" -"Week 7 Day Mon","","","","","exeter_twilight","","","","night_weekday","","","","","","","","night_weekday","plymouth_twilight","","","","","","","","","","","","","","night_weekday","","","","","","","torbay_twilight","","","","","truro_twilight","","","","","","" -"Week 7 Day Tue","","","","","","exeter_twilight","","","night_weekday","","","","","","plymouth_twilight","","night_weekday","","","","","","","","","","","","","","","night_weekday","","","","","","","torbay_twilight","","","","","","","","","","","truro_twilight" -"Week 7 Day Wed","","","","","","","","","night_weekday","","","exeter_twilight","","","","","night_weekday","","","","plymouth_twilight","","","","","","","","","","","night_weekday","","","","","","","torbay_twilight","","","","","","truro_twilight","","","","","" -"Week 7 Day Thu","","exeter_twilight","","","","","","","night_weekday","","","","","","","","night_weekday","","","","","","","plymouth_twilight","","","","","","","","night_weekday","","","","","","","torbay_twilight","","","","","","","","truro_twilight","","","" -"Week 7 Day Fri","","","","","","weekend_exeter","","","","","","","","","","","","","plymouth_twilight","","","","","","","night_weekend","","","","","","","night_weekend","","","weekend_torbay","","","","","","","","weekend_truro","","","","","","night_weekend" -"Week 7 Day Sat","","","","","","weekend_exeter","","","","","","","","","","","","weekend_plymouth2","","","","","","weekend_plymouth1","","night_weekend","","","","","","","night_weekend","","","weekend_torbay","","","","","","","","weekend_truro","","","","","","night_weekend" -"Week 7 Day Sun","","","","","","weekend_exeter","","","","","","","","","","","","weekend_plymouth2","","","","","","weekend_plymouth1","","night_weekend","","","","","","","night_weekend","","","weekend_torbay","","","","","","","","weekend_truro","","","","","","night_weekend" -"Week 8 Day Mon","","","exeter_twilight","","night_weekday","","","","","","","","","","","night_weekday","","","","plymouth_twilight","","","","","","","","","","","","","","torbay_twilight","","","","","","","","truro_twilight","","","","","","","night_weekday","" -"Week 8 Day Tue","","","","","night_weekday","","","","","","exeter_twilight","","","","","night_weekday","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","","torbay_twilight","","","truro_twilight","","","","","","","night_weekday","" -"Week 8 Day Wed","","","","","night_weekday","","","","","","exeter_twilight","","","","","night_weekday","","","","","","","","","","","","plymouth_twilight","","","","torbay_twilight","","","","","","","","","","truro_twilight","","","","","","","night_weekday","" -"Week 8 Day Thu","","","","","night_weekday","","exeter_twilight","","","","","","","","","night_weekday","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","torbay_twilight","","","","","","","","","truro_twilight","night_weekday","" -"Week 8 Day Fri","","night_weekend","","","","","","","","weekend_exeter","","","","","","","","","","","","","","","","","","","","plymouth_twilight","night_weekend","weekend_torbay","","","","","","night_weekend","","","","","weekend_truro","","","","","","","" -"Week 8 Day Sat","","night_weekend","","","","","","","","weekend_exeter","","","","","","","weekend_plymouth1","","","","weekend_plymouth2","","","","","","","","","","night_weekend","weekend_torbay","","","","","","night_weekend","","","","","weekend_truro","","","","","","","" -"Week 8 Day Sun","","night_weekend","","","","","","","","weekend_exeter","","","","","","","weekend_plymouth1","","","","weekend_plymouth2","","","","","","","","","","night_weekend","weekend_torbay","","","","","","night_weekend","","","","","weekend_truro","","","","","","","" -"Week 9 Day Mon","","","","","","","","exeter_twilight","","","","","","","night_weekday","","","","","","","","","","","","","","","plymouth_twilight","","","","","torbay_twilight","","night_weekday","","","","","","","","","","night_weekday","truro_twilight","","" -"Week 9 Day Tue","","","","","","","","","exeter_twilight","","","","","","night_weekday","","","","","","","","","","","plymouth_twilight","","","","","","","","","torbay_twilight","","night_weekday","","","","truro_twilight","","","","","","night_weekday","","","" -"Week 9 Day Wed","","","","","","","","","exeter_twilight","","","","plymouth_twilight","","night_weekday","","","","","","","","","","","","","","","","","","","","torbay_twilight","","night_weekday","","","","","","","","","","night_weekday","","","truro_twilight" -"Week 9 Day Thu","","","","","","","","","exeter_twilight","","","","","","night_weekday","plymouth_twilight","","","","","","","","","","","","","","","","","","","torbay_twilight","","night_weekday","","","","","","","","","","night_weekday","","truro_twilight","" -"Week 9 Day Fri","","","","","","","","weekend_exeter","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","night_weekend","","","","night_weekend","","","","","weekend_torbay","","","","","","","night_weekend","","weekend_truro","","" -"Week 9 Day Sat","","","","","","","","weekend_exeter","","","","","","weekend_plymouth1","","","","","","","","","","weekend_plymouth2","","","","","","night_weekend","","","","night_weekend","","","","","weekend_torbay","","","","","","","night_weekend","","weekend_truro","","" -"Week 9 Day Sun","","","","","","","","weekend_exeter","","","","","","weekend_plymouth1","","","","","","","","","","weekend_plymouth2","","","","","","night_weekend","","","","night_weekend","","","","","weekend_torbay","","","","","","","night_weekend","","weekend_truro","","" -"Week 10 Day Mon","","exeter_twilight","","","","","","","","","night_weekday","","night_weekday","","","","","","","","","","","","","","","plymouth_twilight","","","","","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","","","","","","","","","","exeter_twilight","night_weekday","","night_weekday","","","","","","","","","","","","","","","","","","plymouth_twilight","","torbay_twilight","","","","","night_weekday","","","","","truro_twilight","","","","","","","" -"Week 10 Day Thu","","exeter_twilight","","","","","","","","","night_weekday","","night_weekday","","","","","","","","","","","","","plymouth_twilight","","","","","","","torbay_twilight","","","","","night_weekday","","","","","","","","truro_twilight","","","","" -"Week 10 Day Fri","weekend_exeter","","","","","","","","night_weekend","","","","","","","plymouth_twilight","","","","","","","","","","","","","night_weekend","","","","","","night_weekend","","weekend_torbay","","","","","","","","","","weekend_truro","","","" -"Week 10 Day Sat","weekend_exeter","","","","","","","","night_weekend","","","","","","weekend_plymouth1","","","","","","","","","","","","","weekend_plymouth2","night_weekend","","","","","","night_weekend","","weekend_torbay","","","","","","","","","","weekend_truro","","","" -"Week 10 Day Sun","weekend_exeter","","","","","","","","night_weekend","","","","","","weekend_plymouth1","","","","","","","","","","","","","weekend_plymouth2","night_weekend","","","","","","night_weekend","","weekend_torbay","","","","","","","","","","weekend_truro","","","" -"Week 11 Day Mon","","night_weekday","","","","","","","","","exeter_twilight","","","","","","","","","","","","","night_weekday","","","","","","","plymouth_twilight","","","torbay_twilight","","","","","","","","","","","","","","truro_twilight","night_weekday","" -"Week 11 Day Tue","","night_weekday","","","","","","","","","exeter_twilight","","","","","","","","","","","","","night_weekday","","","","","","plymouth_twilight","","","","torbay_twilight","","","","","","","","truro_twilight","","","","","","","night_weekday","" -"Week 11 Day Wed","","night_weekday","","","","","","","","","exeter_twilight","","","","","","","","","","","","","night_weekday","","","","","","","plymouth_twilight","","","torbay_twilight","","","","","","","","","","","","","","","night_weekday","truro_twilight" -"Week 11 Day Thu","","night_weekday","","","exeter_twilight","","","","","","","","","","","","","","","","","","","night_weekday","","","","","plymouth_twilight","","","","","torbay_twilight","","","","","","","","","","","","","","","night_weekday","truro_twilight" -"Week 11 Day Fri","","","","","","","weekend_exeter","night_weekend","","","","","","","","","","","plymouth_twilight","","","","","","night_weekend","","","","","","","","","","","","","","weekend_torbay","","","night_weekend","weekend_truro","","","","","","","" -"Week 11 Day Sat","","","","","","","weekend_exeter","night_weekend","","","","","","","","weekend_plymouth1","","","","","","","","","night_weekend","","","","","weekend_plymouth2","","","","","","","","","weekend_torbay","","","night_weekend","weekend_truro","","","","","","","" -"Week 11 Day Sun","","","","","","","weekend_exeter","night_weekend","","","","","","","","weekend_plymouth1","","","","","","","","","night_weekend","","","","","weekend_plymouth2","","","","","","","","","weekend_torbay","","","night_weekend","weekend_truro","","","","","","","" -"Week 12 Day Mon","","","night_weekday","","","exeter_twilight","","","","","","","","plymouth_twilight","","","","night_weekday","","","","","","","","","","","","","","","","torbay_twilight","","","","","","","","","","","","night_weekday","truro_twilight","","","" -"Week 12 Day Tue","","","night_weekday","","","","","","exeter_twilight","","","","","","","","","night_weekday","","","plymouth_twilight","","","","","","","","","","","","","torbay_twilight","","","","","","","","","","","","night_weekday","truro_twilight","","","" -"Week 12 Day Wed","","","night_weekday","","","","","exeter_twilight","","","","","","plymouth_twilight","","","","night_weekday","","","","","","","","","","","","","","","","torbay_twilight","","","","","","","","","","","truro_twilight","night_weekday","","","","" -"Week 12 Day Thu","","","night_weekday","","","","exeter_twilight","","","","","","","","","","","night_weekday","plymouth_twilight","","","","","","","","","","","","","","","torbay_twilight","","","","","","","","","","","","night_weekday","","","","truro_twilight" -"Week 12 Day Fri","","","","","","","","","","","weekend_exeter","","","","","","","","","night_weekend","","","","","","","","","","plymouth_twilight","","","","","night_weekend","weekend_torbay","","","","","","","","","","","night_weekend","","weekend_truro","" -"Week 12 Day Sat","","","","","","","","","","","weekend_exeter","","","weekend_plymouth2","","","","","weekend_plymouth1","night_weekend","","","","","","","","","","","","","","","night_weekend","weekend_torbay","","","","","","","","","","","night_weekend","","weekend_truro","" -"Week 12 Day Sun","","","","","","","","","","","weekend_exeter","","","weekend_plymouth2","","","","","weekend_plymouth1","night_weekend","","","","","","","","","","","","","","","night_weekend","weekend_torbay","","","","","","","","","","","night_weekend","","weekend_truro","" -"Week 13 Day Mon","night_weekday","exeter_twilight","","","","","","","","","","","","","","","","","","","","","","","plymouth_twilight","","","night_weekday","","","","","","","","","","torbay_twilight","","","","","","night_weekday","","","","truro_twilight","","" -"Week 13 Day Tue","night_weekday","","","","","","exeter_twilight","","","","","","","","","","","","","","","","","","","plymouth_twilight","","night_weekday","","","","","","","","","","torbay_twilight","","","","","","night_weekday","","truro_twilight","","","","" -"Week 13 Day Wed","night_weekday","","","","","","","","","exeter_twilight","","","","","","","","","","","","","","","","","","night_weekday","","","plymouth_twilight","","","","","","","torbay_twilight","","","","","","night_weekday","","truro_twilight","","","","" -"Week 13 Day Thu","night_weekday","","","","exeter_twilight","","","","","","","","","","","","","","","","","","","","","","","night_weekday","","plymouth_twilight","","","","","","","","torbay_twilight","","","","","","night_weekday","","","","","truro_twilight","" -"Week 13 Day Fri","","","weekend_exeter","","","","","","","","","night_weekend","","plymouth_twilight","","","","","","","","","","night_weekend","","","","","","","","","","night_weekend","","","weekend_torbay","","","","","","","","","weekend_truro","","","","" -"Week 13 Day Sat","","","weekend_exeter","","","","","","","","","night_weekend","","","","weekend_plymouth2","","","","","","","","night_weekend","weekend_plymouth1","","","","","","","","","night_weekend","","","weekend_torbay","","","","","","","","","weekend_truro","","","","" -"Week 13 Day Sun","","","weekend_exeter","","","","","","","","","night_weekend","","","","weekend_plymouth2","","","","","","","","night_weekend","weekend_plymouth1","","","","","","","","","night_weekend","","","weekend_torbay","","","","","","","","","weekend_truro","","","","" +"Name","Layla Bell","Luciana Calovi Motschenbacher","Stephanie Bailey","Salma Aslam","Alex wood","Max Ireland","Seren Peters","Charles Finan","Paul Ward","Delilah Trimmer","Matt Murphey","Tom Welsh","Kyaw Tint","Maththew O'Brien","Max Finzel","Zainab Sharaf","Jean Skumar","Michael Tomek","Dhuvresh Patel","Nicolas Dziadulewicz","Vilim Kalamar","Jenna Millington","Georgina Edwards","Jenn Haw fong","Khalil Madbak","Paul Jenkins","Rebecca Murphy","Sophie McGlade","Amoolya Mannava","Natasha Hougham","Ross Kruger","Fiona Lyall","Jon Skinner","Wijhdan Abusrewil","Andrew MacCormick","Joel Lim","Mark Haley","Alexander Sanchez - cabello","Chong Yew Ng","Matthew Thorley","Sayed Hashim Alqarooni","Harriet Conley","Alexander Wijnberg","Cameron Bullock","Alan Eccles","Christian Greer","Hannah Lewis","Amina Odeh","Sarath Vennam","Mo Babsail","Richard Chaytor","Sherafghan" +"Site","exeter","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","plymouth","plymouth_twilights","plymouth_twilights","torbay","torbay","torbay","torbay","torbay","torbay","torbay","torbay","torbay","truro","truro","truro","truro","truro","truro","truro","truro","truro","truro" +"Grade","2","2","2","3","3","3","3","4","4","5","5","5","2","2","2","2","3","3","3","3","3","4","4","4","4","4","5","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","100.0","80.0","100.0","100.0","100.0","60.0","100.0","60.0","100.0","100.0","100.0","100.0","100.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","","","","","","","","","night_weekday","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","night_weekday","","truro_twilight","","","","" +"Week 1 Day Tue","exeter_twilight","","","","","","","","","","","night_weekday","","","","","","","","","night_weekday","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","night_weekday","","truro_twilight","","","","" +"Week 1 Day Wed","","","","","","","","","","exeter_twilight","","night_weekday","plymouth_twilight","","","","","","","","night_weekday","","","","","","","","","","","","","","","","","","","","","","","","","night_weekday","","truro_twilight","","","","" +"Week 1 Day Thu","","","","","","","exeter_twilight","","","","","night_weekday","","","","plymouth_twilight","","","","","night_weekday","","","","","","","","","","","","","","","","","","","","","","","","","night_weekday","","","truro_twilight","","","" +"Week 1 Day Fri","","","","","night_weekend","","","","","","","","","plymouth_twilight","","","","","","","","","","","","night_weekend","","","","","","","","","","","","","","","","","","","","","","","","night_weekend","","" +"Week 1 Day Sat","","weekend_exeter","","","night_weekend","","","","","","","","weekend_plymouth1","","","","","","","","","","","","","night_weekend","","","","weekend_plymouth2","","","","","","weekend_torbay","","","","","","","","","","","weekend_truro","","","night_weekend","","" +"Week 1 Day Sun","","weekend_exeter","","","night_weekend","","","","","","","","weekend_plymouth1","","","","","","","","","","","","","night_weekend","","","","weekend_plymouth2","","","","","","weekend_torbay","","","","","","","","","","","weekend_truro","","","night_weekend","","" +"Week 2 Day Mon","","","","","","","","","","","exeter_twilight","","","","","","","","","","","","","night_weekday","","","","night_weekday","","","plymouth_twilight","","","","","","","","","","","","","","truro_twilight","","","","","","","night_weekday" +"Week 2 Day Tue","exeter_twilight","","","","","","","","","","","","","","","","","plymouth_twilight","","","","","","night_weekday","","","","night_weekday","","","","","","","","","","","","","","","","","","","","","truro_twilight","","","night_weekday" +"Week 2 Day Wed","","","","","exeter_twilight","","","","","","","","","","","","","","plymouth_twilight","","","","","night_weekday","","","","night_weekday","","","","","","","","","","","","","","","truro_twilight","","","","","","","","","night_weekday" +"Week 2 Day Thu","","","","","exeter_twilight","","","","","","","","","","","","","","","","","","plymouth_twilight","night_weekday","","","","night_weekday","","","","","","","","","","","","","","","","","","","","truro_twilight","","","","night_weekday" +"Week 2 Day Fri","","","","","","","","","","","","","","","","","","night_weekend","","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","night_weekend","","","","night_weekend","","","","","","","" +"Week 2 Day Sat","","","","","","","","weekend_exeter","","","","","","weekend_plymouth1","","","","night_weekend","","","","","","","weekend_plymouth2","","","","","","","","","","","","","","","weekend_torbay","night_weekend","","","","night_weekend","","","","","","weekend_truro","" +"Week 2 Day Sun","","","","","","","","weekend_exeter","","","","","","weekend_plymouth1","","","","night_weekend","","","","","","","weekend_plymouth2","","","","","","","","","","","","","","","weekend_torbay","night_weekend","","","","night_weekend","","","","","","weekend_truro","" +"Week 3 Day Mon","","","","","","night_weekday","","","exeter_twilight","night_weekday","","","","","","","","","plymouth_twilight","","","","","","","","","","","night_weekday","","","","","","","","","","","","","truro_twilight","","","","","","","","","" +"Week 3 Day Tue","","exeter_twilight","","","","night_weekday","","","","night_weekday","","","","","plymouth_twilight","","","","","","","","","","","","","","","night_weekday","","","","","","","","","","","","","","","","","","","","truro_twilight","","" +"Week 3 Day Wed","exeter_twilight","","","","","night_weekday","","","","night_weekday","","","","","","","","","","","plymouth_twilight","","","","","","","","","night_weekday","","","","","","","","","","","","","truro_twilight","","","","","","","","","" +"Week 3 Day Thu","","","","","exeter_twilight","night_weekday","","","","night_weekday","","","","","","","","","plymouth_twilight","","","","","","","","","","","night_weekday","","","","","","","","","","","","","","","","","","","","","","truro_twilight" +"Week 3 Day Fri","","","","","","","","","","","","night_weekend","","","","","","","","night_weekend","","","","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","night_weekend","","","","" +"Week 3 Day Sat","","","weekend_exeter","","","","","","","","","night_weekend","weekend_plymouth2","","","weekend_plymouth1","","","","night_weekend","","","","","","","","","","","","","","","","","weekend_torbay","","","","","","","weekend_truro","","","","night_weekend","","","","" +"Week 3 Day Sun","","","weekend_exeter","","","","","","","","","night_weekend","weekend_plymouth2","","","weekend_plymouth1","","","","night_weekend","","","","","","","","","","","","","","","","","weekend_torbay","","","","","","","weekend_truro","","","","night_weekend","","","","" +"Week 4 Day Mon","","","","","","exeter_twilight","","night_weekday","","","","","","","","","night_weekday","","","","","","","","","plymouth_bank_holidays","","plymouth_twilight","","","","","","","","torbay_twilight","","","","","","","","","truro_twilight","","","","","","night_weekday","" +"Week 4 Day Tue","","","","","","","","night_weekday","exeter_twilight","","","","","","","","night_weekday","","","","","","","","plymouth_bank_holidays","","","","plymouth_twilight","","","","","","torbay_twilight","","","","","","","","","","","","","","truro_twilight","","night_weekday","" +"Week 4 Day Wed","exeter_twilight","","","","","","","night_weekday","","","","","","","","","night_weekday","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","","","","","","","","","","","truro_twilight","night_weekday","" +"Week 4 Day Thu","","","","","","","","night_weekday","exeter_twilight","","","","","","plymouth_twilight","","night_weekday","","","","","","","","","","","","","","","","","","","","","","","","","","","truro_twilight","","","","","","","night_weekday","" +"Week 4 Day Fri","","","","","","","","","","","night_weekend","","","","","plymouth_twilight","","","night_weekend","","","","","","","","","","","","night_weekend","","","","","","","","","","","","","","","","","","","","","" +"Week 4 Day Sat","","","","","","","weekend_exeter","","","","night_weekend","","","","","","","","night_weekend","","","","","","","","","weekend_plymouth1","weekend_plymouth2","","night_weekend","","","weekend_torbay","","","","","","","","","","","","weekend_truro","","","","","","" +"Week 4 Day Sun","","","","","","","weekend_exeter","","","","night_weekend","","","","","","","","night_weekend","","","","","","","","","weekend_plymouth1","weekend_plymouth2","","night_weekend","","","weekend_torbay","","","","","","","","","","","","weekend_truro","","","","","","" +"Week 5 Day Mon","","exeter_twilight","","","","","","","","","","","","","","plymouth_twilight","","","","","","","","","night_weekday","","","","","","","plymouth_bank_holidays","","","","","","","","night_weekday","torbay_twilight","","truro_twilight","","","","night_weekday","","","","","" +"Week 5 Day Tue","","","exeter_twilight","","","","","","","","","","","","plymouth_twilight","","","","","","","","","","night_weekday","","","","","","","","","","","","","","","night_weekday","","","","truro_twilight","","","night_weekday","","","","","" +"Week 5 Day Wed","","","","","","","","","","","exeter_twilight","","","","","","","","","","","","","plymouth_twilight","night_weekday","","","","","","","","","","","","","","","night_weekday","","","","","","","night_weekday","","","","truro_twilight","" +"Week 5 Day Thu","exeter_twilight","","","","","","","","","","","","","","","plymouth_twilight","","","","","","","","","night_weekday","","","","","","","","","","","","","","","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_plymouth1","","","","","","","","","weekend_plymouth2","","","","","","","","","","","weekend_torbay","","","","night_weekend","","","","weekend_truro","","","","","","","","","" +"Week 5 Day Sun","","","","","","weekend_exeter","","","night_weekend","","","","","night_weekend","weekend_plymouth1","","","","","","","","","weekend_plymouth2","","","","","","","","","","","weekend_torbay","","","","night_weekend","","","","weekend_truro","","","","","","","","","" +"Week 6 Day Mon","","","","","","","night_weekday","","","","exeter_twilight","","","","","","","","","plymouth_twilight","","","night_weekday","","","","","","","","","","","","","","night_weekday","","","","","","","","","","","","truro_twilight","","","" +"Week 6 Day Tue","","exeter_twilight","","","","","night_weekday","","","","","","","","","","","","","","","","night_weekday","plymouth_twilight","","","","","","","","","","","","","night_weekday","","","","","","","","truro_twilight","","","","","","","" +"Week 6 Day Wed","","","","","","","night_weekday","","","","exeter_twilight","","","","","","","","","","","","night_weekday","","","","","","","","","","plymouth_twilight","","","","night_weekday","","","","","","truro_twilight","","","","","","","","","" +"Week 6 Day Thu","","","","","","","night_weekday","","exeter_twilight","","","","plymouth_twilight","","","","","","","","","","night_weekday","","","","","","","","","","","","","","night_weekday","","","","","","","truro_twilight","","","","","","","","" +"Week 6 Day Fri","","","night_weekend","","","","","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","","","","","","","","night_weekend","","","","","","","","","","","night_weekend","","","" +"Week 6 Day Sat","weekend_exeter","","night_weekend","","","","","","","","","","","","","","weekend_plymouth2","","","","","","","","","weekend_plymouth1","","","","","","","","weekend_torbay","","","","night_weekend","","","","","","","","","","","night_weekend","","","weekend_truro" +"Week 6 Day Sun","weekend_exeter","","night_weekend","","","","","","","","","","","","","","weekend_plymouth2","","","","","","","","","weekend_plymouth1","","","","","","","","weekend_torbay","","","","night_weekend","","","","","","","","","","","night_weekend","","","weekend_truro" diff --git a/shifts.py b/shifts.py index f051a17..e616ffd 100644 --- a/shifts.py +++ b/shifts.py @@ -50,6 +50,7 @@ class SingleShift(object): assign_as_block=False, force_as_block=False, hard_constrain_shift=True, + bank_holidays_only=False, constraints=[], ): self.site = sites @@ -71,11 +72,13 @@ class SingleShift(object): self.assign_as_block = assign_as_block self.force_as_block = force_as_block self.constraints = constraints + + self.bank_holidays_only = bank_holidays_only - self.total_shifts = length * len(days) * len(shift_days) + #self.total_shifts = length * len(days) * len(shift_days) def __str__(self): - return f"name: {self.name}, site: {self.site}, length: {self.length}, balance weighting: {self.balance_weighting}, balance offset: {self.balance_offset}, hard_constrain: {self.hard_constrain_shift}, workers required : {self.workers_required}, rota on nwds {self.rota_on_nwds}, assign as block: {self.assign_as_block}, force as block: {self.force_as_block}, constraints: {self.constraints}, total shifts: {self.total_shifts}" + return f"name: {self.name}, site: {self.site}, length: {self.length}, balance weighting: {self.balance_weighting}, balance offset: {self.balance_offset}, hard_constrain: {self.hard_constrain_shift}, workers required : {self.workers_required}, rota on nwds {self.rota_on_nwds}, assign as block: {self.assign_as_block}, force as block: {self.force_as_block}, constraints: {self.constraints}"#, total shifts: {self.total_shifts}" def get_shift_summary(self): """ @@ -456,7 +459,7 @@ class RotaBuilder(object): workers_required, site_required, ) in self.get_required_workers_and_site_combinations(): - print(week, day, shift, workers_required, site_required) + #print(week, day, shift, workers_required, site_required) self.model.constraints.add(workers_required == sum( self.model.works[worker.id, week, day, shift] for worker in self.workers if worker.site in site_required)) @@ -487,24 +490,26 @@ class RotaBuilder(object): # Define a maximum number hours that can be worked per week # NOTE: this works on a calander week not a 7 day period - def maxHoursPerWeekRule(model, wid, week): - return 72 >= sum( - shift.length * model.works[wid, week, day, shift.name] - for day, shift in self.get_day_shiftclass_combinations()) + + # TODO: consider fixing + #def maxHoursPerWeekRule(model, wid, week): + # return 72 >= sum( + # shift.length * model.works[wid, week, day, shift.name] + # for day, shift in self.get_day_shiftclass_combinations()) - self.model.max_hours_per_week_constraint = Constraint( - [worker.id for worker in self.workers], - self.weeks, - rule=maxHoursPerWeekRule) + #self.model.max_hours_per_week_constraint = Constraint( + # [worker.id for worker in self.workers], + # self.weeks, + # rule=maxHoursPerWeekRule) # Define an upper limit for hours worked over the rota period - def maxHoursRule(model, wid): - return 8000 >= sum( - shift.length * model.works[wid, week, day, shift.name] - for week, day, shift in self.get_all_shiftclass_combinations()) + #def maxHoursRule(model, wid): + # return 8000 >= sum( + # shift.length * model.works[wid, week, day, shift.name] + # for week, day, shift in self.get_all_shiftclass_combinations()) - self.model.max_hours_constraint = Constraint( - [worker.id for worker in self.workers], rule=maxHoursRule) + #self.model.max_hours_constraint = Constraint( + # [worker.id for worker in self.workers], rule=maxHoursRule) # Limit to 1 ST2 (or below) on a night shift def nightShiftMaxSTRule(model, week, shift): @@ -643,8 +648,8 @@ class RotaBuilder(object): ): # Each site specfies which sites self.workers can fullfill it # calaculate the total number of shifts that need assigning over the rota - total_shifts = (len(self.weeks) * len(shift.shift_days) * - shift.workers_required) + #total_shifts = (len(self.weeks) * len(shift.shift_days) * + total_shifts = self.shift_counts[shift] * shift.workers_required full_time_equivalent_joined = sum([ self.full_time_equivalent_sites[i] for i in shift.site @@ -659,7 +664,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) worker.shift_target_number[shift.name] = target_shifts if shift.hard_constrain_shift: @@ -1022,17 +1027,17 @@ class RotaBuilder(object): n3week, n3day = weeks_days[n] n3 = 0 - if self.get_shift_names_by_day(day): + if self.get_shift_names_by_week_day(week, day): # Unable to work (hard constraint not preference) self.model.constraints.add( self.model.available[worker.id, week, day] >= sum( self.model.works[worker.id, week, day, shift] - for shift in self.get_shift_names_by_day(day))) + for shift in self.get_shift_names_by_week_day(week, day))) # single shift per day self.model.constraints.add(1 >= sum( self.model.works[worker.id, week, day, shift] - for shift in self.get_shift_names_by_day(day))) + for shift in self.get_shift_names_by_week_day(week, day))) # if working a night ensure preceeding (1) or subsequent (2) shifts can only be nights @@ -1050,7 +1055,7 @@ class RotaBuilder(object): constraint_shift.name] + sum(n1 * self.model.works[worker.id, nweek, nday, shift] - for shift in self.get_shift_names_by_day(nday) + for shift in self.get_shift_names_by_week_day(nweek, nday) if shift != constraint_shift.name)) self.model.constraints.add( @@ -1058,28 +1063,28 @@ class RotaBuilder(object): constraint_shift.name] + sum(n2 * self.model.works[worker.id, n2week, n2day, shift] - for shift in self.get_shift_names_by_day(n2day) + for shift in self.get_shift_names_by_week_day(n2week, n2day) if shift != constraint_shift.name)) # self.model.constraints.add( # 1 >= self.model.works[worker.id, week, day, # constraint_shift.name] + # sum(n3 * self.model.works[worker.id, n3week, n3day, # shift] - # for shift in self.get_shift_names_by_day(n3day) + # for shift in self.get_shift_names_by_week_day(week, n3day) # if shift != constraint_shift.name)) self.model.constraints.add( 1 >= self.model.works[worker.id, week, day, constraint_shift.name] + sum(p1 * self.model.works[worker.id, pweek, pday, shift] - for shift in self.get_shift_names_by_day(pday) + for shift in self.get_shift_names_by_week_day(pweek, pday) if shift != constraint_shift.name)) self.model.constraints.add( 1 >= self.model.works[worker.id, week, day, constraint_shift.name] + sum(p2 * self.model.works[worker.id, p2week, p2day, shift] - for shift in self.get_shift_names_by_day(p2day) + for shift in self.get_shift_names_by_week_day(p2week, p2day) if shift != constraint_shift.name)) self.define_objectives() @@ -1227,14 +1232,14 @@ class RotaBuilder(object): """ self.shifts.extend(shifts) - def get_shift_names_by_day(self, day: DayStr): + def get_shift_names_by_week_day(self, week, day: DayStr): """Returns the shifts required for a specific day Returns: set: Set of ShiftName """ - return self.day_shifts_dict[day] + return self.week_day_shifts_dict[(week, day)] def get_shift_by_name(self, name): """ @@ -1260,28 +1265,42 @@ class RotaBuilder(object): self.shifts_by_name = {} self.shift_names = [] # type: List[ShiftName] - self.day_shifts_dict = {day: set() for day in days} - + #self.week_day_shifts_dict = {(week, day): set() for week in self.weeks for day in days} + self.week_day_shifts_dict = {} self.sites = set() + + self.week_day_shift_product = [] + self.week_day_shiftclass_product = [] + + self.shift_counts = defaultdict(int) + for week, day in self.weeks_days_product: + self.week_day_shifts_dict[(week, day)] = set() + for s in self.shifts: + if s.bank_holidays_only: + if self.week_day_date_map[(week, day)] in bank_holiday_map: + self.week_day_shift_product.append((week, day, s.name)) + self.week_day_shiftclass_product.append((week, day, s)) + self.week_day_shifts_dict[(week, day)].add(s.name) + self.shift_counts[s] = self.shift_counts[s] + 1 + else: + if day in s.shift_days: + self.week_day_shift_product.append((week, day, s.name)) + self.week_day_shiftclass_product.append((week, day, s)) + self.week_day_shifts_dict[(week, day)].add(s.name) + self.shift_counts[s] = self.shift_counts[s] + 1 + #print(self.week_day_shift_product) for s in self.shifts: self.shifts_by_name[s.name] = s self.shift_names.append(s.name) - for day in s.shift_days: - self.day_shifts_dict[day].add(s.name) + #for day in s.shift_days: + # self.week_day_shifts_dict[(week, day)].add(s.name) for site in s.site: - self.sites.add(site) - - self.week_day_shift_product = [] - self.week_day_shiftclass_product = [] - for week, day in self.weeks_days_product: - for s in self.shifts: - if day in s.shift_days: - self.week_day_shift_product.append((week, day, s.name)) - self.week_day_shiftclass_product.append((week, day, s)) - + self.sites.add(site) + + # Todo replace with week_day..... self.day_shift_product = [] self.day_shiftclass_product = [] for s in self.shifts: @@ -1384,7 +1403,7 @@ class RotaBuilder(object): """ l = [] for week, day, shift in self.week_day_shiftclass_product: - if day in shift.shift_days: + #if day in shift.shift_days: l.append((week, day, shift.name, shift.workers_required, shift.site)) @@ -1429,7 +1448,7 @@ class RotaBuilder(object): w = defaultdict(list) for worker in self.workers: - print(worker) + #print(worker) w[worker.site].append(worker) l = [] @@ -1474,7 +1493,7 @@ class RotaResults(object): for worker in self.rota.workers: i = "" - for shift in self.rota.get_shift_names_by_day(day): + for shift in self.rota.get_shift_names_by_week_day(week, day): if works[worker.id, week, day, shift].value == 1: i = shift @@ -1531,7 +1550,7 @@ class RotaResults(object): w = ["{:20}".format(worker.name)] for week, day in self.rota.get_week_day_combinations(): a = "-" - for shift in self.rota.get_shift_names_by_day(day): + for shift in self.rota.get_shift_names_by_week_day(week, day): if model.works[worker.id, week, day, shift].value == 1: shifts.append(shift) a = shift[0] @@ -1624,7 +1643,7 @@ class RotaResults(object): a = "-" shift_name = "" - for shift in self.rota.get_shift_names_by_day(day): + for shift in self.rota.get_shift_names_by_week_day(week, day): if model.works[worker.id, week, day, shift].value == 1: shifts.append(shift) a = shift[0] @@ -1673,13 +1692,13 @@ class RotaResults(object): shift_count = shift_count + "{}: {}, ".format(s, c) worker_td = "{} ({}) [{}]".format( - worker.site, worker.site, nwds, worker.site, worker.name, worker.name, + worker.site, worker.site, nwds, worker.site, worker.name, worker.fte, worker.fte_adj, worker.end_date, worker_targets, json.dumps(shift_count_dict), - worker.weekend_shift_target_number, worker.night_at_derriford, worker.name, worker.grade, + worker.weekend_shift_target_number, worker.night_at_derriford, worker.name, worker.name, worker.grade, worker.fte) - print(shift_count_dict) + #print(shift_count_dict) shift_count = shift_count + "#weekends_worked: {}\\#".format( model.worker_weekend_count[worker.id].value) @@ -1687,7 +1706,7 @@ class RotaResults(object): bank_holiday_count = model.bank_holiday_count[worker.id].value bank_holiday_count_w = model.bank_holiday_count_w[ worker.id].value - 1 - print(worker.name, bank_holiday_count, bank_holiday_count_w) + #print(worker.name, bank_holiday_count, bank_holiday_count_w) timetable.append("{}{}".format( worker_td, "".join(shift_tds))) #timetable.append("{}".format("".join(w), shift_count)) @@ -1837,14 +1856,13 @@ class RotaResults(object): site].value, self.rota.model.night_per_site_t2[week, block, site].value) - + """ def get_night_details(self): for worker in self.rota.workers: print( "{:20}".format(worker.name), "worked: {},".format( self.rota.model.night_shift_count[(worker.id)].value), - "target: {},".format( worker.shift_target_number["night_weekday"] + worker.shift_target_number["night_weekend"]), "target_diff: {},".format( @@ -1854,6 +1872,7 @@ class RotaResults(object): "balance: {},".format( self.rota.model.night_shift_count_w[worker.id].value), ) + """ def get_weekend_details(self): for worker in self.rota.workers: diff --git a/test.py b/test.py index e99afd2..c820276 100644 --- a/test.py +++ b/test.py @@ -10,11 +10,11 @@ import datetime import sys -use_neos = False +use_neos = True use_cplex = False solve = True -weeks_to_rota = 13 +weeks_to_rota = 6 time_to_run = 28500 #allow = 5000 @@ -25,8 +25,8 @@ use_live_rota = False sites = ("truro", "exeter", "torbay", "barnstaple", "plymouth") -Rota = RotaBuilder(datetime.date(2021, 9, 6), -#Rota = RotaBuilder(datetime.date(2021, 11, 8), +#Rota = RotaBuilder(datetime.date(2021, 9, 6), +Rota = RotaBuilder(datetime.date(2021, 12, 6), weeks_to_rota=weeks_to_rota, balance_offset_modifier=2, max_weekend_frequency=2, @@ -60,7 +60,7 @@ Rota.add_shifts( days[:4], balance_offset=3, assign_as_block=True), - SingleShift(("plymouth", ), + SingleShift(("plymouth", "plymouth_twilights"), "plymouth_twilight", 12.5, days[:5], @@ -104,6 +104,15 @@ Rota.add_shifts( workers_required=1, rota_on_nwds=True, force_as_block=True), + SingleShift(("plymouth", "plymouth_twilights"), + "plymouth_bank_holidays", + 8, + days[5:], + balance_offset=3, + workers_required=1, + rota_on_nwds=True, + force_as_block=False, + bank_holidays_only=True), SingleShift( (sites), "night_weekday", @@ -264,6 +273,8 @@ else: print("Building model") Rota.build_shifts_and_workers() +Rota.sites.add("plymouth_twilights") + Rota.build_model() print(Rota.get_worker_details()) @@ -319,7 +330,7 @@ worker_timetable = ResultsHolder.get_worker_timetable() worker_timetable_brief = ResultsHolder.get_worker_timetable_brief( show_prefs=False, show_unavailable=False) -#print(worker_timetable_brief) +print(worker_timetable_brief) #print(Rota.get_workers_total_fte()) ResultsHolder.get_weekend_details() diff --git a/workers.py b/workers.py index 1fa3a20..7aac590 100644 --- a/workers.py +++ b/workers.py @@ -106,7 +106,7 @@ class Worker: day)] = 1 / (len(pref_not_to_work) + 1) if not_available_to_work is not None: - print(not_available_to_work) + #print(not_available_to_work) # loop throught dates converting to week / day combination for date, reason in not_available_to_work: days_from_start = (