diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py
index dc5932a1145..459bd63b3df 100644
--- a/addons/hr_holidays/models/hr_leave.py
+++ b/addons/hr_holidays/models/hr_leave.py
@@ -747,31 +747,23 @@ 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_team_leader = self.env.user.has_group('hr_holidays.group_hr_holidays_team_leader')
is_officer = self.env.user.has_group('hr_holidays.group_hr_holidays_user')
is_manager = self.env.user.has_group('hr_holidays.group_hr_holidays_manager')
- # FIXME This is probably handled by hr_leave_allocation_rule_employee_update ir.rule
- if state in ['refuse', 'validate1', 'validate'] and not is_team_leader:
- raise UserError(_('Only a Team Leader, Time Off Officer or Manager can approve or refuse time off requests.'))
-
for holiday in self:
val_type = holiday.holiday_status_id.validation_type
- if not is_manager:
- if state == 'confirm':
- continue
- elif state == 'draft':
+ if not is_manager and state != 'confirm':
+ if state == 'draft':
if holiday.employee_id != current_employee:
- raise UserError(_('Only a Time Off Manager can reset other people time off.'))
+ raise UserError(_('Only a Leave Manager can reset other people leaves.'))
else:
# use ir.rule based first access check: department, members, ... (see security.xml)
holiday.check_access_rule('write')
- # FIXME Should probably be handled via ir.rule
# This handles states validate1 validate and refuse
if holiday.employee_id == current_employee:
- raise UserError(_('Only a Time Off Manager can approve its own requests.'))
+ raise UserError(_('Only a Leave Manager can approve its own requests.'))
if (state == 'validate1' and val_type == 'both') or (state == 'validate' and val_type == 'manager') and holiday.holiday_type == 'employee':
manager = holiday.employee_id.parent_id or holiday.employee_id.department_id.manager_id
@@ -784,10 +776,10 @@ class HolidaysRequest(models.Model):
error = (not (manager and manager == current_employee) and not (team_leader and team_leader == self.env.user))
if error:
- raise UserError(_('You must be either %s\'s manager or Time Off Manager to approve this time off') % (holiday.employee_id.name))
+ raise UserError(_('You must be either %s\'s manager or Leave manager to approve this leave') % (holiday.employee_id.name))
if state == 'validate' and val_type == 'both':
- raise UserError(_('Only an Time Off Manager can apply the second approval on time off requests.'))
+ raise UserError(_('Only an Leave Manager can apply the second approval on leave requests.'))
# ------------------------------------------------------------
# Activity methods
@@ -798,10 +790,8 @@ class HolidaysRequest(models.Model):
responsible = self.env.user
if self.validation_type == 'hr' or (self.validation_type == 'both' and self.state == 'validate1'):
- responsible = self.env['res.users'].search([
- ('company_id', '=', self.employee_id.company_id.id),
- ('groups_id', 'in', self.env.ref('hr_holidays.group_hr_holidays_user').id)
- ], limit=1)
+ if self.holiday_status_id.responsible_id:
+ responsible = self.holiday_status_id.responsible_id
elif self.state == 'confirm' or (self.state == 'validate' and self.validation_type == 'no_validation'):
if self.employee_id.leave_manager_id and self.employee_id.leave_manager_id.has_group('hr_holidays.group_hr_holidays_team_leader'):
responsible = self.employee_id.leave_manager_id
diff --git a/addons/hr_holidays/models/hr_leave_allocation.py b/addons/hr_holidays/models/hr_leave_allocation.py
index 8be3c4ac604..8ac1d7d10bd 100644
--- a/addons/hr_holidays/models/hr_leave_allocation.py
+++ b/addons/hr_holidays/models/hr_leave_allocation.py
@@ -523,16 +523,17 @@ class HolidaysAllocation(models.Model):
def _get_responsible_for_approval(self):
self.ensure_one()
+ responsible = self.env.user
+
if self.validation_type == 'hr' or (self.validation_type == 'both' and self.state == 'validate1'):
- return self.env['res.users'].search([
- ('company_id', '=', self.employee_id.company_id.id),
- ('groups_id', 'in', self.env.ref('hr_holidays.group_hr_holidays_user').id)
- ], limit=1)
+ if self.holiday_status_id.responsible_id:
+ responsible = self.holiday_status_id.responsible_id
if self.state == 'confirm' and self.employee_id.parent_id.user_id:
- return self.employee_id.parent_id.user_id
+ responsible = self.employee_id.parent_id.user_id
elif self.department_id.manager_id.user_id:
- return self.department_id.manager_id.user_id
- return self.env.user
+ responsible = self.department_id.manager_id.user_id
+
+ return responsible
def activity_update(self):
to_clean, to_do = self.env['hr.leave.allocation'], self.env['hr.leave.allocation']
diff --git a/addons/hr_holidays/models/hr_leave_type.py b/addons/hr_holidays/models/hr_leave_type.py
index e5a5d810240..30c4a843531 100644
--- a/addons/hr_holidays/models/hr_leave_type.py
+++ b/addons/hr_holidays/models/hr_leave_type.py
@@ -65,6 +65,9 @@ class HolidaysType(models.Model):
group_days_leave = fields.Float(
compute='_compute_group_days_leave', string='Group Time Off')
company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.user.company_id)
+ responsible_id = fields.Many2one('res.users', 'Responsible', domain=lambda self: [('groups_id', 'in', self.env.ref('hr_holidays.group_hr_holidays_user').id)],
+ help="This user will be responsible for approving this type of times off"
+ "This is only used when validation is 'hr' or 'both'",)
validation_type = fields.Selection([
('no_validation', 'No Validation'),
('hr', 'Payroll Officer'),
diff --git a/addons/hr_holidays/security/hr_holidays_security.xml b/addons/hr_holidays/security/hr_holidays_security.xml
index 6e893f62d85..1d534a94648 100644
--- a/addons/hr_holidays/security/hr_holidays_security.xml
+++ b/addons/hr_holidays/security/hr_holidays_security.xml
@@ -7,8 +7,8 @@
Team Approver
-
-
+
+
All Approver
@@ -40,7 +40,7 @@
Time Off: employee: create/write/unlink not validated own
- [('employee_id.user_id','=',user.id), ('state', 'in', ['draft', 'confirm', 'cancel', 'refuse'])]
+ [('employee_id.user_id','=',user.id), ('state', 'in', ['draft', 'confirm', 'cancel', 'refuse']), ('holiday_type', '=', 'employee')]
@@ -48,23 +48,13 @@
Time Off: approver: write on employee's time off in his team
- [('employee_id.leave_manager_id', '=' , user.id)]
+ [('employee_id.leave_manager_id', '=' , user.id), ('holiday_type', '=', 'employee')]
-
- Time Off: see all time off: read all
-
- [(1, '=', 1)]
-
-
-
-
-
-
Time Off: see all time off: create/write/unlink own + managed employee + without department + same or managed department
diff --git a/addons/hr_holidays/views/hr_leave_type_views.xml b/addons/hr_holidays/views/hr_leave_type_views.xml
index f2c01f8e7f8..1c0b02abd1b 100644
--- a/addons/hr_holidays/views/hr_leave_type_views.xml
+++ b/addons/hr_holidays/views/hr_leave_type_views.xml
@@ -50,6 +50,7 @@
+