[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
This commit is contained in:
committed by
Yannick Tivisse
parent
bc930e2e67
commit
c99a6d2fb5
@@ -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. '
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user