diff --git a/yuthon_hr_attendance/models/hr_attendance_month.py b/yuthon_hr_attendance/models/hr_attendance_month.py index 5a9e6fd85..ba9d1c45b 100644 --- a/yuthon_hr_attendance/models/hr_attendance_month.py +++ b/yuthon_hr_attendance/models/hr_attendance_month.py @@ -4,6 +4,7 @@ import calendar from odoo import api, fields, models, tools, _ from odoo.tools.float_utils import float_round from dateutil.relativedelta import relativedelta +from datetime import date class HrAttendanceYear(models.Model): @@ -414,6 +415,9 @@ class HrAttendanceMonthDetail(models.Model): def button_confirm(self): current_employee = self.env['hr.employee'].search([('user_id', '=', self.env.user.id)], limit=1) + start_date,end_date = self._get_days(current_employee) + day = self._create_leave_record(start_date, end_date) + work_day = self._process_shift_days(day,start_date,end_date) # 自然日中的工作日 for record in self: current_year = record.current_year current_month = int(record.current_month) @@ -467,9 +471,8 @@ class HrAttendanceMonthDetail(models.Model): performance_deduction += (performance_bonuses / 21.75) * personal_leave # 产假 - maternity_leave = record.maternity_leave - commuting_deduction += (commuting_allowance / month_days) * maternity_leave - performance_deduction += (performance_bonuses / month_days) * maternity_leave + commuting_deduction += (commuting_allowance / month_days) * work_day + performance_deduction += (performance_bonuses / month_days) * work_day # 陪产假 paternity_leave = record.paternity_leave @@ -507,6 +510,78 @@ class HrAttendanceMonthDetail(models.Model): 'last_month_commuting_deduction': commuting_deduction }) + # 行政考勤 调休日期 + def _process_shift_days(self, days , start_date, end_date): + calendar_leaves = self.env['resource.calendar.leaves'].search([]) + all_days = [] + for calendar in calendar_leaves: + shift_days = calendar.shift_replacement_day.split(',') if calendar.shift_replacement_day else [] + for day_str in shift_days: + day = datetime.datetime.strptime(day_str, '%m月%d日') + day = day.replace(year=start_date.year).date() + all_days.append(day) + unique_days = list(set(all_days)) + total_days = days + for day in unique_days: + if start_date <= day <= end_date: + total_days += 1 + return total_days + + # 创建用户记录传入日期来获取天数(自然日中工作日的逻辑) + def _create_leave_record(self, start_date, end_date): + holiday_status_id = self.env['hr.leave.type'].search([('name', '=', '年假')]) + admin_id = self.env['hr.employee'].search([("name", "=", 'Administrator')]) + leave = self.env['hr.leave'].sudo().create({ + 'employee_id': admin_id.id, + 'holiday_status_id': holiday_status_id.id, + 'request_date_from': start_date, + 'request_date_to': end_date, + 'state': 'confirm', + }) + days = leave.number_of_days + return days + + # 获得假种的当月开始日期结束日期 (目前先产假) + def _get_days(self, employee_id): + year = int(self.current_year) + month = int(self.current_month) + if month == 12: + date_to = date(year, 12, 31) + else: + next_month = month + 1 + date_to = date(year, next_month, 1) - datetime.timedelta(days=1) + date_from = date(year, month, 1) + holiday_status_id = self.env['hr.leave.type'].search([('name', '=', '产假')]) + leave_records = self.env['hr.leave'].search([ + ('employee_id', '=', employee_id.id), + ('holiday_status_id', '=', holiday_status_id.id), + ('date_from', '<', date_to), + ('date_to', '>', date_from), + ('state', '=', 'validate') + ]) + for leave in leave_records: + leave_start = leave.date_from.date() + leave_end = leave.date_to.date() + start_in_month = max(leave_start, date_from) + end_in_month = min(leave_end, date_to) + # 判断是否跨月 + # is_cross_month = leave_start.year != leave_end.year or leave_start.month != leave_end.month + # if is_cross_month: + if leave_start.year == year and leave_start.month == month: + start_date = leave_start + if leave_end.year == year and leave_end.month == month: + end_date = leave_end + else: + end_date = date(year, month + 1, 1) if month < 12 else date(year + 1, 1, 1) + end_date = end_date - datetime.timedelta(days=1) # 取到当月最后一天 + elif leave_end.year == year and leave_end.month == month: + start_date = date(year, month, 1) + end_date = leave_end + else: + start_date = start_in_month + end_date = end_in_month + return start_date,end_date + def _get_attendance_month_obj(self): """ 获取出勤月度汇总记录结果表 diff --git a/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py b/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py index 2d13f7b1f..cdd8654b1 100644 --- a/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py +++ b/yuthon_hr_attendance/wizard/hr_attendance_month_wizard.py @@ -206,38 +206,24 @@ class HrAttendanceMonthWizard(models.TransientModel): # 判断是否跨月 is_cross_month = leave_start.year != leave_end.year or leave_start.month != leave_end.month if is_cross_month: - # if holiday_status_id.type_of_work == '0': - # if leave_start.year == year and leave_start.month == month: - # # 请假开始在当前月,如 2 月 16 号开始,2 月取 2 月底减去 16 - # days_in_month = (date(year, month + 1, 1) - leave_start).days if month < 12 else (date(year + 1, 1, 1) - leave_start).days - # leave_days[leave_type] = days_in_month - # elif leave_end.year == year and leave_end.month == month: - # # 请假结束在当前月,如 5 月 6 号结束,5 月取 6 天 - # days_in_month = (leave_end - date(year, month, 1)).days + 1 - # leave_days[leave_type] = days_in_month - # else: - # # 正常情况,计算当前月内的天数 - # days_in_month = (end_in_month - start_in_month).days - # leave_days[leave_type] = days_in_month - # else: - if leave_start.year == year and leave_start.month == month: - start_date = leave_start - if leave_end.year == year and leave_end.month == month: - end_date = leave_end - else: - end_date = date(year, month + 1, 1) if month < 12 else date(year + 1, 1, 1) - end_date = end_date - datetime.timedelta(days=1) # 取到当月最后一天 - elif leave_end.year == year and leave_end.month == month: - start_date = date(year, month, 1) + if leave_start.year == year and leave_start.month == month: + start_date = leave_start + if leave_end.year == year and leave_end.month == month: end_date = leave_end else: - start_date = start_in_month - end_date = end_in_month + end_date = date(year, month + 1, 1) if month < 12 else date(year + 1, 1, 1) + end_date = end_date - datetime.timedelta(days=1) # 取到当月最后一天 + elif leave_end.year == year and leave_end.month == month: + start_date = date(year, month, 1) + end_date = leave_end + else: + start_date = start_in_month + end_date = end_in_month - leave = self._create_leave_record(holiday_status_id, start_date, end_date) - leave_days[leave_type] = leave.number_of_days - # leave_days[leave_type] = self._process_shift_days(leave, start_date, end_date) - leave.unlink() + leave = self._create_leave_record(holiday_status_id, start_date, end_date) + leave_days[leave_type] = leave.number_of_days + # leave_days[leave_type] = self._process_shift_days(leave, start_date, end_date) + leave.unlink() else: for leave in leave_records: total_days += leave.number_of_days_display @@ -267,20 +253,3 @@ class HrAttendanceMonthWizard(models.TransientModel): 'request_date_to': end_date, 'state': 'confirm', }) - - # 行政考勤 调休日期 - # def _process_shift_days(self, leave , start_date, end_date): - # calendar_leaves = self.env['resource.calendar.leaves'].search([]) - # all_days = [] - # for calendar in calendar_leaves: - # shift_days = calendar.shift_replacement_day.split(',') if calendar.shift_replacement_day else [] - # for day_str in shift_days: - # day = datetime.datetime.strptime(day_str, '%m月%d日') - # day = day.replace(year=start_date.year).date() - # all_days.append(day) - # unique_days = list(set(all_days)) - # total_days = leave.number_of_days - # for day in unique_days: - # if start_date <= day <= end_date: - # total_days += 1 - # return total_days \ No newline at end of file