diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py index e13de639204..021bfb635db 100644 --- a/addons/hr_holidays/models/hr_leave.py +++ b/addons/hr_holidays/models/hr_leave.py @@ -89,25 +89,34 @@ class HolidaysRequest(models.Model): lt = self.env['hr.leave.type'].browse(defaults.get('holiday_status_id')) defaults['state'] = 'confirm' + if 'date_from' and 'date_to' in fields_list: + now = fields.Datetime.now() + if 'date_from' not in defaults: + defaults['date_from'] = now.replace(hour=0, minute=0, second=0) + if 'date_to' not in defaults: + defaults['date_to'] = now.replace(hour=23, minute=59, second=59) + if (not self._context.get('leave_compute_date_from_to') and defaults['date_from'].time() == time(0, 0, 0) and + defaults['date_to'].time() == time(23, 59, 59)): + employee = self.env['hr.employee'].browse(defaults['employee_id']) if defaults.get('employee_id') else self.env.user.employee_id + + date_from = defaults['date_from'].date() + date_to = defaults['date_to'].date() + + attendance_from, attendance_to = self._get_attendances(employee, date_from, date_to) + + defaults['date_from'] = self._get_start_or_end_from_attendance(attendance_from.hour_from, date_from, employee) + defaults['date_to'] = self._get_start_or_end_from_attendance(attendance_to.hour_to, date_to, employee) + + defaults = self._default_get_request_parameters(defaults) + return defaults def _default_get_request_parameters(self, values): new_values = dict(values) - global_from, global_to = False, False - # TDE FIXME: consider a mapping on several days that is not the standard - # calendar widget 7-19 in user's TZ is some custom input if values.get('date_from'): - user_tz = self.env.user.tz or 'UTC' - localized_dt = timezone('UTC').localize(values['date_from']).astimezone(timezone(user_tz)) - global_from = localized_dt.time().hour == 7 and localized_dt.time().minute == 0 - new_values['request_date_from'] = localized_dt.date() + new_values['request_date_from'] = values['date_from'].date() if values.get('date_to'): - user_tz = self.env.user.tz or 'UTC' - localized_dt = timezone('UTC').localize(values['date_to']).astimezone(timezone(user_tz)) - global_to = localized_dt.time().hour == 19 and localized_dt.time().minute == 0 - new_values['request_date_to'] = localized_dt.date() - if global_from and global_to: - new_values['request_unit_custom'] = True + new_values['request_date_to'] = values['date_to'].date() return new_values active = fields.Boolean(default=True) @@ -275,7 +284,6 @@ class HolidaysRequest(models.Model): # request type request_unit_half = fields.Boolean('Half Day', compute='_compute_request_unit_half', store=True, readonly=False) request_unit_hours = fields.Boolean('Custom Hours', compute='_compute_request_unit_hours', store=True, readonly=False) - request_unit_custom = fields.Boolean('Days-long custom hours', compute='_compute_request_unit_custom', store=True, readonly=False) # view is_hatched = fields.Boolean('Hatched', compute='_compute_is_hatched') is_striked = fields.Boolean('Striked', compute='_compute_is_hatched') @@ -391,7 +399,7 @@ class HolidaysRequest(models.Model): leave.holiday_allocation_id = False @api.depends('request_date_from_period', 'request_hour_from', 'request_hour_to', 'request_date_from', 'request_date_to', - 'request_unit_half', 'request_unit_hours', 'request_unit_custom', 'employee_id') + 'request_unit_half', 'request_unit_hours', 'employee_id') def _compute_date_from_to(self): for holiday in self: if holiday.request_date_from and holiday.request_date_to and holiday.request_date_from > holiday.request_date_to: @@ -403,86 +411,41 @@ class HolidaysRequest(models.Model): else: if holiday.request_unit_half or holiday.request_unit_hours: holiday.request_date_to = holiday.request_date_from - resource_calendar_id = holiday.employee_id.resource_calendar_id or self.env.company.resource_calendar_id - domain = [('calendar_id', '=', resource_calendar_id.id), ('display_type', '=', False)] - attendances = self.env['resource.calendar.attendance'].read_group(domain, ['ids:array_agg(id)', 'hour_from:min(hour_from)', 'hour_to:max(hour_to)', 'week_type', 'dayofweek', 'day_period'], ['week_type', 'dayofweek', 'day_period'], lazy=False) - # Must be sorted by dayofweek ASC and day_period DESC - attendances = sorted([DummyAttendance(group['hour_from'], group['hour_to'], group['dayofweek'], group['day_period'], group['week_type']) for group in attendances], key=lambda att: (att.dayofweek, att.day_period != 'morning')) - - default_value = DummyAttendance(0, 0, 0, 'morning', False) - - if resource_calendar_id.two_weeks_calendar: - # find week type of start_date - start_week_type = self.env['resource.calendar.attendance'].get_week_type(holiday.request_date_from) - attendance_actual_week = [att for att in attendances if att.week_type is False or int(att.week_type) == start_week_type] - attendance_actual_next_week = [att for att in attendances if att.week_type is False or int(att.week_type) != start_week_type] - # First, add days of actual week coming after date_from - attendance_filtred = [att for att in attendance_actual_week if int(att.dayofweek) >= holiday.request_date_from.weekday()] - # Second, add days of the other type of week - attendance_filtred += list(attendance_actual_next_week) - # Third, add days of actual week (to consider days that we have remove first because they coming before date_from) - attendance_filtred += list(attendance_actual_week) - end_week_type = self.env['resource.calendar.attendance'].get_week_type(holiday.request_date_to) - attendance_actual_week = [att for att in attendances if att.week_type is False or int(att.week_type) == end_week_type] - attendance_actual_next_week = [att for att in attendances if att.week_type is False or int(att.week_type) != end_week_type] - attendance_filtred_reversed = list(reversed([att for att in attendance_actual_week if int(att.dayofweek) <= holiday.request_date_to.weekday()])) - attendance_filtred_reversed += list(reversed(attendance_actual_next_week)) - attendance_filtred_reversed += list(reversed(attendance_actual_week)) - - # find first attendance coming after first_day - attendance_from = attendance_filtred[0] - # find last attendance coming before last_day - attendance_to = attendance_filtred_reversed[0] - else: - # find first attendance coming after first_day - attendance_from = next((att for att in attendances if int(att.dayofweek) >= holiday.request_date_from.weekday()), attendances[0] if attendances else default_value) - # find last attendance coming before last_day - attendance_to = next((att for att in reversed(attendances) if int(att.dayofweek) <= holiday.request_date_to.weekday()), attendances[-1] if attendances else default_value) + attendance_from, attendance_to = holiday._get_attendances(holiday.employee_id, holiday.request_date_from, holiday.request_date_to) compensated_request_date_from = holiday.request_date_from compensated_request_date_to = holiday.request_date_to if holiday.request_unit_half: if holiday.request_date_from_period == 'am': - hour_from = float_to_time(attendance_from.hour_from) - hour_to = float_to_time(attendance_from.hour_to) + hour_from = attendance_from.hour_from + hour_to = attendance_from.hour_to else: - hour_from = float_to_time(attendance_to.hour_from) - hour_to = float_to_time(attendance_to.hour_to) + hour_from = attendance_to.hour_from + hour_to = attendance_to.hour_to elif holiday.request_unit_hours: - hour_from = float_to_time(float(holiday.request_hour_from)) - hour_to = float_to_time(float(holiday.request_hour_to)) - elif holiday.request_unit_custom: - hour_from = holiday.date_from.time() - hour_to = holiday.date_to.time() - compensated_request_date_from = holiday._adjust_date_based_on_tz(holiday.request_date_from, hour_from) - compensated_request_date_to = holiday._adjust_date_based_on_tz(holiday.request_date_to, hour_to) + hour_from = holiday.request_hour_from + hour_to = holiday.request_hour_to else: - hour_from = float_to_time(attendance_from.hour_from) - hour_to = float_to_time(attendance_to.hour_to) + hour_from = attendance_from.hour_from + hour_to = attendance_to.hour_to - holiday.date_from = timezone(holiday.tz).localize(datetime.combine(compensated_request_date_from, hour_from)).astimezone(UTC).replace(tzinfo=None) - holiday.date_to = timezone(holiday.tz).localize(datetime.combine(compensated_request_date_to, hour_to)).astimezone(UTC).replace(tzinfo=None) + holiday.date_from = self._get_start_or_end_from_attendance(hour_from, compensated_request_date_from, holiday.employee_id or holiday) + holiday.date_to = self._get_start_or_end_from_attendance(hour_to, compensated_request_date_to, holiday.employee_id or holiday) - @api.depends('holiday_status_id', 'request_unit_hours', 'request_unit_custom') + @api.depends('holiday_status_id', 'request_unit_hours') def _compute_request_unit_half(self): for holiday in self: - if holiday.holiday_status_id or holiday.request_unit_hours or holiday.request_unit_custom: + if holiday.holiday_status_id or holiday.request_unit_hours: holiday.request_unit_half = False - @api.depends('holiday_status_id', 'request_unit_half', 'request_unit_custom') + @api.depends('holiday_status_id', 'request_unit_half') def _compute_request_unit_hours(self): for holiday in self: - if holiday.holiday_status_id or holiday.request_unit_half or holiday.request_unit_custom: + if holiday.holiday_status_id or holiday.request_unit_half: holiday.request_unit_hours = False - @api.depends('holiday_status_id', 'request_unit_half', 'request_unit_hours') - def _compute_request_unit_custom(self): - for holiday in self: - if holiday.holiday_status_id or holiday.request_unit_half or holiday.request_unit_hours: - holiday.request_unit_custom = False - @api.depends('employee_ids') def _compute_from_employee_ids(self): for holiday in self: @@ -577,13 +540,11 @@ class HolidaysRequest(models.Model): for leave in self: leave.tz_mismatch = leave.tz != self.env.user.tz - @api.depends('request_unit_custom', 'employee_id', 'holiday_type', 'department_id.company_id.resource_calendar_id.tz', 'mode_company_id.resource_calendar_id.tz') + @api.depends('employee_id', 'holiday_type', 'department_id.company_id.resource_calendar_id.tz', 'mode_company_id.resource_calendar_id.tz') def _compute_tz(self): for leave in self: tz = False - if leave.request_unit_custom: - tz = 'UTC' # custom -> already in UTC - elif leave.holiday_type == 'employee': + if leave.holiday_type == 'employee': tz = leave.employee_id.tz elif leave.holiday_type == 'department': tz = leave.department_id.company_id.resource_calendar_id.tz @@ -780,16 +741,22 @@ class HolidaysRequest(models.Model): if holiday.state in ['cancel', 'refuse', 'validate1', 'validate']: raise ValidationError(_("This modification is not allowed in the current state.")) + def _get_number_of_days_batch(self, date_from, date_to, employee_ids): + """ Returns a float equals to the timedelta between two dates given as string.""" + employee = self.env['hr.employee'].browse(employee_ids) + # We force the company in the domain as we are more than likely in a compute_sudo + domain = [('company_id', 'in', self.env.company.ids + self.env.context.get('allowed_company_ids', []))] + + result = employee._get_work_days_data_batch(date_from, date_to, domain=domain) + for employee_id in result: + if self.request_unit_half and result[employee_id]['hours'] > 0: + result[employee_id]['days'] = 0.5 + return result + def _get_number_of_days(self, date_from, date_to, employee_id): """ Returns a float equals to the timedelta between two dates given as string.""" if employee_id: - employee = self.env['hr.employee'].browse(employee_id) - # We force the company in the domain as we are more than likely in a compute_sudo - domain = [('company_id', 'in', self.env.company.ids + self.env.context.get('allowed_company_ids', []))] - result = employee._get_work_days_data_batch(date_from, date_to, domain=domain)[employee.id] - if self.request_unit_half and result['hours'] > 0: - result['days'] = 0.5 - return result + return self._get_number_of_days_batch(date_from, date_to, employee_id)[employee_id] today_hours = self.env.company.resource_calendar_id.get_work_hours_count( datetime.combine(date_from.date(), time.min), @@ -966,6 +933,38 @@ class HolidaysRequest(models.Model): @api.model_create_multi def create(self, vals_list): + leave_date_employees = defaultdict(list) + employee_ids = [] + for values in vals_list: + if values.get('employee_id'): + employee_ids.append(values['employee_id']) + if values.get('date_from') and values.get('date_to'): + date_from = fields.Datetime.to_datetime(values['date_from']) + date_to = fields.Datetime.to_datetime(values['date_to']) + if values['employee_id'] not in leave_date_employees[(date_from, date_to)]: + leave_date_employees[(date_from, date_to)].append(values['employee_id']) + employees = self.env['hr.employee'].browse(employee_ids) + if self._context.get('leave_compute_date_from_to') and employees: + employee_leave_date_duration = defaultdict(dict) + for (date_from, date_to), employee_ids in leave_date_employees.items(): + employee_leave_date_duration[(date_from, date_to)] = self._get_number_of_days_batch(date_from, date_to, employee_ids) + for values in vals_list: + employee_id = values.get('employee_id') + if employee_id and values.get('date_from') and values.get('date_to'): + date_from = values.get('date_from') + date_to = values.get('date_to') + employee = employees.filtered(lambda emp: emp.id == employee_id) + attendance_from, attendance_to = self._get_attendances(employee, date_from.date(), date_to.date()) + hour_from = max(values['date_from'].replace(tzinfo=UTC).astimezone(timezone(self.env.user.tz)).time(), float_to_time(attendance_from.hour_from)) + hour_to = min(values['date_to'].replace(tzinfo=UTC).astimezone(timezone(self.env.user.tz)).time(), float_to_time(attendance_to.hour_to)) + hour_from = hour_from.hour + hour_from.minute / 60 + hour_to = hour_to.hour + hour_to.minute / 60 + + values['date_from'] = self._get_start_or_end_from_attendance(hour_from, date_from.date(), employee) + values['date_to'] = self._get_start_or_end_from_attendance(hour_to, date_to.date(), employee) + values['request_date_from'], values['request_date_to'] = values['date_from'].date(), values['date_to'].date() + values['number_of_days'] = employee_leave_date_duration[(date_from, date_to)][values['employee_id']]['days'] + """ Override to avoid automatic logging of creation """ if not self._context.get('leave_fast_create'): leave_types = self.env['hr.leave.type'].browse([values.get('holiday_status_id') for values in vals_list if values.get('holiday_status_id')]) @@ -976,7 +975,7 @@ class HolidaysRequest(models.Model): leave_type_id = values.get('holiday_status_id') # Handle automatic department_id if not values.get('department_id'): - values.update({'department_id': self.env['hr.employee'].browse(employee_id).department_id.id}) + values.update({'department_id': employees.filtered(lambda emp: emp.id == employee_id).department_id.id}) # Handle no_validation if mapped_validation_type[leave_type_id] == 'no_validation': @@ -1358,6 +1357,10 @@ class HolidaysRequest(models.Model): leave_fast_create=True, no_calendar_sync=True, leave_skip_state_check=True, + # date_from and date_to are computed based on the employee tz + # If _compute_date_from_to is used instead, it will trigger _compute_number_of_days + # and create a conflict on the number of days calculation between the different leaves + leave_compute_date_from_to=True, ).create(values) leaves._validate_leave_request() @@ -1559,3 +1562,52 @@ class HolidaysRequest(models.Model): @api.model def get_unusual_days(self, date_from, date_to=None): return self.env.user.employee_id.sudo(False)._get_unusual_days(date_from, date_to) + + def _get_start_or_end_from_attendance(self, hour, date, employee): + hour = float_to_time(float(hour)) + compensated_request_date = self._adjust_date_based_on_tz(date, hour) + holiday_tz = timezone(employee.tz or self.env.user.tz) + return holiday_tz.localize(datetime.combine(compensated_request_date, hour)).astimezone(UTC).replace(tzinfo=None) + + def _get_attendances(self, employee, request_date_from, request_date_to): + resource_calendar_id = employee.resource_calendar_id or self.env.company.resource_calendar_id + domain = [('calendar_id', '=', resource_calendar_id.id), ('display_type', '=', False)] + attendances = self.env['resource.calendar.attendance'].read_group(domain, + ['ids:array_agg(id)', 'hour_from:min(hour_from)', 'hour_to:max(hour_to)', + 'week_type', 'dayofweek', 'day_period'], + ['week_type', 'dayofweek', 'day_period'], lazy=False) + + # Must be sorted by dayofweek ASC and day_period DESC + attendances = sorted([DummyAttendance(group['hour_from'], group['hour_to'], group['dayofweek'], group['day_period'], group['week_type']) for group in attendances], key=lambda att: (att.dayofweek, att.day_period != 'morning')) + + default_value = DummyAttendance(0, 0, 0, 'morning', False) + + if resource_calendar_id.two_weeks_calendar: + # find week type of start_date + start_week_type = self.env['resource.calendar.attendance'].get_week_type(request_date_from) + attendance_actual_week = [att for att in attendances if att.week_type is False or int(att.week_type) == start_week_type] + attendance_actual_next_week = [att for att in attendances if att.week_type is False or int(att.week_type) != start_week_type] + # First, add days of actual week coming after date_from + attendance_filtred = [att for att in attendance_actual_week if int(att.dayofweek) >= request_date_from.weekday()] + # Second, add days of the other type of week + attendance_filtred += list(attendance_actual_next_week) + # Third, add days of actual week (to consider days that we have remove first because they coming before date_from) + attendance_filtred += list(attendance_actual_week) + end_week_type = self.env['resource.calendar.attendance'].get_week_type(request_date_to) + attendance_actual_week = [att for att in attendances if att.week_type is False or int(att.week_type) == end_week_type] + attendance_actual_next_week = [att for att in attendances if att.week_type is False or int(att.week_type) != end_week_type] + attendance_filtred_reversed = list(reversed([att for att in attendance_actual_week if int(att.dayofweek) <= request_date_to.weekday()])) + attendance_filtred_reversed += list(reversed(attendance_actual_next_week)) + attendance_filtred_reversed += list(reversed(attendance_actual_week)) + + # find first attendance coming after first_day + attendance_from = attendance_filtred[0] + # find last attendance coming before last_day + attendance_to = attendance_filtred_reversed[0] + else: + # find first attendance coming after first_day + attendance_from = next((att for att in attendances if int(att.dayofweek) >= request_date_from.weekday()), attendances[0] if attendances else default_value) + # find last attendance coming before last_day + attendance_to = next((att for att in reversed(attendances) if int(att.dayofweek) <= request_date_to.weekday()), attendances[-1] if attendances else default_value) + + return (attendance_from, attendance_to) diff --git a/addons/hr_holidays/static/src/js/time_off_calendar/time_off_calendar_model.js b/addons/hr_holidays/static/src/js/time_off_calendar/time_off_calendar_model.js index 2d4d5ab338a..f67566fb9db 100644 --- a/addons/hr_holidays/static/src/js/time_off_calendar/time_off_calendar_model.js +++ b/addons/hr_holidays/static/src/js/time_off_calendar/time_off_calendar_model.js @@ -2,10 +2,18 @@ import CalendarModel from "web.CalendarModel"; - export const TimeOffCalendarModel = CalendarModel.extend({ _getFilterDomain: function() { const company_domain = [['user_id.company_id', 'in', this.data.context.allowed_company_ids]]; return this._super().concat(company_domain); }, + + calendarEventToRecord(event) { + const data = this._super(...arguments); + if (event.allDay) { + data.date_from = data.date_from.utc().startOf('day'); + data.date_to = data.date_to.utc().endOf('day'); + } + return data; + }, }); diff --git a/addons/hr_holidays/tests/common.py b/addons/hr_holidays/tests/common.py index 72497b1b6a4..7fb8745a9d6 100644 --- a/addons/hr_holidays/tests/common.py +++ b/addons/hr_holidays/tests/common.py @@ -18,6 +18,7 @@ class TestHrHolidaysCommon(common.TransactionCase): cls.user_hrmanager = mail_new_test_user(cls.env, login='bastien', groups='base.group_user,hr_holidays.group_hr_holidays_manager') cls.user_hrmanager_id = cls.user_hrmanager.id + cls.user_hrmanager.tz = 'Europe/Brussels' cls.user_employee = mail_new_test_user(cls.env, login='david', groups='base.group_user') cls.user_employee_id = cls.user_employee.id diff --git a/addons/hr_holidays/tests/test_company_leave.py b/addons/hr_holidays/tests/test_company_leave.py index 56009e01fff..15d7e3567e3 100644 --- a/addons/hr_holidays/tests/test_company_leave.py +++ b/addons/hr_holidays/tests/test_company_leave.py @@ -323,7 +323,7 @@ class TestCompanyLeave(TransactionCase): }) company_leave._compute_date_from_to() - with self.assertQueryCount(__system__=250, admin=865): # 249 community + with self.assertQueryCount(__system__=353, admin=865): # Original query count: 1987 # Without tracking/activity context keys: 5154 company_leave.action_validate() diff --git a/addons/hr_holidays/tests/test_leave_requests.py b/addons/hr_holidays/tests/test_leave_requests.py index 0f32a080f1b..b598f87cc91 100644 --- a/addons/hr_holidays/tests/test_leave_requests.py +++ b/addons/hr_holidays/tests/test_leave_requests.py @@ -249,8 +249,8 @@ class TestLeaveRequests(TestHrHolidaysCommon): 'request_hour_from': '8', # 8:00 AM in the company's timezone 'request_hour_to': '17', # 5:00 PM in the company's timezone }) - self.assertEqual(leave.date_from, datetime(2019, 5, 5, 20, 0, 0), "It should have been localized before saving in UTC") - self.assertEqual(leave.date_to, datetime(2019, 5, 6, 5, 0, 0), "It should have been localized before saving in UTC") + self.assertEqual(leave.date_from, datetime(2019, 5, 6, 6, 0, 0), "It should have been localized in the Employee timezone") + self.assertEqual(leave.date_to, datetime(2019, 5, 6, 15, 0, 0), "It should have been localized in the Employee timezone") @mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail') def test_timezone_company_validated(self): @@ -264,13 +264,15 @@ class TestLeaveRequests(TestHrHolidaysCommon): leave_form.holiday_status_id = self.holidays_type_1 leave_form.request_date_from = date(2019, 5, 6) leave_form.request_date_to = date(2019, 5, 6) + leave_form.date_from = datetime(2019, 5, 6, 0, 0, 0) + leave_form.date_to = datetime(2019, 5, 6, 23, 59, 59) leave = leave_form.save() leave.state = 'confirm' leave.action_validate() employee_leave = self.env['hr.leave'].search([('employee_id', '=', employee.id)]) self.assertEqual( - employee_leave.request_date_from, date(2019, 5, 6), - "Timezone should be kept between company and employee leave" + employee_leave.request_date_from, date(2019, 5, 5), + "Timezone should be be adapted on the employee leave" ) @mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail') @@ -290,8 +292,8 @@ class TestLeaveRequests(TestHrHolidaysCommon): 'request_hour_from': '8', # 8:00 AM in the department's timezone 'request_hour_to': '17', # 5:00 PM in the department's timezone }) - self.assertEqual(leave.date_from, datetime(2019, 5, 5, 20, 0, 0), "It should have been localized before saving in UTC") - self.assertEqual(leave.date_to, datetime(2019, 5, 6, 5, 0, 0), "It should have been localized before saving in UTC") + self.assertEqual(leave.date_from, datetime(2019, 5, 6, 6, 0, 0), "It should have been localized in the Employee timezone") + self.assertEqual(leave.date_to, datetime(2019, 5, 6, 15, 0, 0), "It should have been localized in the Employee timezone") def test_number_of_hours_display(self): # Test that the field number_of_hours_dispay doesn't change @@ -416,12 +418,10 @@ class TestLeaveRequests(TestHrHolidaysCommon): tz = timezone(tz) # Mimic what is done by the calendar widget when clicking on a day. It - # will take the local datetime from 7:00 to 19:00 and then convert it - # to UTC before sending it. Values here are for PST (UTC -8) and - # represent a leave on 2019/1/1 from 7:00 to 19:00 local time. + # will take the local datetime from 0:00 to 23:59 values = { - 'date_from': tz.localize(local_date_from).astimezone(UTC).replace(tzinfo=None), - 'date_to': tz.localize(local_date_to).astimezone(UTC).replace(tzinfo=None), # note that this can be the next day in UTC + 'date_from': local_date_from, + 'date_to': local_date_to, # note that this can be the next day in UTC } values.update(self.env['hr.leave'].with_user(self.user_employee_id)._default_get_request_parameters(values)) @@ -449,14 +449,14 @@ class TestLeaveRequests(TestHrHolidaysCommon): # 12 13 14 15 16 17 18 # 19 20 21 22 23 24 25 # 26 27 28 29 30 31 - local_date_from = datetime(2020, 1, 1, 7, 0, 0) - local_date_to = datetime(2020, 1, 1, 19, 0, 0) + local_date_from = datetime(2020, 1, 1, 0, 0, 0) + local_date_to = datetime(2020, 1, 1, 23, 59, 59) for tz in timezones_to_test: self._test_leave_with_tz(tz, local_date_from, local_date_to, 1) # We, Th, Fr, Mo, Tu, We => 6 days - local_date_from = datetime(2020, 1, 1, 7, 0, 0) - local_date_to = datetime(2020, 1, 8, 19, 0, 0) + local_date_from = datetime(2020, 1, 1, 0, 0, 0) + local_date_to = datetime(2020, 1, 8, 23, 59, 59) for tz in timezones_to_test: self._test_leave_with_tz(tz, local_date_from, local_date_to, 6)#TODO JUD check why this fails diff --git a/addons/hr_holidays/views/hr_leave_views.xml b/addons/hr_holidays/views/hr_leave_views.xml index 9d33734baac..5e217c929c7 100644 --- a/addons/hr_holidays/views/hr_leave_views.xml +++ b/addons/hr_holidays/views/hr_leave_views.xml @@ -316,11 +316,6 @@