summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlbs-odoo <lbs@odoo.com>2018-10-31 15:31:34 +0000
committerYannick Tivisse <yti@odoo.com>2018-11-07 13:52:37 +0000
commitc99a6d2fb5b22bdbdf36b49e0df508a0224d4b77 (patch)
tree65eb632dfe6dd023534fd7939ed7bba8c8c876f0
parentbc930e2e67976394725d7528ec1d16f81fa7cac4 (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.py4
-rw-r--r--addons/hr_holidays/models/hr_leave.py15
-rw-r--r--addons/hr_holidays/security/hr_holidays_security.xml24
-rw-r--r--addons/hr_holidays/views/hr_leave_views.xml13
-rw-r--r--addons/hr_holidays/views/hr_views.xml3
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">