def person_stats(self, jobnumber, month): """个人考勤统计""" ret = {} s = Schedule() now_year = datetime.date.today().strftime("%Y") record_dates = [d for d in s.iter_mothdays(int(now_year), int(month))] # 准备前置数据 userobj = User.objects.get(jobnumber=jobnumber) attendence_records = AttendenceRecord.objects.record_query(attendence_id=userobj.attendence_id, record_dates=record_dates) approval_records = ApprovalRecord.objects.record_query(userid=userobj.userid, record_dates=record_dates) holiday_info = Holiday.objects.holiday_info(record_dates=record_dates) # 初始化 unclockin_num = unclockout_num = worktime_lt_num = late_num = early_num = 0 # 计算 for attendence_record in attendence_records: record_date = attendence_record.record_date # 不统计节假日/请休假情况 if not holiday_info.get(record_date, None) and len(approval_records.get(record_date, [])) == 0: if not attendence_record.clockin_time: unclockin_num += 1 if not attendence_record.clockout_time: unclockout_num += 1 if attendence_record.clockin_time_warning: late_num += 1 if attendence_record.clockout_time_warning: early_num += 1 if attendence_record.worktime_warning: worktime_lt_num += 1 # 组装 ret.update( { 'name': userobj.name, 'jobnumber': userobj.jobnumber, 'deptname': Department.objects.query_mult_department(department_id=userobj.department_id).name, 'month': '-'.join([now_year, month]), 'unclockin_num': unclockin_num, 'unclockout_num': unclockout_num, 'worktime_lt_num': worktime_lt_num, 'late_num': late_num, 'early_num': early_num } ) return ret
def person_approval_stats(self, jobnumber, month): """个人请休假信息统计""" ret = {} s = Schedule() now_year = datetime.date.today().strftime("%Y") record_dates = [d for d in s.iter_mothdays(int(now_year), int(month))] # 准备前置数据 userobj = User.objects.get(jobnumber=jobnumber) attendence_records = AttendenceRecord.objects.record_query(attendence_id=userobj.attendence_id, record_dates=record_dates) approval_records = ApprovalRecord.objects.record_query(userid=userobj.userid, record_dates=record_dates) holiday_info = Holiday.objects.holiday_info(record_dates=record_dates) # 初始化 unclock_day = winter_leave = sick_leave = person_leave = fullpay_sick_leave = halfpay_sick_leave = marriage_leave = maternity_leave \ = siling_leave = dead_leave = baby_leave = 0 # stats for attendence_record in attendence_records: record_date = attendence_record.record_date # 不统计节假日/请休假情况 if not holiday_info.get(record_date, None) and len(approval_records.get(record_date, [])) == 0: if not attendence_record.clockin_time or not attendence_record.clockout_time: unclock_day += 1 # 计算需要去重 has_sum_list = [] for day, approval_objs in approval_records.iteritems(): if len(approval_objs) > 0: for approval_obj in approval_objs: if approval_obj.instance_id not in has_sum_list: if approval_obj.approval_type == u'请假': if approval_obj.aproval_desc in [u'年假']: winter_leave += s.count_diff_day(approval_obj.start_time, approval_obj.end_time, int(month)) if approval_obj.aproval_desc in [u'司龄假']: siling_leave += s.count_diff_day(approval_obj.start_time, approval_obj.end_time, int(month)) if approval_obj.aproval_desc in [u'病假']: sick_leave += s.count_diff_day(approval_obj.start_time, approval_obj.end_time, int(month)) if approval_obj.aproval_desc in [u'事假']: person_leave += s.count_diff_day(approval_obj.start_time, approval_obj.end_time, int(month)) if approval_obj.aproval_desc in [u'全薪病假']: fullpay_sick_leave += s.count_diff_day(approval_obj.start_time, approval_obj.end_time, int(month)) if approval_obj.aproval_desc in [u'半薪病假/事假']: halfpay_sick_leave += s.count_diff_day(approval_obj.start_time, approval_obj.end_time, int(month)) if approval_obj.aproval_desc in [u'婚假']: marriage_leave += s.count_diff_day(approval_obj.start_time, approval_obj.end_time, int(month)) if approval_obj.aproval_desc in [u'丧假']: dead_leave += s.count_diff_day(approval_obj.start_time, approval_obj.end_time, int(month)) if approval_obj.aproval_desc in [u'产检假或陪产假']: maternity_leave += s.count_diff_day(approval_obj.start_time, approval_obj.end_time, int(month)) if approval_obj.aproval_desc in [u'产假']: baby_leave += s.count_diff_day(approval_obj.start_time, approval_obj.end_time, int(month)) has_sum_list.append(approval_obj.instance_id) # 组装 ret.update( { 'name': userobj.name, 'jobnumber': userobj.jobnumber, 'deptname': Department.objects.query_mult_department(department_id=userobj.department_id).name, 'month': '-'.join([now_year, month]), 'unclock_day': unclock_day, 'winter_leave': winter_leave, 'sick_leave': sick_leave, 'person_leave': person_leave, 'fullpay_sick_leave': fullpay_sick_leave, 'halfpay_sick_leave': halfpay_sick_leave, 'marriage_leave': marriage_leave, 'maternity_leave': maternity_leave, 'siling_leave': siling_leave, 'dead_leave': dead_leave, 'baby_leave': baby_leave } ) return ret