Ganttify_Brew_Sched / codeFile.py
DavidD003's picture
Create new file
a24c4bf
raw
history blame
7.25 kB
from datetime import datetime, timedelta
from openpyxl import load_workbook
import openpyxl as pyxl
class Brw():
def __init__(self,bNo,brnd,fltr,frm,times):
self.brewNo=bNo
self.brand=brnd
# self.mixer
self.fltr=fltr
self.cookStart=t[0]
self.mixStart=t[1]
self.filtStart=t[2]
self.ktlStart=t[3]
self.ktlFull=t[4]
self.wrtclStart=t[5]
self.wrtclEnd=t[6]
def Gantiffy(brwschd):
wb = load_workbook(filename = brwSchd,data_only=True)
#Generate objects
ws=wb['Schedule']
brews={}
i=6
while ws['E'+str(i)].value!=None:
t=[] #to grab times
bNo=ws['C'+str(i)].value
brnd=ws['E'+str(i)].value
fltr=ws['F'+str(i)].value
frm=ws['G'+str(i)].value
for col in ('P','Q','R','S','T','U','V'):
t.append(ws[col+str(i)].value)
brews[bNo]=Brw(bNo,brnd,fltr,frm,t)
i+=1 #increment so no inf loop
#-------------------
#Column widths
#Generate a big list of all column names AAA-ZZZ in excel and set the column width to 1 pt for each
master=[]
alph=[chr(65+i) for i in range(26)]
master.extend(alph)
alph1=[[chr(65+i)+l for l in alph] for i in range(26)]
ls=[]
for l in alph1:
ls.extend(l)
master.extend(l)
alph2=[[chr(65+i)+l for l in ls] for i in range(26)]
alph2
ls=[]
for l in alph2:
ls.extend(l)
master.extend(l)
for c in master[1:1500]:
ws.column_dimensions[c].width =1.5
#------------------
#Set time step, in minutes, and print timeline
ts=10
i=0 #Pull first brew with below statement to get the first time needs to be on schedule
st=min(brews[list(brews.keys())[i]].cookStart,brews[list(brews.keys())[i]].mixStart)
# sheet["A3"].alignment = Alignment(text_rotation=90)
#Print starting value, starting from top of the hour
#-------------------
#Generate dictionary containing column id (number or letters?) keyed by datetime for that column at same time as printout
timeCol={}
for i in range(1420): #720 10 min chunks in 5 days
tVal=datetime(st.year,st.month,st.day,st.hour)+timedelta(minutes=10*i)
timeCol[tVal]=i+2 #Column Number 2 for iteration 0, etc
#Print the half hours and hours
if tVal.minute in (20,30):ws.cell(column=i+2,row=2).value="-" #Print '--' on the middle of the hour
elif tVal.minute==0:ws.cell(column=i+2,row=2).value="'"+str(tVal.hour) #Print the hour
if tVal.hour==0 and tVal.minute==0: #Print the weekday name
v=tVal.weekday()
if v==0: ws.cell(column=i+2,row=1).value="Monday"
elif v==1: ws.cell(column=i+2,row=1).value="Tuesday"
elif v==2: ws.cell(column=i+2,row=1).value="Wednesday"
elif v==3: ws.cell(column=i+2,row=1).value="Thursday"
elif v==4: ws.cell(column=i+2,row=1).value="Friday"
elif v==5: ws.cell(column=i+2,row=1).value="Saturday"
elif v==6: ws.cell(column=i+2,row=1).value="Sunday"
def styleCell(cl,val):
if val==0:
cl.font=pyxl.styles.Font(bold=True,size=14)
cl.alignment=pyxl.styles.Alignment(horizontal='center')
cl.fill=pyxl.styles.PatternFill(fill_type="solid",start_color='0092D050',end_color='0092D050')
cl.border=pyxl.styles.Border(left=pyxl.styles.Side(border_style='thin'),
right=pyxl.styles.Side(border_style='thin'),
top=pyxl.styles.Side(border_style='thin'),
bottom=pyxl.styles.Side(border_style='thin'))
else:
cl.fill=pyxl.styles.PatternFill(fill_type="solid",start_color='00B0F0',end_color='00B0F0')
cl.font=pyxl.styles.Font(bold=True,size=14,color="00FFFFFF")
cl.alignment=pyxl.styles.Alignment(horizontal='center')
cl.border=pyxl.styles.Border(left=pyxl.styles.Side(border_style='thin'),
right=pyxl.styles.Side(border_style='thin'),
top=pyxl.styles.Side(border_style='thin'),
bottom=pyxl.styles.Side(border_style='thin'))
#-------------------
#Print brew info to the cell on each row where it starts,
#and merge that cell appropriately to the right.
#Round the previous process down to nearest 10 min and next process up to ensure no conflcit when the schedule makes them very tight
def d_key(tm):#d for round DOWN
#Given time from a brew object, returns that time rounded DOWN to the nearest 10 minute,
#corresponding to key for finding which column to print to
tm = tm - timedelta(minutes=tm.minute % 10,seconds=tm.second,microseconds=tm.microsecond)
return tm
def u_key(tm):#u for round UP
#returns key for slot rounded up.
discard = timedelta(minutes=tm.minute % 10,seconds=tm.second,microseconds=tm.microsecond)
tm -= discard
# if discard >= timedelta(minutes=5): #Include this statement and indent next to make it classic rounding
tm += timedelta(minutes=10)
return tm
class mm1():
def __init__(self):
self.log=[]
def sched(self,st,en):
self.log.append((st,en))
def busy(self,st,en):
for r in self.log:
if r[0]<st<r[1]:
return True
if r[0]<en<r[1]:
return True
if st<r[0] and r[1]<en:
return True
return False
mm=mm1()
for brN in brews.keys():
b=brews[brN]
#Cereal Cooker - assume only used if cook time is diff from mix time
r=3
if d_key(b.cookStart)!=d_key(b.mixStart):
ws.cell(column=timeCol[u_key(b.cookStart)],row=r).value=str(b.brewNo) +b.brand[:5]
ws.merge_cells(start_row=r, start_column=timeCol[u_key(b.cookStart)], end_row=r, end_column=timeCol[d_key(b.mixStart)])
styleCell(ws.cell(column=timeCol[u_key(b.cookStart)],row=r),brN%2)
#Mixer
if mm.busy(b.mixStart,b.filtStart):r=5
else:
r=4
mm.sched(b.mixStart,b.filtStart)
ws.cell(column=timeCol[u_key(b.mixStart)],row=r).value=str(b.brewNo) +b.brand[:5]
ws.merge_cells(start_row=r, start_column=timeCol[u_key(b.mixStart)], end_row=r, end_column=timeCol[d_key(b.filtStart)])
styleCell(ws.cell(column=timeCol[u_key(b.mixStart)],row=r),brN%2)
#Filter - choose row based on
if fltr=='1-MF':r=6
elif fltr=='2-MF':r=7
else:r=8
ws.cell(column=timeCol[u_key(b.filtStart)],row=r).value=str(b.brewNo) +b.brand[:5]
ws.merge_cells(start_row=r, start_column=timeCol[u_key(b.filtStart)], end_row=r, end_column=timeCol[d_key(b.ktlFull)])
styleCell(ws.cell(column=timeCol[u_key(b.filtStart)],row=r),brN%2)
#Kettle
r=9
ws.cell(column=timeCol[u_key(b.ktlStart)],row=r).value=str(b.brewNo) +b.brand[:5]
ws.merge_cells(start_row=r, start_column=timeCol[u_key(b.ktlStart)], end_row=r, end_column=timeCol[d_key(b.wrtclStart)])
styleCell(ws.cell(column=timeCol[u_key(b.ktlStart)],row=r),brN%2)
#Cool
r=10
ws.cell(column=timeCol[u_key(b.wrtclStart)],row=r).value=str(b.brewNo) +b.brand[:5]
ws.merge_cells(start_row=r, start_column=timeCol[u_key(b.wrtclStart)], end_row=r, end_column=timeCol[d_key(b.wrtclEnd)])
styleCell(ws.cell(column=timeCol[u_key(b.wrtclStart)],row=r),brN%2)
wb.save(filename = 'gantt.xlsx')