DavidD003 commited on
Commit
e1a9790
·
1 Parent(s): 7f89cb4

Update SchedBuilderClasses2.py

Browse files
Files changed (1) hide show
  1. SchedBuilderClasses2.py +43 -20
SchedBuilderClasses2.py CHANGED
@@ -408,7 +408,7 @@ class Schedule():
408
  if self.ee[lowManID].slOK(self,sl,tp='F'): return lowManID,'F'
409
  self.assnLog.append('NO STAFF! No one to force to '+sl.key())
410
  return None,'N' #No one to force
411
-
412
  def checkForceStop(self,tup,iter,assn):
413
  if tup!=None:
414
  if iter==tup[0] and assn==tup[1]: return True
@@ -485,7 +485,7 @@ class Schedule():
485
  WIPschd.assnLog.append('The last assignment created a broken schedule where the person' +WIPschd.ee[eId].lastNm+' had a forcing (previously assigned) after 48h in the week (just assigned.) Adding this slot to priority sequence and reiterating')
486
  self.assnLog.extend(WIPschd.assnLog) #add to master before iterating
487
  self.assnLog.extend('RETURN A')
488
- return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd) #WIPschd,'P-Frce Brk' #<-Alt return for debugging
489
  newK=set([k for k in WIPschd.slots if len(WIPschd.slots[k].eligVol)==0 and WIPschd.slots[k].assnType not in ['WWF','F','V','nV','DNS','N']]) #After assignment, see if anything now needing forcing that hasn't been seen before
490
  if len(newK-set(WIPschd.noVol))>0: #Case that a forced assignment made someone ineligible for a slot they were marked as the last volunteer in, creating a slot requiring forcing that hasn't been seen before, requiring re iteration
491
  pullK=newK-set(WIPschd.noVol) #Get the keys for slots that are now without volunteers(could be more than one so use set subtraction)
@@ -493,7 +493,7 @@ class Schedule():
493
  WIPschd.noVol.extend(pullK)
494
  self.assnLog.extend(WIPschd.assnLog) #Add to master before iterating
495
  self.assnLog.extend('RETURN B')
496
- return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd) # WIPschd,'P-Bump' #<-Alt return for debugging
497
  #=====
498
  #======
499
  #Phase 0.5 - Make 8 Hour shift assignments previously identified in Phase 1, to set the scene
@@ -547,14 +547,14 @@ class Schedule():
547
  WIPschd.noVol.extend(pullK)
548
  self.assnLog.extend(WIPschd.assnLog) #Add to master before iterating
549
  self.assnLog.extend('RETURN C')
550
- return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd) # WIPschd,'P-Bump' #<-Alt return for debugging
551
  else:
552
  pre8[k1]=eId
553
  pre8[k2]=eId
554
  WIPschd.assnLog.append("Assigning "+str(WIPschd.ee[eId].lastNm)+" a voluntary 8 hour shift to "+str(k1)+", "+str(k2)+" means they can't be forced for a later slot they were forced in for already. Reiterating schedule with this 8 hour assignment on the initial-fill priority list")
555
  self.assnLog.extend(WIPschd.assnLog)
556
  self.assnLog.extend('RETURN D')
557
- return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd)
558
  if s==1:
559
  break #Break out of searching through ee's, it got assigned and so, done
560
  if s==1: break #Break out of incrementing through k2 as k1 has been assignd so we need to look at another k1
@@ -593,14 +593,14 @@ class Schedule():
593
  WIPschd.noVol.extend(pullK)
594
  self.assnLog.extend(WIPschd.assnLog) #Add to master before iterating
595
  self.assnLog.extend('RETURN G')
596
- return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd) # WIPschd,'P-Bump' #<-Alt return for debugging
597
  else:
598
  pre8[k1]=eId
599
  pre8[k2]=eId
600
  WIPschd.assnLog.append("Assigning "+str(WIPschd.ee[eId].lastNm)+" a voluntary 8 hour shift to "+str(k1)+", "+str(k2)+" means they can't be forced for a later slot they were forced in for already. Reiterating schedule with this 8 hour assignment on the initial-fill priority list")
601
  self.assnLog.extend(WIPschd.assnLog)
602
  self.assnLog.extend('RETURN H')
603
- return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd)
604
  if s==1:
605
  break #Break out of searching through ee's, it got assigned and so, done
606
  if s==1: break #Break out of incrementing through k2 as k1 has been assignd so we need to look at another k1
@@ -659,13 +659,13 @@ class Schedule():
659
  WIPschd.noVol.extend(pullK)
660
  self.assnLog.extend(WIPschd.assnLog) #Add to master before iterating
661
  self.assnLog.extend('RETURN I')
