diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py
index 91bfdb82625..f48d1c26066 100644
--- a/addons/hr_holidays/models/hr_leave.py
+++ b/addons/hr_holidays/models/hr_leave.py
@@ -132,6 +132,7 @@ class HolidaysRequest(models.Model):
report_note = fields.Text('HR Comments', copy=False, groups="hr_holidays.group_hr_holidays_manager")
user_id = fields.Many2one('res.users', string='User', related='employee_id.user_id', related_sudo=True, compute_sudo=True, store=True, readonly=True, index=True)
manager_id = fields.Many2one('hr.employee', compute='_compute_from_employee_id', store=True, readonly=False)
+ is_user_only_responsible = fields.Boolean(compute="_compute_is_user_only_responsible")
# leave type configuration
holiday_status_id = fields.Many2one(
"hr.leave.type", compute='_compute_from_employee_id',
@@ -194,7 +195,8 @@ class HolidaysRequest(models.Model):
string='Allocation Mode', readonly=False, required=True, default='employee',
help='By Employee: Allocation/Request for individual Employee, By Employee Tag: Allocation/Request for group of employees in category')
employee_ids = fields.Many2many(
- 'hr.employee', compute='_compute_from_holiday_type', store=True, string='Employees', readonly=False, groups="hr_holidays.group_hr_holidays_user")
+ 'hr.employee', compute='_compute_from_holiday_type', store=True, string='Employees', readonly=True, groups="hr_holidays.group_hr_holidays_responsible")
+ allowed_employee_ids = fields.Many2many('hr.employee', compute='_compute_allowed_employee_ids')
multi_employee = fields.Boolean(
compute='_compute_from_employee_ids', store=True, compute_sudo=False,
help='Holds whether this allocation concerns more than 1 employee')
@@ -418,6 +420,17 @@ class HolidaysRequest(models.Model):
holiday.employee_id = False
holiday.multi_employee = (len(holiday.employee_ids) > 1)
+ @api.depends_context('uid')
+ def _compute_allowed_employee_ids(self):
+ allowed_employees = self.env['hr.employee'].search([
+ ('active', '=', True),
+ ('company_id', 'in', self.env.companies.ids)])
+ if not self.env.user.has_group('hr_holidays.group_hr_holidays_user'):
+ user = self.env.user
+ self.allowed_employee_ids = allowed_employees.filtered(lambda emp: emp.user_id == user or emp.leave_manager_id == user)
+ else:
+ self.allowed_employee_ids = allowed_employees
+
@api.depends('holiday_type')
def _compute_from_holiday_type(self):
allocation_from_domain = self.env['hr.leave.allocation']
@@ -463,6 +476,13 @@ class HolidaysRequest(models.Model):
if holiday.employee_id and not holiday.holiday_status_id.with_context(employee_id=holiday.employee_id.id).has_valid_allocation:
holiday.holiday_status_id = False
+ @api.depends_context('uid')
+ @api.depends('employee_id')
+ def _compute_is_user_only_responsible(self):
+ user = self.env.user
+ self.is_user_only_responsible = user.has_group('hr_holidays.group_hr_holidays_responsible')\
+ and not user.has_group('hr_holidays.group_hr_holidays_user')
+
@api.depends('employee_id', 'holiday_type')
def _compute_department_id(self):
for holiday in self:
@@ -1408,14 +1428,18 @@ class HolidaysRequest(models.Model):
holiday.check_access_rule('write')
# This handles states validate1 validate and refuse
- if holiday.employee_id == current_employee:
- raise UserError(_('Only a Time Off Manager can approve/refuse its own requests.'))
+ if holiday.employee_id == current_employee\
+ and self.env.user != holiday.employee_id.leave_manager_id\
+ and not is_officer:
+ raise UserError(_('Only a Time Off Officer or Manager can approve/refuse its own requests.'))
if (state == 'validate1' and val_type == 'both') and holiday.holiday_type == 'employee':
if not is_officer and self.env.user != holiday.employee_id.leave_manager_id:
raise UserError(_('You must be either %s\'s manager or Time off Manager to approve this leave') % (holiday.employee_id.name))
- if (state == 'validate' and val_type == 'manager') and self.env.user != (holiday.employee_id | holiday.sudo().employee_ids).leave_manager_id:
+ if (state == 'validate' and val_type == 'manager')\
+ and self.env.user != (holiday.employee_id | holiday.sudo().employee_ids).leave_manager_id\
+ and not is_officer:
if holiday.employee_id:
employees = holiday.employee_id
else:
diff --git a/addons/hr_holidays/views/hr_holidays_views.xml b/addons/hr_holidays/views/hr_holidays_views.xml
index c14828fea89..a7befcc3063 100644
--- a/addons/hr_holidays/views/hr_holidays_views.xml
+++ b/addons/hr_holidays/views/hr_holidays_views.xml
@@ -59,7 +59,8 @@
name="Allocations"
parent="menu_hr_holidays_management"
action="hr_leave_allocation_action_approve_department"
- sequence="2"/>
+ sequence="2"
+ groups="hr_holidays.group_hr_holidays_user"/>
+
+
+
@@ -426,14 +449,15 @@
0
-
+
+
-
-
-
+
+
+
+
@@ -678,10 +702,8 @@
tree,kanban,form,calendar,activity
{
- 'search_default_approve': 1,
- 'search_default_my_team': 2,
- 'search_default_active_employee': 3,
- 'search_default_active_time_off': 4,
+ 'search_default_waiting_for_me': 1,
+ 'search_default_waiting_for_me_manager': 2,
'hide_employee_name': 1,
'holiday_status_display_name': False}