class EmpChange(CachingModel): '''调动表''' changeno=models.AutoField(verbose_name=_(u'调动单号'),db_column='changeno',primary_key=True,editable=False) UserID=EmpPoPForeignKey(verbose_name=_(u"人员"),editable=True) changedate=models.DateTimeField(verbose_name=_(u'调动时间'),null=True,blank=True,editable=True,default=datetime.datetime.now()) changepostion=models.IntegerField(verbose_name=_(u'调动栏位'),choices=POSTION,editable=True,null=True,blank=True,) oldvalue=models.CharField(verbose_name=_(u'调动前'),max_length=100,editable=True,null=True,blank=True) newvalue=models.CharField(verbose_name=_(u'调动后'),max_length=100,editable=True,null=True,blank=True) changereason=models.CharField(max_length=200,verbose_name=_(u'调动原因'),null=True,blank=True,editable=True) isvalid=models.BooleanField(verbose_name=_(u'是否生效'),choices=YESORNO,editable=True,default=0) approvalstatus=models.IntegerField(verbose_name=_(u'审核状态'),choices=APPROVAL,editable=False,default=2) remark=models.CharField(verbose_name=_(u'备注'),editable=True,null=True,blank=True,max_length=200) def __unicode__(self): return self.UserID.PIN+(self.UserID.EName and " %s"%self.UserID.EName or "") def save(self): #ContentType.objects.get_for_model(obj) #print "self.changepostion:%s"%self.changepostion try: if self.changepostion and int(self.changepostion) in [1,2,3,4]: #同步人员信息表,并原还页面上有可能修改原始数据 cmp = [_(u'请选择调整后的部门'),_(u'请选择调整后的职务'),_(u'请选择调整后的雇佣类型'),_(u'请选择调整后的区域')] if not self.newvalue: raise Exception(cmp[int(self.changepostion)-1]) where={} if self.changepostion==1: self.oldvalue=self.UserID.DeptID.pk where['id__exact']=int(self.newvalue) self.UserID.DeptID=Department.objects.filter(Q(**where))[0] elif self.changepostion==2: self.oldvalue=self.UserID.Title try: where['id__exact']=int(self.newvalue) t=BaseCode.objects.filter(Q(**where)) if t: self.UserID.Title=t[0] else: self.UserID.Title="" except: self.UserID.Title=self.newvalue else: self.oldvalue=self.UserID.emptype self.UserID.emptype=int(self.newvalue) self.UserID.save() super(EmpChange,self).save() except Exception, e: import traceback; traceback.print_exc(); raise e return self
class LeaveLog(CachingModel): """ 离职操作 """ UserID=EmpPoPForeignKey(verbose_name=_(u"人员"),null=False,editable=True) leavedate=models.DateField(verbose_name=_(u'离职日期'),editable=True) leavetype=models.IntegerField(verbose_name=_(u'离职类型'),choices=LEAVETYPE,editable=True) reason=models.CharField(verbose_name=_(u'离职原因'),max_length=200,null=True,blank=True,editable=True) isReturnTools =models.BooleanField(verbose_name=_(u'是否归还工具'),choices=YESORNO, null=False,default=True, editable=True) isReturnClothes=models.BooleanField(verbose_name=_(u'是否归还工衣'),choices=YESORNO, null=False,default=True, editable=True) isReturnCard=models.BooleanField(verbose_name=_(u'是否归还卡'),choices=YESORNO, null=False,default=True, editable=True) isClassAtt=models.BooleanField(verbose_name=_(u'立即关闭考勤'),choices=YESORNO, null=False,default=0, editable=False) isClassAccess=models.BooleanField(verbose_name=_(u'立即关闭门禁'),choices=YESORNO, null=False,default=0, editable=False) is_close_pos=models.BooleanField(verbose_name=_(u'立即关闭消费'),choices=YESORNO, null=False,default=0, editable=False) def __unicode__(self): from mysite.personnel.models import Employee emp="" try: Employee.can_restore=True emp=Employee.objects.get(pk=self.UserID_id) Employee.can_restore=False except: return "" return emp.PIN +" "+ (emp.EName and u" %s"%emp.EName or "") def save(self): try: # from mysite.personnel.models.model_issuecard import IssueCard,CARD_VALID,CARD_STOP # iscard = IssueCard.objects.filter(UserID=self.UserID,cardstatus = CARD_VALID) # if get_option("POS"):#zkeco+pos # if iscard and self.is_close_pos:#立即关闭消费 # iscard[0].cardstatus = CARD_STOP # iscard[0].save(force_update=True) # if get_option("POS_IC") and iscard[0].sys_card_no: # from mysite.iclock.models.dev_comm_operate import update_pos_device_info # from mysite.iclock.models.model_device import Device,DEVICE_POS_SERVER # dev = Device.objects.filter(device_type = DEVICE_POS_SERVER) # update_pos_device_info(dev,[iscard[0]],"USERINFO") super(LeaveLog,self).save() if self.UserID.status==0: self.UserID.status=STATUS_LEAVE self.UserID.save() except Exception,e: raise Exception(e) import traceback;traceback.print_exc() pass
class USER_OF_RUN(CachingModel): UserID = EmpPoPForeignKey(verbose_name=_(u"人员"), db_column='UserID') StartDate = models.DateField(_(u'开始日期'), null=False, default=datetime.datetime.now(), blank=True) EndDate = models.DateField(_(u'结束日期'), null=False, default='2099-12-31', blank=True) NUM_OF_RUN_ID = models.ForeignKey(NUM_RUN, verbose_name=_(u'班次'), db_column='NUM_OF_RUN_ID', null=False, blank=False) ISNOTOF_RUN = models.IntegerField(null=True, default=0, blank=True, editable=False) ORDER_RUN = models.IntegerField(null=True, blank=True, editable=False) # def save(self): # self.EndDate=datetime.datetime(self.EndDate.year,self.EndDate.month,self.EndDate.day,23,59,59) # return models.Model.save(self) def get_all_Shift_Name(self): datas = NUM_RUN.objects.all() s = [] for row in datas: s.append(row["Name"]) return s def __unicode__(self): return u"%s" % self.UserID.EName #return u"%s(%s--%s)"%(self.UserID.PIN,self.StartDate.strftime("%Y-%m-%d"),self,EndDate.strftime("%Y-%m-%d")) class OpAddUserOfRun(ModelOperation): help_text = _(u"""新增员工排班""") verbose_name = _(u"新增排班") params = ( ('UserID', EmpMultForeignKey(verbose_name=_(u'人员'), blank=True, null=True)), ('StartDate', models.DateField( _(u'开始日期'), default=datetime.datetime.now().strftime("%Y-%m-01"))), ('EndDate', models.DateField( _(u'结束日期'), default=(datetime.datetime.now() + datetime.timedelta(days=31)).strftime("%Y-%m") + "-01")), ) def action(self, UserID, StartDate, EndDate): # from mysite.personnel.models.model_emp import Employee # deptIDs=self.request.POST.getlist('deptIDs') # UserIDs=self.request.POST.getlist('UserID') # dept_all=self.request.POST.get('dept_all','') # if len(UserIDs)>0: # users=Employee.objects.filter(id__in=UserIDs) # else: # if dept_all: # users=Employee.objects.filter(DeptID__in=deptIDs) # else: # users=[] users = UserID # print users if not users: raise Exception(_(u'请选择人员')) if len(users) > 1000: raise Exception(_(u'人员选择过多,最大支持1000人同时新增记录!')) sAssigned_shifts = self.request.POST.get('sAssigned_shifts', '') #print "sAssigned_shifts:%s"%sAssigned_shifts if not sAssigned_shifts: raise Exception(_(u'请选择班次')) if StartDate > EndDate: raise Exception(_(u'结束日期不能小于开始日期!')) sAssigned_shifts = eval(sAssigned_shifts) print sAssigned_shifts[0] num_run = NUM_RUN.objects.get(pk=int(sAssigned_shifts[0]['SchId'])) for u in users: USER_OF_RUN.objects.filter(UserID=u, StartDate=StartDate, EndDate=EndDate, NUM_OF_RUN_ID=num_run).delete() t = USER_OF_RUN() t.UserID = u t.StartDate = StartDate t.EndDate = EndDate t.NUM_OF_RUN_ID = num_run t.save() from mysite.att.models.__init__ import get_autocalculate_time as gct from model_waitforprocessdata import WaitForProcessData as wfpd import datetime gct_time = gct() gct_date = datetime.date(gct_time.year, gct_time.month, gct_time.day) if StartDate < gct_date or EndDate <= gct_date: wtmp = wfpd() st = datetime.datetime(StartDate.year, StartDate.month, StartDate.day, 0, 0, 0) et = datetime.datetime(EndDate.year, EndDate.month, EndDate.day, 23, 59, 59) wtmp.UserID = u wtmp.starttime = st wtmp.endtime = et #wtmp.customer=self.customer wtmp.save() # if self.request: # FetchSchPlan(self.request) class OpAddTempShifts(ModelOperation): from mysite.att.models.user_temp_sch import USER_TEMP_SCH help_text = _(u"""新增员工临时排班""") verbose_name = _(u"新增临时排班") params = ( ('UserID', EmpMultForeignKey(verbose_name=_(u'人员'), blank=True, null=True)), ('StartDate', models.DateField( _(u'开始日期'), default=datetime.datetime.now().strftime("%Y-%m-%d"))), ('EndDate', models.DateField( _(u'结束日期'), default=(datetime.datetime.now() + datetime.timedelta(days=1)).strftime("%Y-%m-%d"))), ('WorkType', USER_TEMP_SCH._meta.get_field('WorkType')), ) def action(self, UserID, StartDate, EndDate, WorkType): from mysite.personnel.models.model_emp import Employee from mysite.att.models.schclass import SchClass from mysite.att.models.user_temp_sch import USER_TEMP_SCH import datetime from mysite.personnel.models import Department if self.request: #addTemparyShifts(self.request) st = self.request.POST.get('StartDate', "") et = self.request.POST.get('EndDate', "") start = st.replace("/", "-") endt = et.replace("/", "-") chklbSchClass = self.request.POST.getlist("sTimeTbl") chklbDates = self.request.POST.getlist("sDates") OverTime = self.request.POST.get('OverTime', '') users = UserID flag = self.request.POST.get('Flag', '1') #print 'flag:%s'%flag is_OT = self.request.POST.get('is_OT', '') is_OT = (str(is_OT) == 'on') # #获取用户 # if len(UserIDs)>0: # users=Employee.objects.filter(id__in=UserIDs) # else: # if dept_all: # users=Employee.objects.filter(DeptID__in=deptIDs) # else: # users=[] if not users: raise Exception(_(u'请选择人员')) if len(users) > 1000: raise Exception(_(u'人员选择过多,最大支持1000人同时新增记录!')) if not chklbDates: raise Exception(_(u'请选择日期')) if not chklbSchClass: raise Exception(_(u'请选择时段')) #获取时间段 schs = SchClass.objects.filter(pk__in=chklbSchClass) # for sch in schs: # st=datetime.strptime(start+' '+ sch.StartTime.strftime('%H:%M:%S'),"%Y-%m-%d %H:%M:%S") # et=datetime.strptime(endt+' '+ sch.EndTime.strftime('%H:%M:%S'),"%Y-%m-%d %H:%M:%S") # # for u in users: # # sql="delete from %s where UserID=%s and SchClassID=%s and ComeTime>='%s' and LeaveTime<='%s'"%( USER_TEMP_SCH._meta.db_table, # u.pk,sch.pk,st.strftime("%Y-%m-%d %H:%M:%S"),et.strftime("%Y-%m-%d %H:%M:%S")) # print "sql:%s"%sql # customSql(sql) # #循环保存临时排班 for day in chklbDates: day = day.replace("/", "-") for sch in schs: #格式化时间 st = datetime.datetime.strptime( day + ' ' + sch.StartTime.strftime('%H:%M:%S'), '%Y-%m-%d %H:%M:%S') et = datetime.datetime.strptime( day + ' ' + sch.EndTime.strftime('%H:%M:%S'), '%Y-%m-%d %H:%M:%S') if et < st: #判断时间段是否跨天 et = et + datetime.timedelta(days=1) #清除已经排过的临时排班 #USER_TEMP_SCH.objects.filter(UserID__in=users,SchclassID__exact=sch.pk,ComeTime__exact=st,LeaveTime__exact=et).delete() #保存 for u in users: USER_TEMP_SCH.objects.filter( UserID__exact=u, SchclassID__exact=sch.pk, ComeTime__exact=st, LeaveTime__exact=et).delete() t = USER_TEMP_SCH() t.UserID = u t.ComeTime = st t.LeaveTime = et t.WorkType = WorkType t.Flag = flag if is_OT: t.OverTime = OverTime t.SchclassID = sch.pk t.save() class OpDeleteShift(Operation): help_text = _(u"""删除排班记录""") verbose_name = _(u"删除排班记录") def action(self): self.object.delete() class OpClearShift(ModelOperation): help_text = _(u"""清空排班记录""") verbose_name = _(u"清空排班记录") tips_text = _(u"确认要清空所有排班记录") def action(self): filterdata_by_user(self.model.objects.all(), self.request.user).delete() # self.model.objects.all().delete() class OpClearEmpShift(ModelOperation): help_text = _(u"""清空临时排班记录""") verbose_name = _(u"清空临时排班记录") tips_text = _(u"确认要清空所有临时排班记录") def action(self): from mysite.att.models.user_temp_sch import USER_TEMP_SCH filterdata_by_user(USER_TEMP_SCH.objects.all(), self.request.user).delete() class Admin(CachingModel.Admin): default_give_perms = ["contenttypes.can_AttUserOfRun"] sort_fields = ["UserID.PIN"] default_widgets = {'UserID': ZMulEmpChoiceWidget} list_filter = ( 'UserID', 'NUM_OF_RUN_ID', 'StartDate', 'EndDate', ) search_fields = ['UserID', 'NUM_OF_RUN_ID'] api_fields = [ 'UserID.PIN', 'UserID.EName', 'NUM_OF_RUN_ID.Name', 'StartDate', 'EndDate' ] list_display = [ 'UserID_id', 'UserID.PIN', 'UserID.EName', 'NUM_OF_RUN_ID_id', 'NUM_OF_RUN_ID.Name', 'StartDate', 'EndDate', 'create_time' ] log = True visible = False class Meta: app_label = 'att' db_table = 'user_of_run' verbose_name = _(u'员工排班') verbose_name_plural = verbose_name unique_together = (("UserID", "NUM_OF_RUN_ID", "StartDate", "EndDate"), )
class LeaveLog(CachingModel): """ 离职操作 """ UserID = EmpPoPForeignKey(verbose_name=_(u"人员"), null=False, editable=True) leavedate = models.DateField(verbose_name=_(u'离职日期'), editable=True) leavetype = models.IntegerField(verbose_name=_(u'离职类型'), choices=LEAVETYPE, editable=True) reason = models.CharField(verbose_name=_(u'离职原因'), max_length=200, null=True, blank=True, editable=True) isReturnTools = models.BooleanField(verbose_name=_(u'是否归还工具'), choices=YESORNO, null=False, default=True, editable=True) isReturnClothes = models.BooleanField(verbose_name=_(u'是否归还工衣'), choices=YESORNO, null=False, default=True, editable=True) isReturnCard = models.BooleanField(verbose_name=_(u'是否归还卡'), choices=YESORNO, null=False, default=True, editable=True) isClassAtt = models.BooleanField(verbose_name=_(u'立即关闭考勤'), choices=YESORNO, null=False, default=0, editable=False) isClassAccess = models.BooleanField(verbose_name=_(u'立即关闭门禁'), choices=YESORNO, null=False, default=0, editable=False) def __unicode__(self): return self.UserID.PIN + " " + (self.UserID.EName and u" %s" % self.UserID.EName or "") def save(self): try: super(LeaveLog, self).save() if self.UserID.status == 0: self.UserID.status = STATUS_LEAVE self.UserID.save() except: import traceback traceback.print_exc() pass class _delete(Operation): help_text = _(u"删除选定记录") #删除选定的记录 verbose_name = _(u"删除") visible = False def action(self): self.object.delete() class OpRestoreEmpLeave(Operation): help_text = _(u'恢复离职人员') verbose_name = _(u'离职恢复') def action(self): import datetime emp = self.object.UserID if emp.isblacklist == 1: raise Exception(_(u'黑名单不能处理离职恢复!')) emp.__class__.can_restore = True emp.isblacklist = None emp.status = STATUS_OK emp.Hiredday = datetime.datetime.now().strftime("%Y-%m-%d") emp.save() emp.__class__.can_restore = False #下载到设备 newObj = self.object.UserID from mysite.iclock.models.model_cmmdata import adj_user_cmmdata #sync_set_user(newObj.search_device_byuser(), [newObj]) adj_user_cmmdata(newObj, [], newObj.attarea.all()) self.object.delete() class OpCloseAtt(Operation): help_text = _(u'关闭考勤') verbose_name = _(u'关闭考勤') def action(self): oldObj = self.object.UserID if self.object.isClassAtt == 1: raise Exception(_(u"考勤已经关闭!")) self.object.isClassAtt = 1 self.object.save() devs = oldObj.search_device_byuser() sync_delete_user(devs, [oldObj]) class _change(ModelOperation): visible = False def action(self): pass class OpCloseAccess(Operation): help_text = _(u'关闭门禁') verbose_name = _(u'关闭门禁') def action(self): oldObj = self.object.UserID if oldObj.check_accprivilege(): devs = oldObj.search_accdev_byuser() sync_delete_user(devs, [oldObj]) sync_delete_user_privilege(devs, [oldObj]) if self.object.isClassAccess == 1: raise Exception(_(u"门禁已经关闭!")) self.object.isClassAccess = 1 self.object.save() class Admin(CachingModel.Admin): sort_fields = ["UserID.PIN", "leavedate"] app_menu = "personnel" menu_index = 4 visible = "mysite.att" in settings.INSTALLED_APPS #暂只有考勤使用 list_filter = ('UserID', 'leavedate', 'leavetype', 'isReturnTools', 'isReturnCard', 'isReturnClothes') query_fields = [ 'UserID__PIN', 'UserID__EName', 'leavedate', 'leavetype', 'reason' ] list_display = [ 'UserID.PIN', 'UserID.EName', 'UserID.DeptID', 'UserID.isblacklist', 'leavedate', 'leavetype', 'isClassAtt', 'reason' ] + acc disabled_perms = [ 'change_leavelog', 'dataimport_leavelog', 'delete_leavelog' ] + init_settings help_text = _(u"加入黑名单的人员,将不能离职恢复") class Meta: verbose_name = _(u'人员离职') verbose_name_plural = verbose_name app_label = 'personnel'
class CarCashSZ(CachingModel): user = EmpPoPForeignKey(verbose_name=_(u"人员"), null=False, editable=True) card = models.CharField(_(u'卡号'), max_length=20, null=False, blank=True, editable=True, default='') sys_card_no = models.IntegerField(verbose_name=_(u"卡账号"), null=True, blank=True, editable=True) # dept_id = models.IntegerField(_(u'部门id'),max_length=10, null=True, blank=True,editable=False) dept = DeptForeignKey(verbose_name=_(u'部门'), editable=True, null=True) sn_name = models.CharField(_(u'设备序列号'), max_length=40, null=True, blank=True) cardserial = models.IntegerField(_(u'卡流水号'), max_length=20, null=True, blank=True) serialnum = models.IntegerField(_(u'设备流水号'), max_length=20, null=True, blank=True) checktime = models.DateTimeField(verbose_name=_(u'操作时间'), default=datetime.datetime.now(), blank=True, editable=True, null=True) type = CashTypeForeignKey(verbose_name=_(u'类型'), null=False, blank=False, editable=True) money = models.DecimalField(max_digits=19, decimal_places=2, verbose_name=_(u'金额(元)'), null=False, blank=False, editable=True) discount = models.SmallIntegerField(verbose_name=_(u"折扣"), default=0, max_length=3, null=True, blank=True, editable=False) #Integer hide_column = models.SmallIntegerField(_(u'类型名称'), max_length=10, null=True, blank=True, choices=CASHTYPE) dining = models.ForeignKey(Dininghall, verbose_name=_(u'餐厅'), editable=True, blank=True, null=True) # dining = models.CharField(_(u'餐厅'),max_length=20,null=True,blank=True,editable=False) blance = models.DecimalField(verbose_name=_(u'余额'), max_digits=20, null=True, blank=True, decimal_places=2, editable=True) convey_time = models.DateTimeField(verbose_name=_(u'上传时间'), blank=True, editable=True, null=True) allow_type = models.SmallIntegerField(_(u'补贴类型'), max_length=10, null=True, blank=True, choices=AllOW_TYPE) allow_batch = models.SmallIntegerField(_(u'补贴批次'), max_length=10, null=True, blank=True) allow_base_batch = models.SmallIntegerField(_(u'补贴基次'), max_length=10, null=True, blank=True) log_flag = models.SmallIntegerField(_(u'记录类型'), null=True, default=2, blank=True, editable=False, choices=LOGFLAG) def __unicode__(self): return "" # return u"%s"%self.user def get_montype(self): u"得到卡类型get具有缓存" type = "" if not self.type_id: return type try: type = CarCashType.objects.get(id=self.type_id) if type.type == 2: type = u"%s" % _(u'支出') else: type = u"%s" % _(u'支入') except: import traceback traceback.print_exc() pass return type if self.type.type == 2: return u"%s" % _(u'支出') elif self.type.type == 1: return u"%s" % _(u"收入") def save(self, *args, **kwargs): try: if get_option("POS_ID"): if self.serialnum and self.sn_name: iskey = "CarCashSZ_%s%s" % (self.serialnum, self.sn_name) cache.set(iskey, self, TIMEOUT) op = threadlocals.get_current_user() self.create_operator = op.username serino = get_cardserial_from_cache(self.card) self.cardserial = serino models.Model.save(self, args) else: super(CarCashSZ, self).save() except: import traceback traceback.print_exc() # def delete(self): # raise Exception(_(u'该人员的消费记录不允许删除')) def get_pin(self): emp_pin = "" try: Employee.can_restore = True emp_obj = Employee.objects.get(id=self.user_id) Employee.can_restore = False emp_pin = emp_obj.PIN except: pass return emp_pin def get_ename(self): emp_name = "" try: Employee.can_restore = True emp_obj = Employee.objects.get(id=self.user_id) Employee.can_restore = False emp_name = emp_obj.EName except: pass return emp_name def get_dept_name(self): u'''从缓存中得到部门的Name''' from mysite.personnel.models.model_emp import get_dept dept_name = "" try: dept_obj = get_dept(self.user_id) dept_name = dept_obj.name except: pass return dept_name def get_type_name(self): u"得到卡类型get具有缓存" name = "" if not self.type_id: return name try: name = CarCashType.objects.get(id=self.type_id) name = u"%s" % name.name except: pass return name class Admin(CachingModel.Admin): sort_fields = [ "-checktime", "money", "serialnum", "cardserial", "checktime" ] app_menu = "pos" menu_group = 'pos' menu_index = 5 cache = 3600 visible = True if get_option("POS_ID"): query_fields = [ 'user.PIN', 'card', 'hide_column', 'checktime', ] adv_fields = [ 'card', 'type.type', 'money', 'blance', 'discount', 'checktime', 'create_operator', 'sn_name', 'serialnum', 'cardserial', ] list_display = [ 'user.PIN', 'user.EName', 'user.DeptID', 'card', 'hide_column', 'type.type', 'money', 'blance', 'discount', 'checktime', 'create_operator', 'sn_name', 'serialnum', 'cardserial', ] else: query_fields = [ 'user.PIN', 'hide_column', 'sn_name', 'checktime', ] adv_fields = [ 'card', 'sys_card_no', 'type', 'serialnum', 'money', 'blance', 'create_operator', 'checktime', 'log_flag' ] list_display = [ 'user.PIN', 'user.EName', 'user.DeptID', 'card', 'sys_card_no', 'cardserial', 'hide_column', 'type.type', 'allow_type', 'money', 'blance', 'convey_time', 'checktime', 'sn_name', 'serialnum', 'create_operator', 'log_flag' ] search_fields = ['checktime'] newadded_column = { "user.PIN": "get_pin", "user.EName": "get_ename", "type.type": "get_montype", "user.DeptID": "get_dept_name" } tstart_end_search = { "checktime": [_(u"起始时间"), _(u"结束时间")] } #配置时间字段(TimeField,DatetimeField,DateField)可以有起始和结束查找 disabled_perms = ['change_carcashsz', 'add_carcashsz'] class _delete(Operation): help_text = _(u"删除选定记录") #删除选定的记录 verbose_name = _(u"删除") visible = False def action(self): raise Exception(_(u'该人员的消费记录不允许删除')) class _change(ModelOperation): visible = False def action(self): pass class _add(ModelOperation): visible = False def action(self): pass class Meta: app_label = 'pos' verbose_name = _(u'卡现金收支') verbose_name_plural = verbose_name if get_option("POS_IC"): unique_together = (("sn_name", "hide_column", "sys_card_no", "money", "checktime"), )
class Allowance(CachingModel): user = EmpPoPForeignKey(verbose_name=_(u"人员"), null=False, blank=False, editable=True) # pin = models.CharField(_(u'人员编号'), db_column="badgenumber", null=False, max_length=20) # ename = models.CharField(_(u'姓名'), db_column="name", null=True, max_length=24, blank=True, default="") # cardno = models.CharField(_(u'卡号'), max_length=20, null=False, blank=True, editable=True, default='') money = models.DecimalField(max_digits=8, decimal_places=2, verbose_name=_(u"补贴金额")) receive_money = models.DecimalField(max_digits=8, decimal_places=2, verbose_name=_(u"领取金额"), null=True, blank=True, editable=False) is_pass = models.IntegerField(verbose_name=_(u"是否通过审核"), editable=True, default=0, choices=YESORNO, blank=True, null=False) pass_name = models.CharField(max_length=100, verbose_name=_(u"审核通过人员"), blank=True, null=True, editable=False) valid_date = models.DateField(verbose_name=_(u"补贴有效日期"), blank=True, null=True, editable=True) receive_date = models.DateTimeField(verbose_name=_(u"补贴领取时间"), blank=True, null=True, editable=False) date = models.DateTimeField(verbose_name=_(u"补贴时间"), blank=False, null=False, editable=False) remark = models.CharField(max_length=200, verbose_name=_(u"备注"), blank=True, null=True) batch = models.CharField(max_length=20, verbose_name=_(u"补贴批次"), blank=True, null=True, editable=True) base_batch = models.CharField(max_length=20, verbose_name=_(u"补贴基次"), blank=True, null=True, editable=False) is_ok = models.IntegerField(verbose_name=_(u"是否领取"), editable=True, default=0, choices=YESORNO, blank=True, null=True) is_transfer = models.IntegerField(verbose_name=_(u"是否下发"), editable=False, default=0, choices=YESORNO, blank=True, null=True) sys_card_no = models.IntegerField(verbose_name=_(u"卡账号"), null=True, blank=True, editable=False) def __unicode__(self): return u"%s" % self.user def data_valid(self, sendtype): if self.is_pass == 1: raise Exception(_(u'该数据已经审核通过,不能修改')) def save(self, *args, **kwargs): try: self.date = datetime.datetime.now() if get_option("POS_IC") and self.pk is not None: now = datetime.datetime.now().date() if self.valid_date is None: raise Exception(_(u"补贴有效日期不能为空")) if now > self.valid_date: raise Exception(_(u"有效日期必须大于当前日期")) if get_option("POS_IC") and self.pk is None: from mysite.personnel.models.model_issuecard import IssueCard, CARD_VALID, CARD_OVERDUE now_time = datetime.datetime.now() if ONLINE_ALLOWANCE: #在线补贴模式 self.batch = ((now_time.year - 2000) * 12 + now_time.month) * 31 + now_time.day else: self.batch = now_time.strftime("%Y%m")[2:] objcard = IssueCard.objects.get( UserID=self.user, cardstatus__in=[CARD_OVERDUE, CARD_VALID]) if objcard: self.sys_card_no = objcard.sys_card_no else: raise Exception(_(u"编号%s人员没有发卡") % self.user) super(Allowance, self).save() except IntegrityError: raise Exception(_(u"所选补贴人员中编号%s人员当月补贴已经登记!") % self.user) class OpReloadAllowance(Operation): help_text = _(u"重新下发审核通过,但未能领取的补贴到补贴设备") verbose_name = _(u"重新下发补贴") visible = get_option("POS_IC") and not ONLINE_ALLOWANCE def action(self): if self.object.is_pass == 0: raise Exception(_(u"编号%s人员补贴没有通过审核,操作失败") % self.object.user) if self.object.is_ok == 1: raise Exception(_(u"编号%s人员补贴已被领取,操作失败") % self.object.user) from mysite.iclock.models.model_device import Device, DEVICE_POS_SERVER from mysite.iclock.models.dev_comm_operate import update_pos_device_info dev = Device.objects.filter(device_type=DEVICE_POS_SERVER, device_use_type=2) #查找补贴机 if dev: update_pos_device_info(dev, [self.object], "SUBSIDYLOG") else: raise Exception(_(u"当前系统,没有补贴设备,操作失败")) class dataimport(ModelOperation): if get_option("POS_IC"): help_text = _( u"导入补贴数据:1.导入的人员必须是登记过卡帐号的人员,并且该人员的卡帐号必须是有效的卡。员工每月只支持一次补贴!2.卡状态为挂失,停用,过期的人员不能进行补贴登记,系统自动过滤!3.补贴导入成功后系统会自动下发设备指令,(直接审核通过)不可以再做修改!" ) #导入 else: help_text = _( u"导入补贴数据:1.卡状态为挂失,停用,过期的人员不能进行补贴登记,系统自动过滤!2.补贴导入成功后系统会直接审核通过,不可以再做修改!" ) #导入 verbose_name = _(u"导入") visible = True def action(self): from mysite.iclock.models.model_device import Device, DEVICE_POS_SERVER if get_option("POS_IC"): devlist = Device.objects.filter(device_type=DEVICE_POS_SERVER, device_use_type=2) #查找补贴机 if not devlist: raise Exception(_(u"当前系统,没有补贴设备,操作失败")) if get_option("POS_IC"): from mysite.pos.ic_allowance_import import ICImportAllowData obj_import = ICImportAllowData(req=self.request, input_name="import_data") else: from mysite.pos.id_allowance_import import IDImportAllowData obj_import = IDImportAllowData(req=self.request, input_name="import_data") obj_import.exe_import_data() ret_error = obj_import.error_info if ret_error: import traceback traceback.extract_stack() raise Exception(u"%(ret)s" % {"ret": ";".join(ret_error)}) class OpAudit(Operation): if get_option("POS_ID"): help_text = _(u"审核通过时系统会在卡现金收支表中增加一条补贴记录,审核通过的记录不允许再修改") else: help_text = _(u"审核通过时系统会自动下发指令,审核通过的记录不允许再修改") verbose_name = _(u"审核补贴") @transaction.commit_on_success def action(self): if self.object.is_pass == 0: from mysite.personnel.models.model_issuecard import IssueCard, CARD_VALID, CARD_OVERDUE from mysite.iclock.models.model_device import Device, DEVICE_POS_SERVER try: if get_option("POS_ID"): key = "IssueCard_%s" % self.object.user.Card iscarobj = get_issuecard(key, IssueCard) # iscarobj = IssueCard.objects.get(cardno=self.object.user.Card,cardstatus__in = [CARD_OVERDUE,CARD_VALID]) else: from mysite.personnel.models.model_issuecard import IssueCard, CARD_VALID, CARD_OVERDUE iscarobj = IssueCard.objects.get( sys_card_no=self.object.sys_card_no, cardstatus__in=[CARD_OVERDUE, CARD_VALID]) except: iscarobj = None try: if iscarobj: now = datetime.datetime.now().date() dev = [] valid_date = self.object.valid_date if get_option("POS_IC"): batch = self.object.batch allowance_list = Allowance.objects.filter( sys_card_no=self.object.sys_card_no, batch__lt=batch, is_pass=0) #获取小余当前记录的批次的没有审核的补贴记录 if allowance_list: raise Exception( _(u"编号%s人员存在小于当前补贴批次号的未审核的补贴记录,请先审核小批次的记录!" ) % self.object.user) if get_option("POS_IC") and now > valid_date: raise Exception( _(u"编号%s人员补贴记录已超过补贴有效期") % self.object.user) if iscarobj.cardstatus != CARD_VALID: raise Exception( _(u"编号%s卡已挂失或过期,无法补贴") % self.object.user) if get_option("POS_IC"): dev = Device.objects.filter( device_type=DEVICE_POS_SERVER, device_use_type=2) #查找补贴机 if not dev: raise Exception(_(u"当前系统,没有补贴设备,操作失败")) newblan = iscarobj.blance + self.object.money if iscarobj.type is not None: from mysite.personnel.models.model_iccard import ICcard iccardobj = ICcard.objects.get(pk=iscarobj.type_id) lessmoney = iccardobj.less_money #卡类最小余额 maxmoney = iccardobj.max_money #卡类最大余额 if lessmoney > newblan and lessmoney > 0: raise Exception( _(u"人员编号%s超出卡类最小余额") % self.object.user) if newblan > maxmoney and maxmoney > 0: raise Exception( _(u"人员编号%s超出卡类最大余额") % self.object.user) if maxmoney == 0 and newblan > 10000: raise Exception( _(u"人员编号%s超出系统允许最大余额") % self.object.user) self.object.is_pass = 1 self.object.pass_name = unicode(self.request.user) self.object.save() if get_option("POS_ID"): from mysite.pos.models.model_carcashsz import CarCashSZ from mysite.pos.models.model_carcashtype import CarCashType newblan = iscarobj.blance + self.object.money CarCashSZ( user=self.object.user, card=iscarobj.cardno, checktime=datetime.datetime.now(), type=CarCashType.objects.get(id=2), #消费类型 money=self.object.money, hide_column=2, blance=newblan, ).save() iscarobj.blance = newblan iscarobj.save() else: from mysite.iclock.models.dev_comm_operate import update_pos_device_info if dev: update_pos_device_info(dev, [self.object], "SUBSIDYLOG") else: raise Exception(_(u"编号%s人员没有有效的卡号") % self.object.user) except Exception, e: # raise Exception(_(u"审核失败")) import traceback traceback.print_exc() raise e else:
class OverTime(CachingModel): emp = EmpPoPForeignKey(verbose_name=_(u'人员'), null=False, blank=False) starttime = models.DateTimeField(_(u'开始时间'), null=False, blank=False) endtime = models.DateTimeField(_(u'结束时间'), null=False, blank=False) remark = models.CharField(_(u'加班描述'), null=True, blank=True, max_length=200) audit_status = models.IntegerField(_(u'审核状态'), null=False, blank=False, default=APPLICATION, choices=APPLICATION_STATUS, editable=False) auditreason = models.CharField(_(u'审核原因'), null=True, blank=True, max_length=100, editable=False) def __unicode__(self): return u"%s" % (self.emp) def save(self): #验证 obj_tmp = OverTime.objects.filter(emp=self.emp, starttime__lte=self.endtime, endtime__gte=self.starttime) if obj_tmp and obj_tmp[0].pk != self.pk: raise Exception(_(u'加班记录重复')) if self.endtime <= self.starttime: raise Exception(_(u'结束时间不能小于等于开始时间')) req = get_current_request() if self.pk: #编辑 tmp = OverTime.objects.get(pk=self.pk) if req.session.has_key("employee"): #员工自助用户申请或者重新申请 if tmp.audit_status == REFUSE: self.audit_status = APPLICATION_AGAIN if tmp.audit_status == AUDIT_SUCCESS: raise Exception(_(u'该记录已审核')) elif (not req.session.has_key("employee")): #管理员,新增,默认就是审核通过 self.audit_status = AUDIT_SUCCESS super(OverTime, self).save() # from mysite.att.calculate.global_cache import JBD_DATA # if JBD_DATA.has_key(self.emp.id): # del JBD_DATA[self.emp.id] if self.audit_status == AUDIT_SUCCESS: from mysite.att.models.__init__ import get_autocalculate_time as gct from model_waitforprocessdata import WaitForProcessData as wfpd gct_time = gct() if self.starttime < gct_time or self.endtime <= gct_time: wtmp = wfpd() st = datetime.datetime(self.starttime.year, self.starttime.month, self.starttime.day, 0, 0, 0) et = datetime.datetime(self.endtime.year, self.endtime.month, self.endtime.day, 23, 59, 59) wtmp.UserID = self.emp wtmp.starttime = st wtmp.endtime = et wtmp.save() def delete(self): u"删除加班单" req = get_current_request() if req.session.has_key("employee"): if self.audit_status == AUDIT_SUCCESS: raise Exception(_(u'审核通过的记录不能被删除')) if self.audit_status == AUDIT_SUCCESS: from model_waitforprocessdata import WaitForProcessData as wfpd wtmp = wfpd() st = datetime.datetime(self.starttime.year, self.starttime.month, self.starttime.day, 0, 0, 0) et = datetime.datetime(self.endtime.year, self.endtime.month, self.endtime.day, 23, 59, 59) wtmp.UserID = self.emp wtmp.starttime = st wtmp.endtime = et wtmp.save() super(OverTime, self).delete() # from mysite.att.calculate.global_cache import JBD_DATA # if JBD_DATA.has_key(self.emp.id): # del JBD_DATA[self.emp.id] @staticmethod def clear(): OverTime.objects.all().delete() class OpAuditManyEmployee(Operation): u"批量审核" verbose_name = _(u'审批') help_text = _(u'加班单审批') params = ( ('stat', models.IntegerField(_(u'审核状态'), null=False, blank=False, default=AUDIT_SUCCESS, choices=AUDIT_STATUS)), ('reason', models.CharField(_(u'审核原因'), null=True, blank=True, max_length=100)), ) def action(self, stat, reason): if self.object.audit_status == AUDIT_SUCCESS: raise Exception( _(u"%(emp)s,%(st)s,%(et)s,%(rm)s 已审核") % { "emp": self.object.emp, "st": self.object.starttime, "et": self.object.endtime, "rm": self.object.remark }) self.object.audit_status = stat self.object.auditreason = reason self.object.save() class _add(ModelOperation): visible = False help_text = _(u"新增记录") #新增记录 verbose_name = _(u"新增") def action(self): pass class OpAddManyOvertime(ModelOperation): help_text = _(u'''新增''') verbose_name = _(u"新增加班单") params = ( ('UserID', EmpMultForeignKey(verbose_name=_(u'人员'), blank=True, null=True)), ('starttime', models.DateTimeField(_(u'开始时间'), null=False, blank=False)), ('endtime', models.DateTimeField(_(u'结束时间'), null=False, blank=False)), ('remark', models.CharField(_(u'加班描述'), null=True, blank=True, max_length=200)), ) def action(self, **args): emps = args.pop('UserID') if args['starttime'] >= args['endtime']: raise Exception(_(u'结束时间不能小于等于开始时间')) if not emps: raise Exception(_(u'请选择人员')) if len(emps) > 1000: raise Exception(_(u'人员选择过多,最大支持1000人同时新增记录!')) for emp in emps: OverTime(emp=emp, **args).save() class Admin(CachingModel.Admin): menu_index = 6 query_fields = [ 'emp.PIN', 'emp.EName', 'remark', 'audit_status', 'auditreason' ] list_display = [ 'emp', 'starttime', 'endtime', 'remark', 'audit_status|audit_filter', 'auditreason' ] class Meta: app_label = 'att' verbose_name = _(u'加班单') unique_together = (("emp", "starttime", "endtime"), )
class Notice(CachingModel): id = models.AutoField(verbose_name=_(u'编号'), primary_key=True, null=False, editable=False) context = models.TextField(verbose_name=_(u'短消息内容'), max_length=320) starttime = models.DateTimeField(_(u'开始时间'), null=True) lasttime = models.IntegerField(verbose_name=_(u'短消息持续时间(分)'), max_length=20, default=60) device = DevicePoPForeignKey(verbose_name=_(u'设备'), db_column='DeviceID', null=True, blank=True, editable=False) user = EmpPoPForeignKey(verbose_name=_(u'人员'), db_column='UserID', null=True, blank=True, editable=False) isset = models.IntegerField(_(u'是否下发'), choices=YESORNO, default=0, editable=False) def __unicode__(self): return u"短消息(ID:%s)" % self.id def save(self, **args): self.context = self.context.replace('\r', '').replace('\n', '').replace('\t', '') clen = len(self.context.encode('ascii', 'ignore')) tlen = clen + (len(self.context) - clen) * 2 if tlen > 320: raise Exception(_(u'短消息内容不能超过320个字符')) super(Notice, self).save(**args) def delete(self, **args): sync_del_notice(self.id, user=self.user, device=self.device) super(Notice, self).delete() class _add(ModelOperation): visible = False help_text = _(u"新增记录") #新增记录 verbose_name = _(u"新增") def action(self): pass # class OpAddUserMsg(ModelOperation): # help_text=_(u'''新增对私信息''') # verbose_name=_(u"新增对私公告") # params=( ## ('device' , DeviceMultForeignKey(verbose_name=_(u'设备'),db_column='DeviceID',null=False, blank=False)), # ('user' , EmpMultForeignKey(verbose_name=_(u'人员'), db_column='UserID',null=True, blank=True)), # ('context', models.TextField(verbose_name=_(u'公告内容'),max_length=320)), # ('starttime', models.DateTimeField(_(u'开始时间'),null=True)), # ('lasttime', models.IntegerField(verbose_name=_(u'公告持续时间(分)'), max_length=20,default=60)), # ) # def action(self, **args): # users=args.pop('user') # if self.request: # if not users: # depts=self.request.POST.getlist('deptIDs') # users=Employee.objects.filter(DeptID__in=depts) # if not users: # raise Exception(_(u'请选择人员')) # for user in users: # Notice(user=user, **args).save() class AddCmd(Operation): help_text = _(u"""把信息下发到设备中去""") verbose_name = _(u'短消息下发') def action(self): starttime = self.object.starttime.strftime("%Y-%m-%d %H:%M:%S") users = self.object.user devices = self.object.device if users: sync_set_notice(self.object.id, self.object.context, starttime, self.object.lasttime, user=users) if devices: sync_set_notice(self.object.id, self.object.context, starttime, self.object.lasttime, device=devices) aa = self.object aa.isset = 1 aa.save() def get_area(self): return u",".join([a.areaname for a in self.area.all()]) def get_user(self): return u",".join([u.EName for u in self.user.all()]) class Admin(CachingModel.Admin): #管理该模型 sort_fields = ['id', 'starttime'] #需要排序的字段,放在列表中 menu_group = 'personnel' #在哪个app应用下 menu_index = 5 #菜单的摆放的位置 list_display = [ 'starttime', 'lasttime', 'isset', 'context', 'user.PIN' ] query_fields = ['device__sn', 'user__PIN', 'user__EName'] #需要查找的字段 adv_fields = list_display visible = get_option("NOTICE_VISIBLE") class Meta: verbose_name = _(u'设备短消息') #名字 verbose_name_plural = verbose_name app_label = 'iclock' #属于哪个app
class CheckExact(CachingModel): ''' 补签表模型 ''' UserID = EmpPoPForeignKey(verbose_name=_(u'人员'),db_column='UserID', editable=True) CHECKTIME = models.DateTimeField(_(u'签卡时间'),null=False, blank=False) CHECKTYPE=models.CharField(_(u'考勤状态'),max_length=5, default=0,choices=ATTSTATES) ISADD=models.SmallIntegerField(null=True, blank=True,editable=False) YUYIN=models.CharField(_(u'签卡原因'),max_length=100, null=True, blank=True) ISMODIFY=models.SmallIntegerField(null=True, default=0,blank=True,editable=False) ISDELETE=models.SmallIntegerField(null=True,default=0, blank=True,editable=False) INCOUNT=models.SmallIntegerField(null=True,default=0, blank=True,editable=False) ISCOUNT=models.SmallIntegerField(null=True, default=0,editable=False) MODIFYBY = models.CharField(_(u'修改'),max_length=20,null=True, blank=True,editable=False) DATE=models.DateTimeField(_(u'员工考勤修改日志日期'),null=True, blank=True,editable=False) def save(self,**args): ce=CheckExact.objects.filter(UserID=self.UserID,CHECKTIME=self.CHECKTIME) if ce and ce[0].id!=self.id: raise Exception(_(u'补签记录输入重复')) if self.pk!=None: ce=CheckExact.objects.get(pk=self.pk) old="" if ce: old=Transaction.objects.filter(UserID=self.UserID,TTime=ce.CHECKTIME) super(CheckExact,self).save(**args) if old: t=old[0] else: t=Transaction() t.UserID=self.UserID t.TTime=self.CHECKTIME t.State=self.CHECKTYPE t.Verify=5 t.save() #---添加到签卡原始数据表 from mysite.att.models.__init__ import get_autocalculate_time as gct from model_waitforprocessdata import WaitForProcessData as wfpd import datetime gct_time=gct() if self.CHECKTIME<gct_time: wtmp=wfpd() st=datetime.datetime(self.CHECKTIME.year,self.CHECKTIME.month,self.CHECKTIME.day,0,0,0) et=datetime.datetime(self.CHECKTIME.year,self.CHECKTIME.month,self.CHECKTIME.day,23,59,59) wtmp.UserID=self.UserID wtmp.starttime=st wtmp.endtime=et #wtmp.customer=self.customer wtmp.save() #---添加考勤计算任务计划 class _add(ModelOperation): visible=False verbose_name=_(u'新增') def action(self): pass def delete(self): Transaction.objects.filter(UserID=self.UserID,TTime=self.CHECKTIME).delete() super(CheckExact,self).delete() def __unicode__(self): return u"%s"%self.UserID class OpAddManyCheckExact(ModelOperation): verbose_name=_(u"新增补签卡") help_text=_(u'新增补签卡同时会在原始记录表中增加一条相同记录,修改时会同时修改原始记录表中的相同记录') params=( ('UserID', EmpMultForeignKey(verbose_name=_(u'人员'),blank=True,null=True)), ('checktime',models.DateTimeField(_(u'签卡时间'))), ('checktype',models.CharField(_(u'考勤状态'), choices=ATTSTATES)), ('reason',models.CharField(_(u'签卡原因'),blank=True,null=True,max_length=100)), ) def action(self,UserID,checktime,checktype,reason): if self.request: if UserID==0: depts=self.request.POST.getlist('deptIDs') UserID=Employee.objects.filter(DeptID__in=depts) if not UserID: raise Exception(_(u'请选择人员')) ce=CheckExact.objects.filter(UserID__in=UserID,CHECKTIME=checktime) if ce.count()>0: raise Exception(_(u'补签记录输入重复')) for emp in UserID: ck=CheckExact() ck.UserID=emp ck.CHECKTIME=checktime ck.YUYIN=reason ck.CHECKTYPE=checktype ck.save() class Admin(CachingModel.Admin): default_give_perms=["contenttypes.can_AttCalculate",] sort_fields=["UserID.PIN","CHECKTIME"] menu_index=2 app_menu="att" api_fields=('UserID.PIN','UserID.EName','CHECKTIME','CHECKTYPE','YUYIN') list_display=('UserID_id','UserID.PIN','UserID.EName','CHECKTIME','CHECKTYPE','YUYIN',) list_filter =('UserID','CHECKTIME','CHECKTYPE','YUYIN') query_fields=('UserID__PIN','UserID__EName','CHECKTIME','CHECKTYPE','YUYIN') hide_fields=('UserID_id',) disabled_perms=["add_checkexact",'dataimport_checkexact'] #default_widgets={'UserID': ZMulEmpChoiceWidget} class Meta: app_label='att' db_table = 'checkexact' verbose_name=_(u'补签卡') verbose_name_plural=verbose_name
class EmpSpecDay(CachingModel): ''' 请假原始表模型 ''' emp = EmpPoPForeignKey(verbose_name=_(u'人员'), db_column='UserID', null=False, blank=False) start = models.DateTimeField(_(u'开始时间'), db_column='StartSpecDay', null=False, default=nextDay(), blank=False) end = models.DateTimeField(_(u'结束时间'), db_column='EndSpecDay', null=True, default=endOfDay(nextDay()), blank=False) leaveclass = models.ForeignKey(LeaveClass, verbose_name=_(u'假类'), db_column='DateID', null=False, blank=False, default=1) reson = models.CharField(_(u'请假原因'), db_column='YUANYING', max_length=100, null=True, blank=True) apply = models.DateTimeField(_(u'填写时间'), db_column='Date', null=True, default=datetime.datetime.now(), blank=True) state = models.CharField(_(u'申请状态'), max_length=2, null=True, db_column="State", default=2, blank=True, choices=AUDIT_STATES, editable=False) def save(self, *args, **kwargs): if self.start >= self.end: raise Exception(_(u'结束时间不能小于开始时间')) tt = EmpSpecDay.objects.filter(emp=self.emp, start__lte=self.end, end__gte=self.start) if tt and tt[0].id != self.id: raise Exception(_(u'请假时间重复')) # tmp=EmpSpecDay.objects.filter(Q(emp=self.emp,start__lte=self.start,end__gte=self.end)| Q(emp=self.emp,start__gte=self.start,end__lte=self.end)).exclude(pk=1) # if tmp and tmp[0].pk !=self.pk : # raise Exception(_(u'已存在相同请假记录!')) super(EmpSpecDay, self).save() from mysite.att.models.__init__ import get_autocalculate_time as gct from model_waitforprocessdata import WaitForProcessData as wfpd import datetime gct_time = gct() if self.start < gct_time or self.end <= gct_time: wtmp = wfpd() st = self.start et = self.end wtmp.UserID = self.emp wtmp.starttime = st wtmp.endtime = et #wtmp.customer=self.customer wtmp.save() def __unicode__(self): return u"%s: %s, %s" % (self.emp, self.start and self.start.strftime("%m-%d") or "", self.leaveclass) #return u"%s: %s, %s"%(self.emp, self.start and self.start.strftime("%m-%d") or "", self.leaveclass)出错 class _add(ModelOperation): visible = False help_text = _(u"新增记录") #新增记录 verbose_name = _(u"新增") def action(self): pass class OpAddManyUserID(ModelOperation): help_text = _(u'''新增''') verbose_name = _(u"新增请假") params = ( ('UserID', EmpMultForeignKey(verbose_name=_(u'人员'), blank=False, null=False)), ('start', models.DateTimeField(_(u'开始时间'))), ('end', models.DateTimeField(_(u'结束时间'))), ('leaveclass', models.ForeignKey(LeaveClass, verbose_name=_(u'假类'))), ('reson', models.CharField(_(u'请假原因'), blank=True, null=True, max_length=100)), ('apply', models.DateTimeField(_(u'填写时间'), default=datetime.datetime.now(), blank=True)), ) def action(self, **args): emps = args.pop('UserID') if self.request: if not emps: depts = self.request.POST.getlist('deptIDs') emps = Employee.objects.filter(DeptID__in=depts) if args['start'] >= args['end']: raise Exception(_(u'结束时间不能小于开始时间')) if not emps: raise Exception(_(u'请选择人员')) for emp in emps: EmpSpecDay(emp=emp, **args).save() class Admin(CachingModel.Admin): from mysite.personnel.models.empwidget import ZMulPopEmpChoiceWidget sort_fields = ["emp.PIN", "start", "end"] disabled_perms = ['add_empspecday', 'dataimport_empspecday'] #default_widgets={"emp":ZMulPopEmpChoiceWidget} list_filter = ['emp', 'reson', 'state', 'leaveclass'] query_fields = ['emp__PIN', 'emp__EName', 'reson', 'state'] list_display = [ 'emp.PIN', 'emp.EName', 'start', 'end', 'reson', 'leaveclass' ] menu_index = 1 class Meta: app_label = 'att' db_table = 'user_speday' verbose_name = _(u'请假') verbose_name_plural = verbose_name unique_together = (("emp", "start", "leaveclass"), )
class IssueCard(CachingModel): '''发卡表''' UserID = EmpPoPForeignKey(verbose_name=_(u"人员"), null=False, editable=True) cardno = models.CharField(verbose_name=_(u'卡号'), max_length=20, null=False, blank=True, editable=True) effectivenessdate = models.DateField(verbose_name=_(u'有效日期'), null=True, blank=True, editable=False) isvalid = models.BooleanField(verbose_name=_(u'是否有效'), choices=YESORNO, editable=False, default=1) #cardtype=models.ForeignKey(CardType,verbose_name=_(u'卡类型'),editable=True,null=True,blank=True) cardpwd = models.CharField(verbose_name=_(u'卡密码'), max_length=20, null=True, blank=True, editable=False) #blance=models.DecimalField(verbose_name=_(u'卡上余额'),max_digits=8,null=True,blank=True,decimal_places=2,editable=True) failuredate = models.DateField(verbose_name=_(u'失效日期'), null=True, blank=True, editable=False) cardstatus = models.CharField(verbose_name=_(u'卡状态'), max_length=20, choices=CARDSTATUS, editable=False, default=1) issuedate = models.DateField( verbose_name=_(u'发卡日期'), null=True, blank=True, editable=False, default=datetime.datetime.now().strftime("%Y-%m-%d")) def __unicode__(self): return u"%s %s" % (self.UserID, self.cardno) def data_valid(self, sendtype): from datetime import datetime from mysite.iclock.models.modelproc import get_normal_card print type(self.cardno) try: orgcard = str(self.cardno) except: raise Exception(_(u'卡号不正确')) import re tmp = re.compile('^[0-9]+$') if not tmp.search(orgcard): raise Exception(_(u'卡号不正确')) u = Employee.objects.filter(Card__exact=self.cardno) if u: raise Exception(_(u'卡号已使用')) if self.UserID.Card: raise Exception(_(u'该人员已发过卡')) self.issuedate = datetime.now().strftime("%Y-%m-%d") class _delete(Operation): visible = False verbose_name = _(u'删除') def action(self): pass def save(self): super(IssueCard, self).save() if self.UserID.Card != self.cardno: self.UserID.Card = self.cardno self.UserID.save() #同步卡号到门禁控制器 from mysite import settings if "mysite.iaccess" in settings.INSTALLED_APPS: from mysite.iclock.models.dev_comm_operate import sync_set_user sync_set_user(self.UserID.search_accdev_byuser(), [self.UserID]) class OpBatchIssueCard(ModelOperation): verbose_name = _(u'批量发卡') help_text = _(u'已经发过卡的人员,将不会在生成人员列表时出现!') from mysite import settings params = (('pin_width', models.IntegerField(null=True, blank=True, default=settings.PIN_WIDTH)), ) def action(self, pin_width): if self.request: empids = self.request.POST.get("empids", "") cardnos = self.request.POST.get("cardnos", "") empids = [int(i) for i in empids.split(",")] #print empids cardnos = [str(i) for i in cardnos.split(",")] #print cardnos where = {'id__in': empids} emps = Employee.objects.filter(Q(**where)) for i in range(len(empids)): tcard = IssueCard() tuser = emps.get(pk=empids[i]) tcard.cardno = cardnos[i] tcard.UserID = tuser tcard.save() tuser.Card = cardnos[i] tuser.save() class _change(Operation): visible = False verbose_name = _(u'修改') def action(self): pass # class OpLoseCard(Operation): # help_text=u'挂失卡' # verbose_name=u'挂失卡' # visible=False # def action(self): # self.object.cardstatus=3 # self.object.save() # class OpRevertCard(Operation): # help_text=u'解挂卡' # verbose_name=u'解挂卡' # visible=False # def action(self): # self.object.cardstatus=1 # self.object.save() # class OpExchangeCard(Operation): # help_text=u'员工换卡' # verbose_name=u'员工换卡' # # def action(self): # self.object.cardstatus=1 # self.object.save() class Admin(CachingModel.Admin): sort_fields = ["UserID.PIN", "issuedate"] app_menu = "personnel" list_filter = ('UserID', 'cardno', 'isvalid', 'cardstatus') query_fields = [ 'UserID__PIN', 'UserID__EName', 'cardno', 'cardstatus', 'isvalid' ] #list_display = ['UserID.PIN','UserID.EName','cardno','cardstatus','isvalid'] list_display = ['UserID.PIN', 'UserID.EName', 'cardno', 'issuedate'] disabled_perms = [ 'dataimport_issuecard', 'oprevertcard_issuecard', 'oplosecard_issuecard' ] menu_index = 5 disabled_perms = [ "dataimport_issuecard", "change_issuecard", "oplosecard_issuecard", "oprevertcard_issuecard" ] help_text = _(u"目前支持手动输入卡号以及使用发卡器发卡!") class Meta: app_label = 'personnel' verbose_name = _(u'人员发卡') verbose_name_plural = verbose_name
class EmpSpecDay(CachingModel): emp = EmpPoPForeignKey(verbose_name=_(u'人员'), db_column='UserID', editable=True) start = models.DateTimeField(_(u'开始时间'), db_column='StartSpecDay', null=False, default=nextDay(), blank=False) end = models.DateTimeField(_(u'结束时间'), db_column='EndSpecDay', null=True, default=endOfDay(nextDay()), blank=False) leaveclass = models.ForeignKey(LeaveClass, verbose_name=_(u'假类'), db_column='DateID', null=False, blank=False, default=1) reson = models.CharField(_(u'请假原因'), db_column='YUANYING', max_length=100, null=True, blank=True) apply = models.DateTimeField(_(u'填写时间'), db_column='Date', auto_now=True, null=True, default=datetime.datetime.now, blank=True) audit_status = models.SmallIntegerField(_(u'审核状态'), blank=True, null=True, default=APPLICATION, choices=ALL_STATUS, editable=False) audit_reason = models.CharField(_(u'审核原因'), max_length=100, null=True, blank=True, editable=False) state = models.CharField(_(u'申请状态'), max_length=2, null=True, db_column="State", default=APPLICATION, blank=True, choices=AUDIT_STATES, editable=False) def save(self, *args, **kwargs): if not self.emp: raise Exception(_(u'必须选择人员')) if self.start >= self.end: raise Exception(_(u'结束时间不能小于或等于开始时间')) tt = EmpSpecDay.objects.filter(emp=self.emp, start__lte=self.end, end__gte=self.start) if tt and tt[0].id != self.id: raise Exception(_(u'请假时间重复')) # if tt and int(tt[0].audit_status)== AUDIT_SUCCESS: if self.id and tt and tt[0].audit_status == AUDIT_SUCCESS: raise Exception(_(u'审核通过的请假记录不能修改')) # tmp=EmpSpecDay.objects.filter(Q(emp=self.emp,start__lte=self.start,end__gte=self.end)| Q(emp=self.emp,start__gte=self.start,end__lte=self.end)).exclude(pk=1) # if tmp and tmp[0].pk !=self.pk : # raise Exception(_(u'已存在相同请假记录!')) req = get_current_request() if self.pk: tx = EmpSpecDay.objects.get(pk=self.pk) if req.session.has_key("employee"): if int(tx.audit_status) == AUDIT_SUCCESS: raise Exception(_(u'该记录已审核')) if int(tx.state) == REFUSE: self.audit_status = APPLICATION_AGAIN elif (not req.session.has_key("employee")): self.audit_status = AUDIT_SUCCESS super(EmpSpecDay, self).save() from mysite.att.models.__init__ import get_autocalculate_time as gct from model_waitforprocessdata import WaitForProcessData as wfpd import datetime gct_time = gct() if self.start < gct_time or self.end <= gct_time: wtmp = wfpd() st = self.start et = self.end wtmp.UserID = self.emp wtmp.starttime = st wtmp.endtime = et #wtmp.customer=self.customer wtmp.save() def delete(self): req = get_current_request() if req.session.has_key("employee"): if int(self.audit_status) == AUDIT_SUCCESS: raise Exception(_(u'审核通过的记录不能被删除')) if int(self.audit_status) == AUDIT_SUCCESS: from model_waitforprocessdata import WaitForProcessData as wfpd wtmp = wfpd() st = datetime.datetime(self.start.year, self.start.month, self.start.day, 0, 0, 0) et = datetime.datetime(self.end.year, self.end.month, self.end.day, 23, 59, 59) wtmp.UserID = self.emp wtmp.starttime = st wtmp.endtime = et wtmp.save() super(EmpSpecDay, self).delete() def __unicode__(self): emp_obj = "" leavetype_name = "" try: emp_obj = Employee.objects.get(id=self.emp_id) leavetype_obj = LeaveClass.objects.get(LeaveID=self.leaveclass_id) leavetype_name = leavetype_obj.LeaveName except: pass return u"%s: %s, %s" % (emp_obj, self.start and self.start.strftime("%m-%d") or "", leavetype_name) # return u"%s: %s, %s"%(self.emp, self.start and self.start.strftime("%m-%d") or "", self.leaveclass) class _add(ModelOperation): visible = False help_text = _(u"新增记录") #新增记录 verbose_name = _(u"新增") def action(self): pass class OpAddManyUserID(ModelOperation): help_text = _(u'''新增''') verbose_name = _(u"新增请假") params = ( ('UserID', EmpMultForeignKey(verbose_name=_(u'人员'), blank=True, null=True)), ('start', models.DateTimeField(_(u'开始时间'))), ('end', models.DateTimeField(_(u'结束时间'))), ('leaveclass', models.ForeignKey(LeaveClass, verbose_name=_(u'假类'))), ('reson', models.CharField(_(u'请假原因'), blank=True, null=True, max_length=100)), ('apply', models.DateTimeField(_(u'填写时间'), default=datetime.datetime.now, blank=True)), ) def action(self, **args): from mysite.iclock.iutils import get_dept_from_all, get_max_in emps = args.pop('UserID') if args['start'] >= args['end']: raise Exception(_(u'结束时间不能小于开始时间')) if not emps: raise Exception(_(u'请选择人员')) if len(emps) > 1000: raise Exception(_(u'人员选择过多,最大支持1000人同时新增记录!')) for emp in emps: EmpSpecDay(emp=emp, **args).save() def get_emp_pin(self): u'''从缓存中得到人员PIN号''' emp_pin = "" try: emp_obj = Employee.objects.get(id=self.emp_id) emp_pin = emp_obj.PIN except: pass return emp_pin def get_emp_name(self): u'''从缓存中得到人员姓名''' emp_name = "" try: emp_obj = Employee.objects.get(id=self.emp_id) emp_name = emp_obj.EName except: pass return emp_name def get_leaveclass_name(self): leaveclass_name = "" try: leavetype_obj = LeaveClass.objects.get(LeaveID=self.leaveclass_id) leaveclass_name = leavetype_obj.LeaveName except: pass return leaveclass_name class OpSpecAudit(Operation): u"请假单审核" verbose_name = _(u'审批') help_text = _(u'请假审批') params = ( ('stat', models.IntegerField(_(u'审核状态'), null=False, blank=False, default=AUDIT_SUCCESS, choices=AUDIT_STATUS)), ('reason', models.CharField(_(u'审核原因'), null=True, blank=True, max_length=100)), ) def action(self, stat, reason): if self.object.audit_status == AUDIT_SUCCESS: raise Exception( _(u"%(emp)s,%(st)s,%(et)s,%(rm)s 已审核") % { "emp": self.object.emp, "st": self.object.start, "et": self.object.end, "rm": self.object.reson }) self.object.audit_status = stat self.object.audit_reason = reason self.object.save() class Admin(CachingModel.Admin): from mysite.personnel.models.empwidget import ZMulPopEmpChoiceWidget sort_fields = ["emp.PIN", "start", "end"] disabled_perms = ['add_empspecday', 'dataimport_empspecday'] #default_widgets={"emp":ZMulPopEmpChoiceWidget} list_filter = ['emp', 'reson', 'state', 'leaveclass'] query_fields = ['emp.PIN', 'emp.EName', 'reson', 'state'] list_display = [ 'emp.PIN', 'emp.EName', 'start', 'end', 'reson', 'leaveclass', 'apply', 'audit_status|audit_filter', 'audit_reason' ] newadded_column = { "leaveclass": "get_leaveclass_name", } report_fields = ['emp', 'start', 'end', 'reson', 'leaveclass'] menu_index = 4 class Meta: app_label = 'att' db_table = 'user_speday' verbose_name = _(u'请假') verbose_name_plural = verbose_name unique_together = (("emp", "start", "leaveclass"), )
class Transaction(models.Model): UserID = EmpPoPForeignKey(db_column='userid', verbose_name=_(u"人员")) TTime = models.DateTimeField(_(u'考勤时间'), db_column='checktime') State = models.CharField(_(u'考勤状态'), db_column='checktype', max_length=5, default='I', choices=ATTSTATES) Verify = models.IntegerField(_(u'验证方式'), db_column='verifycode', default=0, choices=VERIFYS) #---签卡类型 SN = DeviceForeignKey(db_column='SN', verbose_name=_(u'设备'), null=True, blank=True) sensorid = models.CharField(db_column='sensorid', verbose_name=u'Sensor ID', null=True, blank=True, max_length=5, editable=False) WorkCode = models.CharField(_(u'工作代码'), max_length=20, null=True, blank=True) Reserved = models.CharField(_(u'保留'), max_length=20, null=True, blank=True) sn_name = models.CharField(_(u'序列号'), max_length=40, null=True, blank=True) def limit_transaction_to(self,query_set,user): from mysite.iclock.iutils import userDeptList,userAreaList deptids = userDeptList(user) if not deptids: return query_set deptids = [ int(dept.pk) for dept in deptids ] return query_set.filter(UserID__DeptID__in=deptids) def employee(self): #cached employee try: return Employee.objByID(self.UserID_id) except: return None def Time(self): if self.TTime.microsecond>500000: self.TTime=self.TTime+datetime.timedelta(0,0,1000000-self.TTime.microsecond) return self.TTime def StrTime(self): return self.Time().strftime('%Y/%m%d/%H%M%S') @staticmethod def delOld(): return ("TTime", 365) def Device(self): return get_device(self.sn_name) def get_img_url(self, default=None): device=self.Device() emp=self.employee() if device and emp: try: pin=int(emp.PIN) except: pin=emp.PIN fname="%s.jpg"%(self.StrTime()) imgUrl=getUploadFileName(device.SN, pin, fname) if os.path.exists(imgUrl): return getUploadFileURL(device.SN, pin, fname) return default def get_thumbnail_url(self, default=None): device=self.Device() emp=self.employee() if device and emp: try: pin=int(emp.PIN) except: pin=emp.PIN fname="%s.jpg"%(self.StrTime()) imgUrl=getUploadFileName("thumbnail/"+device.SN, pin, fname) #print imgUrl if not os.path.exists(imgUrl): imgUrlOrg=getUploadFileName(device.SN, pin, fname) if not os.path.exists(imgUrlOrg): #print imgUrlOrg, "is not exists" return default if not createThumbnail(imgUrlOrg, imgUrl): #print imgUrl, "create fail." return default return getUploadFileURL("thumbnail/"+device.SN, pin, fname) #print "device, emp", device, emp return default def __unicode__(self): return self.UserID.__unicode__()+', '+self.TTime.strftime("%y-%m-%d %H:%M:%S") @staticmethod def myData(user): if user.username=='employee': #employee user return Transaction.objects.filter(UserID=request.employee) return Transaction.objects.filter(UserID__DeptID__in=userDeptList(user)) def get_attpic(self): from dbapp.file_handler import get_model_filename dt=self.TTime.strftime("%Y%m%d%H%M%S") pin="" pin= int(self.UserID.PIN) sn=self.sn_name t=get_model_filename(Transaction, "%s/%s/%s" % (sn, dt[:4], dt[4:8])+"/"+ str(pin)+"_"+ dt[8:] + ".jpg", "picture")[1] return t def get_emppic(self): return self.UserID.photo class dataexport(Operation): help_text=_(u"数据导出") #导出 verbose_name=_(u"导出") visible=False def action(self): pass class Meta: app_label='iclock' verbose_name = _(u"原始记录表") verbose_name_plural = verbose_name db_table = 'checkinout' unique_together = (("UserID", "TTime"),) permissions = ( ('clearObsoleteData_transaction','Clear Obsolete Data'), ) class Admin: default_give_perms=["contenttypes.can_AttCalculate"] sort_fields=["UserID.PIN","TTime"] app_menu="att" menu_group = 'att' visible = "mysite.att" in settings.INSTALLED_APPS#暂只有考勤使用 read_only=True api_fields=('UserID.PIN','UserID.EName','TTime','State','sn_name') list_display=('UserID_id','UserID.PIN','UserID.EName','TTime','State','sn_name','get_attpic','get_emppic') photo_path_tran="get_attpic" photo_path="get_emppic" hide_fields=('UserID_id','get_attpic') list_filter = ('UserID','TTime','State','Verify','SN') query_fields=['UserID__PIN','UserID__EName','sn_name'] search_fields=('TTime',) menu_index=4 disabled_perms=["add_transaction",'change_transaction','delete_transaction','clearObsoleteData_transaction'] layout_types=["table","photo"]
class EmpChange(CachingModel): '''调动表''' changeno = models.AutoField(verbose_name=_(u'调动单号'), db_column='changeno', primary_key=True, editable=False) UserID = EmpPoPForeignKey(verbose_name=_(u"人员"), editable=True) changedate = models.DateTimeField(verbose_name=_(u'调动时间'), null=True, blank=True, editable=True, default=datetime.datetime.now()) changepostion = models.IntegerField( verbose_name=_(u'调动栏位'), choices=POSTION, editable=True, null=True, blank=True, ) oldvalue = models.TextField(verbose_name=_(u'调动前'), editable=False, null=True, blank=True) newvalue = models.TextField(verbose_name=_(u'调动后'), editable=True, null=True, blank=True) changereason = models.CharField(max_length=200, verbose_name=_(u'调动原因'), null=True, blank=True, editable=True) isvalid = models.BooleanField(verbose_name=_(u'是否生效'), choices=YESORNO, editable=True, default=0) approvalstatus = models.IntegerField(verbose_name=_(u'审核状态'), choices=APPROVAL, editable=False, default=2) remark = models.CharField(verbose_name=_(u'备注'), editable=True, null=True, blank=True, max_length=200) def __unicode__(self): return self.UserID.PIN + (self.UserID.EName and " %s" % self.UserID.EName or "") def save(self): #ContentType.objects.get_for_model(obj) #print "self.changepostion:%s"%self.changepostion try: if self.changepostion and int( self.changepostion) in [1, 2, 3]: #同步人员信息表,并原还页面上有可能修改原始数据 where = {} if self.changepostion == 1: self.oldvalue = get_pk(self.UserID.DeptID) where['id__exact'] = int(self.newvalue) self.UserID.DeptID = Department.objects.filter( Q(**where))[0] elif self.changepostion == 2: self.oldvalue = get_pk(self.UserID.position) where['id__exact'] = int(self.newvalue) obj = Position.objects.filter(Q(**where))[0] self.UserID.position = obj self.UserID.DeptID = obj.DeptID else: self.oldvalue = self.UserID.emptype self.UserID.emptype = int(self.newvalue) self.UserID.save() if not self.changedate: self.changedate = datetime.datetime.now() old_ = self.get_oldvalue() new_ = self.get_newvalue() self.oldvalue = old_ self.newvalue = new_ super(EmpChange, self).save() except Exception, e: import traceback traceback.print_exc() raise e return self