From 76240554c64ba19c3b87e49f216b817955f13d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Mon, 2 Feb 2026 11:42:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_hr_attendance/controllers/portal.py | 69 +++++++++++++--------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/yuthon_hr_attendance/controllers/portal.py b/yuthon_hr_attendance/controllers/portal.py index 5420d287f..313200b5e 100644 --- a/yuthon_hr_attendance/controllers/portal.py +++ b/yuthon_hr_attendance/controllers/portal.py @@ -5,7 +5,7 @@ from odoo.exceptions import AccessError, MissingError, ValidationError from odoo.http import request from ....addons.portal.controllers import portal from datetime import datetime, date, time, timedelta - +from dateutil.relativedelta import relativedelta class CustomerPortal(portal.CustomerPortal): @@ -76,37 +76,48 @@ class CustomerPortal(portal.CustomerPortal): record = request.env['yuthon.vacation.reports'].sudo().search([('id', '=', kw.get('id'))]) data = { 'state': '已确认' if record.vacation_state == 'confirmed' else '待确认', - '日期': record.display_date, - '应到': record.should_attendance, - '实到': record.actual_attendance, - '迟到': record.is_late_card, - '早退': record.is_early_card, - '缺卡': record.is_no_card, - '旷工': record.is_work, - '异常': record.is_abnormal, - '年假': record.done_leave, - '加班时': record.done_working_overtime, - '调休': record.compensatory_leave, - '事假': record.leave_of_absence, - '加班时(法定假)': record.statutory_leave, - '育儿假': record.parental_leave, - '值班调休': record.duty_off_leave, - '婚假': record.marriage_leave, - '产假': record.maternity_leave, - '陪产假': record.paternity_leave, - '计生假': record.family_planning_leave, - '丧假': record.bereavement_leave, - '探亲假': record.home_visit_leave, - '家长会假': record.parents_meeting_leave, - '病假(普通)': record.general_sick_leave, - '病假(住院期)': record.hospital_sick_leave, - '病假(出院恢复期)': record.recovery_sick_leave, - '考试假': record.exam_leave, + '应到': f"{record.should_attendance}天", + '实到': f"{record.actual_attendance}天", + '迟到': f"{record.is_late_card}次", + '早退': f"{record.is_early_card}次", + '缺卡': f"{record.is_no_card}次", + '旷工': f"{record.is_work}次", + '异常': f"{record.is_abnormal}次", + '年假': f"{record.done_leave}天", + '加班时': f"{record.done_working_overtime * 8}小时", + '调休': f"{record.compensatory_leave}天", + '事假': f"{record.leave_of_absence}天", + '加班时(法定假)': f"{record.statutory_leave * 8}小时", + '育儿假': f"{record.parental_leave}天", + '值班调休': f"{record.duty_off_leave}天", + '婚假': f"{record.marriage_leave}天", + '产假': f"{record.maternity_leave}天", + '陪产假': f"{record.paternity_leave}天", + '计生假': f"{record.family_planning_leave}天", + '丧假': f"{record.bereavement_leave}天", + '探亲假': f"{record.home_visit_leave}天", + '家长会假': f"{record.parents_meeting_leave}天", + '病假(普通)': f"{record.general_sick_leave}天", + '病假(住院期)': f"{record.hospital_sick_leave}天", + '病假(出院恢复期)': f"{record.recovery_sick_leave}天", + '考试假': f"{record.exam_leave}天", } return json.dumps({'data': data, 'code': 200, 'message': ''}) @http.route('/phone/vacation/self/status', type='http', auth="none", csrf=False, cors='*') def phone_vacation_self_status(self, **kw): record_id = request.env['yuthon.vacation.reports'].sudo().search([('id', '=', kw.get('id'))]) - record_id.write({'vacation_state': 'confirmed'}) - return json.dumps({'code': 200, 'message': 'OK'}) + month_start = record_id.vacation_date.replace(day=1) + month_end = (month_start + relativedelta(months=1) - relativedelta(days=1)) + attendance_exception = self.env['hr.attendance'].search([ + ('employee_id', '=', record_id.employee_id.id), + ('current_data', '>=', month_start), + ('current_data', '<=', month_end), + ('is_abnormal', '=', True) + ], limit=1) + # 如果考勤异常,则不自动确认 + if attendance_exception: + return json.dumps({'code': 200, 'message': '考勤异常,请先核对考勤记录'}) + else: + record_id.write({'vacation_state': 'confirmed'}) + return json.dumps({'code': 200, 'message': 'OK'})