diff --git a/rota.csv b/rota.csv index 7b4d72f..d40daa8 100644 --- a/rota.csv +++ b/rota.csv @@ -2,59 +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","","","","","","","","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","","","","","" +"Week 1 Day Mon","","","","","","","","night_weekday","","","","exeter_twilight","","","","","","","night_weekday","","","","","","","","plymouth_twilight","","","","","","","","","","","torbay_twilight","","","","","night_weekday","","truro_twilight","","","","","" +"Week 1 Day Tue","","","","","","","","night_weekday","","","exeter_twilight","","","","","","","","night_weekday","","","","","","","","plymouth_twilight","","","","","","","","","","","torbay_twilight","","","","","night_weekday","","","","truro_twilight","","","" +"Week 1 Day Wed","","","","","","","","night_weekday","","","exeter_twilight","","plymouth_twilight","","","","","","night_weekday","","","","","","","","","","","","","","","","","","torbay_twilight","","","","","","night_weekday","","","truro_twilight","","","","" +"Week 1 Day Thu","","","","","","","","night_weekday","","exeter_twilight","","","","plymouth_twilight","","","","","night_weekday","","","","","","","","","","","","","","","","","","torbay_twilight","","","","","","night_weekday","truro_twilight","","","","","","" +"Week 1 Day Fri","","","","","","","","","weekend_exeter","","","night_weekend","","","","","","","","","plymouth_twilight","","","night_weekend","","","","","","","","","","","","","","night_weekend","weekend_torbay","","","","","","","","weekend_truro","","","" +"Week 1 Day Sat","","","","","","","","","weekend_exeter","","","night_weekend","","weekend_plymouth1","weekend_plymouth2","","","","","","","","","night_weekend","","","","","","","","","","","","","","night_weekend","weekend_torbay","","","","","","","","weekend_truro","","","" +"Week 1 Day Sun","","","","","","","","","weekend_exeter","","","night_weekend","","weekend_plymouth1","weekend_plymouth2","","","","","","","","","night_weekend","","","","","","","","","","","","","","night_weekend","weekend_torbay","","","","","","","","weekend_truro","","","" +"Week 2 Day Mon","night_weekday","","","","","","","exeter_twilight","","","","","","","","","","","","night_weekday","","","plymouth_twilight","","","","","","","","","","","","torbay_twilight","","","","","","","","","truro_twilight","","","","","night_weekday","" +"Week 2 Day Tue","night_weekday","exeter_twilight","","","","","","","","","","","","","","plymouth_twilight","","","","night_weekday","","","","","","","","","","","","","","","torbay_twilight","","","","","","","truro_twilight","","","","","","","night_weekday","" +"Week 2 Day Wed","night_weekday","","","","","","","exeter_twilight","","","","","","","","","","","","night_weekday","","","","plymouth_twilight","","","","","","","","","","","torbay_twilight","","","","","","","","truro_twilight","","","","","","night_weekday","" +"Week 2 Day Thu","night_weekday","","","","","","","","exeter_twilight","","","","","plymouth_twilight","","","","","","night_weekday","","","","","","","","","","","","","","","","","","torbay_twilight","","","","","","","","truro_twilight","","","night_weekday","" +"Week 2 Day Fri","","","","","","weekend_exeter","","","","","night_weekend","","plymouth_twilight","","","","","","","","","","","","night_weekend","","","","","","","weekend_torbay","","","","night_weekend","","","","","","","","","","","","","","weekend_truro" +"Week 2 Day Sat","","","","","","weekend_exeter","","","","","night_weekend","","","","","weekend_plymouth1","","","","","","","weekend_plymouth2","","night_weekend","","","","","","","","","","weekend_torbay","night_weekend","","","","","","","","","","","","","","weekend_truro" +"Week 2 Day Sun","","","","","","weekend_exeter","","","","","night_weekend","","","","","weekend_plymouth1","","","","","","","weekend_plymouth2","","night_weekend","","","","","","","","","","weekend_torbay","night_weekend","","","","","","","","","","","","","","weekend_truro" +"Week 3 Day Mon","","","exeter_twilight","","night_weekday","","","","","","","","","plymouth_twilight","","","","night_weekday","","","","","","","","","","","","","","torbay_twilight","","","","","","","","","","truro_twilight","","","","","","night_weekday","","" +"Week 3 Day Tue","","","","","night_weekday","","","","","","","exeter_twilight","plymouth_twilight","","","","","night_weekday","","","","","","","","","","","","","","torbay_twilight","","","","","","","","","","","","","truro_twilight","","","night_weekday","","" +"Week 3 Day Wed","","","","","night_weekday","","","","","","exeter_twilight","","","","","plymouth_twilight","","night_weekday","","","","","","","","","","","","","","torbay_twilight","","","","","","","","","","","","truro_twilight","","","","night_weekday","","" +"Week 3 Day Thu","","","","","night_weekday","exeter_twilight","","","","","","","","","","","","night_weekday","","","","","","","plymouth_twilight","","","","","","","torbay_twilight","","","","","","","","","","","","","","","","night_weekday","truro_twilight","" +"Week 3 Day Fri","","","","","","","weekend_exeter","","","","","night_weekend","","","","","","","","","","","","","","","night_weekend","plymouth_twilight","","","","","","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","","","","night_weekday","","","","","","","","","","","","","","","","","","","plymouth_twilight","","","","night_weekday","","","","torbay_twilight","","","","","","","","truro_twilight","","","night_weekday","","","","","","" +"Week 4 Day Tue","","","exeter_twilight","","","night_weekday","","","","","","","","","","","","","plymouth_twilight","","","","","","","","","","night_weekday","","","","torbay_twilight","","","","","","","","truro_twilight","","","night_weekday","","","","","","" +"Week 4 Day Wed","","","","","exeter_twilight","night_weekday","","","","","","","","","","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","","weekend_exeter","","","","","","","","","night_weekend","","","","","","night_weekend","","","","","","","","","","","","","","plymouth_twilight","weekend_torbay","","","","night_weekend","","","","","","","","","","","","","weekend_truro","" +"Week 4 Day Sat","","weekend_exeter","","","","","","","","","night_weekend","","","weekend_plymouth2","","","night_weekend","weekend_plymouth1","","","","","","","","","","","","","","weekend_torbay","","","","night_weekend","","","","","","","","","","","","","weekend_truro","" +"Week 4 Day Sun","","weekend_exeter","","","","","","","","","night_weekend","","","weekend_plymouth2","","","night_weekend","weekend_plymouth1","","","","","","","","","","","","","","weekend_torbay","","","","night_weekend","","","","","","","","","","","","","weekend_truro","" +"Week 5 Day Mon","","","exeter_twilight","","","","night_weekday","","","","","","","","","plymouth_twilight","","","","","","","","","","","","night_weekday","","","","","torbay_twilight","","","","","","","","truro_twilight","night_weekday","","","","","","","","" +"Week 5 Day Tue","","","exeter_twilight","","","","night_weekday","","","","","","","","plymouth_twilight","","","","","","","","","","","","","night_weekday","","","","","torbay_twilight","","","","","","","","","night_weekday","","","","","","truro_twilight","","" +"Week 5 Day Wed","","exeter_twilight","","","","","night_weekday","","","","","","","","","","","","","","","","","","","","","night_weekday","","plymouth_twilight","","","","","","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","","weekend_torbay","night_weekend","","","","","","","weekend_truro","","","","night_weekend","","","","","" +"Week 5 Day Sat","","","weekend_exeter","","","","","","","","","","","","","weekend_plymouth2","","","","","","","","","night_weekend","","","","weekend_plymouth1","","","","weekend_torbay","night_weekend","","","","","","","","","weekend_truro","","night_weekend","","","","","" +"Week 5 Day Sun","","","weekend_exeter","","","","","","","","","","","","","weekend_plymouth2","","","","","","","","","night_weekend","","","","weekend_plymouth1","","","","weekend_torbay","night_weekend","","","","","","","","","weekend_truro","","night_weekend","","","","","" +"Week 6 Day Mon","","","","","","","","","exeter_twilight","","","","","plymouth_twilight","","","","","","","","","night_weekday","","","","","","","","","","","","night_weekday","","","","torbay_twilight","","","","","","","truro_twilight","night_weekday","","","" +"Week 6 Day Tue","","","","","","exeter_twilight","","","","","","","","","","","","","","","","","night_weekday","","","","plymouth_twilight","","","","","","","","night_weekday","","","","torbay_twilight","","truro_twilight","","","","","","night_weekday","","","" +"Week 6 Day Wed","","","","","","","","","exeter_twilight","","","","","","","","","","","","","","night_weekday","plymouth_twilight","","","","","","","","","","","night_weekday","","","","torbay_twilight","","truro_twilight","","","","","","night_weekday","","","" +"Week 6 Day Thu","","","","","exeter_twilight","","","","","","","","","","","","","","plymouth_twilight","","","","night_weekday","","","","","","","","","","","","night_weekday","","","","torbay_twilight","","","","","","","","night_weekday","","truro_twilight","" +"Week 6 Day Fri","","night_weekend","","","","","","weekend_exeter","","","","","","","","","plymouth_twilight","","","","night_weekend","","","","","","","","","","","","","","","","weekend_torbay","night_weekend","","","","","","","","weekend_truro","","","","" +"Week 6 Day Sat","","night_weekend","","","","","","weekend_exeter","","","","","","","","","","","weekend_plymouth1","","night_weekend","","","","","","","weekend_plymouth2","","","","","","","","","weekend_torbay","night_weekend","","","","","","","","weekend_truro","","","","" +"Week 6 Day Sun","","night_weekend","","","","","","weekend_exeter","","","","","","","","","","","weekend_plymouth1","","night_weekend","","","","","","","weekend_plymouth2","","","","","","","","","weekend_torbay","night_weekend","","","","","","","","weekend_truro","","","","" +"Week 7 Day Mon","","","","","","exeter_twilight","","","night_weekday","","","","","","night_weekday","","","","","","","","","plymouth_twilight","","","","","","","","","","torbay_twilight","","","","","night_weekday","","","","","","","","","","truro_twilight","" +"Week 7 Day Tue","","","","","","","","","night_weekday","","","exeter_twilight","","","night_weekday","","","","","","","","","","plymouth_twilight","","","","","","","","","torbay_twilight","","","","","night_weekday","","","","","","","","","truro_twilight","","" +"Week 7 Day Wed","","","","","","","","exeter_twilight","night_weekday","","","","","","night_weekday","","","","plymouth_twilight","","","","","","","","","","","","","","","torbay_twilight","","","","","night_weekday","","","","truro_twilight","","","","","","","" +"Week 7 Day Thu","","","exeter_twilight","","","","","","night_weekday","","","","","","night_weekday","","","","","plymouth_twilight","","","","","","","","","","","","","","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_plymouth2","","","","night_weekend","","","","","weekend_plymouth1","","","","night_weekend","","weekend_torbay","","","","","","","","","weekend_truro","","","","","","" +"Week 7 Day Sun","","","","","weekend_exeter","","","","","night_weekend","","","","","","","","","","weekend_plymouth2","","","","night_weekend","","","","","weekend_plymouth1","","","","night_weekend","","weekend_torbay","","","","","","","","","weekend_truro","","","","","","" +"Week 8 Day Mon","","","exeter_twilight","","","","","","","","","","night_weekday","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","torbay_twilight","night_weekday","","","","","","","","","night_weekday","truro_twilight","","","" +"Week 8 Day Tue","","","exeter_twilight","","","","","","","","","","night_weekday","","","","","","","","plymouth_twilight","","","","","","","","","","","","","","","","night_weekday","","","torbay_twilight","","","","","truro_twilight","night_weekday","","","","" +"Week 8 Day Wed","","","","","","","","","","exeter_twilight","","","night_weekday","plymouth_twilight","","","","","","","","","","","","","","","","","","","","","","torbay_twilight","night_weekday","","","","","","","","","night_weekday","truro_twilight","","","" +"Week 8 Day Thu","","","","","","","","","","exeter_twilight","","","night_weekday","","","","","","","","","","","","","","","","plymouth_twilight","","","","","","","torbay_twilight","night_weekday","","","","","","","","","night_weekday","","","","truro_twilight" +"Week 8 Day Fri","","","","","","","weekend_exeter","","","","","","","","","","","plymouth_twilight","","","night_weekend","","","","","","","","","","","weekend_torbay","","","","","","","","night_weekend","night_weekend","","","","","","","weekend_truro","","" +"Week 8 Day Sat","","","","","","","weekend_exeter","","","","","","","","weekend_plymouth2","","","","","","night_weekend","","","","","","","weekend_plymouth1","","","","weekend_torbay","","","","","","","","night_weekend","night_weekend","","","","","","","weekend_truro","","" +"Week 8 Day Sun","","","","","","","weekend_exeter","","","","","","","","weekend_plymouth2","","","","","","night_weekend","","","","","","","weekend_plymouth1","","","","weekend_torbay","","","","","","","","night_weekend","night_weekend","","","","","","","weekend_truro","","" diff --git a/shifts.py b/shifts.py index 45020ee..a8a9638 100644 --- a/shifts.py +++ b/shifts.py @@ -21,6 +21,8 @@ WeekInt = int days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] +full_weekend_count = 2 + # weeks = [i for i in range(1,weeks_to_rota+1)] # weeks_days_product = list(itertools.product(weeks, days)) @@ -207,13 +209,12 @@ 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_split = Var( + ((week, shift) for week in self.weeks + for shift in self.shifts_to_assign_or_force_as_blocks()), + within=Binary, + initialize=0, + ) self.model.blocks_worker_shift_assigned = Var( ((worker.id, week, shift) for worker in self.workers @@ -222,6 +223,7 @@ class RotaBuilder(object): within=Binary, initialize=0, ) + self.model.blocks_assigned = Var( ((week, shift) for week in self.weeks @@ -464,11 +466,14 @@ 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)) - + # And it is not assigned if the worker is from the wrong site + self.model.constraints.add(0 == sum( + self.model.works[worker.id, week, day, shift] + for worker in self.workers if worker.site not in site_required)) # # Ensure shifts are only assigned by workers from the allowed sites # self.model.constraints.add(0 == sum( # self.model.works[worker.id, week, day, shift] @@ -609,11 +614,7 @@ 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)) + if shift.force_as_block_unless_nwd: workers = self.get_workers_for_shift(shift) @@ -658,6 +659,18 @@ class RotaBuilder(object): week, shift.name] for worker in workers) <= 2) + + + #self.model.constraints.add( + # self.model.worker_block_shift_split[week, shift.name] <= 2 - sum(self.model.blocks_worker_shift_assigned[worker.id, + # week, + # shift.name] + # for worker in workers)) + # + #self.model.constraints.add( + # sum(self.model.works[w.id, week, day,shift.name] + # for w in nwd_workers for day in shift.shift_days) - sum(self.model.works[w.id, week, day,shift.name] + # for w in full_workers for day in shift.shift_days) >= self.model.worker_block_shift_split[week, shift.name] ) else: self.model.constraints.add( @@ -672,11 +685,14 @@ class RotaBuilder(object): if self.constraint_options[ "avoid_st2_first_month"] and worker.grade == 2: # Avoid ST1s on the first month - self.model.constraints.add(0 == sum( - self.model.works[worker.id, week, day, shift] for week, - day, shift in self.get_all_shiftname_combinations() - if week in (1, 2, 3, 4) and shift in ("night_weekday", "night_weekend"))) - + try: + self.model.constraints.add(0 == sum( + self.model.works[worker.id, week, day, shift] for week, + day, shift in self.get_all_shiftname_combinations() + if week in (1, 2, 3, 4) and shift in ("night_weekday", "night_weekend"))) + except ValueError as e: + print("Failure setting constraint", "avoid_st2_first_month") + print(e) # Count number of weekends an worker works if self.constraint_options["balance_weekends"]: self.model.constraints.add( @@ -938,7 +954,7 @@ class RotaBuilder(object): # Ignore last week if week + 1 in self.weeks: self.model.constraints.add( - 2 >= sum(self.model.works[worker.id, week, "Sat", + full_weekend_count >= sum(self.model.works[worker.id, week, "Sat", shift.name] for shift in self.get_shifts()) + sum(self.model.works[worker.id, week, "Sun", @@ -952,7 +968,7 @@ class RotaBuilder(object): # Ignore last week if week + 1 in self.weeks: self.model.constraints.add( - 2 >= sum(self.model.works[worker.id, week, "Sat", + full_weekend_count >= sum(self.model.works[worker.id, week, "Sat", shift.name] for shift in self.get_shifts()) + sum(self.model.works[worker.id, week, "Sun", @@ -967,7 +983,7 @@ class RotaBuilder(object): if worker.site in self.constraint_options[ "prevent_fridays_before_full_weekends"]: self.model.constraints.add( - 2 >= sum(self.model.works[worker.id, week, "Sat", + full_weekend_count >= sum(self.model.works[worker.id, week, "Sat", shift.name] for shift in self.get_shifts() if "night" not in shift.constraints) + @@ -982,7 +998,7 @@ class RotaBuilder(object): if worker.site in self.constraint_options[ "prevent_thursdays_before_full_weekends"]: self.model.constraints.add( - 2 >= sum(self.model.works[worker.id, week, "Sat", + full_weekend_count >= sum(self.model.works[worker.id, week, "Sat", shift.name] for shift in self.get_shifts() if "night" not in shift.constraints) + @@ -1645,7 +1661,7 @@ class RotaResults(object): for week, day in self.rota.get_week_day_combinations(): a = "-" for shift in self.rota.get_shift_names_by_week_day(week, day): - if model.works[worker.id, week, day, shift].value == 1: + if model.works[worker.id, week, day, shift].value > 0: shifts.append(shift) a = shift[0] w.append(a) @@ -1714,7 +1730,10 @@ class RotaResults(object): for worker in self.rota.workers: if worker.site != current_site: - timetable.append("{} n={} fte={}".format(worker.site, len(self.rota.workers_at_sites[worker.site]), self.rota.full_time_equivalent_sites[worker.site])) + try: + timetable.append("{} n={} fte={}".format(worker.site, len(self.rota.workers_at_sites[worker.site]), self.rota.full_time_equivalent_sites[worker.site])) + except KeyError as e: + print(e) current_site = worker.site shifts = [] @@ -1739,7 +1758,7 @@ class RotaResults(object): shift_name = "" for shift in self.rota.get_shift_names_by_week_day(week, day): - if model.works[worker.id, week, day, shift].value == 1: + if model.works[worker.id, week, day, shift].value > 0: shifts.append(shift) a = shift[0] shift_name = shift @@ -1988,3 +2007,4 @@ class RotaResults(object): "balance: {},".format( self.rota.model.weekend_shift_count_w[worker.id].value), ) + diff --git a/test.py b/test.py index 0550203..3b2506f 100644 --- a/test.py +++ b/test.py @@ -11,7 +11,7 @@ import datetime import sys use_neos = True -use_cplex = False +use_cplex = True solve = True weeks_to_rota = 8 @@ -29,7 +29,7 @@ Rota = RotaBuilder(datetime.date(2021, 9, 6), #Rota = RotaBuilder(datetime.date(2021, 12, 6), #Rota = RotaBuilder(datetime.date(2021, 11, 8), weeks_to_rota=weeks_to_rota, - balance_offset_modifier=1, + balance_offset_modifier=2, max_weekend_frequency=2, max_night_frequency=2) @@ -82,17 +82,17 @@ Rota.add_shifts( 12.5, days[4:], balance_offset=3, - rota_on_nwds=True, + rota_on_nwds=False, force_as_block=True, - force_as_block_unless_nwd=False), + force_as_block_unless_nwd=True), SingleShift(("torbay", ), "weekend_torbay", 12.5, days[4:], balance_offset=3, - rota_on_nwds=True, + rota_on_nwds=False, force_as_block=True, - force_as_block_unless_nwd=False), + force_as_block_unless_nwd=True), SingleShift(("plymouth", ), "weekend_plymouth1", 8, @@ -362,4 +362,4 @@ ResultsHolder.get_weekend_details() with open("test.html", "w") as f: f.write(ResultsHolder.get_worker_timetable_html(True)) -ResultsHolder.export_rota_to_csv("rota") \ No newline at end of file +ResultsHolder.export_rota_to_csv("rota")