diff --git a/addons/hr/views/res_users.xml b/addons/hr/views/res_users.xml index cab22bb0cf7..dc030c4b420 100644 --- a/addons/hr/views/res_users.xml +++ b/addons/hr/views/res_users.xml @@ -21,6 +21,7 @@ + diff --git a/addons/hr_holidays/__manifest__.py b/addons/hr_holidays/__manifest__.py index 17e469332be..f41b34cc4cf 100644 --- a/addons/hr_holidays/__manifest__.py +++ b/addons/hr_holidays/__manifest__.py @@ -39,7 +39,6 @@ A synchronization with an internal agenda (Meetings of the CRM module) is also p 'views/hr_leave_allocation_views.xml', 'views/mail_activity_views.xml', - 'wizard/hr_holidays_summary_department_views.xml', 'wizard/hr_holidays_summary_employees_views.xml', 'report/hr_holidays_templates.xml', diff --git a/addons/hr_holidays/data/hr_holidays_demo.xml b/addons/hr_holidays/data/hr_holidays_demo.xml index 1199aea6686..7aa5139583e 100644 --- a/addons/hr_holidays/data/hr_holidays_demo.xml +++ b/addons/hr_holidays/data/hr_holidays_demo.xml @@ -12,15 +12,6 @@ - - - Home Workings - lightgreen - - - - - @@ -293,14 +284,6 @@ validate - - International Tour - - 8 - - confirm - - Summer Vacation @@ -308,34 +291,6 @@ - - - - - - - - Home working - - - - - - 8 - - - - - - - - diff --git a/addons/hr_holidays/models/__init__.py b/addons/hr_holidays/models/__init__.py index 0697c64a04e..368a7bc4bf1 100644 --- a/addons/hr_holidays/models/__init__.py +++ b/addons/hr_holidays/models/__init__.py @@ -7,7 +7,6 @@ from . import hr_department from . import hr_leave from . import hr_leave_allocation from . import hr_leave_type -from . import mail_channel from . import mail_message_subtype from . import res_partner from . import res_users diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py index 067c37909ea..7b95214e71f 100644 --- a/addons/hr_holidays/models/hr_leave.py +++ b/addons/hr_holidays/models/hr_leave.py @@ -126,7 +126,6 @@ class HolidaysRequest(models.Model): 'hr.department', string='Department', readonly=True, states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}) notes = fields.Text('Reasons', readonly=True, states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}) - out_of_office_message = fields.Char(string='Chat Status') # duration date_from = fields.Datetime( 'Start Date', readonly=True, index=True, copy=False, required=True, @@ -263,11 +262,6 @@ class HolidaysRequest(models.Model): self.request_unit_custom = False self.state = 'confirm' if self.validation_type != 'no_validation' else 'draft' - @api.onchange('user_id') - def _onchange_user_id(self): - if not self.out_of_office_message: - self.out_of_office_message = self.user_id.out_of_office_message - @api.onchange('request_date_from_period', 'request_hour_from', 'request_hour_to', 'request_date_from', 'request_date_to', 'employee_id') @@ -630,9 +624,6 @@ class HolidaysRequest(models.Model): pass def write(self, values): - # Allow an employee to always write his own out of office message - if len(self) == 1 and values.keys() == {'out_of_office_message'} and self.employee_id.user_id == self.env.user: - return super(HolidaysRequest, self.sudo()).write(values) is_officer = self.env.user.has_group('hr_holidays.group_hr_holidays_user') if not is_officer: diff --git a/addons/hr_holidays/models/hr_leave_allocation.py b/addons/hr_holidays/models/hr_leave_allocation.py index e37a0f6979d..b11cbffe465 100644 --- a/addons/hr_holidays/models/hr_leave_allocation.py +++ b/addons/hr_holidays/models/hr_leave_allocation.py @@ -111,8 +111,11 @@ class HolidaysAllocation(models.Model): 'hr.employee.category', string='Employee Tag', readonly=True, states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}) # accrual configuration - accrual = fields.Boolean( - "Accrual", readonly=True, + allocation_type = fields.Selection( + [ + ('regular', 'Regular Allocation'), + ('accrual', 'Accrual Allocation') + ], string="Allocation Type", default="regular", required=True, readonly=True, states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}) accrual_limit = fields.Integer('Balance limit', default=0, help="Maximum of allocation for accrual; 0 means no maximum.") number_per_interval = fields.Float("Number of unit per interval", readonly=True, states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}, default=1) @@ -150,7 +153,7 @@ class HolidaysAllocation(models.Model): """ today = fields.Date.from_string(fields.Date.today()) - holidays = self.search([('accrual', '=', True), ('state', '=', 'validate'), ('holiday_type', '=', 'employee'), + holidays = self.search([('allocation_type', '=', 'accrual'), ('state', '=', 'validate'), ('holiday_type', '=', 'employee'), '|', ('date_to', '=', False), ('date_to', '>', fields.Datetime.now()), '|', ('nextcall', '=', False), ('nextcall', '<=', today)]) @@ -298,7 +301,7 @@ class HolidaysAllocation(models.Model): if new_date_to < self.date_to: self.date_to = new_date_to - if self.accrual: + if self.allocation_type == 'accrual': self.number_of_days = 0 if self.holiday_status_id.request_unit == 'hour': @@ -357,7 +360,7 @@ class HolidaysAllocation(models.Model): @api.model def create(self, values): """ Override to avoid automatic logging of creation """ - if values.get('accrual', False): + if values.get('allocation_type', 'regular') == 'accrual': values['date_from'] = fields.Datetime.now() employee_id = values.get('employee_id', False) if not values.get('department_id'): @@ -407,7 +410,7 @@ class HolidaysAllocation(models.Model): 'number_of_days': self.number_of_days, 'parent_id': self.id, 'employee_id': employee.id, - 'accrual': self.accrual, + 'allocation_type': self.allocation_type, 'date_to': self.date_to, 'interval_unit': self.interval_unit, 'interval_number': self.interval_number, @@ -450,7 +453,6 @@ class HolidaysAllocation(models.Model): 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() self.activity_update() - return True def action_validate(self): current_employee = self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1) diff --git a/addons/hr_holidays/models/hr_leave_type.py b/addons/hr_holidays/models/hr_leave_type.py index cb3cbe34a0f..46ac9886973 100644 --- a/addons/hr_holidays/models/hr_leave_type.py +++ b/addons/hr_holidays/models/hr_leave_type.py @@ -61,7 +61,7 @@ class HolidaysType(models.Model): compute='_compute_leaves', string='Remaining Time Off', help='Maximum Time Off Allowed - Time Off Already Taken') virtual_remaining_leaves = fields.Float( - compute='_compute_leaves', string='Virtual Remaining Time Off', + compute='_compute_leaves', search='_search_virtual_remaining_leaves' ,string='Virtual Remaining Time Off', help='Maximum Time Off Allowed - Time Off Already Taken - Time Off Waiting Approval') group_days_allocation = fields.Float( compute='_compute_group_days_allocation', string='Days Allocated') @@ -154,6 +154,30 @@ class HolidaysType(models.Model): return [('id', 'in', valid_leave)] + def _search_virtual_remaining_leaves(self, operator, value): + value = float(value) + leave_types = self.env['hr.leave.type'].search([]) + valid_leave_types = self.env['hr.leave.type'] + + for leave_type in leave_types: + if leave_type.allocation_type != 'no': + if operator == '>' and leave_type.virtual_remaining_leaves > value: + valid_leave_types |= leave_type + elif operator == '<' and leave_type.virtual_remaining_leaves < value: + valid_leave_types |= leave_type + elif operator == '>=' and leave_type.virtual_remaining_leaves >= value: + valid_leave_types |= leave_type + elif operator == '<=' and leave_type.virtual_remaining_leaves <= value: + valid_leave_types |= leave_type + elif operator == '=' and leave_type.virtual_remaining_leaves == value: + valid_leave_types |= leave_type + elif operator == '!=' and leave_type.virtual_remaining_leaves != value: + valid_leave_types |= leave_type + else: + valid_leave_types |= leave_type + + return [('id', 'in', valid_leave_types.ids)] + def get_days(self, employee_id): # need to use `dict` constructor to create a dict per id result = dict((id, dict(max_leaves=0, leaves_taken=0, remaining_leaves=0, virtual_remaining_leaves=0)) for id in self.ids) diff --git a/addons/hr_holidays/models/mail_channel.py b/addons/hr_holidays/models/mail_channel.py deleted file mode 100644 index 8342aeb54eb..00000000000 --- a/addons/hr_holidays/models/mail_channel.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, fields, models - - -class Channel(models.Model): - _inherit = 'mail.channel' - - def partner_info(self, all_partners, direct_partners): - partner_infos = super(Channel, self).partner_info(all_partners, direct_partners) - # only search for leave out_of_office_message if im_status is on leave - partners_on_leave = [partner_id for partner_id in direct_partners.ids if 'leave' in partner_infos[partner_id]['im_status']] - if partners_on_leave: - now = fields.Datetime.now() - self.env.cr.execute('''SELECT res_users.partner_id as partner_id, hr_leave.out_of_office_message as out_of_office_message, hr_leave.date_to as date_to - FROM res_users - JOIN hr_leave ON hr_leave.user_id = res_users.id - AND hr_leave.state not in ('cancel', 'refuse') - AND res_users.active = 't' - AND hr_leave.date_from <= %s - AND hr_leave.date_to >= %s - AND res_users.partner_id in %s''', (now, now, tuple(partners_on_leave))) - out_of_office_infos = dict(((res['partner_id'], res) for res in self.env.cr.dictfetchall())) - for partner_id, out_of_office_info in out_of_office_infos.items(): - partner_infos[partner_id]['out_of_office_date_end'] = out_of_office_info['date_to'] - partner_infos[partner_id]['out_of_office_message'] = out_of_office_info['out_of_office_message'] - return partner_infos diff --git a/addons/hr_holidays/report/hr_leave_reports.xml b/addons/hr_holidays/report/hr_leave_reports.xml index 20bc19d8451..9e48b10678d 100644 --- a/addons/hr_holidays/report/hr_leave_reports.xml +++ b/addons/hr_holidays/report/hr_leave_reports.xml @@ -111,11 +111,11 @@ - Time off + Time off Analysis ir.actions.act_window hr.leave.report - tree,form + tree,form,pivot { 'search_default_group_type': 1, 'search_default_year': 1} diff --git a/addons/hr_holidays/static/src/js/time_off_calendar.js b/addons/hr_holidays/static/src/js/time_off_calendar.js index c4b27814e1e..36dd3f6387e 100644 --- a/addons/hr_holidays/static/src/js/time_off_calendar.js +++ b/addons/hr_holidays/static/src/js/time_off_calendar.js @@ -72,7 +72,9 @@ odoo.define('hr_holidays.dashboard.view_custo', function(require) { this.do_action({ type: 'ir.actions.act_window', res_model: 'hr.leave.allocation', + name: 'New Allocation Request', views: [[false,'form']], + context: {'form_view_ref': 'hr_holidays.hr_leave_allocation_view_form_dashboard'}, target: 'new', }, { on_close: function () { diff --git a/addons/hr_holidays/static/src/scss/time_off.scss b/addons/hr_holidays/static/src/scss/time_off.scss index e7efa3e1604..b32aae50df8 100644 --- a/addons/hr_holidays/static/src/scss/time_off.scss +++ b/addons/hr_holidays/static/src/scss/time_off.scss @@ -2,7 +2,10 @@ .o_timeoff_card { border-right: #adb5bd solid 2px; text-align: center; - margin-top: 8px; + margin-top: 4px; + div { + line-height: 1; + } } .o_timeoff_card_last { diff --git a/addons/hr_holidays/static/src/xml/time_off_calendar.xml b/addons/hr_holidays/static/src/xml/time_off_calendar.xml index 24ecac05586..70bba2fd937 100644 --- a/addons/hr_holidays/static/src/xml/time_off_calendar.xml +++ b/addons/hr_holidays/static/src/xml/time_off_calendar.xml @@ -11,7 +11,7 @@ -
+
/ Days @@ -20,9 +20,9 @@
- + - remaining + remaining
diff --git a/addons/hr_holidays/tests/__init__.py b/addons/hr_holidays/tests/__init__.py index 67c8327e999..9510f75b34b 100644 --- a/addons/hr_holidays/tests/__init__.py +++ b/addons/hr_holidays/tests/__init__.py @@ -7,4 +7,3 @@ from . import test_hr_leave_type from . import test_accrual_allocations from . import test_change_department from . import test_leave_requests -from . import test_out_of_office diff --git a/addons/hr_holidays/tests/test_accrual_allocations.py b/addons/hr_holidays/tests/test_accrual_allocations.py index 205875c5d74..89e19437dcd 100644 --- a/addons/hr_holidays/tests/test_accrual_allocations.py +++ b/addons/hr_holidays/tests/test_accrual_allocations.py @@ -51,7 +51,7 @@ class TestAccrualAllocations(TestHrHolidaysBase): 'name': 'Accrual allocation for employee', 'employee_id': self.employee_emp_id, 'holiday_status_id': self.accrual_type.id, - 'accrual': True, + 'allocation_type': 'accrual', 'number_of_days': 0, 'number_per_interval': 1, 'interval_number': 1, @@ -69,7 +69,7 @@ class TestAccrualAllocations(TestHrHolidaysBase): 'name': 'Accrual allocation for employee with leaves', 'employee_id': self.employee_hruser_id, 'holiday_status_id': self.accrual_type.id, - 'accrual': True, + 'allocation_type': 'accrual', 'number_of_days': 0, 'number_per_interval': 1, 'interval_number': 1, @@ -108,7 +108,7 @@ class TestAccrualAllocations(TestHrHolidaysBase): 'name': '1 day per 2 weeks', 'employee_id': self.employee_emp_id, 'holiday_status_id': self.accrual_type.id, - 'accrual': True, + 'allocation_type': 'accrual', 'number_of_days': 0, 'number_per_interval': 1, 'interval_number': 2, @@ -120,7 +120,7 @@ class TestAccrualAllocations(TestHrHolidaysBase): 'name': '4 hours per week', 'employee_id': self.employee_emp_id, 'holiday_status_id': self.accrual_type.id, - 'accrual': True, + 'allocation_type': 'accrual', 'number_of_days': 0, 'number_per_interval': 4, 'interval_number': 1, @@ -132,7 +132,7 @@ class TestAccrualAllocations(TestHrHolidaysBase): 'name': '2 day per 1 month', 'employee_id': self.employee_emp_id, 'holiday_status_id': self.accrual_type.id, - 'accrual': True, + 'allocation_type': 'accrual', 'number_of_days': 0, 'number_per_interval': 2, 'interval_number': 1, @@ -144,7 +144,7 @@ class TestAccrualAllocations(TestHrHolidaysBase): 'name': '20 days per year', 'employee_id': self.employee_emp_id, 'holiday_status_id': self.accrual_type.id, - 'accrual': True, + 'allocation_type': 'accrual', 'number_of_days': 0, 'number_per_interval': 20, 'interval_number': 1, @@ -174,7 +174,7 @@ class TestAccrualAllocations(TestHrHolidaysBase): 'name': 'one shot one kill', 'employee_id': self.employee_emp_id, 'holiday_status_id': self.accrual_type.id, - 'accrual': True, + 'allocation_type': 'accrual', 'number_of_days': 0, 'number_per_interval': 1, 'interval_number': 1, @@ -194,7 +194,7 @@ class TestAccrualAllocations(TestHrHolidaysBase): 'name': '2 days per week', 'employee_id': self.employee_emp_id, 'holiday_status_id': self.accrual_type.id, - 'accrual': True, + 'allocation_type': 'accrual', 'number_of_days': 0, 'number_per_interval': 1, 'interval_number': 2, @@ -237,7 +237,7 @@ class TestAccrualAllocations(TestHrHolidaysBase): 'name': 'accrual 5 max', 'employee_id': self.employee_emp_id, 'holiday_status_id': self.accrual_type.id, - 'accrual': True, + 'allocation_type': 'accrual', 'accrual_limit': 5, 'number_of_days': 0, 'number_per_interval': 6, diff --git a/addons/hr_holidays/tests/test_holidays_flow.py b/addons/hr_holidays/tests/test_holidays_flow.py index 15cf8f173e8..1a9e06125fc 100644 --- a/addons/hr_holidays/tests/test_holidays_flow.py +++ b/addons/hr_holidays/tests/test_holidays_flow.py @@ -195,18 +195,6 @@ class TestHolidaysFlow(TestHrHolidaysBase): _check_holidays_status(hol3_status, 20.0, 1.0, 19.0, 19.0) def test_10_leave_summary_reports(self): - # Print the HR Holidays(Summary Department) Report through the wizard - ctx = { - 'model': 'hr.department', - 'active_ids': [self.ref('hr.employee_admin'), self.ref('hr.employee_qdp'), self.ref('hr.employee_al')] - } - data_dict = { - 'date_from': datetime.today().strftime('%Y-%m-01'), - 'depts': [(6, 0, [self.ref('hr.dep_sales')])], - 'holiday_type': 'Approved' - } - test_reports.try_report_action(self.env.cr, self.env.uid, 'action_hr_holidays_summary_dept', wiz_data=data_dict, context=ctx, our_module='hr_holidays') - # Print the HR Holidays(Summary Employee) Report through the wizard ctx = { 'model': 'hr.employee', diff --git a/addons/hr_holidays/tests/test_leave_requests.py b/addons/hr_holidays/tests/test_leave_requests.py index 495d2317caf..5b781d5f176 100644 --- a/addons/hr_holidays/tests/test_leave_requests.py +++ b/addons/hr_holidays/tests/test_leave_requests.py @@ -174,6 +174,7 @@ class TestLeaveRequests(TestHrHolidaysBase): # employee should be set to current user allocation_form = Form(self.env['hr.leave.allocation'].with_user(self.user_employee)) allocation_form.holiday_status_id = self.holidays_type_1 + allocation_form.name = 'New Allocation Request' allocation = allocation_form.save() @mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail') diff --git a/addons/hr_holidays/tests/test_out_of_office.py b/addons/hr_holidays/tests/test_out_of_office.py deleted file mode 100644 index 70ca001da0e..00000000000 --- a/addons/hr_holidays/tests/test_out_of_office.py +++ /dev/null @@ -1,124 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from datetime import datetime -from dateutil.relativedelta import relativedelta - -from odoo.tests.common import tagged, users, warmup, Form -from odoo.addons.hr_holidays.tests.common import TestHrHolidaysBase - - -@tagged('out_of_office') -class TestOutOfOffice(TestHrHolidaysBase): - - def setUp(self): - super().setUp() - self.leave_type = self.env['hr.leave.type'].create({ - 'name': 'Legal Leaves', - 'time_type': 'leave', - 'allocation_type': 'no', - 'validity_start': False, - }) - - def test_leave_ooo(self): - self.assertNotEqual(self.employee_hruser.user_id.im_status, 'leave_offline', 'user should not be on leave') - self.assertNotEqual(self.employee_hruser.user_id.partner_id.im_status, 'leave_offline', 'user should not be on leave') - leave_date_end = (datetime.today() + relativedelta(days=3)) - leave = self.env['hr.leave'].create({ - 'name': 'Christmas', - 'employee_id': self.employee_hruser.id, - 'holiday_status_id': self.leave_type.id, - 'date_from': (datetime.today() - relativedelta(days=1)), - 'date_to': leave_date_end, - 'out_of_office_message': 'contact tde in case of problems', - 'number_of_days': 4, - }) - leave.action_approve() - self.assertEqual(self.employee_hruser.user_id.im_status, 'leave_offline', 'user should be out (leave_offline)') - self.assertEqual(self.employee_hruser.user_id.partner_id.im_status, 'leave_offline', 'user should be out (leave_offline)') - - partner = self.employee_hruser.user_id.partner_id - partner2 = self.user_employee.partner_id - - channel = self.env['mail.channel'].with_context({ - 'mail_create_nolog': True, - 'mail_create_nosubscribe': True, - 'mail_channel_noautofollow': True, - }).create({ - 'channel_partner_ids': [(4, partner.id), (4, partner2.id)], - 'public': 'private', - 'channel_type': 'chat', - 'email_send': False, - 'name': 'test' - }) - infos = channel.with_user(self.user_employee).channel_info() - self.assertEqual(infos[0]['direct_partner'][0]['out_of_office_date_end'], leave_date_end) - self.assertEqual(infos[0]['direct_partner'][0]['out_of_office_message'], 'contact tde in case of problems') - - def test_leave_ooo_use_default(self): - """ Out of office message from Preferences should be used as default value """ - self.user_hruser.out_of_office_message = 'contact xdo in case of problems' - - leave_form = Form(self.env['hr.leave'].with_user(self.user_hruser), view='hr_holidays.hr_leave_view_form') - leave_form.date_from = datetime.today() - relativedelta(days=1) - leave_form.date_to = datetime.today() - leave_form.holiday_status_id = self.leave_type - leave = leave_form.save() - self.assertEqual(leave.out_of_office_message, 'contact xdo in case of problems') - - def test_leave_ooo_overwrite_default(self): - """ Out of office message default value should be overwrittable """ - self.user_hruser.out_of_office_message = 'contact xdo in case of problems' - - leave_form = Form(self.env['hr.leave'].with_user(self.user_hruser), view='hr_holidays.hr_leave_view_form') - leave_form.date_from = datetime.today() - relativedelta(days=1) - leave_form.date_to = datetime.today() - leave_form.holiday_status_id = self.leave_type - leave_form.out_of_office_message = 'contact tde in case of problems' - leave = leave_form.save() - self.assertEqual(leave.out_of_office_message, 'contact tde in case of problems') - - -@tagged('out_of_office') -class TestOutOfOfficePerformance(TestHrHolidaysBase): - - def setUp(self): - super(TestOutOfOfficePerformance, self).setUp() - self.leave_type = self.env['hr.leave.type'].create({ - 'name': 'Legal Leaves', - 'time_type': 'leave', - 'allocation_type': 'no', - 'validity_start': False, - }) - self.leave_date_end = (datetime.today() + relativedelta(days=3)) - self.leave = self.env['hr.leave'].create({ - 'name': 'Christmas', - 'employee_id': self.employee_hruser_id, - 'holiday_status_id': self.leave_type.id, - 'date_from': (datetime.today() - relativedelta(days=1)), - 'date_to': (datetime.today() + relativedelta(days=3)), - 'out_of_office_message': 'contact tde in case of problems', - 'number_of_days': 4, - }) - - self.hr_user = self.employee_hruser.user_id - self.hr_partner = self.employee_hruser.user_id.partner_id - self.employer_partner = self.user_employee.partner_id - - @users('__system__', 'demo') - @warmup - def test_leave_im_status_performance_partner_offline(self): - with self.assertQueryCount(__system__=2, demo=2): - self.assertEqual(self.employer_partner.im_status, 'offline') - - @users('__system__', 'demo') - @warmup - def test_leave_im_status_performance_user_leave_offline(self): - with self.assertQueryCount(__system__=2, demo=2): - self.assertEqual(self.hr_user.im_status, 'leave_offline') - - @users('__system__', 'demo') - @warmup - def test_leave_im_status_performance_partner_leave_offline(self): - with self.assertQueryCount(__system__=2, demo=2): - self.assertEqual(self.hr_partner.im_status, 'leave_offline') diff --git a/addons/hr_holidays/views/hr_holidays_views.xml b/addons/hr_holidays/views/hr_holidays_views.xml index 45ea1cf7340..832de6634fc 100644 --- a/addons/hr_holidays/views/hr_holidays_views.xml +++ b/addons/hr_holidays/views/hr_holidays_views.xml @@ -113,21 +113,14 @@ - - diff --git a/addons/hr_holidays/views/hr_leave_allocation_views.xml b/addons/hr_holidays/views/hr_leave_allocation_views.xml index 03daeb41873..6df1d9705a4 100644 --- a/addons/hr_holidays/views/hr_leave_allocation_views.xml +++ b/addons/hr_holidays/views/hr_leave_allocation_views.xml @@ -8,16 +8,16 @@ - + - + - + - @@ -87,12 +85,14 @@ - + + + -