diff --git a/addons/hr_holidays/data/hr_holidays_data.xml b/addons/hr_holidays/data/hr_holidays_data.xml index 235bd6e036d..7213fdd66a4 100644 --- a/addons/hr_holidays/data/hr_holidays_data.xml +++ b/addons/hr_holidays/data/hr_holidays_data.xml @@ -7,6 +7,8 @@ black + + @@ -21,6 +23,8 @@ Compensatory Days lavender + + diff --git a/addons/hr_holidays/models/hr.py b/addons/hr_holidays/models/hr.py index 3f70bec2961..a30175abbca 100644 --- a/addons/hr_holidays/models/hr.py +++ b/addons/hr_holidays/models/hr.py @@ -142,7 +142,7 @@ class Employee(models.Model): 'number_of_days_temp': difference }) leave.action_approve() - if leave.double_validation: + if leave.validation_type == 'both': leave.action_validate() elif difference < 0: raise UserError(_('You cannot reduce validated allocation requests')) diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py index 2f6c5ee61c7..30ebc057333 100644 --- a/addons/hr_holidays/models/hr_leave.py +++ b/addons/hr_holidays/models/hr_leave.py @@ -8,7 +8,7 @@ import math from datetime import timedelta from odoo import api, fields, models -from odoo.exceptions import UserError, AccessError, ValidationError +from odoo.exceptions import UserError, ValidationError from odoo.tools import float_compare from odoo.tools.translate import _ @@ -22,9 +22,20 @@ class HolidaysRequest(models.Model): _order = "date_from desc" _inherit = ['mail.thread'] + @api.model + def default_get(self, fields_list): + defaults = super(HolidaysRequest, self).default_get(fields_list) + + LeaveType = self.env['hr.leave.type'].with_context(employee_id=defaults.get('employee_id'), default_date_from=defaults.get('date_from')) + lt = LeaveType.search([('valid', '=', True), ('employee_applicability', 'in', ['leave', 'both'])]) + + defaults['holiday_status_id'] = lt[0].id if len(lt) > 0 else defaults.get('holiday_status_id') + return defaults + def _default_employee(self): return self.env.context.get('default_employee_id') or self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1) + name = fields.Char('Description') state = fields.Selection([ ('draft', 'To Submit'), @@ -47,7 +58,8 @@ class HolidaysRequest(models.Model): date_to = fields.Datetime('End Date', readonly=True, copy=False, required=True, states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}, track_visibility='onchange') holiday_status_id = fields.Many2one("hr.leave.type", string="Leave Type", required=True, readonly=True, - states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}) + states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}, + domain="[('valid', '=', True), ('employee_applicability', 'in', ['leave', 'both'])]") employee_id = fields.Many2one('hr.employee', string='Employee', index=True, readonly=True, states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}, default=_default_employee, track_visibility='onchange') manager_id = fields.Many2one('hr.employee', related='employee_id.parent_id', string='Manager', readonly=True, store=True) @@ -75,7 +87,7 @@ class HolidaysRequest(models.Model): help='This area is automatically filled by the user who validate the leave', oldname='manager_id') second_approver_id = fields.Many2one('hr.employee', string='Second Approval', readonly=True, copy=False, oldname='manager_id2', help='This area is automaticly filled by the user who validate the leave with second level (If Leave type need second validation)') - double_validation = fields.Boolean('Apply Double Validation', related='holiday_status_id.double_validation') + validation_type = fields.Selection('Validation Type', related='holiday_status_id.validation_type') can_reset = fields.Boolean('Can reset', compute='_compute_can_reset') _sql_constraints = [ @@ -208,6 +220,20 @@ class HolidaysRequest(models.Model): if employee.user_id: self.message_subscribe_users(user_ids=employee.user_id.ids) + @api.multi + @api.constrains('holiday_status_id') + def _check_leave_type_validity(self): + for leave in self: + if leave.holiday_status_id.validity_start and leave.holiday_status_id.validity_stop: + vstart = fields.Datetime.from_string(leave.holiday_status_id.validity_start) + vstop = fields.Datetime.from_string(leave.holiday_status_id.validity_stop) + dfrom = fields.Datetime.from_string(leave.date_from) + dto = fields.Datetime.from_string(leave.date_to) + + if dfrom and dto and (dfrom < vstart or dto > vstop): + raise UserError(_('You can take %s only between %s and %s') % (leave.holiday_status_id.display_name, \ + leave.holiday_status_id.validity_start, leave.holiday_status_id.validity_stop)) + @api.model def create(self, values): """ Override to avoid automatic logging of creation """ @@ -331,8 +357,8 @@ class HolidaysRequest(models.Model): @api.multi def action_approve(self): - # if double_validation: this method is the first approval approval - # if not double_validation: this method calls action_validate() below + # if validation_type == 'both': this method is the first approval approval + # if validation_type != 'both': this method calls action_validate() below if not self.env.user.has_group('hr_holidays.group_hr_holidays_user'): raise UserError(_('Only an HR Officer or Manager can approve leave requests.')) @@ -340,8 +366,17 @@ class HolidaysRequest(models.Model): if any(holiday.state != 'confirm' for holiday in self): raise UserError(_('Leave request must be confirmed ("To Approve") in order to approve it.')) - self.filtered(lambda hol: hol.double_validation).write({'state': 'validate1', 'first_approver_id': current_employee.id}) - self.filtered(lambda hol: not hol.double_validation).action_validate() + for holiday in self: + validation_type = holiday.holiday_status_id.validation_type + manager = holiday.employee_id.parent_id or holiday.employee_id.department_id.manager_id + if (validation_type in ['manager', 'both']) and (manager and manager != current_employee)\ + and not self.env.user.has_group('hr_holidays.group_hr_holidays_manager'): + raise UserError(_('You must be %s manager to approve this leave') % (holiday.employee_id.name)) + elif validation_type == 'hr' and not self.env.user.has_group('hr_holidays.group_hr_holidays_manager'): + raise UserError(_('You must be a Human Resource Manager to approve this Leave')) + + self.filtered(lambda hol: hol.validation_type == 'both').write({'state': 'validate1', 'first_approver_id': current_employee.id}) + self.filtered(lambda hol: not hol.validation_type == 'both').action_validate() return True @api.multi @@ -357,7 +392,7 @@ class HolidaysRequest(models.Model): raise UserError(_('Only an HR Manager can apply the second approval on leave requests.')) holiday.write({'state': 'validate'}) - if holiday.double_validation: + if holiday.validation_type == 'both': holiday.write({'second_approver_id': current_employee.id}) else: holiday.write({'first_approver_id': current_employee.id}) @@ -371,7 +406,7 @@ class HolidaysRequest(models.Model): leaves += self.with_context(mail_notify_force_send=False).create(values) # TODO is it necessary to interleave the calls? leaves.action_approve() - if leaves and leaves[0].double_validation: + if leaves and leaves[0].validation_type == 'both': leaves.action_validate() return True diff --git a/addons/hr_holidays/models/hr_leave_allocation.py b/addons/hr_holidays/models/hr_leave_allocation.py index 9eac9e9ff66..583e01ac74c 100644 --- a/addons/hr_holidays/models/hr_leave_allocation.py +++ b/addons/hr_holidays/models/hr_leave_allocation.py @@ -6,7 +6,7 @@ import logging from odoo import api, fields, models -from odoo.exceptions import UserError, AccessError +from odoo.exceptions import UserError from odoo.tools.translate import _ _logger = logging.getLogger(__name__) @@ -20,6 +20,11 @@ class HolidaysAllocation(models.Model): def _default_employee(self): return self.env.context.get('default_employee_id') or self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1) + def _default_holiday_status_id(self): + LeaveType = self.env['hr.leave.type'].with_context(employee_id=self._default_employee().id) + lt = LeaveType.search([('valid', '=', True), ('employee_applicability', 'in', ['leave', 'both']), ('limit', '=', False)]) + return lt[:1] + name = fields.Char('Description') state = fields.Selection([ ('draft', 'To Submit'), @@ -34,7 +39,8 @@ class HolidaysAllocation(models.Model): "\nThe status is 'Refused', when leave request is refused by manager." + "\nThe status is 'Approved', when leave request is approved by manager.") holiday_status_id = fields.Many2one("hr.leave.type", string="Leave Type", required=True, readonly=True, - states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}) + states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}, + domain="[('valid', '=', True), ('employee_applicability', 'in', ['allocation', 'both']), ('limit', '=', False)]", default=_default_holiday_status_id) employee_id = fields.Many2one('hr.employee', string='Employee', index=True, readonly=True, states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}, default=_default_employee, track_visibility='onchange') notes = fields.Text('Reasons', readonly=True, states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}) @@ -59,7 +65,7 @@ class HolidaysAllocation(models.Model): help='This area is automatically filled by the user who validate the leave', oldname='manager_id') second_approver_id = fields.Many2one('hr.employee', string='Second Approval', readonly=True, copy=False, oldname='manager_id2', help='This area is automaticly filled by the user who validate the leave with second level (If Leave type need second validation)') - double_validation = fields.Boolean('Apply Double Validation', related='holiday_status_id.double_validation') + validation_type = fields.Selection('Validation Type', related='holiday_status_id.validation_type') can_reset = fields.Boolean('Can reset', compute='_compute_can_reset') _sql_constraints = [ @@ -120,6 +126,19 @@ class HolidaysAllocation(models.Model): if employee.user_id: self.message_subscribe_users(user_ids=employee.user_id.ids) + @api.multi + @api.constrains('holiday_status_id') + def _check_leave_type_validity(self): + for allocation in self: + if allocation.holiday_status_id.validity_start and allocation.holiday_status_id.validity_stop: + vstart = fields.Datetime.from_string(allocation.holiday_status_id.validity_start) + vstop = fields.Datetime.from_string(allocation.holiday_status_id.validity_stop) + today = fields.Datetime.from_string(fields.Datetime.now()) + + if vstart > today or vstop < today: + raise UserError(_('You can allocate %s only between %s and %s') % (allocation.holiday_status_id.display_name, + allocation.holiday_status_id.validity_start, allocation.holiday_status_id.validity_stop)) + @api.model def create(self, values): """ Override to avoid automatic logging of creation """ @@ -191,8 +210,8 @@ class HolidaysAllocation(models.Model): @api.multi def action_approve(self): - # if double_validation: this method is the first approval approval - # if not double_validation: this method calls action_validate() below + # if validation_type == 'both': this method is the first approval approval + # if validation_type != 'both': this method calls action_validate() below if not self.env.user.has_group('hr_holidays.group_hr_holidays_user'): raise UserError(_('Only an HR Officer or Manager can approve leave requests.')) @@ -200,8 +219,17 @@ class HolidaysAllocation(models.Model): if any(holiday.state != 'confirm' for holiday in self): raise UserError(_('Leave request must be confirmed ("To Approve") in order to approve it.')) - self.filtered(lambda hol: hol.double_validation).write({'state': 'validate1', 'first_approver_id': current_employee.id}) - self.filtered(lambda hol: not hol.double_validation).action_validate() + for holiday in self: + validation_type = holiday.holiday_status_id.validation_type + manager = holiday.employee_id.parent_id or holiday.employee_id.department_id.manager_id + if (validation_type in ['manager', 'both']) and (manager and manager != current_employee)\ + and not self.env.user.has_group('hr_holidays.group_hr_holidays_manager'): + raise UserError(_('You must be %s manager to approve this leave') % (holiday.employee_id.name)) + elif validation_type == 'hr' and not self.env.user.has_group('hr_holidays.group_hr_holidays_manager'): + raise UserError(_('You must be a Human Resource Manager to approve this Leave')) + + self.filtered(lambda hol: hol.validation_type == 'both').write({'state': 'validate1', 'first_approver_id': current_employee.id}) + self.filtered(lambda hol: not hol.validation_type == 'both').action_validate() return True @api.multi @@ -217,7 +245,7 @@ class HolidaysAllocation(models.Model): raise UserError(_('Only an HR Manager can apply the second approval on leave requests.')) holiday.write({'state': 'validate'}) - if holiday.double_validation: + if holiday.validation_type == 'both': holiday.write({'second_approver_id': current_employee.id}) else: holiday.write({'first_approver_id': current_employee.id}) @@ -229,7 +257,7 @@ class HolidaysAllocation(models.Model): leaves += self.with_context(mail_notify_force_send=False).create(values) # TODO is it necessary to interleave the calls? leaves.action_approve() - if leaves and leaves[0].double_validation: + if leaves and leaves[0].validation_type == 'both': leaves.action_validate() return True diff --git a/addons/hr_holidays/models/hr_leave_type.py b/addons/hr_holidays/models/hr_leave_type.py index f916000b10d..a7db3f2ff48 100644 --- a/addons/hr_holidays/models/hr_leave_type.py +++ b/addons/hr_holidays/models/hr_leave_type.py @@ -6,6 +6,7 @@ import logging from odoo import api, fields, models +from odoo.exceptions import ValidationError from odoo.tools.translate import _ _logger = logging.getLogger(__name__) @@ -14,8 +15,11 @@ _logger = logging.getLogger(__name__) class HolidaysType(models.Model): _name = "hr.leave.type" _description = "Leave Type" + _order = "sequence, id" name = fields.Char('Leave Type', required=True, translate=True) + sequence = fields.Integer(default=100, + help='The type with the smallest sequence is the default value in leave request') categ_id = fields.Many2one('calendar.event.type', string='Meeting Type', help='Once a leave is validated, Odoo will create a corresponding meeting of this type in the calendar.') color_name = fields.Selection([ @@ -52,10 +56,54 @@ class HolidaysType(models.Model): virtual_remaining_leaves = fields.Float(compute='_compute_leaves', string='Virtual Remaining Leaves', help='Maximum Leaves Allowed - Leaves Already Taken - Leaves Waiting Approval') - double_validation = fields.Boolean(string='Apply Double Validation', - help="When selected, the Allocation/Leave Requests for this type require a second validation to be approved.") company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.user.company_id) + validation_type = fields.Selection([('hr', 'Human Resource Responsible'), + ('manager', 'Manager'), + ('both', 'Double Validation')], + default='hr', + string='Validation By') + + employee_applicability = fields.Selection([('both', 'On Leave As Well As On Allocation'), + ('leave', 'Only On Leave'), + ('allocation', 'Only On Allocation')], + default='both', string='Available For Employee :', + help='This leave type will be available on Leave / Allocation request based on selected value') + + validity_start = fields.Date("Start Date", default=fields.Date.today(), + help='Adding validity to types of leaves so that it cannot be selected outside' + 'this time period') + validity_stop = fields.Date("End Date") + + valid = fields.Boolean(compute='_compute_valid', search='_search_valid', help='This indicates if it is still possible to use this type of leave') + + @api.multi + @api.constrains('validity_start', 'validity_stop') + def _check_validity_dates(self): + for htype in self: + if htype.validity_start and htype.validity_stop and \ + htype.validity_start > htype.validity_stop: + raise ValidationError(_("End of validity period should be greater than start of validity period")) + + @api.multi + @api.depends('validity_start', 'validity_stop', 'limit') + def _compute_valid(self): + dt = self._context.get('default_date_from', fields.Date.today()) + + for holiday_type in self: + if holiday_type.validity_start and holiday_type.validity_stop: + holiday_type.valid = ((dt < holiday_type.validity_stop) and (dt > holiday_type.validity_start)) + else: + holiday_type.valid = not holiday_type.validity_stop + + def _search_valid(self, operator, value): + dt = self._context.get('default_date_from', fields.Date.today()) + signs = ['>=', '<='] if operator == '=' else ['<=', '>='] + + return ['|', ('validity_stop', operator, False), '&', + ('validity_stop', signs[0] if value else signs[1], dt), + ('validity_start', signs[1] if value else signs[0], dt)] + @api.multi def get_days(self, employee_id): # need to use `dict` constructor to create a dict per id diff --git a/addons/hr_holidays/tests/common.py b/addons/hr_holidays/tests/common.py index 85dff9ba5ff..8ecba9ed7d2 100644 --- a/addons/hr_holidays/tests/common.py +++ b/addons/hr_holidays/tests/common.py @@ -35,11 +35,29 @@ class TestHrHolidaysBase(common.TransactionCase): }).id # Hr Data + Department = self.env['hr.department'].with_context(tracking_disable=True) + + self.hr_dept = Department.create({ + 'name': 'Human Resources', + }) + self.rd_dept = Department.create({ + 'name': 'Research and devlopment', + }) + self.employee_emp_id = self.env['hr.employee'].create({ 'name': 'David Employee', 'user_id': self.user_employee_id, + 'department_id': self.rd_dept.id, }).id self.employee_hruser_id = self.env['hr.employee'].create({ 'name': 'Armande HrUser', 'user_id': self.user_hruser_id, + 'department_id': self.rd_dept.id, }).id + self.employee_hrmanager_id = self.env['hr.employee'].create({ + 'name': 'Bastien HrManager', + 'user_id': self.user_hrmanager_id, + 'department_id': self.hr_dept.id, + }).id + + self.rd_dept.write({'manager_id': self.employee_hruser_id}) diff --git a/addons/hr_holidays/tests/test_holidays_flow.py b/addons/hr_holidays/tests/test_holidays_flow.py index dfa1d3dea45..2bf1c819f88 100644 --- a/addons/hr_holidays/tests/test_holidays_flow.py +++ b/addons/hr_holidays/tests/test_holidays_flow.py @@ -3,6 +3,7 @@ from datetime import datetime from dateutil.relativedelta import relativedelta +from odoo import fields from odoo.exceptions import AccessError, ValidationError, UserError from odoo.tools import mute_logger, test_reports @@ -43,13 +44,26 @@ class TestHolidaysFlow(TestHrHolidaysBase): 'categ_id': self.env['calendar.event.type'].sudo(self.user_hrmanager_id).create({'name': 'NotLimitedMeetingType'}).id }) self.holidays_status_1 = HolidayStatusManagerGroup.create({ - 'name': 'NotLimited', + 'name': 'NotLimitedHR', 'limit': True, + 'validation_type': 'hr', }) self.holidays_status_2 = HolidayStatusManagerGroup.create({ 'name': 'Limited', 'limit': False, - 'double_validation': True, + 'validation_type': 'both', + }) + self.holidays_status_3 = HolidayStatusManagerGroup.create({ + 'name': 'NotLimitedManager', + 'limit': True, + 'validation_type': 'manager', + }) + self.holiday_status_4 = HolidayStatusManagerGroup.create({ + 'name': 'TimeNotLimited', + 'limit': True, + 'validation_type': 'manager', + 'validity_start': fields.Datetime.from_string('2017-01-01 00:00:00'), + 'validity_stop': fields.Datetime.from_string('2017-06-01 00:00:00'), }) # -------------------------------------------------- @@ -69,7 +83,7 @@ class TestHolidaysFlow(TestHrHolidaysBase): }) Requests.search([('name', '=', 'Hol10')]).unlink() - # Employee creates a leave request in a no-limit category + # Employee creates a leave request in a no-limit category hr manager only hol1_employee_group = HolidaysEmployeeGroup.create({ 'name': 'Hol11', 'employee_id': self.employee_emp_id, @@ -79,15 +93,43 @@ class TestHolidaysFlow(TestHrHolidaysBase): 'number_of_days_temp': 1, }) hol1_user_group = hol1_employee_group.sudo(self.user_hruser_id) + hol1_manager_group = hol1_employee_group.sudo(self.user_hrmanager_id) self.assertEqual(hol1_user_group.state, 'confirm', 'hr_holidays: newly created leave request should be in confirm state') # Employee validates its leave request -> should not work with self.assertRaises(UserError): hol1_employee_group.action_approve() - self.assertEqual(hol1_user_group.state, 'confirm', 'hr_holidays: employee should not be able to validate its own leave request') + self.assertEqual(hol1_manager_group.state, 'confirm', 'hr_holidays: employee should not be able to validate its own leave request') + + # HrUser validates the employee leave request -> should not work + with self.assertRaises(UserError): + hol1_user_group.action_approve() + self.assertEqual(hol1_manager_group.state, 'confirm', 'hr_holidays: hr user should not be able to validate manager only leaves') + + # HrManager validates the employee leave request + hol1_manager_group.action_approve() + self.assertEqual(hol1_manager_group.state, 'validate', 'hr_holidays: validates leave request should be in validate state') + + # Employee creates a leave request in a no-limit category department manager only + hol12_employee_group = HolidaysEmployeeGroup.create({ + 'name': 'Hol12', + 'employee_id': self.employee_emp_id, + 'holiday_status_id': self.holidays_status_3.id, + 'date_from': (datetime.today() + relativedelta(days=12)), + 'date_to': (datetime.today() + relativedelta(days=13)), + 'number_of_days_temp': 1, + }) + hol12_user_group = hol12_employee_group.sudo(self.user_hruser_id) + hol12_manager_group = hol12_employee_group.sudo(self.user_hrmanager_id) + self.assertEqual(hol12_user_group.state, 'confirm', 'hr_holidays: newly created leave request should be in confirm state') + + # Employee validates its leave request -> should not work + with self.assertRaises(UserError): + hol12_employee_group.action_approve() + self.assertEqual(hol12_user_group.state, 'confirm', 'hr_holidays: employee should not be able to validate its own leave request') # HrUser validates the employee leave request - hol1_user_group.action_approve() + hol12_user_group.action_approve() self.assertEqual(hol1_user_group.state, 'validate', 'hr_holidays: validates leave request should be in validate state') # -------------------------------------------------- @@ -128,6 +170,9 @@ class TestHolidaysFlow(TestHrHolidaysBase): }) # HrUser validates the first step aloc1_user_group.action_approve() + # HrUser validates the second step -> should crash + with self.assertRaises(UserError): + aloc1_user_group.action_validate() # HrManager validates the second step aloc1_user_group.sudo(self.user_hrmanager_id).action_validate() # Checks Employee has effectively some days left @@ -147,11 +192,14 @@ class TestHolidaysFlow(TestHrHolidaysBase): # Check left days: - 1 virtual remaining day _check_holidays_status(hol_status_2_employee_group, 2.0, 0.0, 2.0, 1.0) - # HrUser validates the first step - hol2_user_group.action_approve() + # HrManager validates the first step + hol2_user_group.sudo(self.user_hrmanager_id).action_approve() self.assertEqual(hol2.state, 'validate1', 'hr_holidays: first validation should lead to validate1 state') + # HrUser validates the second step -> should crash + with self.assertRaises(UserError): + hol2_user_group.action_validate() # HrManager validates the second step hol2_user_group.sudo(self.user_hrmanager_id).action_validate() self.assertEqual(hol2.state, 'validate', @@ -197,7 +245,7 @@ class TestHolidaysFlow(TestHrHolidaysBase): 'date_from': datetime.today().strftime('%Y-%m-10 10:00:00'), 'date_to': datetime.today().strftime('%Y-%m-11 19:00:00'), 'employee_id': employee_id, - 'number_of_days_temp': 1 + 'number_of_days_temp': 1, }) # I find a small mistake on my leave request to I click on "Refuse" button to correct a mistake. hol3.action_refuse() @@ -213,6 +261,25 @@ class TestHolidaysFlow(TestHrHolidaysBase): # Check left days for casual leave: 19 days left _check_holidays_status(hol3_status, 20.0, 1.0, 19.0, 19.0) + Requests.create({ + 'name': 'Sick Leave', + 'holiday_status_id': self.holiday_status_4.id, + 'date_from': fields.Datetime.from_string('2017-03-03 06:00:00'), + 'date_to': fields.Datetime.from_string('2017-03-11 19:00:00'), + 'employee_id': employee_id, + 'number_of_days_temp': 1, + }).unlink() + + with self.assertRaises(ValidationError): + Requests.create({ + 'name': 'Sick Leave', + 'holiday_status_id': self.holiday_status_4.id, + 'date_from': fields.Datetime.from_string('2017-07-03 06:00:00'), + 'date_to': fields.Datetime.from_string('2017-07-11 19:00:00'), + 'employee_id': employee_id, + 'number_of_days_temp': 1, + }) + def test_10_leave_summary_reports(self): # Print the HR Holidays(Summary Department) Report through the wizard ctx = { diff --git a/addons/hr_holidays/views/hr_leave_type_views.xml b/addons/hr_holidays/views/hr_leave_type_views.xml index da4e973f70a..d5ae5093123 100644 --- a/addons/hr_holidays/views/hr_leave_type_views.xml +++ b/addons/hr_holidays/views/hr_leave_type_views.xml @@ -28,14 +28,26 @@ - - - + + + + + + + + + + + + + + + @@ -83,8 +95,13 @@ 35 + + + + + diff --git a/addons/hr_holidays/views/hr_leave_views.xml b/addons/hr_holidays/views/hr_leave_views.xml index 649410c283f..c985ee037e0 100644 --- a/addons/hr_holidays/views/hr_leave_views.xml +++ b/addons/hr_holidays/views/hr_leave_views.xml @@ -91,7 +91,7 @@ - +