Skip to content

Commit 0a150cb

Browse files
author
Antoni Marroig Campomar
committed
New improvements
1 parent 4000b12 commit 0a150cb

12 files changed

Lines changed: 151 additions & 36 deletions

hr_holidays_public_regional/__manifest__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
Manage regional public holidays by assigning dedicated calendars to employees.
77
Leaves can optionally exclude regional holidays from their duration calculation.
88
""",
9-
"version": "17.0.1.0.7",
9+
"version": "17.0.1.0.0",
1010
"category": "Human Resources",
1111
"author": "APSL-Nagarro, Odoo Community Association (OCA)",
1212
"website": "https://github.com/OCA/hr-holidays",

hr_holidays_public_regional/i18n/es.po

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ msgid ""
66
msgstr ""
77
"Project-Id-Version: Odoo Server 17.0\n"
88
"Report-Msgid-Bugs-To: \n"
9-
"POT-Creation-Date: 2025-07-25 12:24+0000\n"
10-
"PO-Revision-Date: 2025-07-25 12:24+0000\n"
9+
"POT-Creation-Date: 2025-12-11 08:42+0000\n"
10+
"PO-Revision-Date: 2025-12-11 08:42+0000\n"
1111
"Last-Translator: \n"
1212
"Language-Team: \n"
1313
"MIME-Version: 1.0\n"
@@ -48,13 +48,15 @@ msgid "Create Next Year Public Regional Holidays"
4848
msgstr "Crear Próximo Calendario Regional de Festivos"
4949

5050
#. module: hr_holidays_public_regional
51+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee_regional_calendar__create_uid
5152
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional__create_uid
5253
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional_line__create_uid
5354
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_public_regional_holidays_wizard__create_uid
5455
msgid "Created by"
5556
msgstr "Creado por"
5657

5758
#. module: hr_holidays_public_regional
59+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee_regional_calendar__create_date
5860
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional__create_date
5961
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional_line__create_date
6062
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_public_regional_holidays_wizard__create_date
@@ -84,27 +86,35 @@ msgstr ""
8486
"calendario al que están siendo asignadas"
8587

8688
#. module: hr_holidays_public_regional
89+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee_regional_calendar__display_name
8790
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional_line__display_name
8891
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_public_regional_holidays_wizard__display_name
8992
msgid "Display Name"
9093
msgstr "Mostrar nombre"
9194

9295
#. module: hr_holidays_public_regional
9396
#: model:ir.model,name:hr_holidays_public_regional.model_hr_employee
97+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee_regional_calendar__employee_id
9498
msgid "Employee"
9599
msgstr "Empleado"
96100

101+
#. module: hr_holidays_public_regional
102+
#: model:ir.model,name:hr_holidays_public_regional.model_hr_employee_regional_calendar
103+
msgid "Employee Regional Calendar"
104+
msgstr "Calendario Regional del Empleado"
105+
106+
#. module: hr_holidays_public_regional
107+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee_regional_calendar__end_date
108+
msgid "End Date"
109+
msgstr "Fecha de Fin"
110+
97111
#. module: hr_holidays_public_regional
98112
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_leave_type__exclude_public_regional_holidays
99113
msgid "Exclude Public Regional Holidays"
100114
msgstr "Excluir Festivos Regionales"
101115

102116
#. module: hr_holidays_public_regional
103-
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee__regional_holiday_calendar_id
104-
msgid "Holiday Regional Calendar"
105-
msgstr "Calendario Festivos Regionales"
106-
107-
#. module: hr_holidays_public_regional
117+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee_regional_calendar__id
108118
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional__id
109119
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional_line__id
110120
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_public_regional_holidays_wizard__id
@@ -120,13 +130,15 @@ msgstr ""
120130
" días de ausencia."
121131

122132
#. module: hr_holidays_public_regional
133+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee_regional_calendar__write_uid
123134
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional__write_uid
124135
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional_line__write_uid
125136
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_public_regional_holidays_wizard__write_uid
126137
msgid "Last Updated by"
127138
msgstr "Última actualización por"
128139

129140
#. module: hr_holidays_public_regional
141+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee_regional_calendar__write_date
130142
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional__write_date
131143
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional_line__write_date
132144
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_public_regional_holidays_wizard__write_date
@@ -182,10 +194,18 @@ msgid "Public Regional Holidays"
182194
msgstr "Festivos Regionales"
183195

184196
#. module: hr_holidays_public_regional
197+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee_regional_calendar__calendar_id
185198
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional_line__calendar_id
186199
msgid "Regional Calendar"
187200
msgstr "Calendario Regional"
188201

202+
#. module: hr_holidays_public_regional
203+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee__regional_holiday_calendar_ids
204+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee_base__regional_holiday_calendar_ids
205+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee_public__regional_holiday_calendar_ids
206+
msgid "Regional Calendars"
207+
msgstr "Calendarios Regionales"
208+
189209
#. module: hr_holidays_public_regional
190210
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_holidays_public_regional__line_ids
191211
msgid "Regional Holidays Dates"
@@ -196,6 +216,11 @@ msgstr "Fechas Festivos Regionales"
196216
msgid "Resource Working Time"
197217
msgstr "Tiempo de trabajo de recursos"
198218

219+
#. module: hr_holidays_public_regional
220+
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_hr_employee_regional_calendar__start_date
221+
msgid "Start Date"
222+
msgstr "Fecha de Inicio"
223+
199224
#. module: hr_holidays_public_regional
200225
#: model:ir.model.fields,field_description:hr_holidays_public_regional.field_public_regional_holidays_wizard__template_ids
201226
msgid "Templates"

hr_holidays_public_regional/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from . import hr_employee
2+
from . import hr_employee_regional_calendar
23
from . import hr_holidays_public_regional
34
from . import hr_leave
45
from . import hr_leave_type

hr_holidays_public_regional/models/hr_employee.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,8 @@ def get_public_holidays_data(self, date_start, date_end):
4646
class HrEmployeeBase(models.AbstractModel):
4747
_inherit = "hr.employee.base"
4848

49-
regional_holiday_calendar_id = fields.Many2one(
50-
"hr.holidays.public.regional",
51-
string="Holiday Regional Calendar",
52-
ondelete="restrict",
53-
tracking=True,
49+
regional_holiday_calendar_ids = fields.One2many(
50+
"hr.employee.regional.calendar", "employee_id", string="Regional Calendars"
5451
)
5552
is_public_regional_holiday = fields.Boolean(
5653
string="Public Holiday Today", compute="_compute_is_public_regional_holiday"
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from odoo import fields, models
2+
3+
4+
class EmployeeRegionalCalendar(models.Model):
5+
_name = "hr.employee.regional.calendar"
6+
_description = "Employee Regional Calendar"
7+
_order = "start_date desc"
8+
9+
employee_id = fields.Many2one(
10+
"hr.employee", string="Employee", required=True, ondelete="cascade"
11+
)
12+
calendar_id = fields.Many2one(
13+
"hr.holidays.public.regional",
14+
string="Regional Calendar",
15+
required=True,
16+
ondelete="restrict",
17+
)
18+
start_date = fields.Date(required=True)
19+
end_date = fields.Date(required=True)

hr_holidays_public_regional/models/hr_holidays_public_regional.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,27 @@ def get_regional_holidays_list(
4444
year = year or datetime.date.today().year
4545
start_dt = datetime.date(year, 1, 1)
4646
end_dt = datetime.date(year, 12, 31)
47-
if employee and employee.regional_holiday_calendar_id:
48-
domain = [
49-
("date", ">=", start_dt),
50-
("date", "<=", end_dt),
51-
("calendar_id", "=", employee.regional_holiday_calendar_id.id),
52-
]
53-
return self.env["hr.holidays.public.regional.line"].search(domain)
47+
if employee:
48+
employee_regional_calendar_ids = self.env[
49+
"hr.employee.regional.calendar"
50+
].search(
51+
[
52+
("employee_id", "=", employee.id),
53+
]
54+
)
55+
employee_calendar_ids = (
56+
employee_regional_calendar_ids.mapped("calendar_id").ids
57+
if employee_regional_calendar_ids
58+
else []
59+
)
60+
61+
if employee_calendar_ids:
62+
domain = [
63+
("date", ">=", start_dt),
64+
("date", "<=", end_dt),
65+
("calendar_id", "in", employee_calendar_ids),
66+
]
67+
return self.env["hr.holidays.public.regional.line"].search(domain)
5468
return self.env["hr.holidays.public.regional.line"].browse()
5569

5670
@api.model

hr_holidays_public_regional/models/hr_leave.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,27 @@ def _get_domain_from_get_unusual_days_regional(self, date_from, date_to=None):
5959
if employee_id
6060
else self.env.user.employee_id
6161
)
62-
if not employee.regional_holiday_calendar_id:
63-
return [("id", "=", False)]
62+
employee_regional_calendar_ids = self.env[
63+
"hr.employee.regional.calendar"
64+
].search(
65+
[
66+
("employee_id", "=", employee.id),
67+
]
68+
)
69+
employee_calendar_ids = (
70+
employee_regional_calendar_ids.mapped("calendar_id").ids
71+
if employee_regional_calendar_ids
72+
else []
73+
)
6474
domain = [
6575
("date", ">=", date_from),
66-
("calendar_id", "=", employee.regional_holiday_calendar_id.id),
76+
("calendar_id", "in", employee_calendar_ids),
6777
]
6878
if date_to:
6979
domain.append(
7080
(
7181
"date",
72-
"<",
82+
"<=",
7383
date_to,
7484
)
7585
)

hr_holidays_public_regional/security/ir.model.access.csv

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ access_hr_holidays_public_regional_manager,access_hr_holidays_public_regional,mo
44
access_hr_holidays_public_regional_line_user,access_hr_holidays_public_regional_line,model_hr_holidays_public_regional_line,base.group_user,1,0,0,0
55
access_hr_holidays_public_regional_line_manager,access_hr_holidays_public_regional_line,model_hr_holidays_public_regional_line,hr_holidays.group_hr_holidays_manager,1,1,1,1
66
access_hr_holidays_public_regional_manager_wizard,access_hr_holidays_public_regional_wizard,model_public_regional_holidays_wizard,hr_holidays.group_hr_holidays_manager,1,1,1,1
7+
acess_hr_employee_regional_calendar_user,acess_hr_employee_regional_calendar_user,model_hr_employee_regional_calendar,base.group_user,1,0,0,0
8+
acess_hr_employee_regional_calendar_manager,acess_hr_employee_regional_calendar_manager,model_hr_employee_regional_calendar,hr_holidays.group_hr_holidays_manager,1,1,1,1

hr_holidays_public_regional/tests/test_holidays_calculation.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,33 @@ def setUpClass(cls):
8484
"exclude_public_holidays": False,
8585
}
8686
)
87+
8788
cls.employee_1 = cls.env["hr.employee"].create(
8889
{
8990
"name": "Employee 1",
9091
"resource_calendar_id": cls.calendar.id,
91-
"regional_holiday_calendar_id": cls.public_regional_holiday1.id,
92+
}
93+
)
94+
cls.env["hr.employee.regional.calendar"].create(
95+
{
96+
"employee_id": cls.employee_1.id,
97+
"calendar_id": cls.public_regional_holiday1.id,
98+
"start_date": "1946-01-01",
99+
"end_date": "1946-12-31",
92100
}
93101
)
94102
cls.employee_2 = cls.env["hr.employee"].create(
95103
{
96104
"name": "Employee 2",
97105
"resource_calendar_id": cls.calendar.id,
98-
"regional_holiday_calendar_id": cls.public_regional_holiday2.id,
106+
}
107+
)
108+
cls.env["hr.employee.regional.calendar"].create(
109+
{
110+
"employee_id": cls.employee_2.id,
111+
"calendar_id": cls.public_regional_holiday2.id,
112+
"start_date": "1946-01-01",
113+
"end_date": "1946-12-31",
99114
}
100115
)
101116

hr_holidays_public_regional/tests/test_holidays_public_regional.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,14 @@ def setUpClass(cls):
3838
{"name": "holiday x", "date": dt, "calendar_id": cls.holiday1.id}
3939
)
4040

41-
cls.employee = cls.employee_model.create(
42-
{"name": "Test Employee", "regional_holiday_calendar_id": holiday2.id}
41+
cls.employee = cls.employee_model.create({"name": "Test Employee"})
42+
cls.env["hr.employee.regional.calendar"].create(
43+
{
44+
"employee_id": cls.employee.id,
45+
"calendar_id": holiday2.id,
46+
"start_date": "1994-01-01",
47+
"end_date": "1994-12-31",
48+
}
4349
)
4450

4551

@@ -136,7 +142,14 @@ def assertPublicHolidayIsUnusualDay(self, expected):
136142
"calendar_id": holiday.id,
137143
}
138144
)
139-
self.employee.regional_holiday_calendar_id = holiday.id
145+
self.env["hr.employee.regional.calendar"].create(
146+
{
147+
"employee_id": self.employee.id,
148+
"calendar_id": holiday.id,
149+
"start_date": "2019-01-01",
150+
"end_date": "2019-12-31",
151+
}
152+
)
140153
self.assertEqual(
141154
self.leave_model.with_user(
142155
self.env.ref("base.user_demo").id
@@ -159,7 +172,14 @@ def test_public_holidays_context(self):
159172
"calendar_id": holiday.id,
160173
}
161174
)
162-
self.employee.regional_holiday_calendar_id = holiday.id
175+
self.env["hr.employee.regional.calendar"].create(
176+
{
177+
"employee_id": self.employee.id,
178+
"calendar_id": holiday.id,
179+
"start_date": "2019-01-01",
180+
"end_date": "2019-12-31",
181+
}
182+
)
163183
self.assertTrue(
164184
self.leave_model.with_user(
165185
self.env.ref("base.user_demo").id

0 commit comments

Comments
 (0)