From c99a6d2fb5b22bdbdf36b49e0df508a0224d4b77 Mon Sep 17 00:00:00 2001 From: lbs-odoo Date: Wed, 31 Oct 2018 15:31:34 +0000 Subject: [PATCH] [IMP] hr_holidays: Add team leader group and leave_manager_id Purpose ======= 1/ A team leader is not able to validate leaves for his own team. 2/ Another person than the manager can be supposed to validate the leaves for a certain employee Specification ============= 1/ New hierarchy: Team Leader < Officer < Manager People in Team Leader access group will now be able to approve leaves for employees in their team. - Added the new access group - Added rules for people in this group to read or write appropriate records 2/ Add 'leave_manager_id' field on employees to refer to the Team Leader. - Added the new field to Employee model - Added the field to the view so that it is visible - Modified a filter in a view so that it is more relevant according to its name (My Team Leaves) - Added a filter in a view for managed employees TaskID: 1888653 closes odoo/odoo#28352 --- addons/hr_holidays/models/hr.py | 4 ++++ addons/hr_holidays/models/hr_leave.py | 15 +++++++----- .../security/hr_holidays_security.xml | 24 +++++++++++++++---- addons/hr_holidays/views/hr_leave_views.xml | 13 +++++----- addons/hr_holidays/views/hr_views.xml | 3 ++- 5 files changed, 42 insertions(+), 17 deletions(-) diff --git a/addons/hr_holidays/models/hr.py b/addons/hr_holidays/models/hr.py index 5e1dc9840bb..05b35373309 100644 --- a/addons/hr_holidays/models/hr.py +++ b/addons/hr_holidays/models/hr.py @@ -63,6 +63,10 @@ class Department(models.Model): class Employee(models.Model): _inherit = "hr.employee" + leave_manager_id = fields.Many2one( + 'res.users', string='Leave Responsible', + domain=lambda self: [('groups_id', 'in', self.env.ref('hr_holidays.group_hr_holidays_team_leader').id)], + help="User responsible of leaves approval. Should be Team Leader or Department Manager.") remaining_leaves = fields.Float( compute='_compute_remaining_leaves', string='Remaining Legal Leaves', help='Total number of legal leaves allocated to this employee, change this value to create allocation/leave request. ' diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py index 13b9420a522..16b10a6c83b 100644 --- a/addons/hr_holidays/models/hr_leave.py +++ b/addons/hr_holidays/models/hr_leave.py @@ -31,6 +31,9 @@ class HolidaysRequest(models.Model): - can discuss on its leave requests; - can reset only its own leaves; - cannot validate any leaves; + - a Team Leader + - has same rights as a regular employee + - but is able to approve employees' leaves who are in his/her team (see Employee.leave_manager_id in hr_holidays/hr.py) - an Officer - can see all leaves; - can validate "HR" single validation leaves from people if @@ -686,7 +689,7 @@ 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_officer = self.env.user.has_group('hr_holidays.group_hr_holidays_user') + is_team_leader = self.env.user.has_group('hr_holidays.group_hr_holidays_team_leader') is_manager = self.env.user.has_group('hr_holidays.group_hr_holidays_manager') for holiday in self: val_type = holiday.holiday_status_id.validation_type @@ -698,10 +701,10 @@ class HolidaysRequest(models.Model): raise UserError(_('Only a Leave Manager can reset other people leaves.')) continue - if not is_officer: - raise UserError(_('Only a Leave Officer or Manager can approve or refuse leave requests.')) + if not is_team_leader: + raise UserError(_('Only a Team Leader, Leave Officer or Manager can approve or refuse leave requests.')) - if is_officer: + if is_team_leader: # use ir.rule based first access check: department, members, ... (see security.xml) holiday.check_access_rule('write') @@ -722,8 +725,8 @@ class HolidaysRequest(models.Model): # ------------------------------------------------------------ def _get_responsible_for_approval(self): - if self.state == 'confirm' and self.manager_id.user_id: - return self.manager_id.user_id + if self.state == 'confirm' and self.employee_id.leave_manager_id: + return self.employee_id.leave_manager_id elif self.state == 'confirm' and self.employee_id.parent_id.user_id: return self.employee_id.parent_id.user_id elif self.department_id.manager_id.user_id: diff --git a/addons/hr_holidays/security/hr_holidays_security.xml b/addons/hr_holidays/security/hr_holidays_security.xml index 546fe9440fd..3e10c16ca65 100644 --- a/addons/hr_holidays/security/hr_holidays_security.xml +++ b/addons/hr_holidays/security/hr_holidays_security.xml @@ -1,9 +1,15 @@ + + + Team Leader + + + Officer - + @@ -35,6 +41,16 @@ + + Leaves: Team Leader: write on employee's leaves in his team + + [('employee_id.leave_manager_id', '=' , user.id)] + + + + + + Leaves: officer: read all @@ -113,11 +129,11 @@ - - Leaves Resources Officer + + Leaves Resources: Team Leader [(1,'=',1)] - + diff --git a/addons/hr_holidays/views/hr_leave_views.xml b/addons/hr_holidays/views/hr_leave_views.xml index 4cfe204bec2..77f0a223f0c 100644 --- a/addons/hr_holidays/views/hr_leave_views.xml +++ b/addons/hr_holidays/views/hr_leave_views.xml @@ -31,7 +31,8 @@ - + + @@ -380,18 +381,18 @@ name="Managers" parent="menu_hr_holidays_root" sequence="4" - groups="hr_holidays.group_hr_holidays_manager,hr_holidays.group_hr_holidays_user"/> + groups="hr_holidays.group_hr_holidays_manager,hr_holidays.group_hr_holidays_user,hr_holidays.group_hr_holidays_team_leader"/> diff --git a/addons/hr_holidays/views/hr_views.xml b/addons/hr_holidays/views/hr_views.xml index 967ef412788..5fa3559e97c 100644 --- a/addons/hr_holidays/views/hr_views.xml +++ b/addons/hr_holidays/views/hr_views.xml @@ -137,11 +137,12 @@ - +