[IMP] hr_holidays: reintroduce no_validation leave_type
Since https://github.com/odoo/odoo/commit/59956805424808beed82f1afa5c5e6996e34eb13#diff-ab6382882079a64a861bbba2741a1075 it was impossible to use the no_validation on hr_leave_type. This commit reintroduces this possibility and ensures the leave user gets an actvity for the leave This commit also add a field on hr_leave_type in order to know for whom we should create the activity when validation is by hr closes odoo/odoo#30807 Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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']
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
|
||||
<record id="group_hr_holidays_team_leader" model="res.groups">
|
||||
<field name="name">Team Approver</field>
|
||||
<field name="category_id" ref="base.module_category_human_resources_time_off"/>
|
||||
</record>
|
||||
<field name="category_id" ref="base.module_category_human_resources_time_off"/>
|
||||
</record>
|
||||
|
||||
<record id="group_hr_holidays_user" model="res.groups">
|
||||
<field name="name">All Approver</field>
|
||||
@@ -40,7 +40,7 @@
|
||||
<record id="hr_leave_rule_employee_update" model="ir.rule">
|
||||
<field name="name">Time Off: employee: create/write/unlink not validated own</field>
|
||||
<field name="model_id" ref="model_hr_leave"/>
|
||||
<field name="domain_force">[('employee_id.user_id','=',user.id), ('state', 'in', ['draft', 'confirm', 'cancel', 'refuse'])]</field>
|
||||
<field name="domain_force">[('employee_id.user_id','=',user.id), ('state', 'in', ['draft', 'confirm', 'cancel', 'refuse']), ('holiday_type', '=', 'employee')]</field>
|
||||
<field name="perm_read" eval="False"/>
|
||||
<field name="groups" eval="[(4,ref('base.group_user'))]"/>
|
||||
</record>
|
||||
@@ -48,23 +48,13 @@
|
||||
<record id="hr_leave_rule_team_leader_update" model="ir.rule">
|
||||
<field name="name">Time Off: approver: write on employee's time off 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="domain_force">[('employee_id.leave_manager_id', '=' , user.id), ('holiday_type', '=', 'employee')]</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">Time Off: see all time off: read all</field>
|
||||
<field name="model_id" ref="model_hr_leave"/>
|
||||
<field name="domain_force">[(1, '=', 1)]</field>
|
||||
<field name="perm_create" eval="False"/>
|
||||
<field name="perm_write" eval="False"/>
|
||||
<field name="perm_unlink" eval="False"/>
|
||||
<field name="groups" eval="[(4, ref('hr_holidays.group_hr_holidays_user'))]"/>
|
||||
</record>
|
||||
|
||||
<record id="hr_leave_rule_officer_update" model="ir.rule">
|
||||
<field name="name">Time Off: see all time off: create/write/unlink own + managed employee + without department + same or managed department</field>
|
||||
<field name="model_id" ref="model_hr_leave"/>
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
</group>
|
||||
<group name="validation" string="Validation">
|
||||
<field name="validation_type" widget="radio"/>
|
||||
<field name="responsible_id" attrs="{'invisible': [('validation_type', 'in', ['no_validation', 'manager'])], 'required': [('validation_type', 'in', ['hr', 'both'])]}"/>
|
||||
</group>
|
||||
<group name="visibility" string="Allocation">
|
||||
<field name="allocation_type" widget="radio" force_save="1"/>
|
||||
|
||||
Reference in New Issue
Block a user