from LaborHed import LaborHed from Store import store from datetime import datetime class LaborHedFactory(object): def new(self): return LaborHed() def processTime(self, startStamp = None, endStamp = None): if not startStamp: startStamp = "1900-01-01 00:00:00" if not endStamp: endStamp = str(datetime.today())[:-7] return [ startStamp, endStamp ] def getLaborHeds(self): return store.fetchObjectsOfClass(LaborHed,clauses='ORDER BY startStamp DESC') def getUnpostedLaborHeds(self, startStamp = None, endStamp = None): startStamp,endStamp = self.processTime(startStamp, endStamp) return store.fetchObjectsOfClass(LaborHed,"""WHERE posted=0 AND startStamp >= '%s' AND endStamp <= '%s' ORDER BY startStamp DESC""" % ( startStamp, endStamp ) ) def postUnpostedLaborHeds(self, startStamp = None, endStamp = None): startStamp,endStamp = self.processTime(startStamp, endStamp) con,cur = store.executeSQL("SELECT serialNum FROM LaborHed WHERE posted=0 AND startStamp >= '%s' AND endStamp <= '%s' ORDER BY startStamp DESC""" % ( startStamp, endStamp ) ) laborHeds = cur.fetchall() for x in laborHeds: store.executeSQL("UPDATE LaborDtl SET posted=1 WHERE posted=0 AND laborHedObjId='%s'" % x[0]) store.executeSQL("UPDATE LaborHed SET posted=1 WHERE posted=0 AND startStamp >= '%s' AND endStamp <= '%s'""" % ( startStamp, endStamp ) ) return True def getPostedLaborHeds(self): return store.fetchObjectsOfClass(LaborHed,clauses='WHERE posted=1 ORDER BY startStamp DESC') def getPostedLaborHedsByPage(self,page,pageSize = 250, startStamp = None, endStamp = None): # Returns a list of [ results, nextpage = True/False ] sqlEngine = str( store.__module__ ).split(".")[2] startStamp,endStamp = self.processTime(startStamp, endStamp) if sqlEngine == "MSSQLObjectStore": tmp = store.fetchObjectsOfClass(LaborHed,clauses="""WHERE [posted]=1 AND [startStamp] >= '%s' AND [endStamp] <= '%s' ORDER BY startStamp""" % ( startStamp,endStamp ) ) #Since MSSQL has no TOP statement else: tmp = store.fetchObjectsOfClass(LaborHed,clauses="""WHERE posted=1 AND startStamp >= '%s' AND endStamp <= '%s' ORDER BY startStamp LIMIT %s OFFSET %s""" % ( startStamp, endStamp, pageSize + 1,(page * pageSize) ) ) # Add one to the query to check for existance of a next page if len(tmp) == pageSize + 1: tmp = tmp[:-1] return list([ tmp, len(tmp) == ( pageSize + 1) ]) def getLaborHedBySerialNum(self, serialNum): return store.fetchObject(LaborHed, serialNum) def getLaborHedsByEmployeeSerialNum(self, serialNum): return store.fetchObjectsOfClass(LaborHed, clauses="WHERE employeeObjId='%s'" % serialNum) def getLaborHedsHoursForEmployeeBySerialNum(self, serialNum, startStamp = None, endStamp = None): import datetime output = store.fetchObjectsOfClass(LaborHed, clauses="WHERE employeeObjId='%s' AND endStamp IS NOT NULL" % serialNum ) timeWorked = 0 timeWorkedWeek = 0 laborHeds = 0 laborDtls = 0 productionLaborDtls = 0 setupLaborDtls = 0 indirectLaborDtls = 0 for x in output: time = ( x.endStamp() - x.startStamp() ) if not isinstance(x.startStamp(), datetime.datetime ): from mx import DateTime days = ( DateTime.today() - x.startStamp() ).days else: if not isinstance(timeWorked,datetime.timedelta): #NOTE: Seems some system random pick DateTime or datetime timeWorked = datetime.timedelta() timeWorkedWeek = datetime.timedelta() productionLaborDtls = datetime.timedelta() setupLaborDtls = datetime.timedelta() indirectLaborDtls = datetime.timedelta() days = ( datetime.datetime.today() - x.startStamp() ).days if days <= 7: timeWorkedWeek += time if startStamp or endStamp: startStamp_cmp = str(x.startStamp()).split() endStamp_cmp = str(x.endStamp()).split() if startStamp_cmp[0].count(":"): startStamp_cmp = startStamp_cmp[1] endStamp_cmp = endStamp_cmp[1] else: startStamp_cmp = startStamp_cmp[0] endStamp_cmp = endStamp_cmp[0] startStamp_cmp = cmp(str(startStamp),startStamp_cmp) < 1 endStamp_cmp = cmp(str(endStamp),endStamp_cmp) > -1 if not startStamp_cmp or not endStamp_cmp: continue laborDtls += len(x.laborDtls()) for z in x.laborDtls(): if not z.activeTrans(): stamp = z.endStamp() - z.startStamp() if z.jobType().lower() == "production": productionLaborDtls += stamp elif z.jobType().lower() == "setup": setupLaborDtls += stamp elif z.jobType().lower() == "indirect": indirectLaborDtls += stamp laborHeds += 1 timeWorked += time return [ timeWorked, laborHeds, laborDtls, timeWorkedWeek, productionLaborDtls, indirectLaborDtls, setupLaborDtls ]