662
- return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd) # WIPschd,'P-Bump' #<-Alt return for debugging
663
  if r==False and curS.key() not in WIPschd.noVol:
664
  WIPschd.noVol.append(curS.key())
665
  WIPschd.assnLog.append('The last assignment created a broken schedule where the person ('+WIPschd.ee[eId].lastNm+') had a forcing (previously assigned) after 48h in the week (just assigned.) Adding this slot to priority sequence and reiterating')
666
  self.assnLog.extend(WIPschd.assnLog)
667
  self.assnLog.extend('RETURN E')
668
- return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd) # WIPschd,'V-F Rule' #<-Alt return for debugging
669
  # if len(postNoVol-preNoVol)>0: #Recurse, an assignment made another slot have noVol
670
  # WIPschd.assnLog.append('The last assignment caused slot(s) '+str(list(postNoVol-preNoVol))+' to have no more eligible volunteers. A new iteration will take place with these slots getting priority assignment')
671
  # WIPschd.noVol.extend(list(postNoVol-preNoVol))
@@ -685,7 +685,7 @@ class Schedule():
685
  WIPschd.assnLog.append('The last assignment resulted in slot ('+str([k for k in slLost if k!=lastK])+') having no more eligible volunteers. Those slots are added to the list of slots to force at the start, and a new schedule will be made with updated list of slots to Force')
686
  self.assnLog.extend(WIPschd.assnLog)
687
  self.assnLog.extend('RETURN F')
688
- return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd)# WIPschd,'V-Bump' #<-Alt return for debugging
689
 
690
 
691
 
@@ -1036,22 +1036,45 @@ class Schedule():
1036
  c+=1
1037
  #=============================================
1038
  #Print assignments to a separate sheet, in alphabetical order by last name
1039
- ws2 = wb.create_sheet(title="Assignments (Alpha)")
1040
- ws2.cell(row=2,column=1).value='Last, First'
1041
- ws2.cell(row=2,column=2).value='Time slots'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1042
  # ws2.cell(row=1,column=1).value='Note that the seniority value presented is not actual plant seniority number, but just the sequence of '
1043
- n=1
1044
  for rec in tls.viewTBL('senRef',sortBy=[('last','ASC')]):
1045
  eId=rec[2]
1046
  if len(self.ee[eId].assignments)>0 and self.slots[self.ee[eId].assignments[0]].assnType!='WWF':#If the person has an assignment and isn't WWF, print it
1047
  n+=1
1048
- ws2.cell(row=n+1,column=1).value=self.ee[eId].lastNm+', '+self.ee[eId].firstNm[0]+'.'
1049
- # ws2.cell(row=n+1,column=2).value=eId
 
 
 
1050
  c=0
1051
  for k in sorted(self.ee[eId].assignments,key=lambda k:int(k[:k.index('_')])):
1052
- styleNfill(ws2.cell(row=n+1,column=2+c),self.slots[k])
1053
  # ws2.cell(row=n+1,column=2+c).value=self.slots[k].dispNm+' '+ self.slLeg[self.slots[k].seqID-1][2]+' ('+self.slLeg[self.slots[k].seqID-1][1]+')'
1054
- ws2.cell(row=n+1,column=2+c).value=self.slLeg[self.slots[k].seqID-1][2]+' ('+self.slLeg[self.slots[k].seqID-1][1]+')'
1055
  c+=1
1056
  #==========================
1057
  #Print succint assignment log to a separate sheet
@@ -1078,7 +1101,7 @@ class Schedule():
1078
  ws2.cell(column=1,row=2+n).value=rec
1079
  n+=1
1080
 
1081
- #=============================================
1082
  #Print assignments to a separate sheet, sequenced by seniority
1083
  ws2 = wb.create_sheet(title="Assignments (Sen'ty)")
1084
  ws2.cell(row=2,column=1).value='Seniority'
@@ -1097,7 +1120,7 @@ class Schedule():
1097
  styleNfill(ws2.cell(row=n+1,column=3+c),self.slots[k])
1098
  ws2.cell(row=n+1,column=3+c).value=self.slots[k].dispNm+' '+ self.slLeg[self.slots[k].seqID-1][2]+' ('+self.slLeg[self.slots[k].seqID-1][1]+')'
1099
  c+=1
1100
-
1101
 
1102
 
1103
 
 
408
  if self.ee[lowManID].slOK(self,sl,tp='F'): return lowManID,'F'
409
  self.assnLog.append('NO STAFF! No one to force to '+sl.key())
410
  return None,'N' #No one to force
411
+ # @debug
412
  def checkForceStop(self,tup,iter,assn):
413
  if tup!=None:
414
  if iter==tup[0] and assn==tup[1]: return True
 
