diff options
| author | lbs-odoo <lbs@odoo.com> | 2018-10-31 15:31:34 +0000 |
|---|---|---|
| committer | Yannick Tivisse <yti@odoo.com> | 2018-11-07 13:52:37 +0000 |
| commit | c99a6d2fb5b22bdbdf36b49e0df508a0224d4b77 (patch) | |
| tree | 65eb632dfe6dd023534fd7939ed7bba8c8c876f0 | |
| parent | bc930e2e67976394725d7528ec1d16f81fa7cac4 (diff) | |
[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
| -rw-r--r-- | addons/hr_holidays/models/hr.py | 4 | ||||
| -rw-r--r-- | addons/hr_holidays/models/hr_leave.py | 15 | ||||
| -rw-r--r-- | addons/hr_holidays/security/hr_holidays_security.xml | 24 | ||||
| -rw-r--r-- | addons/hr_holidays/views/hr_leave_views.xml | 13 | ||||
| -rw-r--r-- | 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 @@ <?xml version="1.0" encoding="utf-8"?> <odoo> + + <record id="group_hr_holidays_team_leader" model="res.groups"> + <field name="name">Team Leader</field> + <field name="category_id" ref="base.module_category_hr_holidays"/> + </record> + <record id="group_hr_holidays_user" model="res.groups"> <field name="name">Officer</field> <field name="category_id" ref="base.module_category_hr_holidays"/> - <field name="implied_ids" eval="[(4, ref('hr.group_hr_user'))]"/> + <field name="implied_ids" eval="[(4, ref('hr.group_hr_user')), (4, ref('group_hr_holidays_team_leader'))]"/> </record> <record id="group_hr_holidays_manager" model="res.groups"> @@ -35,6 +41,16 @@ <field name="groups" eval="[(4,ref('base.group_user'))]"/> </record> + <record id="hr_leave_rule_team_leader_update" model="ir.rule"> + <field name="name">Leaves: Team Leader: write on employee's leaves in his team</field> + <field name="model_id" ref="model_hr_leave"/> + <field name="domain_force">[('employee_id.leave_manager_id', '=' , user.id)]</field> + <field name="perm_read" eval="False"/> + <field name="perm_create" eval="False"/> + <field name="perm_unlink" eval="False"/> + <field name="groups" eval="[(4, ref('hr_holidays.group_hr_holidays_team_leader'))]"/> + </record> + <record id="hr_leave_rule_officer_read" model="ir.rule"> <field name="name">Leaves: officer: read all</field> <field name="model_id" ref="model_hr_leave"/> @@ -113,11 +129,11 @@ <field name="groups" eval="[(4, ref('group_hr_holidays_manager'))]"/> </record> - <record id="resource_leaves_officer" model="ir.rule"> - <field name="name">Leaves Resources Officer</field> + <record id="resource_leaves_team_leader" model="ir.rule"> + <field name="name">Leaves Resources: Team Leader</field> <field name="model_id" ref="model_resource_calendar_leaves"/> <field name="domain_force">[(1,'=',1)]</field> - <field name="groups" eval="[(4,ref('hr_holidays.group_hr_holidays_user'))]"/> + <field name="groups" eval="[(4, ref('hr_holidays.group_hr_holidays_team_leader'))]"/> </record> <record id="hr_holidays_status_rule_multi_company" model="ir.rule"> 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 @@ <filter string="Unread Messages" name="message_needaction" domain="[('message_needaction','=',True)]"/> <separator/> <filter string="My Department Leaves" name="department" domain="[('department_id.member_ids.user_id', '=', uid)]" help="My Department Leaves"/> - <filter string="My Team Leaves" name="my_team_leaves" domain="[('employee_id.parent_id.user_id', '=', uid)]" groups="hr_holidays.group_hr_holidays_manager" help="Leaves of Your Team Member"/> + <filter string="People I Manage" name="managed_people" domain="[('employee_id.parent_id.user_id', '=', uid)]" help="Leaves of people you are manager of"/> + <filter string="My Team Leaves" name="my_team_leaves" domain="[('employee_id.leave_manager_id', '=', uid)]" groups="hr_holidays.group_hr_holidays_team_leader" help="Leaves of Your Team Members"/> <separator/> <filter string="To Report in Payslip" name="gray" domain="[('payslip_status', '=', False)]" groups="hr_holidays.group_hr_holidays_manager"/> <separator/> @@ -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"/> <menuitem id="hr_holidays_menu_manager_approve" name="To Approve" parent="menu_hr_holidays_approvals" - 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" sequence="1"/> <menuitem id="hr_holidays_menu_manager_all" name="All" parent="menu_hr_holidays_approvals" - 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" sequence="2"/> <menuitem id="hr_holidays_menu_manager_payroll" @@ -536,14 +537,14 @@ id="menu_open_department_leave_approve" name="Leaves" parent="hr_holidays_menu_manager_approve" - 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" action="hr_leave_action_action_approve_department" sequence="1"/> <menuitem id="menu_open_employee_leave" name="Leaves" parent="hr_holidays_menu_manager_all" - 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" action="hr_leave_action_all" sequence="1"/> 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 @@ <field name="inherit_id" ref="hr.view_employee_form"/> <field name="arch" type="xml"> <xpath expr="//group[@name='active_group']" position="after"> - <group string="Leaves" groups="base.group_no_one"> + <group string="Leaves"> <label for="remaining_leaves"/> <div> <field name="remaining_leaves" class="oe_inline"/> days </div> + <field name="leave_manager_id"/> </group> </xpath> <button name="toggle_active" position="before"> |
