[FIX] resource: manage two weeks calendar and company creation

Steps to reproduce:
-------------------
- Go to Working Time and modify a calendar using "Switch to 2 weeks calendar"
    (not the default company calendar);
- In the Employees App settings, change the "Company Working Hours"
    to the edited calendar;
- Create a new company.

Issue:
------
We have the error: "Attendances can't overlap.".

Cause:
------
When we create a company, we will use the `_default_get` method
to get the default values for the `attendance_ids`.
So we will copy the attendances from the current company,
but we won't copy the `week_type` value.
In addition, the `two_weeks_calendar` value will be `False`.

As a result, overlaps will be checked as for a one-week calendar.
This will trigger the error.

Solution:
---------
If you want to get the current company's attendances by default,
make sure it uses a one-week calendar.
If this is not the case, we take the default (hardcoded) attendances.

Note:
-----
Since the commit 292508e8a749bf32e40995454da6122cd3c1df77,
it was no longer possible to modify a company's default calendar.
It is reverted.

With this FIX, this is now possible.

opw-3446789

closes odoo/odoo#131872

X-original-commit: 22c12db1f009686fa4c3861c398ba178b2785ead
Signed-off-by: Sofie Gvaladze (sgv) <sgv@odoo.com>
Signed-off-by: Thomas Lefebvre (thle) <thle@odoo.com>
This commit is contained in:
Thomas Lefebvre (thle)
2023-08-14 14:52:12 +02:00
parent dbdb7c9a7c
commit 0f08587e6c
4 changed files with 39 additions and 12 deletions
-7
View File
@@ -272,13 +272,6 @@ msgid ""
"Time without removing it."
msgstr ""
#. module: resource
#. odoo-python
#: code:addons/resource/models/resource_calendar.py:0
#, python-format
msgid "Impossible to switch calendar type for the default company schedule."
msgstr ""
#. module: resource
#. odoo-python
#: code:addons/resource/models/resource_calendar.py:0
+2 -5
View File
@@ -14,7 +14,7 @@ from pytz import timezone, utc
from odoo import api, fields, models, _
from odoo.addons.base.models.res_partner import _tz_get
from odoo.exceptions import ValidationError, UserError
from odoo.exceptions import ValidationError
from odoo.osv import expression
from odoo.tools.float_utils import float_round
@@ -45,7 +45,7 @@ class ResourceCalendar(models.Model):
company_id = res.get('company_id', self.env.company.id)
company = self.env['res.company'].browse(company_id)
company_attendance_ids = company.resource_calendar_id.attendance_ids
if company_attendance_ids:
if not company.resource_calendar_id.two_weeks_calendar and company_attendance_ids:
res['attendance_ids'] = [
(0, 0, {
'name': attendance.name,
@@ -184,9 +184,6 @@ class ResourceCalendar(models.Model):
return float_round(hour_count / float(number_of_days), precision_digits=2)
def switch_calendar_type(self):
if self == self.env.company.resource_calendar_id:
raise UserError(_('Impossible to switch calendar type for the default company schedule.'))
if not self.two_weeks_calendar:
self.attendance_ids.unlink()
self.attendance_ids = [
+19
View File
@@ -82,3 +82,22 @@ class TestResourceCommon(TransactionCase):
'name': 'Paul',
'resource_calendar_id': cls.calendar_paul.id,
})
cls.two_weeks_resource = cls._define_calendar_2_weeks(
'Two weeks resource',
[
(0, 0, 0, '0', 'line_section', 0),
(8, 16, 0, '0', False, 1),
(8, 16, 1, '0', False, 2),
(8, 16, 2, '0', False, 3),
(8, 16, 3, '0', False, 4),
(8, 16, 4, '0', False, 5),
(0, 0, 0, '1', 'line_section', 10),
(8, 16, 0, '1', False, 11),
(8, 16, 1, '1', False, 12),
(8, 16, 2, '1', False, 13),
(8, 16, 3, '1', False, 14),
(8, 16, 4, '1', False, 15)
],
'Europe/Brussels'
)
@@ -1320,3 +1320,21 @@ class TestResource(TestResourceCommon):
self.assertEqual(31, sum_work_intervals_jules, "Sum of the work intervals for the calendar of jules should be Wodd:15h+Wpair:16h = 31h")
sum_work_intervals_patel = sum_intervals(calendars_intervals[self.calendar_patel.id])
self.assertEqual(49, sum_work_intervals_patel, "Sum of the work intervals for the calendar of patel should be 14+35h = 49h")
def test_switch_two_weeks_resource(self):
"""
Check that it is possible to switch the company's default calendar
"""
self.env.company.resource_calendar_id = self.two_weeks_resource
company_resource = self.env.company.resource_calendar_id
# Switch two times to be sure to test both cases
company_resource.switch_calendar_type()
company_resource.switch_calendar_type()
def test_create_company_using_two_weeks_resource(self):
"""
Check that we can create a new company
if the default company calendar is two weeks
"""
self.env.company.resource_calendar_id = self.two_weeks_resource
self.env['res.company'].create({'name': 'New Company'})