485
  WIPschd.assnLog.append('The last assignment created a broken schedule where the person' +WIPschd.ee[eId].lastNm+' had a forcing (previously assigned) after 48h in the week (just assigned.) Adding this slot to priority sequence and reiterating')
486
  self.assnLog.extend(WIPschd.assnLog) #add to master before iterating
487
  self.assnLog.extend('RETURN A')
488
+ return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd,stop=stop) #WIPschd,'P-Frce Brk' #<-Alt return for debugging
489
  newK=set([k for k in WIPschd.slots if len(WIPschd.slots[k].eligVol)==0 and WIPschd.slots[k].assnType not in ['WWF','F','V','nV','DNS','N']]) #After assignment, see if anything now needing forcing that hasn't been seen before
490
  if len(newK-set(WIPschd.noVol))>0: #Case that a forced assignment made someone ineligible for a slot they were marked as the last volunteer in, creating a slot requiring forcing that hasn't been seen before, requiring re iteration
491
  pullK=newK-set(WIPschd.noVol) #Get the keys for slots that are now without volunteers(could be more than one so use set subtraction)
 
493
  WIPschd.noVol.extend(pullK)
494
  self.assnLog.extend(WIPschd.assnLog) #Add to master before iterating
495
  self.assnLog.extend('RETURN B')
496
+ return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd,stop=stop) # WIPschd,'P-Bump' #<-Alt return for debugging
497
  #=====
498
  #======
499
  #Phase 0.5 - Make 8 Hour shift assignments previously identified in Phase 1, to set the scene
 
547
  WIPschd.noVol.extend(pullK)
548
  self.assnLog.extend(WIPschd.assnLog) #Add to master before iterating
549
  self.assnLog.extend('RETURN C')
550
+ return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd,stop=stop) # WIPschd,'P-Bump' #<-Alt return for debugging
551
  else:
552
  pre8[k1]=eId
553
  pre8[k2]=eId
554
  WIPschd.assnLog.append("Assigning "+str(WIPschd.ee[eId].lastNm)+" a voluntary 8 hour shift to "+str(k1)+", "+str(k2)+" means they can't be forced for a later slot they were forced in for already. Reiterating schedule with this 8 hour assignment on the initial-fill priority list")
555
  self.assnLog.extend(WIPschd.assnLog)
556
  self.assnLog.extend('RETURN D')
557
+ return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd,stop=stop)
558
  if s==1:
559
  break #Break out of searching through ee's, it got assigned and so, done
560
  if s==1: break #Break out of incrementing through k2 as k1 has been assignd so we need to look at another k1
 
593
  WIPschd.noVol.extend(pullK)
594
  self.assnLog.extend(WIPschd.assnLog) #Add to master before iterating
595
  self.assnLog.extend('RETURN G')
596
+ return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd,stop=stop) # WIPschd,'P-Bump' #<-Alt return for debugging
597
  else:
598
  pre8[k1]=eId
599
  pre8[k2]=eId
600
  WIPschd.assnLog.append("Assigning "+str(WIPschd.ee[eId].lastNm)+" a voluntary 8 hour shift to "+str(k1)+", "+str(k2)+" means they can't be forced for a later slot they were forced in for already. Reiterating schedule with this 8 hour assignment on the initial-fill priority list")
601
  self.assnLog.extend(WIPschd.assnLog)
602
  self.assnLog.extend('RETURN H')
603
+ return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd,stop=stop)
604
  if s==1:
605
  break #Break out of searching through ee's, it got assigned and so, done
606
  if s==1: break #Break out of incrementing through k2 as k1 has been assignd so we need to look at another k1
 
659
  WIPschd.noVol.extend(pullK)
660
  self.assnLog.extend(WIPschd.assnLog) #Add to master before iterating
661
  self.assnLog.extend('RETURN I')
662
+ return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd,stop=stop) # WIPschd,'P-Bump' #<-Alt return for debugging
663
  if r==False and curS.key() not in WIPschd.noVol:
664
  WIPschd.noVol.append(curS.key())
665
  WIPschd.assnLog.append('The last assignment created a broken schedule where the person ('+WIPschd.ee[eId].lastNm+') had a forcing (previously assigned) after 48h in the week (just assigned.) Adding this slot to priority sequence and reiterating')
666
  self.assnLog.extend(WIPschd.assnLog)
667
  self.assnLog.extend('RETURN E')
668
+ return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd,stop=stop) # WIPschd,'V-F Rule' #<-Alt return for debugging
669
  # if len(postNoVol-preNoVol)>0: #Recurse, an assignment made another slot have noVol
670
  # WIPschd.assnLog.append('The last assignment caused slot(s) '+str(list(postNoVol-preNoVol))+' to have no more eligible volunteers. A new iteration will take place with these slots getting priority assignment')
