diff --git a/preview_easy/static/src/xml/qweb.xml b/preview_easy/static/src/xml/qweb.xml index 0d16d8e7c..d5b37974c 100644 --- a/preview_easy/static/src/xml/qweb.xml +++ b/preview_easy/static/src/xml/qweb.xml @@ -38,20 +38,22 @@
-
+
-
- -
-
- -
-
Uploading
+
+
+ +
+
+ +
+
Uploading
+
diff --git a/sh_backmate_theme_adv_enterprise/static/src/scss/responsive/responsive_theme.scss b/sh_backmate_theme_adv_enterprise/static/src/scss/responsive/responsive_theme.scss index bd1a6ce35..7f8147a7c 100644 --- a/sh_backmate_theme_adv_enterprise/static/src/scss/responsive/responsive_theme.scss +++ b/sh_backmate_theme_adv_enterprise/static/src/scss/responsive/responsive_theme.scss @@ -2931,7 +2931,7 @@ nav.o_main_navbar { } } .modal.o_modal_full { - z-index: 1111; + z-index: 1070; } html { body { diff --git a/soong_workflow/static/src/css/record_scss.scss b/soong_workflow/static/src/css/record_scss.scss index cf994af51..ea7524cb1 100644 --- a/soong_workflow/static/src/css/record_scss.scss +++ b/soong_workflow/static/src/css/record_scss.scss @@ -19,4 +19,16 @@ } .o_comment_combined_input { flex: 2; +} + +.o_kanban_soong_wkf_record { + .o_kanban_record_headings { + flex: 1; + } + .o_kanban_record_bottom { + flex: 0 0 94px; + @include media-breakpoint-down(sm) { + flex: 0 0 56px; + } + } } \ No newline at end of file diff --git a/soong_workflow/templates/soong_workflow_templates.xml b/soong_workflow/templates/soong_workflow_templates.xml index 6a176b10f..7b2195461 100644 --- a/soong_workflow/templates/soong_workflow_templates.xml +++ b/soong_workflow/templates/soong_workflow_templates.xml @@ -175,21 +175,21 @@ -
+
- - 节点: - +
+ + 节点: + + + 状态: + +
- 状态: - -
-
- - 经办人: + 经办人:
@@ -197,7 +197,7 @@ 意见:
-
+
附件: diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py index e836a0f92..56ea04a10 100644 --- a/soong_workflow/wizard/soong_workflow_comment_wizard.py +++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py @@ -637,10 +637,11 @@ class SoongWorkflowCommentWizard(models.TransientModel): has_archive_btn = any(btn_name.name == '归档' for btn_name in self.node_btn_id.node_id.button_ids) if has_archive_btn: log_id = record_id.log_ids.filtered(lambda l: l.name == '归档') + employee_id = self.env['hr.employee'].sudo().search([('user_id', '=', record_id.log_ids[0].done_by.id)], limit=1) if workflow_record: workflow_record.write({ 'approve_state': 'end', - 'employee_ids': [(6, 0, [record_id.log_ids[0].done_by.employee_id.id])], + 'employee_ids': [(6, 0, [employee_id.id])], 'soong_state': 'to_active', 'node_id': False, }) diff --git a/yuthon_base/controllers/phone.py b/yuthon_base/controllers/phone.py index fe2b858d2..61012342f 100644 --- a/yuthon_base/controllers/phone.py +++ b/yuthon_base/controllers/phone.py @@ -85,12 +85,11 @@ class YuThonPhone(http.Controller): user_id = request.env['res.users'].sudo().browse(kw.get('employee')) employee_id = user_id.with_company(user_id.company_id.id).employee_id applet_security_setting_ids = request.env['applet.security'].sudo().search([('employee_id', '=', employee_id.id)]).applet_security_setting_ids + task_ids = request.env['yuthon.will.task'].sudo().search([('users_ids', 'in', [user_id])]) data = [{ - '日程': 5, - '抄表': 10, - 'OA': 0, - '工作流': 10, + '日程': len(task_ids), }] + _logger.info(f'{data}-------------------/phone/base/self------------收到请求') return json.dumps({'data': data, 'code': 200, 'message': ''}) @http.route('/phone/base/test', type='http', auth="none", csrf=False, cors='*') diff --git a/yuthon_base/static/src/js/datetime_picker.js b/yuthon_base/static/src/js/datetime_picker.js index 27dabe5b3..beac8a501 100644 --- a/yuthon_base/static/src/js/datetime_picker.js +++ b/yuthon_base/static/src/js/datetime_picker.js @@ -3,7 +3,7 @@ import { patch } from "@web/core/utils/patch"; import { DateTimePicker } from "@web/core/datetime/datetime_picker"; import { isMobileOS } from "@web/core/browser/feature_detection"; -import { useEffect, useRef, reactive } from "@odoo/owl"; +import { useEffect, useRef } from "@odoo/owl"; patch(DateTimePicker.prototype, { setup() { diff --git a/yuthon_holiday/models/inherit_hr_leave.py b/yuthon_holiday/models/inherit_hr_leave.py index b0a35037d..ef10604ff 100644 --- a/yuthon_holiday/models/inherit_hr_leave.py +++ b/yuthon_holiday/models/inherit_hr_leave.py @@ -353,7 +353,7 @@ class HolidaysRequestBatch(models.Model): column1='leave_id', column2='attachment_id' ) - holiday_allowance = fields.Char(string="可用额度", compute='_compute_holiday_allowance', store=True) + holiday_allowance = fields.Text(string="可用额度", compute='_compute_holiday_allowance', store=True) active = fields.Boolean('Active', default=True, tracking=True) def _get_default_name_title(self): @@ -365,7 +365,7 @@ class HolidaysRequestBatch(models.Model): @api.onchange('is_day') def _onchange_is_day(self): if not self.is_day: - self.leave_ids = [(5, 0, 0)] # 清空One2many字段 + self.leave_ids = [(5, 0, 0)] @api.onchange('is_hour') def _onchange_is_hour(self): @@ -411,7 +411,7 @@ class HolidaysRequestBatch(models.Model): other_leave_types = [ '产假', '事假', '法定假', '调休', '补休', '值班调休', '婚假', '陪产假', '计生假', '丧假', '探亲假', - '家长会假', '病假(普通)', '病假(住院期)', + '家长会假', '病假(普通)', '病假(住院期)', '育儿假', '病假(出院恢复期)', '考试假' ] for leave_type in other_leave_types: @@ -851,13 +851,33 @@ class HolidaysRequestBatch(models.Model): current_date = fields.Date.today() vacation_date = current_date for record in self: - reports_id = self.env['yuthon.vacation.reports'].search([('employee_id', '=', record.users_id.employee_ids.id), - ('vacation_date', '=', vacation_date.replace(day=1)) - ], limit=1) - if reports_id: - leave_days = reports_id.leave - overtime_days = reports_id.working_overtime - record.holiday_allowance = f"年假{leave_days:.3f}天, 补休{overtime_days:.3f}天" + result_parts = [] + reports_id = self.env['yuthon.vacation.reports'].search([ + ('employee_id', '=', record.users_id.employee_ids.id), + ('vacation_date', '=', vacation_date.replace(day=1)) + ], limit=1) + + if not reports_id: + record.holiday_allowance = "" + continue + holiday_configs = [ + ("年假", "previous_year", "remainder_year"), + ("补休", "previous_year1", "remainder_year1"), + ("育儿假", None, "remaining_parental_leave") + ] + for name, prev_field, curr_field in holiday_configs: + parts = [] + if prev_field: + prev_value = getattr(reports_id, prev_field, 0.0) + if prev_value > 0: # 大于0才显示 + parts.append(f"上年结余{prev_value:.0f}天") + curr_value = getattr(reports_id, curr_field, 0.0) + if curr_value > 0: + parts.append(f"本年剩余{curr_value:.0f}天") + if parts: + result_parts.append(f"{name}:{','.join(parts)}") + + record.holiday_allowance = "\n".join(result_parts) def action_print_leave_batch(self): """按钮触发打印请假单""" diff --git a/yuthon_hr_attendance/__manifest__.py b/yuthon_hr_attendance/__manifest__.py index 4a41593da..2162b408c 100644 --- a/yuthon_hr_attendance/__manifest__.py +++ b/yuthon_hr_attendance/__manifest__.py @@ -58,6 +58,8 @@ 'views/card_remind_form.xml', 'views/yuthon_customer_planning_views.xml', 'views/planning_slot_template_views.xml', + 'views/yuthon_overtime_line_views.xml', + 'views/vacation_overtime_active_views.xml', 'views/hr_attendance_month_views.xml', 'views/wifi_message_view.xml', 'views/back_approval.xml', @@ -65,6 +67,7 @@ 'views/meal_approval.xml', 'views/applet_address_views.xml', 'views/yuthon_holiday_statement.xml', + 'views/yuthon_parenting_allocate_views.xml', 'views/all_attendance_menu.xml', 'views/overtime_approval_inherit_header.xml', diff --git a/yuthon_hr_attendance/controllers/portal.py b/yuthon_hr_attendance/controllers/portal.py index dfd5bb735..5e11248db 100644 --- a/yuthon_hr_attendance/controllers/portal.py +++ b/yuthon_hr_attendance/controllers/portal.py @@ -4,6 +4,7 @@ from odoo import fields, http, SUPERUSER_ID, _ 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 class CustomerPortal(portal.CustomerPortal): @@ -69,13 +70,46 @@ class CustomerPortal(portal.CustomerPortal): @http.route('/phone/vacation/self/detail', type='http', auth="none", csrf=False, cors='*') def phone_vacation_self_detail(self, **kw): - records = request.env['yuthon.vacation.reports'].sudo().search([('id', '=', kw.get('id'))]) + record = request.env['yuthon.vacation.reports'].sudo().search([('id', '=', kw.get('id'))]) + current_date = record.vacation_date + if current_date.month == 1: + last_month_year = current_date.year - 1 + last_month = 12 + else: + last_month_year = current_date.year + last_month = current_date.month - 1 + records = request.env['yuthon.vacation.reports'].sudo().search([ + ('employee_id', '=', record.employee_id.id), + ('vacation_date', '>=', f'{last_month_year}-{last_month:02d}-01'), + ('vacation_date', '<', f'{last_month_year}-{last_month + 1:02d}-01' if last_month < 12 else f'{last_month_year + 1}-01-01') + ], limit=1) data = { - '日期': records.display_date, - '剩余年假': records.leave, - '剩余补休': records.working_overtime, - '剩余误餐费': records.meal_fee, - '剩余体检费': records.medical_fee, + '日期': record.display_date, + '应到': records.should_attendance, + '实到': records.actual_attendance, + '迟到': records.is_late_card, + '早退': records.is_early_card, + '缺卡': records.is_no_card, + '旷工': records.is_work, + '异常': records.is_abnormal, + '年假': records.done_leave, + '加班时': records.done_working_overtime, + '调休': records.compensatory_leave, + '事假': records.leave_of_absence, + '加班时(法定假)': records.statutory_leave, + '育儿假': records.parental_leave, + '值班调休': records.duty_off_leave, + '婚假': records.marriage_leave, + '产假': records.maternity_leave, + '陪产假': records.paternity_leave, + '计生假': records.family_planning_leave, + '丧假': records.bereavement_leave, + '探亲假': records.home_visit_leave, + '家长会假': records.parents_meeting_leave, + '病假(普通)': records.general_sick_leave, + '病假(住院期)': records.hospital_sick_leave, + '病假(出院恢复期)': records.recovery_sick_leave, + '考试假': records.exam_leave, } return json.dumps({'data': data, 'code': 200, 'message': ''}) diff --git a/yuthon_hr_attendance/data/mothly_report_time.xml b/yuthon_hr_attendance/data/mothly_report_time.xml index c78564dd0..b87d75061 100644 --- a/yuthon_hr_attendance/data/mothly_report_time.xml +++ b/yuthon_hr_attendance/data/mothly_report_time.xml @@ -14,19 +14,6 @@ -1 - - 定时任务:更新我的考勤确认单实到数据 - - code - model.monthly_day_report() - - - 1 - days - - -1 - - 定时任务:批量发送考勤确认 diff --git a/yuthon_hr_attendance/models/__init__.py b/yuthon_hr_attendance/models/__init__.py index 3dfc96f27..523464933 100644 --- a/yuthon_hr_attendance/models/__init__.py +++ b/yuthon_hr_attendance/models/__init__.py @@ -34,7 +34,9 @@ from . import staff_dining_report from . import message_reminder_tasks from . import yuthon_holiday_statement from . import yuthon_meal_case - +from . import yuthon_parenting_allocate +from . import vacation_overtime_active +from . import yuthon_overtime_line # from odoo.tools import SQL # import odoo # odoo.models.READ_GROUP_AGGREGATE.update({ diff --git a/yuthon_hr_attendance/models/card_approval.py b/yuthon_hr_attendance/models/card_approval.py index 5f628d663..8411d2866 100644 --- a/yuthon_hr_attendance/models/card_approval.py +++ b/yuthon_hr_attendance/models/card_approval.py @@ -23,6 +23,7 @@ class CardApprovals(models.Model): reason_application = fields.Text(string="申请事由") documents_ids = fields.Many2many('ir.attachment', string="附件") attendance_id = fields.Many2one('hr.attendance', string="补卡日期") + number_cards_replaced = fields.Integer(string="已补卡次数") attendance = fields.Char(string="补卡日期") is_attendance = fields.Boolean(string="字段隐藏") replacement_time = fields.Selection([('work', '上班卡'), ('quitting', '下班卡'), ('all', '全天卡')], string="补卡", store=True) diff --git a/yuthon_hr_attendance/models/overtime_approval.py b/yuthon_hr_attendance/models/overtime_approval.py index 179b35065..6d0b44506 100644 --- a/yuthon_hr_attendance/models/overtime_approval.py +++ b/yuthon_hr_attendance/models/overtime_approval.py @@ -14,6 +14,7 @@ class OvertimeApprovals(models.Model): _rec_name = 'name' name = fields.Char(string="标题", compute='_compute_name') + number_card = fields.Char(string="补卡次数") code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('overtime_approval')) users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id) company_id = fields.Many2one(related='users_id.employee_ids.company_id', string="公司") @@ -58,6 +59,23 @@ class OvertimeApprovals(models.Model): name_title = fields.Char(default=_get_default_name_title) self_users_ids = fields.Many2many('res.users', string="当前经办人", default=lambda self: [(6, 0, [self.env.user.id])]) + @api.constrains('start_time') + def _check_start_time(self): + for rec in self: + workflow_records = self.env['soong.workflow.record'].search([ + ('workflow_id.name', '=', '加班'), + ('create_uid', '=', self.env.user.id), + ]) + if not workflow_records: + continue + for wf_rec in workflow_records: + target_model = self.env[wf_rec.res_model] + target_record = target_model.browse(wf_rec.res_id) + if not target_record.exists() or not target_record.start_time: + continue + if target_record.start_time.date() == rec.start_time.date(): + raise UserError('当天已有加班审批,请重新选择开始时间') + def open_record(self): if self.start_time and self.end_time and self.employee_ids: start_date = fields.Date.to_date(self.start_time) diff --git a/yuthon_hr_attendance/models/vacation_overtime_active.py b/yuthon_hr_attendance/models/vacation_overtime_active.py new file mode 100644 index 000000000..e9bed3cad --- /dev/null +++ b/yuthon_hr_attendance/models/vacation_overtime_active.py @@ -0,0 +1,24 @@ +from datetime import datetime, timedelta, time +from email.policy import default +from operator import index +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError +import calendar +from datetime import date +from dateutil.relativedelta import relativedelta +from odoo.exceptions import UserError, ValidationError + + +class VacationOvertimeActive(models.Model): + _name = 'vacation.overtime.active' + _description = '加班情况归档' + + employee_id = fields.Many2one('hr.employee', string='员工') + department_id = fields.Many2one('hr.department', related='employee_id.department_id', string="部门") + company_id = fields.Many2one('res.company', related='employee_id.company_id', string="公司") + workflow_record_id = fields.Many2one('soong.workflow.record', string='流程') + overtime_name = fields.Char(string="标题") + carry_forward_date = fields.Date(string="结转日期") + carry_forward_quantity = fields.Float(string="结转时长") + carry_result = fields.Selection([('success', '成功'), ('failed', '失败')], string="结转结果") + remaining_quantity = fields.Float(string="剩余数") diff --git a/yuthon_hr_attendance/models/yuthon_holiday_statement.py b/yuthon_hr_attendance/models/yuthon_holiday_statement.py index 5012d652e..f24b3d258 100644 --- a/yuthon_hr_attendance/models/yuthon_holiday_statement.py +++ b/yuthon_hr_attendance/models/yuthon_holiday_statement.py @@ -5,6 +5,7 @@ from datetime import date, timedelta class YuthonOvertimeReport(models.Model): _name = 'yuthon.holiday.statement' + class InheritHrLeave(models.Model): _inherit = 'hr.leave' _description = '请假情况' diff --git a/yuthon_hr_attendance/models/yuthon_overtime_line.py b/yuthon_hr_attendance/models/yuthon_overtime_line.py new file mode 100644 index 000000000..6c0d97cc1 --- /dev/null +++ b/yuthon_hr_attendance/models/yuthon_overtime_line.py @@ -0,0 +1,23 @@ +from odoo import api, fields, models, tools, _ +from datetime import datetime, time, timedelta +from odoo.exceptions import UserError +from datetime import date, timedelta + + + +class YuthonOvertimeLine(models.Model): + _name = 'yuthon.overtime.line' + _description = '加班明细' + + employee_id = fields.Many2one('hr.employee', string="员工") + last_balance = fields.Float(string="上年结余") + valid_date = fields.Date(string="有效至") + workday = fields.Float(string='工作日') + public_holidays = fields.Float(string='公休日') + vacation_sum = fields.Float(string='合计数') + carry_forward_quantity = fields.Float(string="结转时长") + carry_forward_date = fields.Date(string="结转日期") + remaining_quantity = fields.Float(string="剩余数") + + def open_record(self): + pass \ No newline at end of file diff --git a/yuthon_hr_attendance/models/yuthon_parenting_allocate.py b/yuthon_hr_attendance/models/yuthon_parenting_allocate.py new file mode 100644 index 000000000..b607a5108 --- /dev/null +++ b/yuthon_hr_attendance/models/yuthon_parenting_allocate.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +from odoo import api, fields, models, tools, _ +from datetime import datetime, time, timedelta +from odoo.exceptions import UserError + + +class YuthonParentingAllocate(models.Model): + _name = 'yuthon.parenting.allocate' + _description = '育儿额度分配规则' + + company_id = fields.Many2one("res.company", string="公司", default=lambda self: self.env.company) + cycle_years = fields.Integer(string='周期年数', default=1, help='按出生日计算的周期年数,如1表示1年') + cycle_unit = fields.Integer(string='周期单位', default=1, help='周期的描述单位,如“1”周期') + valid_limit = fields.Integer(string='有效期限(岁)', default=1, help='规则生效的截止条件') + distribute = fields.Integer(string='年/发放额度') + start_date = fields.Date(string="生效日期", copy=False, default=fields.Date.today()) + end_date = fields.Date(string="失效日期", copy=False, default=fields.Date.from_string('2099-01-01')) + is_enable = fields.Boolean(string="是否启用", compute="compute_is_enable", store=True) + birth_certificate = fields.Text(string='备注', default='需要在花名册配置紧急联系人才能生效') + + @api.depends('start_date', 'end_date') + def compute_is_enable(self): + for rec in self: + if not rec.end_date: + rec.is_enable = True + else: + if rec.start_date and rec.end_date: + if rec.start_date <= fields.Date.today() < rec.end_date: + rec.is_enable = True + else: + rec.is_enable = False \ No newline at end of file diff --git a/yuthon_hr_attendance/models/yuthon_vacation_reports.py b/yuthon_hr_attendance/models/yuthon_vacation_reports.py index db17df426..86f239173 100644 --- a/yuthon_hr_attendance/models/yuthon_vacation_reports.py +++ b/yuthon_hr_attendance/models/yuthon_vacation_reports.py @@ -31,6 +31,7 @@ class YuthonVacationReports(models.Model): year_holiday = fields.Float(string="本年公休日", digits=(16, 3)) year_workday = fields.Float(string="本年工作日", digits=(16, 3)) year_sum = fields.Float(string="本年调休合计", digits=(16, 3), compute="_compute_year_sum") + previous_year1 = fields.Float(string="上年剩余(补休)", digits=(16, 3)) used_this_year1 = fields.Float(string="本年已休", digits=(16, 3)) remainder_year1 = fields.Float(string="剩余(补休)", digits=(16, 3), compute="_compute_year_sum") @@ -40,6 +41,7 @@ class YuthonVacationReports(models.Model): overtime_ids = fields.One2many('vacation.over.line', 'vacation_id', string='加班明细') meal_fee_ids = fields.One2many('vacation.meal.line', 'vacation_id', string='误餐明细') medical_fee_ids = fields.One2many('vacation.medical.line', 'vacation_id', string='体检费明细') + parenting_line_ids = fields.One2many('vacation.parenting.line', 'vacation_id', string='育儿假明细') other_fee_ids = fields.One2many('vacation.other.line', 'vacation_id', string='其他明细') vacation_date = fields.Date(string='日期', default=lambda self: fields.Date.today().replace(day=1)) display_date = fields.Char(string='日期', compute='_compute_display_date') @@ -68,6 +70,8 @@ class YuthonVacationReports(models.Model): general_sick_leave = fields.Float(string='病假(普通)', digits=(16, 3), compute='_compute_other_leave', store=True, group_operator=None) hospital_sick_leave = fields.Float(string='病假(住院期)', digits=(16, 3), compute='_compute_other_leave', store=True, group_operator=None) recovery_sick_leave = fields.Float(string='病假(出院恢复期)', digits=(16, 3), compute='_compute_other_leave', store=True, group_operator=None) + parental_leave = fields.Float(string='育儿假', digits=(16, 3), compute='_compute_parental_leave', store=True, group_operator=None) + remaining_parental_leave = fields.Float(string='剩余育儿假', digits=(16, 3), compute='_compute_parental_leave', store=True, group_operator=None) exam_leave = fields.Integer(string='考试假', compute='_compute_other_leave', store=True, group_operator=None) right_days = fields.Float(string='转正天数', group_operator=None, compute='compute_attendance_fields') internship_days = fields.Float(string='实习天数', group_operator=None) @@ -97,6 +101,122 @@ class YuthonVacationReports(models.Model): tracking=3, default='not_sent') + def update_overtime(self): + today = date.today() + over_line_domain = [ + ('vacation_id', '!=', False), + ('update_type', '=', 'add'), + ('is_void', '=', False) + ] + over_lines = self.env['vacation.over.line'].search(over_line_domain) + + void_lines = self.env['vacation.over.line'] + for line in over_lines: + # 确定判断超期的基准日期:有adjust_date则用adjust_date,否则用valid_date + check_date = line.adjust_date if line.adjust_date else line.valid_date + if check_date and today > check_date: + void_lines |= line + + # 批量标记作废 + if void_lines: + void_lines.write({'is_void': True}) + + for void_line in void_lines: + # 跳过vacation_id为空的情况 + if not void_line.vacation_id: + continue + + main_vacation = void_line.vacation_id + vacation_date = main_vacation.vacation_date + + # 查找vacation_date之后的加班记录中,text='上月继承额度'的行 + inherit_domain = [ + ('vacation_id', '=', main_vacation.id), + ('create_date', '>=', fields.Datetime.to_datetime(vacation_date)), + ('text', '=', '上月额度继承'), + ] + inherit_lines = self.env['vacation.over.line'].search(inherit_domain) + if not inherit_lines: + continue + + deduct_value = void_line.update_lines or 0.0 + for inherit_line in inherit_lines: + new_lines = inherit_line.update_lines - deduct_value + inherit_line.write({'update_lines': new_lines}) + + def update_leave(self): + today = date.today() + leave_line_domain = [ + ('vacation_id', '!=', False), + ('update_type', '=', 'add'), + ('is_void', '=', False) + ] + leave_lines = self.env['vacation.leave.line'].search(leave_line_domain) + + void_lines = self.env['vacation.leave.line'] + for line in leave_lines: + check_date = line.adjust_date if line.adjust_date else line.valid_date + if check_date and today > check_date: + void_lines |= line + + if void_lines: + void_lines.write({'is_void': True}) + + # 3. 扣减update_lines中「上月继承额度」的workday + for void_line in void_lines: + if not void_line.vacation_id: + continue + + main_vacation = void_line.vacation_id + vacation_date = main_vacation.vacation_date + if not vacation_date: + continue + + # 查找vacation_date之后的年假继承记录(关联update_lines) + inherit_domain = [ + ('vacation_id', '=', main_vacation.id), + ('create_date', '>=', fields.Datetime.to_datetime(vacation_date)), + ('text', '=', '上月额度继承'), + ('is_void', '=', False) + ] + inherit_lines = self.env['vacation.leave.line'].search(inherit_domain) + + if not inherit_lines: + continue + + # 扣减年假workday + deduct_value = void_line.workday or 0.0 + for inherit_line in inherit_lines: + new_workday = inherit_line.workday - deduct_value + inherit_line.write({'workday': new_workday}) + + @api.depends('other_fee_ids', 'other_fee_ids.holiday_type', 'other_fee_ids.lines', + 'other_fee_ids.is_void', 'other_fee_ids.update_type', 'parenting_line_ids', + 'parenting_line_ids.update_date', 'parenting_line_ids.end_date', 'parenting_line_ids.lines') + def _compute_parental_leave(self): + today = date.today() + for rec in self: + used_amount = 0.0 + deduct_fee_lines = rec.other_fee_ids.filtered( + lambda l: + l.holiday_type.name == '育儿假' + and l.update_type == 'reduce' + and not l.is_void + and l.lines > 0 + ) + if deduct_fee_lines: + used_amount = sum(line.lines for line in deduct_fee_lines) + rec.parental_leave = used_amount + total_amount = 0.0 + valid_parenting_lines = rec.parenting_line_ids.filtered( + lambda l: + l.update_date <= today + and (l.end_date >= today if l.end_date else True) + ) + if valid_parenting_lines: + total_amount = sum(line.lines for line in valid_parenting_lines) + rec.remaining_parental_leave = max(total_amount - used_amount, 0.0) + def update_vacation_state(self): records = self.env["yuthon.vacation.reports"].browse( self._context.get('active_ids', self._context.get('active_id', self.ids)) @@ -132,16 +252,17 @@ class YuthonVacationReports(models.Model): record.other_fee_ids.write({'is_confirm': True}) return result - @api.depends('previous_year', 'year_distribution', 'used_this_year') + @api.depends('year_distribution', 'used_this_year') def _compute_remainder_year(self): for record in self: - record.remainder_year = record.previous_year + record.year_distribution - record.used_this_year + record.remainder_year = record.year_distribution - record.used_this_year @api.depends('last_holiday', 'last_workday', 'year_holiday', 'year_workday', 'used_this_year1') def _compute_year_sum(self): for record in self: record.year_sum = record.last_holiday + record.last_workday + record.year_holiday + record.year_workday record.remainder_year1 = record.year_sum - record.used_this_year1 + record.previous_year1 = record.last_holiday + record.last_workday @api.constrains('employee_id', 'vacation_date') def _check_duplicate_monthly_record(self): @@ -217,8 +338,6 @@ class YuthonVacationReports(models.Model): if invalid_overtimes: raise UserError('有加班单未结束,请先结束加班批次') - rec.manage_reject() - @api.depends('vacation_date') def _compute_display_date(self): for rec in self: @@ -493,11 +612,19 @@ class YuthonVacationReports(models.Model): return f'{month}月{day}日' def button_put(self): - url = f'https://oa.thtzjt.com/webh5/#/vacation?id={self.id}' - we_id = self.env['hr.employee'].search([('id', '=', self.employee_id.id)]).wecom_userid - self.sudo().env["wecom.apps"].sync_send_message_textcard(category='default', user_id=we_id, title="考勤确认", - description=self.employee_id.name + '请确认你的考勤:', - url=url, btntxt="详细信息") + we_id = self.employee_id.wecom_userid + if we_id: + url = f'https://phone.thtzjt.com/phone/Notarize/{self.id}/{self.employee_id.id}' + year = self.vacation_date.year + month = self.vacation_date.month + data = f"你{year}年{month}月的考勤确认单已经生成,请确认" + self.sudo().env["wecom.apps"].sync_send_message_textcard(category='att_ok', user_id=we_id, + title="考勤确认单", description=data, url=url, + btntxt="详细信息") + self.sudo().env["wecom.apps"].sync_send_message_textcard(category='att_ok', user_id="18562027762", + title="考勤确认单", description=data, url=url, + btntxt="详细信息") + self.write({'vacation_state': 'pending'}) return { 'type': 'ir.actions.client', 'tag': 'display_notification', @@ -509,27 +636,32 @@ class YuthonVacationReports(models.Model): } def all_put(self): - vacation_ids = self.env["yuthon.vacation.reports"].browse( - self._context.get('active_ids', self._context.get('active_id'))) - vacation_list = [] + vacation_ids = self.env["yuthon.vacation.reports"].browse(self._context.get('active_ids', self._context.get('active_id'))) for rec in vacation_ids: - vacation_list.append(rec.id) + we_id = rec.employee_id.wecom_userid + year = rec.vacation_date.year + month = rec.vacation_date.month + if we_id: + url = f'https://phone.thtzjt.com/phone/Notarize/{rec.id}/{rec.employee_id.id}' + data = f"你{year}年{month}月的考勤确认单已经生成,请确认" + self.sudo().env["wecom.apps"].sync_send_message_textcard(category='att_ok', user_id=we_id, title="考勤确认单", description=data, url=url, btntxt="详细信息") + self.sudo().env["wecom.apps"].sync_send_message_textcard(category='att_ok', user_id="18562027762", title="考勤确认单", description=data, url=url, btntxt="详细信息") + rec.write({'vacation_state': 'pending'}) return { - 'type': 'ir.actions.act_window', - 'name': '批量发送确认弹窗', - 'res_model': 'vacation.put.wizard', - 'view_mode': 'form', - 'target': 'new', - 'context': {'default_vacation_ids': [(6, 0, [vacation_list])] + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'type': 'success', + 'message': '已发送提醒消息', + 'sticky': False, } } - def manage_confirmation(self): vacation_ids = self.env["yuthon.vacation.reports"].browse( self._context.get('active_ids', self._context.get('active_id'))) for rec in vacation_ids: - rec.manage_reject() + rec.vacation_state = 'confirmed' def manage_reject(self): ''' @@ -543,10 +675,7 @@ class YuthonVacationReports(models.Model): ('employee_id', '=', rec.employee_id.id), ('vacation_date', '>=', fields.Date.to_string(last_month_first)), ('vacation_date', '<=', fields.Date.to_string(last_month_last)), - ('vacation_state', '=', 'confirmed') ], limit=1) - - rec.vacation_state = 'confirmed' current_year = rec.vacation_date.year last_month_year = last_month_last.year is_cross_year = current_year != last_month_year @@ -565,6 +694,18 @@ class YuthonVacationReports(models.Model): 'leave': last_month_record.leave, 'working_overtime': last_month_record.working_overtime, 'medical_fee': last_month_record.medical_fee, + 'previous_year': last_month_record.previous_year, + 'valid_date': last_month_record.valid_date, + 'year_distribution': last_month_record.year_distribution, + 'used_this_year': last_month_record.used_this_year, + 'last_holiday': last_month_record.last_holiday, + 'last_workday': last_month_record.last_workday, + 'valid_date1': last_month_record.valid_date1, + 'year_holiday': last_month_record.year_holiday, + 'year_workday': last_month_record.year_workday, + 'previous_year1': last_month_record.previous_year1, + 'used_this_year1': last_month_record.used_this_year1, + 'remainder_year1': last_month_record.remainder_year1, } rec.write(inherit_vals) if rec.leave: @@ -585,7 +726,6 @@ class YuthonVacationReports(models.Model): total += line.lines elif line.update_type == 'reduce': total -= line.lines - record.medical_fee = max(total, 0.0) def disposable_report(self): @@ -701,9 +841,9 @@ class YuthonVacationReports(models.Model): ) def _compute_working_overtime(self): for record in self: - total_add1 = 0.0 - total_add2 = 0.0 - total_add = 0.0 + total_add1 = 0.0 # 加班时 + total_add2 = 0.0 # (已用补休) + total_add = 0.0 # (剩余补休) legal_total = 0.0 for line in record.overtime_ids: if line.is_void: @@ -718,8 +858,10 @@ class YuthonVacationReports(models.Model): if line.workflow_record_id and line.update_type == 'add' and line.overtime_methods == 'leave': total_add1 += line_total + if line.workflow_record_id and line.update_type == 'reduce': total_add2 += line_total + adjust_holiday_days = 0.0 for other_line in record.other_fee_ids: if other_line.holiday_type and other_line.holiday_type.name == '调休': @@ -790,7 +932,7 @@ class YuthonVacationReports(models.Model): ], limit=1) # 如果考勤异常,则不自动确认 if not attendance_exception: - rec.manage_reject() + rec.vacation_state = 'confirmed' def monthly_report(self): today = fields.Date.today() @@ -952,6 +1094,7 @@ class VacationLeaveLine(models.Model): self._sync_to_employee(reverse=True) return super(VacationLeaveLine, self).unlink() + class VacationOverline(models.Model): _name = 'vacation.over.line' _description = '加班明细' @@ -967,6 +1110,7 @@ class VacationOverline(models.Model): last_balance = fields.Float(string='上年结余', compute='_compute_last_balance', store=True) legal_day = fields.Float(string='法定节假日') public_holidays = fields.Float(string='公休日') + vacation_sum = fields.Float(string='合计数', compute='_compute_last_balance') meal_number = fields.Integer(string='误餐次数') update_date = fields.Date(string='更新时间') is_void = fields.Boolean(string='是否作废') @@ -991,10 +1135,24 @@ class VacationOverline(models.Model): ],string='结转状态', default='pending', ) - remaining_quantity = fields.Float(string='剩余数', compute="_compute_remaining_quantity", store=True) + remaining_quantity = fields.Float(string='剩余数', compute="_compute_last_balance", store=True) + + def open_record1(self): + tree_id = self.env.ref("yuthon_hr_attendance.view_yuthon_vacation_overtime_tree").id + return { + 'type': 'ir.actions.act_window', + 'name': 'Overtime Record', + 'res_model': 'vacation.meal.line', + 'view_mode': 'tree', + 'views': [[tree_id, 'tree']], + 'domain': [('employee_id', '=', self.employee_id.id), + ('carry_forward_state', '=', 'pending') + ], + } @api.model def confirm(self): + # 1. 构建筛选域 domain = [ '|', ['is_initial_number', '=', True], @@ -1012,11 +1170,39 @@ class VacationOverline(models.Model): filtered_records = self.search(domain) if not filtered_records: return - records_to_update = filtered_records.filtered( - lambda r: fields.float_compare(r.duration, r.carry_forward_quantity) == 0 + + valid_records = filtered_records.filtered( + lambda r: r.carry_forward_quantity and r.carry_forward_quantity != 0.0 ) - if records_to_update: - records_to_update.write({'is_filing': True}) + if not valid_records: + return + + active_model = self.env['vacation.overtime.active'] + for rec in valid_records: + if rec.remaining_quantity == 0: + rec.is_filing = True + + match_domain = [ + ('employee_id', '=', rec.employee_id.id if rec.employee_id else False), + ('workflow_record_id', '=', rec.workflow_record_id.id if rec.workflow_record_id else False), + ('carry_forward_date', '=', rec.carry_forward_date or fields.Date.today()), + ('overtime_name', '=', rec.overtime_name or '') + ] + existing_active = active_model.search(match_domain, limit=1) + active_vals = { + 'employee_id': rec.employee_id.id if rec.employee_id else False, + 'workflow_record_id': rec.workflow_record_id.id if rec.workflow_record_id else False, + 'overtime_name': rec.overtime_name or '', + 'remaining_quantity': rec.remaining_quantity, + 'carry_forward_date': rec.carry_forward_date or fields.Date.today(), + 'carry_forward_quantity': rec.carry_forward_quantity, + 'carry_result': 'success' + } + + if existing_active: + existing_active.write(active_vals) + else: + active_model.create(active_vals) def update_is_visible(self): over_ids = self.env["vacation.over.line"].browse( @@ -1028,21 +1214,17 @@ class VacationOverline(models.Model): over_ids = self.env["vacation.over.line"].browse( self._context.get('active_ids', self._context.get('active_id'))) for rec in over_ids: - rec._compute_remaining_quantity() rec._compute_overtime() rec._compute_employee_id() rec._compute_last_balance() - @api.depends('duration', 'carry_forward_quantity') - def _compute_remaining_quantity(self): - for rec in self: - rec.remaining_quantity = rec.duration - rec.carry_forward_quantity - @api.depends('vacation_id') def _compute_last_balance(self): for rec in self: if rec.vacation_id: rec.last_balance = rec.vacation_id.last_holiday + rec.vacation_id.last_workday + rec.vacation_sum = rec.last_balance + rec.public_holidays + rec.workday + rec.remaining_quantity = rec.vacation_sum - rec.carry_forward_quantity else: rec.last_balance = 0 @@ -1320,6 +1502,19 @@ class VacationMealLine(models.Model): return super(VacationMealLine, self).unlink() +class VacationParentingLine(models.Model): + _name = 'vacation.parenting.line' + _description = '育儿明细' + + vacation_id = fields.Many2one('yuthon.vacation.reports', string='关联假期额度记录') + employee_id = fields.Many2one('hr.employee', string='员工') + update_date = fields.Date(string='发放日期') + end_date = fields.Date(string='失效日期') + lines = fields.Float(string='额度') + text = fields.Text(string='备注') + is_confirm = fields.Boolean(string="是否确认") + + class VacationMedicalLine(models.Model): _name = 'vacation.medical.line' _description = '体检费明细' diff --git a/yuthon_hr_attendance/security/ir.model.access.csv b/yuthon_hr_attendance/security/ir.model.access.csv index cdc58f6eb..c19fbb2f2 100644 --- a/yuthon_hr_attendance/security/ir.model.access.csv +++ b/yuthon_hr_attendance/security/ir.model.access.csv @@ -85,4 +85,9 @@ access_applet_security_quick_perm_wizard,access_applet_security_quick_perm_wizar access_vacation_reports_wizard,vacation.reports.wizard,model_vacation_reports_wizard,base.group_user,1,1,1,1 access_yuthon_holiday_statement,access_yuthon_holiday_statement,model_yuthon_holiday_statement,base.group_user,1,1,1,1 access_yuthon_meal_case,access_yuthon_meal_case,model_yuthon_meal_case,base.group_user,1,1,1,1 -access_pay_carryover_wizard,pay.carryover.wizard,model_pay_carryover_wizard,base.group_user,1,1,1,1 \ No newline at end of file +access_pay_carryover_wizard,pay.carryover.wizard,model_pay_carryover_wizard,base.group_user,1,1,1,1 +access_vacation_parenting_line,vacation.parenting.line,model_vacation_parenting_line,base.group_user,1,1,1,1 +access_yuthon_parenting_allocate,yuthon.parenting.allocate,model_yuthon_parenting_allocate,base.group_user,1,1,1,1 +access_vacation_overtime_active,vacation.overtime.active,model_vacation_overtime_active,base.group_user,1,1,1,1 + +access_yuthon_overtime_line,yuthon.overtime.line,model_yuthon_overtime_line,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/yuthon_hr_attendance/static/src/js/button_meal_confirm.js b/yuthon_hr_attendance/static/src/js/button_meal_confirm.js index 3e3e82531..303a5fd09 100644 --- a/yuthon_hr_attendance/static/src/js/button_meal_confirm.js +++ b/yuthon_hr_attendance/static/src/js/button_meal_confirm.js @@ -7,17 +7,10 @@ export class CustomAttendanceMealConfirmController extends ListController { setup() { super.setup(); } - async getAction(lock_type) { - const action = await this.orm.call('vacation.meal.line', 'confirm', [lock_type], {context: this.props.context}); - action["context"] = { - ...action.context, - ...this.model.root.context, - } - return action + await this.orm.call('vacation.meal.line', 'confirm', []); } } - registry.category("views").add("custom_vacation_meal_button", { ...listView, Controller: CustomAttendanceMealConfirmController, diff --git a/yuthon_hr_attendance/static/src/js/button_statement_confirm.js b/yuthon_hr_attendance/static/src/js/button_statement_confirm.js index f598e288e..4c08e982e 100644 --- a/yuthon_hr_attendance/static/src/js/button_statement_confirm.js +++ b/yuthon_hr_attendance/static/src/js/button_statement_confirm.js @@ -8,13 +8,9 @@ export class CustomAttendanceStatementConfirmController extends ListController { super.setup(); } + async getAction(lock_type) { - const action = await this.orm.call('hr.leave', 'confirm', [lock_type], {context: this.props.context}); - action["context"] = { - ...action.context, - ...this.model.root.context, - } - return action + await this.orm.call('hr.leave', 'confirm', []); } } diff --git a/yuthon_hr_attendance/static/src/js/button_vacation_confirm.js b/yuthon_hr_attendance/static/src/js/button_vacation_confirm.js index 00223dbe0..ef52c8ffa 100644 --- a/yuthon_hr_attendance/static/src/js/button_vacation_confirm.js +++ b/yuthon_hr_attendance/static/src/js/button_vacation_confirm.js @@ -9,12 +9,13 @@ export class CustomAttendanceVacationConfirmController extends ListController { } async getAction(lock_type) { - const action = await this.orm.call('vacation.over.line', 'confirm', [lock_type], {context: this.props.context}); - action["context"] = { - ...action.context, - ...this.model.root.context, - } - return action + await this.orm.call('vacation.over.line', 'confirm', []); + } + async getNextAction(lock_type) { + await this.orm.call('vacation.meal.line', 'confirm', []); + } + async getLastAction(lock_type) { + await this.orm.call('vacation.meal.line', 'confirm', []); } } diff --git a/yuthon_hr_attendance/static/src/js/button_vacation_put.js b/yuthon_hr_attendance/static/src/js/button_vacation_put.js index 50947e342..51b4db269 100644 --- a/yuthon_hr_attendance/static/src/js/button_vacation_put.js +++ b/yuthon_hr_attendance/static/src/js/button_vacation_put.js @@ -42,27 +42,13 @@ export class CustomAttendanceVacationPutController extends ListController { openVacationOverWizard() { this.actionService.doAction({ type: 'ir.actions.act_window', - res_model: 'vacation.over.line', - name: '加班情况', + res_model: 'yuthon.overtime.line', + name: '加班合计数报表', view_mode: 'tree', view_type: 'form', views: [[false, 'tree']], target: 'current', - context: {'tree_view_ref': "yuthon_hr_attendance.view_yuthon_vacation_overtime_briefly_tree"}, - domain: [ - '|', - ['is_initial_number', '=', true], - '&', - ['is_initial_number', '=', false], - '&', - ['update_type', '=', 'add'], - '&', - ['workflow_record_id', '!=', false], - '!', - '&', - ['start_time', '>=', '2025-12-01 00:00:00'], - ['start_time', '<', '2026-01-01 00:00:00'] - ], + context: {'tree_view_ref': "yuthon_hr_attendance.view_yuthon_overtime_line_tree"}, }); } diff --git a/yuthon_hr_attendance/static/src/xml/button_vacation_confirm.xml b/yuthon_hr_attendance/static/src/xml/button_vacation_confirm.xml index a62709af5..14211cb33 100644 --- a/yuthon_hr_attendance/static/src/xml/button_vacation_confirm.xml +++ b/yuthon_hr_attendance/static/src/xml/button_vacation_confirm.xml @@ -5,6 +5,12 @@ + + \ No newline at end of file diff --git a/yuthon_hr_attendance/static/src/xml/button_vacation_put.xml b/yuthon_hr_attendance/static/src/xml/button_vacation_put.xml index 993552bae..38e5c0581 100644 --- a/yuthon_hr_attendance/static/src/xml/button_vacation_put.xml +++ b/yuthon_hr_attendance/static/src/xml/button_vacation_put.xml @@ -8,7 +8,7 @@ diff --git a/yuthon_hr_attendance/views/card_approval.xml b/yuthon_hr_attendance/views/card_approval.xml index 090e92c4f..34b519359 100644 --- a/yuthon_hr_attendance/views/card_approval.xml +++ b/yuthon_hr_attendance/views/card_approval.xml @@ -49,6 +49,7 @@ + diff --git a/yuthon_hr_attendance/views/vacation_overtime_active_views.xml b/yuthon_hr_attendance/views/vacation_overtime_active_views.xml new file mode 100644 index 000000000..4f793552b --- /dev/null +++ b/yuthon_hr_attendance/views/vacation_overtime_active_views.xml @@ -0,0 +1,24 @@ + + + + vacation.overtime.active.tree + vacation.overtime.active + + + + + + + + + + + + + + 加班情况(归档) + vacation.overtime.active + tree + + + \ No newline at end of file diff --git a/yuthon_hr_attendance/views/yuthon_overtime_line_views.xml b/yuthon_hr_attendance/views/yuthon_overtime_line_views.xml new file mode 100644 index 000000000..26dd21690 --- /dev/null +++ b/yuthon_hr_attendance/views/yuthon_overtime_line_views.xml @@ -0,0 +1,26 @@ + + + + yuthon.overtime.line.tree + yuthon.overtime.line + + + + + + + + + + + +
- - - +
diff --git a/yuthon_tianhe/views/right_login_template.xml b/yuthon_tianhe/views/right_login_template.xml index b25d59f4e..d08ce57ca 100644 --- a/yuthon_tianhe/views/right_login_template.xml +++ b/yuthon_tianhe/views/right_login_template.xml @@ -68,9 +68,9 @@ 还没有账户? 重置密码
- - - +
diff --git a/yuthon_wechat/data/auth_oauth_provider.xml b/yuthon_wechat/data/auth_oauth_provider.xml index bea12e550..1c0c5c784 100644 --- a/yuthon_wechat/data/auth_oauth_provider.xml +++ b/yuthon_wechat/data/auth_oauth_provider.xml @@ -5,7 +5,7 @@ Wechat Corp 企业微信扫码登录 corpid agentid corpsecret - fa fa-fw fa-sign-in text-primary wecom_qr_login + fa fa-fw fa-sign-in text-primary https://open.work.weixin.qq.com/wwopen/sso/qrConnect https://qyapi.weixin.qq.com/cgi-bin/gettoken https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo @@ -15,7 +15,7 @@ Wechat Corp2 企业微信直接登录 corpid agentid corpsecret - fa fa-fw fa-sign-in text-primary wecom_quick_login + fa fa-fw fa-sign-in text-primary https://open.weixin.qq.com/connect/oauth2/authorize https://qyapi.weixin.qq.com/cgi-bin/gettoken https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo diff --git a/yuthon_wechat/models/wecom_apps.py b/yuthon_wechat/models/wecom_apps.py index a9bf0f1eb..9ae5caa0d 100644 --- a/yuthon_wechat/models/wecom_apps.py +++ b/yuthon_wechat/models/wecom_apps.py @@ -160,7 +160,7 @@ class WeComApps(models.Model): "btntxt": btntxt }, } - elif category == 'task': + elif category in ['task', 'att_ok', 'salary']: data = { 'touser': user_id, 'msgtype': 'textcard', diff --git a/yuthon_wechat/models/wecom_apps_config.py b/yuthon_wechat/models/wecom_apps_config.py index 09f8d76ba..67dd269f3 100644 --- a/yuthon_wechat/models/wecom_apps_config.py +++ b/yuthon_wechat/models/wecom_apps_config.py @@ -29,6 +29,7 @@ class WecomAppsConfig(models.Model): ('att', '出勤类型'), ('task', '日程类型'), ('att_ok', '考勤确认类型'), + ('salary', '薪资消息通知'), ], default="default") wecom_apps_id = fields.Many2one("wecom.apps", string="企业微信的应用") diff --git a/yuthon_will_task/controllers/main.py b/yuthon_will_task/controllers/main.py index 2857a875b..3d01ae9b4 100644 --- a/yuthon_will_task/controllers/main.py +++ b/yuthon_will_task/controllers/main.py @@ -73,12 +73,10 @@ class YuthonWillTask(http.Controller): @http.route('/will/task/list', methods=['POST'], type='http', auth='public', csrf=False) def will_task_list(self, **kwargs): - employee_id = request.env['hr.employee'].search([('user_id', '=', int(kwargs.get('users_id')))]) start = kwargs.get('start') request_hour_selection = request.env['yuthon.will.task'].sudo().fields_get(allfields=['request_hour_from'])['request_hour_from']['selection'] result_list = [] - # task_ids = request.env['yuthon.will.task'].sudo().search([], offset=start, limit=20) - task_ids = request.env['yuthon.will.task'].sudo().search(['|', ('employee_ids', 'in', employee_id.id), ('employee_id.id', '=', employee_id.id)], offset=start, limit=20) + task_ids = request.env['yuthon.will.task'].sudo().search([('users_ids', 'in', [int(kwargs.get('users_id'))])], offset=start, limit=20) for task in task_ids: weekday_str = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"][task.start_date.weekday()] result = { diff --git a/yuthon_work_brand/views/hr_menus.xml b/yuthon_work_brand/views/hr_menus.xml index d35477197..9d89f5109 100644 --- a/yuthon_work_brand/views/hr_menus.xml +++ b/yuthon_work_brand/views/hr_menus.xml @@ -166,17 +166,17 @@ sequence="14"/> @@ -311,6 +311,11 @@ parent="attendance_resources_setting_root_board" action="hr_holidays.hr_leave_allocation_action_approve_department" sequence="20"/> +