From 8c7970bf8fb3a82f268d7dca691a06c1bdcd5f5e Mon Sep 17 00:00:00 2001 From: RomainLibert Date: Mon, 4 Feb 2019 11:57:31 +0000 Subject: [PATCH] [IMP] hr_holidays: reintroduce no_validation leave_type Since https://github.com/odoo/odoo/commit/59956805424808beed82f1afa5c5e6996e34eb13#diff-ab6382882079a64a861bbba2741a1075 it was impossible to use the no_validation on hr_leave_type. This commit reintroduces this possibility and ensures the leave user gets an actvity for the leave This commit also add a field on hr_leave_type in order to know for whom we should create the activity when validation is by hr closes odoo/odoo#30807 Signed-off-by: Yannick Tivisse (yti) --- addons/hr_holidays/models/hr_leave.py | 26 ++++++------------- .../hr_holidays/models/hr_leave_allocation.py | 15 ++++++----- addons/hr_holidays/models/hr_leave_type.py | 3 +++ .../security/hr_holidays_security.xml | 18 +++---------- .../hr_holidays/views/hr_leave_type_views.xml | 1 + 5 files changed, 24 insertions(+), 39 deletions(-) diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py index dc5932a1145..459bd63b3df 100644 --- a/addons/hr_holidays/models/hr_leave.py +++ b/addons/hr_holidays/models/hr_leave.py @@ -747,31 +747,23 @@ class HolidaysRequest(models.Model): def _check_approval_update(self, state): """ Check if target state is achievable. """ current_employee = self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1) - is_team_leader = self.env.user.has_group('hr_holidays.group_hr_holidays_team_leader') is_officer = self.env.user.has_group('hr_holidays.group_hr_holidays_user') is_manager = self.env.user.has_group('hr_holidays.group_hr_holidays_manager') - # FIXME This is probably handled by hr_leave_allocation_rule_employee_update ir.rule - if state in ['refuse', 'validate1', 'validate'] and not is_team_leader: - raise UserError(_('Only a Team Leader, Time Off Officer or Manager can approve or refuse time off requests.')) - for holiday in self: val_type = holiday.holiday_status_id.validation_type - if not is_manager: - if state == 'confirm': - continue - elif state == 'draft': + if not is_manager and state != 'confirm': + if state == 'draft': if holiday.employee_id != current_employee: - raise UserError(_('Only a Time Off Manager can reset other people time off.')) + raise UserError(_('Only a Leave Manager can reset other people leaves.')) else: # use ir.rule based first access check: department, members, ... (see security.xml) holiday.check_access_rule('write') - # FIXME Should probably be handled via ir.rule # This handles states validate1 validate and refuse if holiday.employee_id == current_employee: - raise UserError(_('Only a Time Off Manager can approve its own requests.')) + raise UserError(_('Only a Leave Manager can approve its own requests.')) if (state == 'validate1' and val_type == 'both') or (state == 'validate' and val_type == 'manager') and holiday.holiday_type == 'employee': manager = holiday.employee_id.parent_id or holiday.employee_id.department_id.manager_id @@ -784,10 +776,10 @@ class HolidaysRequest(models.Model): error = (not (manager and manager == current_employee) and not (team_leader and team_leader == self.env.user)) if error: - raise UserError(_('You must be either %s\'s manager or Time Off Manager to approve this time off') % (holiday.employee_id.name)) + raise UserError(_('You must be either %s\'s manager or Leave manager to approve this leave') % (holiday.employee_id.name)) if state == 'validate' and val_type == 'both': - raise UserError(_('Only an Time Off Manager can apply the second approval on time off requests.')) + raise UserError(_('Only an Leave Manager can apply the second approval on leave requests.')) # ------------------------------------------------------------ # Activity methods @@ -798,10 +790,8 @@ class HolidaysRequest(models.Model): responsible = self.env.user if self.validation_type == 'hr' or (self.validation_type == 'both' and self.state == 'validate1'): - responsible = self.env['res.users'].search([ - ('company_id', '=', self.employee_id.company_id.id), - ('groups_id', 'in', self.env.ref('hr_holidays.group_hr_holidays_user').id) - ], limit=1) + if self.holiday_status_id.responsible_id: + responsible = self.holiday_status_id.responsible_id elif self.state == 'confirm' or (self.state == 'validate' and self.validation_type == 'no_validation'): if self.employee_id.leave_manager_id and self.employee_id.leave_manager_id.has_group('hr_holidays.group_hr_holidays_team_leader'): responsible = self.employee_id.leave_manager_id diff --git a/addons/hr_holidays/models/hr_leave_allocation.py b/addons/hr_holidays/models/hr_leave_allocation.py index 8be3c4ac604..8ac1d7d10bd 100644 --- a/addons/hr_holidays/models/hr_leave_allocation.py +++ b/addons/hr_holidays/models/hr_leave_allocation.py @@ -523,16 +523,17 @@ class HolidaysAllocation(models.Model): def _get_responsible_for_approval(self): self.ensure_one() + responsible = self.env.user + if self.validation_type == 'hr' or (self.validation_type == 'both' and self.state == 'validate1'): - return self.env['res.users'].search([ - ('company_id', '=', self.employee_id.company_id.id), - ('groups_id', 'in', self.env.ref('hr_holidays.group_hr_holidays_user').id) - ], limit=1) + if self.holiday_status_id.responsible_id: + responsible = self.holiday_status_id.responsible_id if self.state == 'confirm' and self.employee_id.parent_id.user_id: - return self.employee_id.parent_id.user_id + responsible = self.employee_id.parent_id.user_id elif self.department_id.manager_id.user_id: - return self.department_id.manager_id.user_id - return self.env.user + responsible = self.department_id.manager_id.user_id + + return responsible def activity_update(self): to_clean, to_do = self.env['hr.leave.allocation'], self.env['hr.leave.allocation'] diff --git a/addons/hr_holidays/models/hr_leave_type.py b/addons/hr_holidays/models/hr_leave_type.py index e5a5d810240..30c4a843531 100644 --- a/addons/hr_holidays/models/hr_leave_type.py +++ b/addons/hr_holidays/models/hr_leave_type.py @@ -65,6 +65,9 @@ class HolidaysType(models.Model): group_days_leave = fields.Float( compute='_compute_group_days_leave', string='Group Time Off') company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.user.company_id) + responsible_id = fields.Many2one('res.users', 'Responsible', domain=lambda self: [('groups_id', 'in', self.env.ref('hr_holidays.group_hr_holidays_user').id)], + help="This user will be responsible for approving this type of times off" + "This is only used when validation is 'hr' or 'both'",) validation_type = fields.Selection([ ('no_validation', 'No Validation'), ('hr', 'Payroll Officer'), diff --git a/addons/hr_holidays/security/hr_holidays_security.xml b/addons/hr_holidays/security/hr_holidays_security.xml index 6e893f62d85..1d534a94648 100644 --- a/addons/hr_holidays/security/hr_holidays_security.xml +++ b/addons/hr_holidays/security/hr_holidays_security.xml @@ -7,8 +7,8 @@ Team Approver - - + + All Approver @@ -40,7 +40,7 @@ Time Off: employee: create/write/unlink not validated own - [('employee_id.user_id','=',user.id), ('state', 'in', ['draft', 'confirm', 'cancel', 'refuse'])] + [('employee_id.user_id','=',user.id), ('state', 'in', ['draft', 'confirm', 'cancel', 'refuse']), ('holiday_type', '=', 'employee')] @@ -48,23 +48,13 @@ Time Off: approver: write on employee's time off in his team - [('employee_id.leave_manager_id', '=' , user.id)] + [('employee_id.leave_manager_id', '=' , user.id), ('holiday_type', '=', 'employee')] - - Time Off: see all time off: read all - - [(1, '=', 1)] - - - - - - Time Off: see all time off: create/write/unlink own + managed employee + without department + same or managed department diff --git a/addons/hr_holidays/views/hr_leave_type_views.xml b/addons/hr_holidays/views/hr_leave_type_views.xml index f2c01f8e7f8..1c0b02abd1b 100644 --- a/addons/hr_holidays/views/hr_leave_type_views.xml +++ b/addons/hr_holidays/views/hr_leave_type_views.xml @@ -50,6 +50,7 @@ +