diff --git a/soong_workflow/models/soong_workflow_inspector.py b/soong_workflow/models/soong_workflow_inspector.py index b49beb00f..d9440137a 100644 --- a/soong_workflow/models/soong_workflow_inspector.py +++ b/soong_workflow/models/soong_workflow_inspector.py @@ -33,6 +33,23 @@ class SoongWorkflowInspector(models.Model): inspector_line2_ids = fields.One2many('soong.workflow.inspector.line2', 'workflow_inspector_id', string='督办明细') relevancy_type = fields.Selection([('none', '无')], string="关联流程类型") + users_ids = fields.Many2many('res.users', string="当前经办人", store=True, compute='_compute_users_ids') + + @api.depends('code') + def _compute_users_ids(self): + for record in self: + if not record.code: + record.users_ids = False + continue + workflow_records = self.env['soong.workflow.record'].search([ + ('code', '=', record.code), + ], limit=1) + if workflow_records: + employee_ids = workflow_records.employee_ids + user_ids = employee_ids.mapped('user_id').ids + record.users_ids = [(6, 0, user_ids)] + else: + record.users_ids = False class SoongWorkflowInspectorLine(models.Model): diff --git a/yuthon_contract/models/inherit_hr_contract.py b/yuthon_contract/models/inherit_hr_contract.py index c842310f1..56e8f9937 100644 --- a/yuthon_contract/models/inherit_hr_contract.py +++ b/yuthon_contract/models/inherit_hr_contract.py @@ -11,6 +11,7 @@ class HrContract(models.Model): code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('contract_code')) name = fields.Char(string="合同名称", compute='_compute_name', readonly=False) + is_annual_salary = fields.Boolean(string="是否年薪") resource_calendar_id = fields.Many2one('resource.calendar', string='考勤时间表') state = fields.Selection([ ('draft', '草稿'), @@ -205,6 +206,15 @@ class HrContract(models.Model): else: employee.salary_group_id = False + @api.onchange('is_annual_salary') + def _compute_is_annual_salary(self): + for contract_id in self: + employee = self.env['hr.employee'].search([('id', '=', contract_id.employee_id.id)], limit=1) + if employee: + employee.is_annual_salary = contract_id.is_annual_salary + else: + employee.is_annual_salary = False + @api.model def create(self, vals): contract = super(HrContract, self).create(vals) diff --git a/yuthon_contract/views/inherit_hr_contract_views.xml b/yuthon_contract/views/inherit_hr_contract_views.xml index 07758935b..668819f43 100644 --- a/yuthon_contract/views/inherit_hr_contract_views.xml +++ b/yuthon_contract/views/inherit_hr_contract_views.xml @@ -42,6 +42,7 @@ + diff --git a/yuthon_holiday/models/inherit_hr_leave.py b/yuthon_holiday/models/inherit_hr_leave.py index 25b77f17a..c7b9cddc8 100644 --- a/yuthon_holiday/models/inherit_hr_leave.py +++ b/yuthon_holiday/models/inherit_hr_leave.py @@ -452,6 +452,23 @@ class HolidaysRequestBatch(models.Model): return self._description if self._description else self._name name_title = fields.Char(default=_get_default_name_title) + users_ids = fields.Many2many('res.users', string="当前经办人", store=True, compute='_compute_users_ids') + + @api.depends('code') + def _compute_users_ids(self): + for record in self: + if not record.code: + record.users_ids = False + continue + workflow_records = self.env['soong.workflow.record'].search([ + ('code', '=', record.code), + ], limit=1) + if workflow_records: + employee_ids = workflow_records.employee_ids + user_ids = employee_ids.mapped('user_id').ids + record.users_ids = [(6, 0, user_ids)] + else: + record.users_ids = False @api.onchange('is_day') def _onchange_is_day(self): diff --git a/yuthon_holiday/models/inherit_hr_leave_allocation.py b/yuthon_holiday/models/inherit_hr_leave_allocation.py index 8c7e107ac..0fbe1c86e 100644 --- a/yuthon_holiday/models/inherit_hr_leave_allocation.py +++ b/yuthon_holiday/models/inherit_hr_leave_allocation.py @@ -171,7 +171,7 @@ class HrLeaveAllocation(models.Model): if lines_to_delete: lines_to_delete.is_void = True - return super(HrLeaveAllocation, self).unlink() + return super(HrLeaveAllocation, self).unlink() def update_vacation(self): diff --git a/yuthon_holiday/models/yuthon_fixes_approval.py b/yuthon_holiday/models/yuthon_fixes_approval.py index 6ea69653d..837b059b2 100644 --- a/yuthon_holiday/models/yuthon_fixes_approval.py +++ b/yuthon_holiday/models/yuthon_fixes_approval.py @@ -39,6 +39,23 @@ class YuthonFixesApproval(models.Model): return self._description if self._description else self._name name_title = fields.Char(default=_get_default_name_title) + users_ids = fields.Many2many('res.users', string="当前经办人", store=True, compute='_compute_users_ids') + + @api.depends('code') + def _compute_users_ids(self): + for record in self: + if not record.code: + record.users_ids = False + continue + workflow_records = self.env['soong.workflow.record'].search([ + ('code', '=', record.code), + ], limit=1) + if workflow_records: + employee_ids = workflow_records.employee_ids + user_ids = employee_ids.mapped('user_id').ids + record.users_ids = [(6, 0, user_ids)] + else: + record.users_ids = False @api.onchange('holiday_status') def _onchange_holiday_status(self): diff --git a/yuthon_holiday/models/yuthon_vacation_reports.py b/yuthon_holiday/models/yuthon_vacation_reports.py index 14f4ca568..d0014be33 100644 --- a/yuthon_holiday/models/yuthon_vacation_reports.py +++ b/yuthon_holiday/models/yuthon_vacation_reports.py @@ -7,17 +7,35 @@ from odoo.exceptions import ValidationError class YuthonVacationReports(models.Model): _name = 'yuthon.vacation.reports' _description = '假期额度记录' + _rec_name = "employee_id" employee_id = fields.Many2one('hr.employee', string='员工') company_id = fields.Many2one(related="employee_id.company_id", string="公司") leave_ids = fields.One2many('vacation.leave.line', 'vacation_id', string='年假明细') 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='体检费明细') leave = fields.Float(string='年假', compute='_compute_leave', store=True) working_overtime = fields.Float(string='加班时', compute='_compute_working_overtime', store=True) meal_fee = fields.Integer(string="误餐次数", compute='_compute_meal_fee', store=True) + def action_open_my_form(self): + employee = self.env.user.employee_id + vacation_report = self.env['yuthon.vacation.reports'].search( + [('employee_id', '=', employee.id)], limit=1) + return { + 'name': '我的假期额度', + 'type': 'ir.actions.act_window', + 'res_model': 'yuthon.vacation.reports', + 'view_mode': 'form', + 'res_id': vacation_report.id, + 'view_id': self.env.ref('yuthon_holiday.view_yuthon_vacation_reports_form1').id, + 'context': { + 'default_employee_id': employee.id, + }, + } + def overtime_allocation(self): form_id = self.env.ref('hr_holidays.hr_leave_allocation_view_form_manager').id holiday_status_id = self.env['hr.leave.type'].search([('name', '=', '补休')]) @@ -66,43 +84,47 @@ class YuthonVacationReports(models.Model): } } - @api.depends('leave_ids.update_lines', 'leave_ids.update_type') + @api.depends('leave_ids.update_lines', 'leave_ids.update_type', 'leave_ids.is_void') def _compute_leave(self): for record in self: leave_total = 0.0 for line in record.leave_ids: - if line.update_type == 'add': - leave_total += line.update_lines or 0 - elif line.update_type == 'reduce': - leave_total -= line.update_lines or 0 + if not line.is_void: + if line.update_type == 'add': + leave_total += line.update_lines or 0 + elif line.update_type == 'reduce': + leave_total -= line.update_lines or 0 record.leave = leave_total @api.depends( 'overtime_ids.workday', 'overtime_ids.legal_day', 'overtime_ids.public_holidays', - 'overtime_ids.update_type' + 'overtime_ids.update_type', + 'overtime_ids.is_void' ) def _compute_working_overtime(self): for record in self: overtime_total = 0.0 for line in record.overtime_ids: - line_total = (line.workday or 0) + (line.legal_day or 0) + (line.public_holidays or 0) - if line.update_type == 'add': - overtime_total += line_total - elif line.update_type == 'reduce': - overtime_total -= line_total + if not line.is_void: + line_total = (line.workday or 0) + (line.legal_day or 0) + (line.public_holidays or 0) + if line.update_type == 'add': + overtime_total += line_total + elif line.update_type == 'reduce': + overtime_total -= line_total record.working_overtime = overtime_total - @api.depends('meal_fee_ids.update_lines', 'meal_fee_ids.update_type') + @api.depends('meal_fee_ids.update_lines', 'meal_fee_ids.update_type', 'meal_fee_ids.is_void') def _compute_meal_fee(self): for record in self: meal_total = 0 for line in record.meal_fee_ids: - if line.update_type == 'add': - meal_total += int(line.update_lines or 0) - elif line.update_type == 'reduce': - meal_total -= int(line.update_lines or 0) + if not line.is_void: + if line.update_type == 'add': + meal_total += int(line.update_lines or 0) + elif line.update_type == 'reduce': + meal_total -= int(line.update_lines or 0) record.meal_fee = meal_total def button_fixes_approval(self): @@ -197,6 +219,8 @@ class VacationLeaveLine(models.Model): update_lines = fields.Float(string='更新额度') is_void = fields.Boolean(string='是否作废') allocation_type = fields.Selection([('vacation', '休假'), ('allocation', '分配')], string='分配类型') + valid_date = fields.Date(string='有效期至') + adjust_date = fields.Date(string='调整至') text = fields.Text(string='备注') @api.model @@ -237,6 +261,8 @@ class VacationOverline(models.Model): meal_number = fields.Integer(string='误餐次数') update_date = fields.Date(string='更新时间') is_void = fields.Boolean(string='是否作废') + valid_date = fields.Date(string='有效期至') + adjust_date = fields.Date(string='调整至') text = fields.Text(string='备注') # def _sync_to_employee(self, reverse=False): @@ -283,6 +309,8 @@ class VacationMealLine(models.Model): update_lines = fields.Float(string='更新额度') is_soon = fields.Boolean(string="流程修改") is_void = fields.Boolean(string='是否作废', default=False) + valid_date = fields.Date(string='有效期至') + adjust_date = fields.Date(string='调整至') is_manual = fields.Boolean(string="手动修改") text = fields.Text(string='备注') @@ -312,6 +340,51 @@ class VacationMealLine(models.Model): self._sync_to_employee(reverse=True) return super(VacationMealLine, self).unlink() + +class VacationMedicalLine(models.Model): + _name = 'vacation.medical.line' + _description = '体检费明细' + + vacation_id = fields.Many2one('yuthon.vacation.reports', string='关联假期额度记录') + employee_id = fields.Many2one('hr.employee', string='员工') + workflow_record_id = fields.Many2one('soong.workflow.record', string='流程') + update_type = fields.Char(string='更新类型') + update_date = fields.Date(string='更新时间') + valid_date = fields.Date(string='有效期至') + adjust_date = fields.Date(string='调整至') + lines = fields.Float(string='额度') + is_void = fields.Boolean(string='是否作废', default=False) + text = fields.Text(string='备注') + + @api.model + def create(self, vals): + record = super(VacationMedicalLine, self).create(vals) + if record.employee_id and record.valid_date: + employee = record.employee_id + medical_rule = self.env['medical.rules.setting'].search([ + ('company_id', '=', employee.company_id.id), + ('select_year', '<=', str(record.valid_date.year)) + ], order='select_year DESC', limit=1) + if medical_rule: + age_diff = max(0, employee.old - 20) + increase_times = age_diff // medical_rule.every_few_years + base_amount = medical_rule.base + + # 根据性别和婚姻状况调整额度 + if employee.gender == 'female': + if employee.marital in ['single', 'divorced', 'widower', 'cohabitant']: + base_amount += medical_rule.woman_unmarried + else: + base_amount += medical_rule.woman_unmarried + medical_rule.woman_married + + # 计算最终额度(基础额度 + 递增额度) + final_amount = base_amount + (increase_times * medical_rule.increasing) + final_amount = min(final_amount, medical_rule.max) + record.write({'lines': final_amount}) + return record + + + class DetailsTree(models.Model): _name = 'details.tree' _description = '明细表' diff --git a/yuthon_holiday/security/ir.model.access.csv b/yuthon_holiday/security/ir.model.access.csv index 07834f674..2b531e9b0 100644 --- a/yuthon_holiday/security/ir.model.access.csv +++ b/yuthon_holiday/security/ir.model.access.csv @@ -11,3 +11,4 @@ access_vacation_leave_line,vacation_leave_line,model_vacation_leave_line,base.gr access_vacation_meal_line,vacation_meal_line,model_vacation_meal_line,base.group_user,1,1,1,1 access_vacation_over_line,vacation_over_line,model_vacation_over_line,base.group_user,1,1,1,1 access_details_tree, details_tree,model_details_tree,base.group_user,1,1,1,1 +access_vacation_medical_line,vacation_medical_line,model_vacation_medical_line,base.group_user,1,1,1,1 diff --git a/yuthon_holiday/views/yuthon_vacation_reports_views.xml b/yuthon_holiday/views/yuthon_vacation_reports_views.xml index 33f6c0fcb..7e0a046d0 100644 --- a/yuthon_holiday/views/yuthon_vacation_reports_views.xml +++ b/yuthon_holiday/views/yuthon_vacation_reports_views.xml @@ -4,7 +4,7 @@ yuthon.vacation.reports.tree yuthon.vacation.reports - + @@ -43,6 +43,8 @@ + + @@ -62,6 +64,8 @@ + + @@ -78,22 +82,49 @@ + +