671
  # WIPschd.noVol.extend(list(postNoVol-preNoVol))
 
685
  WIPschd.assnLog.append('The last assignment resulted in slot ('+str([k for k in slLost if k!=lastK])+') having no more eligible volunteers. Those slots are added to the list of slots to force at the start, and a new schedule will be made with updated list of slots to Force')
686
  self.assnLog.extend(WIPschd.assnLog)
687
  self.assnLog.extend('RETURN F')
688
+ return self.fillOutSched_v3(WIPschd.noVol,iter,pre8=pre8,last=WIPschd,stop=stop)# WIPschd,'V-Bump' #<-Alt return for debugging
689
 
690
 
691
 
 
1036
  c+=1
1037
  #=============================================
1038
  #Print assignments to a separate sheet, in alphabetical order by last name
1039
+ ws = wb.create_sheet(title="Assignments (Alpha)")
1040
+ ws.cell(row=3,column=1).value='Last, First'
1041
+ ws.cell(row=2,column=2).value='Time slots'
1042
+ styleCell(ws['A3'],'shift')
1043
+ # styleCell(ws['A2'],'shift')
1044
+ ws.column_dimensions['A'].width =22.78
1045
+ dys=['Friday','Saturday','Sunday','Monday']
1046
+ shifts=['C','A','B']*4
1047
+ tSlots=['11p - 3a','3a - 7a','7a - 11a', '11a - 3p','3p-7p', '7p-11p']*4
1048
+ for i in range(0,24,6): #Print Days of week
1049
+ cl=ws.cell(column=2+i,row=1)
1050
+ styleCell(cl,'day',6) #Style all the cells within the merge
1051
+ ws.merge_cells(start_row=1, start_column=2+i, end_row=1, end_column=2+i+5)
1052
+ cl.value=dys.pop(0)
1053
+ for i in range(0,24,2): #Print the shift title
1054
+ cl=ws.cell(column=2+i,row=2)
1055
+ styleCell(cl,'shift',1)
1056
+ ws.merge_cells(start_row=2, start_column=2+i, end_row=2, end_column=2+i+1)
1057
+ cl.value=shifts.pop(0)
1058
+ for i in range(24): #Print the shift times row
1059
+ cl=ws.cell(column=2+i,row=3)
1060
+ cl.value=tSlots.pop(0)
1061
+ styleCell(cl,'hours')
1062
  # ws2.cell(row=1,column=1).value='Note that the seniority value presented is not actual plant seniority number, but just the sequence of '
1063
+ n=3
1064
  for rec in tls.viewTBL('senRef',sortBy=[('last','ASC')]):
1065
  eId=rec[2]
1066
  if len(self.ee[eId].assignments)>0 and self.slots[self.ee[eId].assignments[0]].assnType!='WWF':#If the person has an assignment and isn't WWF, print it
1067
  n+=1
1068
+ ws.cell(row=n,column=1).value=self.ee[eId].lastNm+', '+self.ee[eId].firstNm[0]+'.' #Print name in column A
1069
+ #Print N/A to all other cells, actual assignments will overwrite.
1070
+ for i in range(2,26):
1071
+ styleCell(ws.cell(row=n,column=i),'DNS')
1072
+ ws.cell(row=n,column=i).value="-"
1073
  c=0
1074
  for k in sorted(self.ee[eId].assignments,key=lambda k:int(k[:k.index('_')])):
1075
+ styleNfill(ws.cell(row=n,column=1+int(k[:k.index('_')])),self.slots[k])
1076
  # ws2.cell(row=n+1,column=2+c).value=self.slots[k].dispNm+' '+ self.slLeg[self.slots[k].seqID-1][2]+' ('+self.slLeg[self.slots[k].seqID-1][1]+')'
1077
+ ws.cell(row=n,column=1+int(k[:k.index('_')])).value=self.slots[k].dispNm
1078
  c+=1
1079
  #==========================
1080
  #Print succint assignment log to a separate sheet
 
1101
  ws2.cell(column=1,row=2+n).value=rec
1102
  n+=1
1103
 
1104
+ #==========================================================
1105
  #Print assignments to a separate sheet, sequenced by seniority
1106
  ws2 = wb.create_sheet(title="Assignments (Sen'ty)")
1107
  ws2.cell(row=2,column=1).value='Seniority'
 
1120
  styleNfill(ws2.cell(row=n+1,column=3+c),self.slots[k])
1121
  ws2.cell(row=n+1,column=3+c).value=self.slots[k].dispNm+' '+ self.slLeg[self.slots[k].seqID-1][2]+' ('+self.slLeg[self.slots[k].seqID-1][1]+')'
1122
  c+=1
1123
+ #====================================================
1124
 
1125
 
1126