diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..6ea32d8
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import models
+
+
+def _validate_existing_work_entry(env):
+ env['hr.work.entry'].search([])._check_if_error()
diff --git a/__manifest__.py b/__manifest__.py
new file mode 100644
index 0000000..f6b68aa
--- /dev/null
+++ b/__manifest__.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+
+{
+ 'name': 'Time Off in Payslips',
+ 'version': '1.0',
+ 'category': 'Human Resources/Payroll',
+ 'sequence': 95,
+ 'summary': 'Manage Time Off in Payslips',
+ 'description': """
+Manage Time Off in Payslips
+============================
+
+This application allows you to integrate time off in payslips.
+ """,
+ 'depends': ['hr_holidays', 'hr_work_entry_contract'],
+ 'data': [
+ 'data/hr_payroll_holidays_data.xml',
+ 'views/hr_leave_views.xml',
+ 'views/hr_leave_type_views.xml',
+ ],
+ 'demo': ['data/hr_payroll_holidays_demo.xml'],
+ 'installable': True,
+ 'auto_install': True,
+ 'post_init_hook': '_validate_existing_work_entry',
+ 'license': 'LGPL-3',
+}
diff --git a/data/hr_payroll_holidays_data.xml b/data/hr_payroll_holidays_data.xml
new file mode 100644
index 0000000..5487330
--- /dev/null
+++ b/data/hr_payroll_holidays_data.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/hr_payroll_holidays_demo.xml b/data/hr_payroll_holidays_demo.xml
new file mode 100644
index 0000000..5476818
--- /dev/null
+++ b/data/hr_payroll_holidays_demo.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/i18n/ar.po b/i18n/ar.po
new file mode 100644
index 0000000..9691d1b
--- /dev/null
+++ b/i18n/ar.po
@@ -0,0 +1,138 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Malaz Abuidris , 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Malaz Abuidris , 2023\n"
+"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ar\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"لا يمكن تعيين إجازة في عدة عقود مع جداول عمل مختلفة.\n"
+"\n"
+"يرجى إنشاء إجازة واحدة لكل عقد.\n"
+"\n"
+"الإجازة:\n"
+"%s\n"
+"\n"
+"العقود:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "الموظف العادي "
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"يؤدي تغيير العقد على هذا الموظف إلى تغيير جدول عمله في الفترة التي حصل فيها "
+"على إجازات بالفعل. يؤدي تغيير جدول العمل هذا إلى تغيير مدة هذه الإجازات بحيث"
+" لم يعد الموظف لديه التخصيص المطلوب لها. يرجى مراجعة هذه الإجازات و/أو "
+"التخصيصات قبل تغيير العقد. "
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "عقد الموظف"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "قيد عمل الموارد البشرية "
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "نوع قيد عمل الموارد البشرية "
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "كشوف المرتبات "
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "الحالة"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"يتم تعين الحالة إلى 'للإرسال'، عندما يتم إنشاء طلب إجازة.\n"
+"تكون الحالة 'للموافقة'، عندما تتم الموافقة على طلب الإجازة من قِبَل المستخدم.\n"
+"تكون الحالة 'تم الرفض'، عندما يتم رفض طلب الإجازة من قِبَل المدير.\n"
+"تكون الحالة 'تمت الموافقة'، عندما تتم الموافقة على طبي الإجازة من قِبَل المدير."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"لا يوجد موظف معين للإجازة. رجاءً تأكد من أنك قد قمت بتسجيل الدخول إلى الشركة"
+" الصحيحة. "
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "الإجازات "
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "نوع الإجازة "
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "نوع قيد العمل "
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "قيد العمل المستخدم في إيصال الدفع. "
diff --git a/i18n/bg.po b/i18n/bg.po
new file mode 100644
index 0000000..a8eeae7
--- /dev/null
+++ b/i18n/bg.po
@@ -0,0 +1,122 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Albena Mincheva , 2023
+# aleksandar ivanov, 2023
+# Георги Пехливанов , 2023
+# Ивайло Малинов , 2023
+# Martin Trigaux, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Martin Trigaux, 2023\n"
+"Language-Team: Bulgarian (https://app.transifex.com/odoo/teams/41243/bg/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: bg\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Основен служител"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Договор на служителя"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Ведомост"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Състояние"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Почивка"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/ca.po b/i18n/ca.po
new file mode 100644
index 0000000..378fb20
--- /dev/null
+++ b/i18n/ca.po
@@ -0,0 +1,138 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# jabiri7, 2023
+# Óscar Fonseca , 2023
+# Josep Anton Belchi, 2023
+# marcescu, 2023
+# Martin Trigaux, 2023
+# Ivan Espinola, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Ivan Espinola, 2023\n"
+"Language-Team: Catalan (https://app.transifex.com/odoo/teams/41243/ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"No es pot establir un permís entre diversos contractes amb diferents horaris de treball.\n"
+"\n"
+"Si us plau, creeu un descans per a cada contracte.\n"
+"\n"
+"Temps d'espera:\n"
+"%s\n"
+"\n"
+"Contractes:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Empleat bàsic"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Contracte de l'empleat"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "Prestació RH"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "Tipus d'entrada de treball de RH"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Nòmina"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Estat"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"L'estat s'estableix com a \"Per enviar\", quan es crea una sol·licitud de temps lliure.\n"
+"L'estat és \"Aprovar\", quan l'usuari confirma la sol·licitud de temps lliure.\n"
+"L'estat es \"Refused\", quan el gestor rebutja la sol·licitud de temps lliure.\n"
+"L'estat és \"aprovat\", quan el gestor aprova la sol·licitud de temps lliure."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"No hi ha cap empleat en el temps lliure. Assegureu-vos que heu iniciat la "
+"sessió a l'empresa correcta."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Absències"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Tipus d'absència"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Tipus d'entrada de treball"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Entrada de treball utilitzada en la nòmina."
diff --git a/i18n/cs.po b/i18n/cs.po
new file mode 100644
index 0000000..ac6d6a3
--- /dev/null
+++ b/i18n/cs.po
@@ -0,0 +1,123 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Jakub Smolka, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Jakub Smolka, 2023\n"
+"Language-Team: Czech (https://app.transifex.com/odoo/teams/41243/cs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: cs\n"
+"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Základní zaměstnanec"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Zaměstnanecká smlouva"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "HR pracovní záznam"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "HR typ pracovního záznamu"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Mzdy"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Stav"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Když je vytvořena žádost o volno, je stav nastaven na „Odeslat“.\n"
+"Stav je „Schválit“, když uživatel potvrdí žádost o volno.\n"
+"Stav je „Odmítnuto“, když manažer zamítne žádost o volno.\n"
+"Stav je „Schváleno“, když manažer schválí žádost o volno."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Volno"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Typ volna"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Typ pracovní položky"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/da.po b/i18n/da.po
new file mode 100644
index 0000000..b6f356b
--- /dev/null
+++ b/i18n/da.po
@@ -0,0 +1,126 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Mads Søndergaard, 2023
+# Ejner Sønniksen , 2023
+# Martin Trigaux, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Martin Trigaux, 2023\n"
+"Language-Team: Danish (https://app.transifex.com/odoo/teams/41243/da/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: da\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Standard ansat"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Ansættelseskontrakt"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "HR arbejdspostering"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "HR arbejdsposteringstype"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Løn"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Status"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Status er sat til 'At indsende', når en anmodning om fri oprettes.\n"
+"Status er 'At godkende', når en anmodning om fri godkendes af bruger.\n"
+"Status er 'Afvist', når en anmodning om fri afvises af leder.\n"
+"Status er 'Godkendt', når en anmodning om fri godkendes af leder."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"Der er ingen ansat angivet på fri perioden. Tjek venligst at du er logget "
+"ind i den korrekte virksomhed."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Fri"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Fri type"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Arbejdsposterings type"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/de.po b/i18n/de.po
new file mode 100644
index 0000000..34fcc65
--- /dev/null
+++ b/i18n/de.po
@@ -0,0 +1,140 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Larissa Manderfeld, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Larissa Manderfeld, 2023\n"
+"Language-Team: German (https://app.transifex.com/odoo/teams/41243/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"Ein Urlaub kann nicht für mehrere Verträge mit unterschiedlichen Arbeitsplänen festgelegt werden.\n"
+"\n"
+"Bitte erstellen Sie eine Abwesenheit für jeden Vertrag.\n"
+"\n"
+"Abwesenheit:\n"
+"%s\n"
+"\n"
+"Verträge:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Basismitarbeiter"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"Wenn Sie den Vertrag dieses Mitarbeiters ändern, ändert sich sein "
+"Arbeitszeitplan in einem Zeitraum, in dem er bereits Urlaub genommen hat. "
+"Durch die Änderung des Arbeitszeitplans wird die Dauer dieser Urlaube so "
+"geändert, dass der Mitarbeiter nicht mehr über den erforderlichen "
+"Urlaubsanspruch für diese Urlaube verfügt. Bitte überprüfen Sie diese "
+"Urlaube und/oder Urlaubansprüche, bevor Sie den Vertrag ändern."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Arbeitsvertrag"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "HR-Arbeitseintrag"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "HR-Arbeitseintragsart"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Personalabrechnung"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Status"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Der Status wird auf „Einzureichen“ gesetzt, wenn ein Abwesenheitsantrag erstellt wird.\n"
+"Der Status ist „Zu genehmigen“, wenn der Abwesenheitsantrag vom Benutzer bestätigt wird.\n"
+"Der Status lautet „Abgelehnt“, wenn der Abwesenheitsantrag vom Manager abgelehnt wird.\n"
+"Der Status lautet „Genehmigt“, wenn der Manager den Abwesenheitsantrag genehmigt hat."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"Es ist kein Mitarbeiter für die Abwesenheit festgelegt. Bitte vergewissern "
+"Sie sich, dass Sie im korrekten Unternehmen angemeldet sind."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Abwesenheit"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Abwesenheitsart"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Arbeitseintragsart"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Arbeitseintrag in Gehaltabrechnung verwendet."
diff --git a/i18n/es.po b/i18n/es.po
new file mode 100644
index 0000000..e276754
--- /dev/null
+++ b/i18n/es.po
@@ -0,0 +1,140 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Larissa Manderfeld, 2024
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Larissa Manderfeld, 2024\n"
+"Language-Team: Spanish (https://app.transifex.com/odoo/teams/41243/es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es\n"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"No se puede establecer una ausencia en varios contratos con diferentes horarios de trabajo.\n"
+"\n"
+"Cree una ausencia para cada contrato.\n"
+"\n"
+"Ausencia:\n"
+"%s\n"
+"\n"
+"Contratos:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Empleado básico"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"Si modifica el contrato de este empleado, su horario laboral cambiará "
+"durante un período en el que ya ha disfrutado de vacaciones. Al cambiar el "
+"horario laboral, se modificará la duración de estas vacaciones, por lo que "
+"el empleado ya no tendrá derecho a las vacaciones requeridas para estas "
+"vacaciones. Por favor, compruebe estas vacaciones y/o los derechos a "
+"vacaciones antes de modificar el contrato."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Contrato de empleado"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "Entrada de trabajo de RRHH"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "Tipo de entrada de trabajo de RRHH"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Nómina"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Estado"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"El estado se establece en `Para enviar', cuando se crea una solicitud de ausencia.\n"
+"El estado es 'Para Aprobar', cuando el usuario confirma la solicitud de ausencia.\n"
+"El estado es 'Rechazado', cuando el gerente rechaza la solicitud de ausencia.\n"
+"El estado es 'Aprobado', cuando el gerente aprueba la solicitud de ausencia."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"No hay ningún empleado establecido en el tiempo libre. Asegúrese de haber "
+"iniciado sesión en la empresa correcta."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Ausencias"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Tipo de ausencia"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Tipo de entrada de trabajo"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Entrada de trabajo utilizada en la nómina."
diff --git a/i18n/es_419.po b/i18n/es_419.po
new file mode 100644
index 0000000..190d144
--- /dev/null
+++ b/i18n/es_419.po
@@ -0,0 +1,140 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Iran Villalobos López, 2023
+# Patricia Gutiérrez Capetillo , 2024
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Patricia Gutiérrez Capetillo , 2024\n"
+"Language-Team: Spanish (Latin America) (https://app.transifex.com/odoo/teams/41243/es_419/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_419\n"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"No se puede establecer un permiso en varios contratos con diferentes horarios de trabajo.\n"
+"\n"
+"Cree un tiempo personal para cada contrato.\n"
+"\n"
+"Tiempo personal:\n"
+"%s\n"
+"\n"
+"Contratos:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Empleado básico"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"Cambiar el contrato de este empleado cambiará su horario de trabajo en un "
+"periodo en el que tomó días personales. Cambiar el horario de trabajo "
+"cambiará la duración de esos días personales de manera que el empleado ya no"
+" los tendrá asignados. Revise estos días y/o estas asignaciones antes de "
+"cambiar el contrato."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Contrato del empleado"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "Entrada de trabajo de RR. HH."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "Tipo de entrada de trabajo de RR. HH."
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Nómina"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Estado"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"El estado se establece como 'Para enviar' cuando se crea una solicitud de tiempo personal.\n"
+"El estado se establece como 'Por aprobar' cuando el usuario confirma la solicitud de tiempo personal.\n"
+"El estado se establece como 'Rechazado' cuando el gerente rechaza la solicitud de tiempo personal.\n"
+"El estado se establece como 'Aprobado' cuando el gerente aprueba la solicitud de tiempo personal."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"No hay ningún empleado en tiempo personal, asegúrese de haber iniciado "
+"sesión en la empresa correcta."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Tiempo personal"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Tipo de tiempo personal"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Tipo de entrada de trabajo"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Entrada de trabajo utilizada en el recibo de nómina."
diff --git a/i18n/et.po b/i18n/et.po
new file mode 100644
index 0000000..50ab11f
--- /dev/null
+++ b/i18n/et.po
@@ -0,0 +1,146 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Leaanika Randmets, 2023
+# Martin Aavastik , 2023
+# Piia Paurson , 2023
+# Algo Kärp , 2023
+# Aveli Kannel , 2023
+# Patrick-Jordan Kiudorv, 2023
+# Eneli Õigus , 2023
+# JanaAvalah, 2023
+# Anna, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Anna, 2023\n"
+"Language-Team: Estonian (https://app.transifex.com/odoo/teams/41243/et/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: et\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"Puudumisi ei saa määrata mitmele lepingule erineva tööjaga.\n"
+"\n"
+"Palun looge üks puudumine iga lepingu kohta..\n"
+"\n"
+"Puudumine:\n"
+"%s\n"
+"\n"
+"Lepingud:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Keskmine töötaja"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Tööleping"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "HR tööajad"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "HR tööaja sissekande tüübid"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Palgaarvestus"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Olek"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Kui puhkusetaotlus luuakse, määratakse olekuks „Esita”.\n"
+"Olek on \"Kinnitada\", kui kasutaja on puhkusetaoluse kinnitanud.\n"
+"Olek on \"Keeldutud\", kui juht lükkab puhkusetaotluse tagasi.\n"
+"Olek on „Kinnitatud”, kui juht on puhkusetaotluse heaks kiitnud."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"Töötajale ei ole puudumisi määratud. Veenduge, et oleksite sisse logitud "
+"õigesse ettevõttesse."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Puudumised"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Puudumise tüüp"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Töö sissekande tüüp"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Palgalehel kasutatud järgmist töö sissekande tüüpi."
diff --git a/i18n/fa.po b/i18n/fa.po
new file mode 100644
index 0000000..59a7116
--- /dev/null
+++ b/i18n/fa.po
@@ -0,0 +1,127 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# سید محمد آذربرا , 2023
+# Martin Trigaux, 2023
+# F Hariri , 2023
+# Hanna Kheradroosta, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Hanna Kheradroosta, 2023\n"
+"Language-Team: Persian (https://app.transifex.com/odoo/teams/41243/fa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fa\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "کارمند پایه"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "قرارداد کارمند"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "سند کار منابع انسانی"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "منابع انسانی کار نوع ورودی"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "حقوق و دستمزد"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "وضعیت"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"وضعیت روی 'برای ارسال' تنظیم میشود، زمانی که یک درخواست مرخصی ایجاد شود.\n"
+"وضعیت 'برای تصویب' است، هنگامی که درخواست مرخصی توسط کاربر تایید شود.\n"
+"وضعیت 'رد شده' است، زمانی که درخواست مرخصی توسط مدیر رد شود.\n"
+"وضعیت 'تصویبشده' است، زمانی که درخواست مرخصی توسط مدیر تایید شود."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"هیچ کارمندی در مرخصی تنظیم نشده است. لطفا مطمئن شوید که در شرکت صحیح وارد "
+"شده اید."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "مرخصی"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "نوع مرخصی"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "نوع سند کارکرد"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/fi.po b/i18n/fi.po
new file mode 100644
index 0000000..3d16c14
--- /dev/null
+++ b/i18n/fi.po
@@ -0,0 +1,137 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Veikko Väätäjä , 2023
+# Jarmo Kortetjärvi , 2023
+# Mikko Salmela , 2023
+# Martin Trigaux, 2023
+# Ossi Mantylahti , 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Ossi Mantylahti , 2023\n"
+"Language-Team: Finnish (https://app.transifex.com/odoo/teams/41243/fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"Lomaa ei voi asettaa useisiin sopimuksiin, joissa on eri työaikataulut.\n"
+"\n"
+"Luo yksi vapaapäivä kutakin sopimusta varten.\n"
+"\n"
+"Vapaa:\n"
+"%s\n"
+"\n"
+"Sopimukset:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Normaali työntekijä"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Työsopimus"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "HR-työkirjaus"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "HR-työn kirjaustyyppi"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Palkkahallinto"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Tila"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Tilaksi asetetaan \"Lähetettävä\", kun vapaata koskeva pyyntö luodaan.\n"
+"Tila on 'Hyväksyttäväksi', kun käyttäjä on vahvistanut vapaa-aikapyynnön.\n"
+"Tila on \"Hylätty\", kun esimies on hylännyt vapaapyynnön.\n"
+"Tila on \"Hyväksytty\", kun esimies on hyväksynyt vapaapyynnön."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"Vapaa-aikaa ei ole asetettu työntekijälle. Varmista, että olet kirjautunut "
+"oikeaan yritykseen."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Vapaa"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Vapaa-aikatyyppi"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Työkirjaustyyppi"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Palkkalaskelmassa käytetty työkirjaus."
diff --git a/i18n/fr.po b/i18n/fr.po
new file mode 100644
index 0000000..5863fa0
--- /dev/null
+++ b/i18n/fr.po
@@ -0,0 +1,139 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Jolien De Paepe, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Jolien De Paepe, 2023\n"
+"Language-Team: French (https://app.transifex.com/odoo/teams/41243/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fr\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"Un congé ne peut être défini sur plusieurs contrats à des régimes horaires différents.\n"
+"\n"
+"Veuillez créer un congé pour chaque contrat.\n"
+"\n"
+"Congé :\n"
+"%s\n"
+"\n"
+"Contrats:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Employé de base"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"La modification du contrat de cet employé modifie également son horaire de "
+"travail au cours d'une période où il a déjà pris des congés. La modification"
+" de cet horaire de travail modifie la durée de ces congés de telle sorte que"
+" l'employé ne dispose plus de l'allocation requise pour ces congés. Veuillez"
+" revoir ces congés et/ou allocations avant de modifier le contrat."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Contrat de l'employé"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "Prestation RH"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "Type de prestations RH"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Paie"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Statut"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Lorsqu'une demande de congé est créée, son statut est défini sur \"À soumettre\".\n"
+"Lorsque la demande est confirmée par l'utilisateur, son statut passe à \"À approuver\".\n"
+"Lorsque la demande est refusée par un manager, son statut passe à \"Refusée\".\n"
+"Lorsque la demande est approuvée par un manager, son statut passe à \"Approuvée\"."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"Aucun employé n'est défini sur le congé. Assurez vous que vous êtes connecté"
+" à la bonne entreprise."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Congés"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Type de congés"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Type de prestation"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Prestation utilisée dans la fiche de paie."
diff --git a/i18n/he.po b/i18n/he.po
new file mode 100644
index 0000000..c65456c
--- /dev/null
+++ b/i18n/he.po
@@ -0,0 +1,119 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Yihya Hugirat , 2023
+# ZVI BLONDER , 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: ZVI BLONDER , 2023\n"
+"Language-Team: Hebrew (https://app.transifex.com/odoo/teams/41243/he/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: he\n"
+"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "עובד רגיל"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "חוזה עובד"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "רשומת עבודה של משאבי אנוש"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "סוג רשומת עבודה של משאבי אנוש"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "שכר"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "סטטוס"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "מאשר חופשות"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "סוג חופשה"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "סוג רשומת עבודה"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/hr_work_entry_holidays.pot b/i18n/hr_work_entry_holidays.pot
new file mode 100644
index 0000000..9276c8f
--- /dev/null
+++ b/i18n/hr_work_entry_holidays.pot
@@ -0,0 +1,114 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 21:55+0000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/hu.po b/i18n/hu.po
new file mode 100644
index 0000000..4053e1b
--- /dev/null
+++ b/i18n/hu.po
@@ -0,0 +1,124 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# krnkris, 2023
+# Tamás Németh , 2023
+# gezza , 2024
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: gezza , 2024\n"
+"Language-Team: Hungarian (https://app.transifex.com/odoo/teams/41243/hu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: hu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Egyszerű munkavállaló"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Alkalmazotti szerződés"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Bérszámfejtés"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Státusz"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Az állapot „Benyújt”-ra van állítva, amikor szabadság kérelem létrehozva.\n"
+"A „Jóváhagyandó” állapot akkor jelentkezik, amikor a felhasználó megerősíti a szabadság kérelmet.\n"
+"Az „Elutasított” állapot akkor áll fenn, amikor a menedzser megtagadja az szabadság kérelmet.\n"
+"A „Jóváhagyott” állapot akkor áll fenn, amikor a menedzser jóváhagyja a szabadság kérelmet."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Szabadság"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Szabadság típus"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/id.po b/i18n/id.po
new file mode 100644
index 0000000..c2253b1
--- /dev/null
+++ b/i18n/id.po
@@ -0,0 +1,139 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Abe Manyo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Abe Manyo, 2023\n"
+"Language-Team: Indonesian (https://app.transifex.com/odoo/teams/41243/id/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: id\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"Cuti tidak dapat ditetapkan di lebih dari satu kontrak dengan jadwal kerja yang berbeda.\n"
+"\n"
+"Silakan buat satu cuti untuk setiap kontrak.\n"
+"\n"
+"Cuti:\n"
+"%s\n"
+"\n"
+"Kontrak:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Karyawan Dasar"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"Mengubah kontrak pada karyawan ini mengubah jadwal kerja mereka menjadi "
+"periode di mana mereka sudah mengambil cuti. Mengubah jadwal kerja ini "
+"mengubah durasi cuti tersebut sehingga karyawan tidak lagi memiliki alokasi "
+"yang diperlukan untuk cuti tersebut. Mohon tinjau cuti tersebut dan/atau "
+"alokasi sebelum mengubah kontrak."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Kontrak Karyawan"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "Entri Kerja HR"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "Tipe Entri Kerja HR"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Penggajian"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Status"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Status adalah 'Untuk Diserahkan', saat permintaan waktu cuti dibuat.\n"
+"Status adalah 'Untuk Disetujui', saat permintaan waktu cuti dikonfirmasi user.\n"
+"Status adalah 'Ditolak', saat permintaan waktu cuti ditolak oleh manager.\n"
+"Status adalah 'Disetujui', saat permintaan waktu cuti disetujui oleh manager."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"Tidak ada karyawan yang ditetapkan pada cuti. Mohon pastikan Anda masuk di "
+"perusahaan yang benar."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Cuti"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Tipe Cuti"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Tipe Entri Kerja"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Entri kerja digunakan di payslip."
diff --git a/i18n/it.po b/i18n/it.po
new file mode 100644
index 0000000..4238bff
--- /dev/null
+++ b/i18n/it.po
@@ -0,0 +1,139 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Marianna Ciofani, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Marianna Ciofani, 2023\n"
+"Language-Team: Italian (https://app.transifex.com/odoo/teams/41243/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: it\n"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"Un congedo non può essere impostato su più contratti con orari di lavoro diversi.\n"
+"\n"
+"Crea un congedo per ogni contratto.\n"
+"\n"
+"Congedo:\n"
+"%s\n"
+"\n"
+"Contratti:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Dipendente base"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"La modifica del contratto di questo dipendente cambia il suo orario di "
+"lavoro in un periodo in cui ha già usufruito di permessi. La modifica "
+"dell'orario di lavoro cambia la durata di questi permessi in modo tale che "
+"il dipendente non abbia più l'assegnazione richiesta. Si prega di rivedere "
+"questi permessi e/o assegnazioni prima di modificare il contratto."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Contratto dipendente"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "Voce lavorativa RU"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "Tipo di voce lavorativa RU"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Libro paga"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Stato"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Lo stato è impostato \"Da inviare\" quando viene creata una richiesta di ferie.\n"
+"Lo stato è \"Da approvare\" quando la richiesta viene confermata da un utente.\n"
+"Lo stato è \"Respinta\" quando la richiesta viene respinta dal supervisore.\n"
+"Lo stato è \"Approvata\" quando la richiesta viene approvata dal supervisore."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"Nessun dipendente impostato per le ferie. Controllare che l'accesso sia "
+"stato effettuato nell'azienda corretta."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Ferie"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Tipologia ferie"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Tipo di voce lavorativa"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Voce lavorativa utilizzata nella busta paga."
diff --git a/i18n/ja.po b/i18n/ja.po
new file mode 100644
index 0000000..40813e8
--- /dev/null
+++ b/i18n/ja.po
@@ -0,0 +1,130 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Junko Augias, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Junko Augias, 2023\n"
+"Language-Team: Japanese (https://app.transifex.com/odoo/teams/41243/ja/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ja\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"異なる勤務体系を持つ複数の契約にまたがって休暇を設定することはできません。\n"
+"\n"
+"各契約ごとに1つの休暇を作成して下さい。\n"
+"\n"
+"休暇:\n"
+"%s\n"
+"\n"
+"契約:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "基本社員"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"この従業員の契約を変更すると、すでに休暇を取得している期間の勤務予定が変更されます。この勤務予定を変更することで、これらの休暇の期間が変更され、従業員が必要な休暇の割当を受けられなくなります。契約を変更する前に、これらの休暇および/または割当を確認して下さい。"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "従業員契約"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "HR作業エントリ"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "HR作業エントリタイプ"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "給与計算"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "状態"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"休暇申請が作成されると、ステータスは'送信予定'に設定されます。ユーザが休暇申請を確認すると、ステータスは'承認中'になります。マネージャーが休暇申請を否認した場合、ステータスは'否認'です。休暇申請がマネージャーによって承認されると、ステータスは'承認済み'になります。"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr "休暇に従業員が設定されていません。正しい会社にログインしていることを確認して下さい。"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "休暇"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "休暇タイプ"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "作業エントリタイプ"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "給与明細に使用されている作業エントリ"
diff --git a/i18n/ko.po b/i18n/ko.po
new file mode 100644
index 0000000..ef53aa2
--- /dev/null
+++ b/i18n/ko.po
@@ -0,0 +1,134 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Daye Jeong, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Daye Jeong, 2023\n"
+"Language-Team: Korean (https://app.transifex.com/odoo/teams/41243/ko/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ko\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"계약 기간이 서로 다른 근무 일정에 걸쳐 휴가를 설정할 수 없습니다.\n"
+"\n"
+"각 계약 기간 별로 하나의 휴가를 신청해 주세요.\n"
+"\n"
+"휴가:\n"
+"%s\n"
+"\n"
+"계약 기간:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "기본 직원"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"이 직원의 계약을 변경하면 이미 휴가를 사용한 기간의 근무 일정이 변경됩니다. 이 근무 일정을 변경하면 해당 직원이 더 이상 필요한 "
+"휴가를 할당받지 못하는 방식으로 휴가 기간이 변경됩니다. 계약을 변경하기 전 이러한 휴가 및/또는 할당 내용을 검토하시기 바랍니다."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "근로 계약서"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "인사 근로 항목"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "인사 근로 항목 유형"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "급여"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "상태"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"휴가 신청서를 작성하면 상태는 '기안 작성'으로 설정됩니다.\n"
+"작성자가 확인 버튼을 누르면 신청서는 자동으로 제출되어 '결재 대기' 상태로 전환됩니다.\n"
+"관리자가 휴가 요청을 거부하면 '반려됨' 상태로 바뀌며,\n"
+"휴가 요청이 정상적으로 승인되면 '결재 완료' 표시가 뜹니다."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr "휴가를 설정한 직원이 없습니다. 근무 중인 회사에 올바르게 로그인했는지 확인해 주세요."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "휴가"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "휴가 유형"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "작업 항목 유형"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "급여 명세서에 사용되는 근로 항목."
diff --git a/i18n/lt.po b/i18n/lt.po
new file mode 100644
index 0000000..c52f291
--- /dev/null
+++ b/i18n/lt.po
@@ -0,0 +1,121 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# digitouch UAB , 2023
+# Linas Versada , 2023
+# Audrius Palenskis , 2023
+# Donatas , 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Donatas , 2023\n"
+"Language-Team: Lithuanian (https://app.transifex.com/odoo/teams/41243/lt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: lt\n"
+"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Darbuotojo sutartis"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "HR darbo įrašo tipas"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Algalapis"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Būsena"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Neatvykimai"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Neatvykimo rūšis"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Darbo įrašo tipas"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/lv.po b/i18n/lv.po
new file mode 100644
index 0000000..f033491
--- /dev/null
+++ b/i18n/lv.po
@@ -0,0 +1,120 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Armīns Jeltajevs , 2023
+# ievaputnina , 2023
+# Martin Trigaux, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Martin Trigaux, 2023\n"
+"Language-Team: Latvian (https://app.transifex.com/odoo/teams/41243/lv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: lv\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Pamata darbinieks"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Darbinieka Darba Līgums"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Algu uzskaitījums"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Statuss"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Atvaļinājumi"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/nl.po b/i18n/nl.po
new file mode 100644
index 0000000..13a239b
--- /dev/null
+++ b/i18n/nl.po
@@ -0,0 +1,139 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Jolien De Paepe, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Jolien De Paepe, 2023\n"
+"Language-Team: Dutch (https://app.transifex.com/odoo/teams/41243/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"Een verlof kan niet worden verdeeld over meerdere contracten met verschillende werkroosters.\n"
+"\n"
+"Maak één verlof aan voor elk contract.\n"
+"\n"
+"Verlof:\n"
+"%s\n"
+"\n"
+"Contracten:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Basis werknemer"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"Als het contrat van deze werknemer wordt gewijzigd, veranderd zijn "
+"werkschema in een periode waarin hij al verlof heeft genomen. Door dit "
+"werkschema te wijzigen, verandert de duur van dit verlof zodanig dat de "
+"werknemer niet langer de vereiste toewijzing hiervoor heeft. Controleer dit "
+"verlof en/of deze toewijzingen voordat je het contract wijzigt."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Arbeidsovereenkomst"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "HR-werkboeking"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "HR werkboekingstype"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Loonadministratie"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Status"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"De status is ingesteld op 'Indienen', wanneer een verlofaanvraag wordt aangemaakt.\n"
+"De status is 'Goed te keuren', wanneer een verlofaanvraag wordt bevestigd door de gebruiker. \n"
+"De status wordt 'Afgewezen', wanneer een verlofaanvraag wordt afgewezen door de manager. \n"
+"De status wordt 'Goedgekeurd', wanneer een verlofaanvraag wordt goedgekeurd door de manager."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"Er is geen werknemer op de verlofaanvraag ingesteld. Zorg ervoor dat je bij "
+"het juiste bedrijf bent ingelogd."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Verlof"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Soort verlof"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Werkboekingstype"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Werkboeking gebruikt op de loonstrook"
diff --git a/i18n/pl.po b/i18n/pl.po
new file mode 100644
index 0000000..e367cd9
--- /dev/null
+++ b/i18n/pl.po
@@ -0,0 +1,132 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Polish (https://app.transifex.com/odoo/teams/41243/pl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pl\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"Urlop nie może być ustawiony dla wielu umów z różnymi harmonogramami pracy.\n"
+"\n"
+"Proszę utworzyć jeden czas wolny dla każdej umowy.\n"
+"\n"
+"Czas wolny:\n"
+"%s\n"
+"Umowy:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Podstawowy pracownik"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Umowa pracownika"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "Wpis pracy HR"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "Typ zapisu pracy"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Wynagrodzenie"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Status"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Status jest ustawiony na 'Do przesłania', gdy tworzony jest wniosek o wolne.\n"
+"Status 'Do zatwierdzenia', gdy wniosek o wolne jest potwierdzany przez użytkownika.\n"
+"Status 'Odrzucony', gdy wniosek o wolne jest odrzucony przez kierownika.\n"
+"Status 'Zatwierdzony', gdy wniosek o wolne jest zatwierdzony przez kierownika."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"Nie ma ustawionego pracownika na czas wolny. Upewnij się, że jesteś "
+"zalogowany w odpowiedniej firmie."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Dni wolne"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Typ dni wolnych"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Typ zapisu pracy"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Zapis pracy używany w pasku wypłaty."
diff --git a/i18n/pt.po b/i18n/pt.po
new file mode 100644
index 0000000..6172870
--- /dev/null
+++ b/i18n/pt.po
@@ -0,0 +1,118 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Portuguese (https://app.transifex.com/odoo/teams/41243/pt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pt\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Contrato do Funcionário"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Folha de Salários"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Estado"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Ausência"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Tipo de Registo de Horas"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/pt_BR.po b/i18n/pt_BR.po
new file mode 100644
index 0000000..ecdb6de
--- /dev/null
+++ b/i18n/pt_BR.po
@@ -0,0 +1,138 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Layna Nascimento, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Layna Nascimento, 2023\n"
+"Language-Team: Portuguese (Brazil) (https://app.transifex.com/odoo/teams/41243/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"Não é possível definir uma licença entre vários contratos com diferentes horários de trabalho.\n"
+"Crie uma folga para cada contrato.\n"
+"\n"
+"Folga:\n"
+"%s\n"
+"\n"
+"Contratos:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Funcionário básico"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"A modificação do contrato desse funcionário altera seu plano de horário de "
+"trabalho em um período em que ele já tirou férias. A alteração desse "
+"cronograma de trabalho altera a duração dessas licenças, de modo que o "
+"funcionário não tem mais a alocação necessária para elas. Revise essas "
+"licenças e/ou alocações antes de alterar o contrato."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Contrato do funcionário"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "RH – Registro de trabalho"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "RH – Tipo de registro de trabalho"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Folha de pagamento"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Status"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"O status é definido como 'A enviar' quando uma solicitação de folga é criada.\n"
+"O status é 'A aprovar', quando a folga é confirmada pelo usuário.\n"
+"O status é 'Recusado', quando a solicitação é recusada pelo gerente.\n"
+"O status é 'Aprovado', quando a solicitação é aprovada pelo gerente."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"Não há funcionário definido na folga. Certifique-se de ter feito login na "
+"empresa certa."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Folga"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Tipo de folga"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Tipo de registro de trabalho"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Registro de trabalho usado no holerite."
diff --git a/i18n/ru.po b/i18n/ru.po
new file mode 100644
index 0000000..9904673
--- /dev/null
+++ b/i18n/ru.po
@@ -0,0 +1,138 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Martin Trigaux, 2023
+# Wil Odoo, 2024
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2024\n"
+"Language-Team: Russian (https://app.transifex.com/odoo/teams/41243/ru/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ru\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"Отпуск не может быть установлен по нескольким контрактам с разными графиками работы.\n"
+"\n"
+"Пожалуйста, создайте один отгул для каждого контракта.\n"
+"\n"
+"Отгул:\n"
+"%s\n"
+"\n"
+"Контракты:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Основной сотрудник"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"Изменение договора с этим сотрудником изменяет его график работы в период, "
+"когда он уже брал отпуск. Изменение графика работы изменяет "
+"продолжительность этих отпусков таким образом, что сотрудник больше не имеет"
+" необходимых ассигнований для них. Пожалуйста, проверьте эти отпуска и/или "
+"ассигнования, прежде чем изменять контракт."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Договор с Сотрудником"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "HR Ввод данных о работе"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "HR Тип Ввода данных о работе"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Оплаты"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Статус"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Статус установлен на ‘Отправить’, когда создается запрос на отпуск.\n"
+"Статус ‘Подтвердить’, когда запрос на отпуск подтверждается пользователем.\n"
+"Статус ‘Отказаться’, когда запрос на отпуск отклонен менеджером.\n"
+"Статус ‘Утвержден’, когда запрос на отпуск одобрен менеджером."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"В отгулах не указан сотрудник. Убедитесь, что вы вошли в нужную компанию."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Отпуск"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Тип отсутсвия"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Тип записи на работу"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Запись о работе, используемая в платежной ведомости."
diff --git a/i18n/sk.po b/i18n/sk.po
new file mode 100644
index 0000000..4a5fb5c
--- /dev/null
+++ b/i18n/sk.po
@@ -0,0 +1,122 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Slovak (https://app.transifex.com/odoo/teams/41243/sk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sk\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Základný zamestnanec"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Zamestnanecká zmluva"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "Vstup do HR"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "HR typ pracovného záznamu"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Výplatná listina"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Stav"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Keď sa vytvorí žiadosť o voľno, stav je nastavený na „Odoslať“.\n"
+"Stav je „Schváliť“, keď používateľ potvrdí žiadosť o voľné dni.\n"
+"Stav je „Odmietnutý“, keď manažér odmietne žiadosť o voľné dni.\n"
+"Stav je Schválené, keď manažér schváli žiadosť o voľné dni."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Voľné dni"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Typ voľných dní"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "typ pracovného záznamu"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/sl.po b/i18n/sl.po
new file mode 100644
index 0000000..cd149c6
--- /dev/null
+++ b/i18n/sl.po
@@ -0,0 +1,119 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Jasmina Macur , 2023
+# Matjaz Mozetic , 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Matjaz Mozetic , 2023\n"
+"Language-Team: Slovenian (https://app.transifex.com/odoo/teams/41243/sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sl\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Kadrovska pogodba"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Plačni seznam"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Status"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Odsotnost"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Tip dopusta"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/sr.po b/i18n/sr.po
new file mode 100644
index 0000000..63b1f02
--- /dev/null
+++ b/i18n/sr.po
@@ -0,0 +1,142 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Martin Trigaux, 2023
+# Dragan Vukosavljevic , 2023
+# Milan Bojovic , 2023
+# Nemanja Skadric, 2024
+# コフスタジオ, 2024
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: コフスタジオ, 2024\n"
+"Language-Team: Serbian (https://app.transifex.com/odoo/teams/41243/sr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sr\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"Jedno odsustvo ne može biti postavljeno preko više ugovora sa različitim radnim rasporedima.\n"
+"\n"
+"Molimo vas da kreirate jedno odsustvo za svaki ugovor.\n"
+"\n"
+"Odsustvo:\n"
+"%s\n"
+"\n"
+"Ugovori:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Osnovni zaposleni"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"Menjanje ugovora o ovom zaposlenom menja njihov radni raspored u periodu "
+"kada su već uzeli slobodne dane. Menjanje ovog radnog rasporeda menja "
+"trajanje ovih slobodnih dana na način da zaposleni više nema potrebnu "
+"alokaciju za njih. Molimo vas da pregledate ove slobodne dane i/ili "
+"alokacije pre nego što promenite ugovor."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Ugovor Zapošljenog"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "HR Radni unos"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "Vrsta unosa rada HR"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Platni Spisak"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Status"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Status je postavljen na 'To Submit', kada je zahtev za slobodne dane kreiran.\n"
+"Status je 'To Approve', kada je zahtev za slobodne dane potvrđen od strane korisnika.\n"
+"Status je 'Refused', kada je zahtev za slobodne dane odbijen od strane menadžera.\n"
+"Status je 'Approved', kada je zahtev za slobodne dane odobren od strane menadžera."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"Nema zaposlenog postavljenog na slobodne dane. Molimo vas da se uverite da "
+"ste prijavljeni u ispravnu kompaniju."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Odsustvo"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Tip Pauze"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Vrsta unosa posla"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Radni unos koji se koristi u platnom listu."
diff --git a/i18n/sv.po b/i18n/sv.po
new file mode 100644
index 0000000..e7dc160
--- /dev/null
+++ b/i18n/sv.po
@@ -0,0 +1,121 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Chrille Hedberg , 2023
+# Simon S, 2023
+# Mikael Åkerberg , 2023
+# Martin Trigaux, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Martin Trigaux, 2023\n"
+"Language-Team: Swedish (https://app.transifex.com/odoo/teams/41243/sv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sv\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Grundläggande anställd"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Anställningskontrakt"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Löner"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Status"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Ledighet"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Frånvarotyp"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/th.po b/i18n/th.po
new file mode 100644
index 0000000..70108e9
--- /dev/null
+++ b/i18n/th.po
@@ -0,0 +1,138 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Rasareeyar Lappiam, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Rasareeyar Lappiam, 2023\n"
+"Language-Team: Thai (https://app.transifex.com/odoo/teams/41243/th/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: th\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"ไม่สามารถกำหนดวันลาให้กับสัญญาหลายฉบับที่มีตารางการทำงานต่างกันได้\n"
+"\n"
+"โปรดสร้างวันหยุดหนึ่งครั้งสำหรับแต่ละสัญญา\n"
+"\n"
+"ระบบการลา:\n"
+"%s\n"
+"\n"
+"ข้อมูลติดต่อ:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "พนักงานทั่วไป"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"การเปลี่ยนสัญญากับพนักงานรายนี้จะเปลี่ยนตารางการทำงานในช่วงเวลาที่พวกเขาได้ทำการลาไปแล้ว"
+" "
+"การเปลี่ยนตารางการทำงานนี้จะเปลี่ยนระยะเวลาของการลาในลักษณะที่พนักงานไม่ได้รับการจัดสรรที่จำเป็นสำหรับพวกเขาอีกต่อไป"
+" โปรดตรวจสอบการลาและ/หรือการจัดสรรเหล่านี้ก่อนที่จะเปลี่ยนแปลงสัญญา"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "สัญญาของพนักงาน"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "HR การเข้างาน"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "HR ประเภทการเข้างาน"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "เงินเดือน"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "สถานะ"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"สถานะถูกตั้งค่าเป็น 'เพื่อส่ง' เมื่อมีการสร้างคำขอลาหยุด\n"
+"สถานะคือ 'เพื่ออนุมัติ' เมื่อผู้ใช้ยืนยันคำขอลาหยุด\n"
+"สถานะคือ 'ปฏิเสธ' เมื่อผู้จัดการปฏิเสธคำขอลาหยุด\n"
+"สถานะคือ 'อนุมัติ' เมื่อคำขอลาหยุดได้รับการอนุมัติโดยผู้จัดการ"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"ไม่มีพนักงานตั้งเวลาการลา "
+"โปรดตรวจสอบให้แน่ใจว่าคุณได้เข้าสู่ระบบบริษัทที่ถูกต้อง"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "การลา"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "ประเภทการลา"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "ประเภทการเข้างาน"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "รายการงานที่ใช้ในสลิปเงินเดือน"
diff --git a/i18n/tr.po b/i18n/tr.po
new file mode 100644
index 0000000..a891104
--- /dev/null
+++ b/i18n/tr.po
@@ -0,0 +1,135 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Ediz Duman , 2023
+# Murat Kaplan , 2023
+# Ertuğrul Güreş , 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Ertuğrul Güreş , 2023\n"
+"Language-Team: Turkish (https://app.transifex.com/odoo/teams/41243/tr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: tr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"İzin, farklı çalışma programlarına sahip birden fazla sözleşmede belirlenemez.\n"
+"\n"
+"Lütfen her sözleşme için bir kez izin oluşturun.\n"
+"\n"
+"İzin süresi:\n"
+"%s\n"
+"\n"
+"Sözleşme:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Temel Personel"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Personel Sözleşmesi"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "İK Puantaj Kaydı"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "İK Puantaj Kaydı Türü"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Bordro"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Durumu"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"İzin talebi oluşturulduğunda durum 'Gönderilecek' olarak ayarlanır.\n"
+"İzin talebi kullanıcı tarafından onaylandığında durum 'Onaylanacak' olur.\n"
+"İzin talebi yönetici tarafından reddedildiğinde durum 'Reddedildi' olur.\n"
+"İzin talebi yönetici tarafından onaylandığında durum 'Onaylandı' olur."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"İzin için belirlenmiş bir çalışan yoktur. Lütfen doğru şirkette oturum "
+"açtığınızdan emin olun."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "İzin"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "İzin Türü"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Puantaj Kaydı Türü"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Maaş bordrosunda kullanılan puantaj kaydı."
diff --git a/i18n/uk.po b/i18n/uk.po
new file mode 100644
index 0000000..9afe565
--- /dev/null
+++ b/i18n/uk.po
@@ -0,0 +1,139 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Alina Lisnenko , 2024
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Alina Lisnenko , 2024\n"
+"Language-Team: Ukrainian (https://app.transifex.com/odoo/teams/41243/uk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: uk\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"Відпустка не може бути встановлена для кількох контрактів із різними графіками роботи.\n"
+"\n"
+"Будь ласка, створіть одну відпустку для кожного контракту.\n"
+"\n"
+"Відпустка:\n"
+"%s\n"
+"\n"
+"Контракти:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Звичайний користувач"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"Зміна контракту з цим працівником змінює його робочий графік у період, коли "
+"він уже пішов у відпустку. Зміна цього робочого графіка змінює тривалість "
+"цих відпусток таким чином, що працівник більше не має необхідного розподілу "
+"для них. Будь ласка, перегляньте ці відпустки та/або розподіл перед зміною "
+"контракту."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Трудовий контракт"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "Робочий запис відділу кадрів"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "Тип робочого запису відділу кадрів"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Зарплата"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Статус"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"Статус встановлено на 'Відправити', коли створюється запит на відпустку.\n"
+"Статус встановлено на 'Затвердити', коли запит на відпустку підтверджено користувачем.\n"
+"Статус встановлено на 'Відмовлено', коли менеджер відхиляє запит на відпустку.\n"
+"Статус встановлено на 'Затверджено', коли запит на відпустку підтверджено менеджером."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"На відпустці не вказано співробітника. Будь ласка, переконайтесь, що ви "
+"ввійшли у правильну компанію."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Відпустка"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Тип відпустки"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Тип робочого запису"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "Робочий запис використовується у розрахунковому листі."
diff --git a/i18n/vi.po b/i18n/vi.po
new file mode 100644
index 0000000..41e5e1d
--- /dev/null
+++ b/i18n/vi.po
@@ -0,0 +1,124 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Wil Odoo, 2023\n"
+"Language-Team: Vietnamese (https://app.transifex.com/odoo/teams/41243/vi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: vi\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "Người dùng cơ bản"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "Hợp đồng nhân viên"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "HR Work Entry"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "Loại công việc HR"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "Bảng lương"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "Trạng thái"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr ""
+"Không có nhân viên được đặt trong nghỉ phép. Bảo đảm là bạn đã đăng nhập vào"
+" đúng công ty."
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "Nghỉ phép"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "Loại Nghỉ phép"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "Work Entry Type"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr ""
diff --git a/i18n/zh_CN.po b/i18n/zh_CN.po
new file mode 100644
index 0000000..4ba5610
--- /dev/null
+++ b/i18n/zh_CN.po
@@ -0,0 +1,132 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# 山西清水欧度(QQ:54773801) <54773801@qq.com>, 2023
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: 山西清水欧度(QQ:54773801) <54773801@qq.com>, 2023\n"
+"Language-Team: Chinese (China) (https://app.transifex.com/odoo/teams/41243/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"不能在具有不同工作时间表的多个合同中设置休假。\n"
+"\n"
+"请为每份合同创建一个假期。\n"
+"\n"
+"休假时间:\n"
+"%s\n"
+"合同:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "基本雇员"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"更改该员工的合同会改变其已休假期间的工作安排。更改工作时间表会改变这些假期的持续时间,从而使该员工不再拥有所需的假期分配。请在更改合同前审查这些假期和/或分配。"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "员工合同"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "人力资源工作"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "人力资源工作类型"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "工资册"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "状态"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"创建休假请求时,状态设置为“提交”。\n"
+"当用户确认休假请求时,状态为“待批准”\n"
+"当经理拒绝请假停止请求时,状态为“拒绝”\n"
+"当经理批准休假时,状态为“已批准”。"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr "休假时间上没有员工设置。请确保您登录在正确的公司。"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "休假"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "休假类型"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "工作条目类型"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "工资单中使用的工作条目。"
diff --git a/i18n/zh_TW.po b/i18n/zh_TW.po
new file mode 100644
index 0000000..c347d61
--- /dev/null
+++ b/i18n/zh_TW.po
@@ -0,0 +1,132 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * hr_work_entry_holidays
+#
+# Translators:
+# Wil Odoo, 2023
+# Tony Ng, 2024
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-10-26 21:55+0000\n"
+"PO-Revision-Date: 2023-10-26 23:09+0000\n"
+"Last-Translator: Tony Ng, 2024\n"
+"Language-Team: Chinese (Taiwan) (https://app.transifex.com/odoo/teams/41243/zh_TW/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: zh_TW\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"A leave cannot be set across multiple contracts with different working schedules.\n"
+"\n"
+"Please create one time off for each contract.\n"
+"\n"
+"Time off:\n"
+"%s\n"
+"\n"
+"Contracts:\n"
+"%s"
+msgstr ""
+"不能在具有不同工作時間表的多個合同中設置休假。\n"
+"\n"
+"請為每份合同創建一個假期。\n"
+"\n"
+"休假時間:\n"
+"%s\n"
+"合約:\n"
+"%s"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_employee_base
+msgid "Basic Employee"
+msgstr "一般員工"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_contract.py:0
+#, python-format
+msgid ""
+"Changing the contract on this employee changes their working schedule in a "
+"period they already took leaves. Changing this working schedule changes the "
+"duration of these leaves in such a way the employee no longer has the "
+"required allocation for them. Please review these leaves and/or allocations "
+"before changing the contract."
+msgstr ""
+"更改該員工的合同會改變其已休假期間的工作安排。更改工作時間表會改變這些假期的持續時間,從而使該員工不再擁有所需的假期分配。請在更改合同前審查這些假期和/或分配。"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_contract
+msgid "Employee Contract"
+msgstr "員工契約"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry
+msgid "HR Work Entry"
+msgstr "HR工時紀錄"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_work_entry_type
+msgid "HR Work Entry Type"
+msgstr "HR工時紀錄類型"
+
+#. module: hr_work_entry_holidays
+#: model_terms:ir.ui.view,arch_db:hr_work_entry_holidays.work_entry_type_leave_form_inherit
+msgid "Payroll"
+msgstr "薪酬管理"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid "Status"
+msgstr "狀態"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry__leave_state
+msgid ""
+"The status is set to 'To Submit', when a time off request is created.\n"
+"The status is 'To Approve', when time off request is confirmed by user.\n"
+"The status is 'Refused', when time off request is refused by manager.\n"
+"The status is 'Approved', when time off request is approved by manager."
+msgstr ""
+"建立休假請求時,狀態設定為「待提交」。\n"
+"當使用者確認休假請求時,狀態為「待批准」\n"
+"當經理退回請假停止請求時,狀態為「已退回」\n"
+"當經理批准休假時,狀態為「已批准」。"
+
+#. module: hr_work_entry_holidays
+#. odoo-python
+#: code:addons/hr_work_entry_holidays/models/hr_leave.py:0
+#, python-format
+msgid ""
+"There is no employee set on the time off. Please make sure you're logged in "
+"the correct company."
+msgstr "沒有員工安排休假。請確保您登入了正確的公司。"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry__leave_id
+msgid "Time Off"
+msgstr "休假"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model,name:hr_work_entry_holidays.model_hr_leave_type
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Time Off Type"
+msgstr "休假類型"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,field_description:hr_work_entry_holidays.field_hr_leave_type__work_entry_type_id
+msgid "Work Entry Type"
+msgstr "工時紀錄類型"
+
+#. module: hr_work_entry_holidays
+#: model:ir.model.fields,help:hr_work_entry_holidays.field_hr_work_entry_type__leave_type_ids
+msgid "Work entry used in the payslip."
+msgstr "工資單中使用的工作條目。"
diff --git a/models/__init__.py b/models/__init__.py
new file mode 100644
index 0000000..1c4d36a
--- /dev/null
+++ b/models/__init__.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+
+from . import hr_contract
+from . import hr_employee_base
+from . import hr_leave
+from . import hr_work_entry
diff --git a/models/hr_contract.py b/models/hr_contract.py
new file mode 100644
index 0000000..d3e2b6c
--- /dev/null
+++ b/models/hr_contract.py
@@ -0,0 +1,157 @@
+# -*- coding:utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import pytz
+
+from datetime import date
+from odoo import api, models, _
+from odoo.exceptions import ValidationError
+from odoo.osv.expression import OR
+
+
+class HrContract(models.Model):
+ _inherit = 'hr.contract'
+ _description = 'Employee Contract'
+
+ @api.constrains('date_start', 'date_end', 'state')
+ def _check_contracts(self):
+ self._get_leaves()._check_contracts()
+
+ def _get_leaves(self):
+ return self.env['hr.leave'].search([
+ ('state', '!=', 'refuse'),
+ ('employee_id', 'in', self.mapped('employee_id.id')),
+ ('date_from', '<=', max([end or date.max for end in self.mapped('date_end')])),
+ ('date_to', '>=', min(self.mapped('date_start'))),
+ ])
+
+ # override to add work_entry_type from leave
+ def _get_leave_work_entry_type(self, leave):
+ if leave.holiday_id:
+ return leave.holiday_id.holiday_status_id.work_entry_type_id
+ else:
+ return leave.work_entry_type_id
+
+ def _get_more_vals_leave_interval(self, interval, leaves):
+ result = super()._get_more_vals_leave_interval(interval, leaves)
+ for leave in leaves:
+ if interval[0] >= leave[0] and interval[1] <= leave[1]:
+ result.append(('leave_id', leave[2].holiday_id.id))
+ return result
+
+ def _get_interval_leave_work_entry_type(self, interval, leaves, bypassing_codes):
+ # returns the work entry time related to the leave that
+ # includes the whole interval.
+ # Overriden in hr_work_entry_contract_holiday to select the
+ # global time off first (eg: Public Holiday > Home Working)
+ self.ensure_one()
+ if 'work_entry_type_id' in interval[2] and interval[2].work_entry_type_id.code in bypassing_codes:
+ return interval[2].work_entry_type_id
+
+ interval_start = interval[0].astimezone(pytz.utc).replace(tzinfo=None)
+ interval_stop = interval[1].astimezone(pytz.utc).replace(tzinfo=None)
+ including_rcleaves = [l[2] for l in leaves if l[2] and interval_start >= l[2].date_from and interval_stop <= l[2].date_to]
+ including_global_rcleaves = [l for l in including_rcleaves if not l.holiday_id]
+ including_holiday_rcleaves = [l for l in including_rcleaves if l.holiday_id]
+ rc_leave = False
+
+ # Example: In CP200: Long term sick > Public Holidays (which is global)
+ if bypassing_codes:
+ bypassing_rc_leave = [l for l in including_holiday_rcleaves if l.holiday_id.holiday_status_id.work_entry_type_id.code in bypassing_codes]
+ else:
+ bypassing_rc_leave = []
+
+ if bypassing_rc_leave:
+ rc_leave = bypassing_rc_leave[0]
+ elif including_global_rcleaves:
+ rc_leave = including_global_rcleaves[0]
+ elif including_holiday_rcleaves:
+ rc_leave = including_holiday_rcleaves[0]
+ if rc_leave:
+ return self._get_leave_work_entry_type_dates(rc_leave, interval_start, interval_stop, self.employee_id)
+ return self.env.ref('hr_work_entry_contract.work_entry_type_leave')
+
+ def _get_sub_leave_domain(self):
+ domain = super()._get_sub_leave_domain()
+ return OR([
+ domain,
+ [('holiday_id.employee_id', 'in', self.employee_id.ids)] # see https://github.com/odoo/enterprise/pull/15091
+ ])
+
+ def write(self, vals):
+ # Special case when setting a contract as running:
+ # If there is already a validated time off over another contract
+ # with a different schedule, split the time off, before the
+ # _check_contracts raises an issue.
+ # If there are existing leaves that are spanned by this new
+ # contract, update their resource calendar to the current one.
+ if not (vals.get("state") == 'open' or vals.get('kanban_state') == 'done'):
+ return super().write(vals)
+
+ specific_contracts = self.env['hr.contract']
+ all_new_leave_origin = []
+ all_new_leave_vals = []
+ leaves_state = {}
+ # In case a validation error is thrown due to holiday creation with the new resource calendar (which can
+ # increase their duration), we catch this error to display a more meaningful error message.
+ try:
+ for contract in self:
+ if vals.get('state') != 'open' and contract.state != 'draft':
+ # In case the current contract is not in the draft state, the kanban_state transition does not
+ # cause any leave changes.
+ continue
+ leaves = contract._get_leaves()
+ for leave in leaves:
+ # Get all overlapping contracts but exclude draft contracts that are not included in this transaction.
+ overlapping_contracts = leave._get_overlapping_contracts(contract_states=[
+ ('state', '!=', 'cancel'),
+ '|', '|', ('id', 'in', self.ids),
+ ('state', '!=', 'draft'),
+ ('kanban_state', '=', 'done'),
+ ])
+ if len(overlapping_contracts.resource_calendar_id) <= 1:
+ if leave.resource_calendar_id != overlapping_contracts.resource_calendar_id:
+ leave.resource_calendar_id = overlapping_contracts.resource_calendar_id
+ continue
+ if leave.id not in leaves_state:
+ leaves_state[leave.id] = leave.state
+ if leave.state != 'refuse':
+ leave.action_refuse()
+ super(HrContract, contract).write(vals)
+ specific_contracts += contract
+ for overlapping_contract in overlapping_contracts:
+ new_request_date_from = max(leave.request_date_from, overlapping_contract.date_start)
+ new_request_date_to = min(leave.request_date_to, overlapping_contract.date_end or date.max)
+ new_leave_vals = leave.copy_data({
+ 'request_date_from': new_request_date_from,
+ 'request_date_to': new_request_date_to,
+ 'state': leaves_state[leave.id],
+ })[0]
+ new_leave = self.env['hr.leave'].new(new_leave_vals)
+ new_leave._compute_date_from_to()
+ new_leave._compute_duration()
+ # Could happen for part-time contract, that time off is not necessary
+ # anymore.
+ if new_leave.date_from < new_leave.date_to:
+ all_new_leave_origin.append(leave)
+ all_new_leave_vals.append(new_leave._convert_to_write(new_leave._cache))
+ if all_new_leave_vals:
+ new_leaves = self.env['hr.leave'].with_context(
+ tracking_disable=True,
+ mail_activity_automation_skip=True,
+ leave_fast_create=True,
+ leave_skip_state_check=True
+ ).create(all_new_leave_vals)
+ new_leaves.filtered(lambda l: l.state in 'validate')._validate_leave_request()
+ for index, new_leave in enumerate(new_leaves):
+ new_leave.message_post_with_source(
+ 'mail.message_origin_link',
+ render_values={'self': new_leave, 'origin': all_new_leave_origin[index]},
+ subtype_xmlid='mail.mt_note',
+ )
+ except ValidationError:
+ raise ValidationError(_("Changing the contract on this employee changes their working schedule in a period "
+ "they already took leaves. Changing this working schedule changes the duration of "
+ "these leaves in such a way the employee no longer has the required allocation for "
+ "them. Please review these leaves and/or allocations before changing the contract."))
+ return super(HrContract, self - specific_contracts).write(vals)
diff --git a/models/hr_employee_base.py b/models/hr_employee_base.py
new file mode 100644
index 0000000..0ba9076
--- /dev/null
+++ b/models/hr_employee_base.py
@@ -0,0 +1,14 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import models
+
+
+class HrEmployeeBase(models.AbstractModel):
+ _inherit = "hr.employee.base"
+
+ def write(self, vals):
+ # Prevent the resource calendar of leaves to be updated by a write to
+ # employee. When this module is enabled the resource calendar of
+ # leaves are determined by those of the contracts.
+ return super(HrEmployeeBase, self.with_context(no_leave_resource_calendar_update=True)).write(vals)
diff --git a/models/hr_leave.py b/models/hr_leave.py
new file mode 100644
index 0000000..c0276be
--- /dev/null
+++ b/models/hr_leave.py
@@ -0,0 +1,228 @@
+# -*- coding:utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from collections import defaultdict
+from datetime import datetime, time
+from dateutil.relativedelta import relativedelta
+
+from odoo import api, fields, models, _
+from odoo.exceptions import ValidationError
+from odoo.osv.expression import AND
+from odoo.tools import format_date
+
+
+class HrLeaveType(models.Model):
+ _inherit = 'hr.leave.type'
+
+ work_entry_type_id = fields.Many2one('hr.work.entry.type', string='Work Entry Type')
+
+
+class HrLeave(models.Model):
+ _inherit = 'hr.leave'
+
+ def _prepare_resource_leave_vals(self):
+ vals = super(HrLeave, self)._prepare_resource_leave_vals()
+ vals['work_entry_type_id'] = self.holiday_status_id.work_entry_type_id.id
+ return vals
+
+ def _get_overlapping_contracts(self, contract_states=None):
+ self.ensure_one()
+ if contract_states is None:
+ contract_states = [
+ '|',
+ ('state', 'not in', ['draft', 'cancel']),
+ '&',
+ ('state', '=', 'draft'),
+ ('kanban_state', '=', 'done')
+ ]
+ domain = AND([contract_states, [
+ ('employee_id', '=', self.employee_id.id),
+ ('date_start', '<=', self.date_to),
+ '|',
+ ('date_end', '>=', self.date_from),
+ '&',
+ ('date_end', '=', False),
+ ('state', '!=', 'close')
+ ]])
+ return self.env['hr.contract'].sudo().search(domain)
+
+ @api.constrains('date_from', 'date_to')
+ def _check_contracts(self):
+ """
+ A leave cannot be set across multiple contracts.
+ Note: a leave can be across multiple contracts despite this constraint.
+ It happens if a leave is correctly created (not across multiple contracts) but
+ contracts are later modifed/created in the middle of the leave.
+ """
+ for holiday in self.filtered('employee_id'):
+ contracts = holiday._get_overlapping_contracts()
+ if len(contracts.resource_calendar_id) > 1:
+ state_labels = {e[0]: e[1] for e in contracts._fields['state']._description_selection(self.env)}
+ raise ValidationError(
+ _("""A leave cannot be set across multiple contracts with different working schedules.
+
+Please create one time off for each contract.
+
+Time off:
+%s
+
+Contracts:
+%s""",
+ holiday.display_name,
+ '\n'.join(_(
+ "Contract %s from %s to %s, status: %s",
+ contract.name,
+ format_date(self.env, contract.date_start),
+ format_date(self.env, contract.date_start) if contract.date_end else _("undefined"),
+ state_labels[contract.state]
+ ) for contract in contracts)))
+
+ def _cancel_work_entry_conflict(self):
+ """
+ Creates a leave work entry for each hr.leave in self.
+ Check overlapping work entries with self.
+ Work entries completely included in a leave are archived.
+ e.g.:
+ |----- work entry ----|---- work entry ----|
+ |------------------- hr.leave ---------------|
+ ||
+ vv
+ |----* work entry ****|
+ |************ work entry leave --------------|
+ """
+ if not self:
+ return
+
+ # 1. Create a work entry for each leave
+ work_entries_vals_list = []
+ for leave in self:
+ contracts = leave.employee_id.sudo()._get_contracts(leave.date_from, leave.date_to, states=['open', 'close'])
+ for contract in contracts:
+ # Generate only if it has aleady been generated
+ if leave.date_to >= contract.date_generated_from and leave.date_from <= contract.date_generated_to:
+ work_entries_vals_list += contracts._get_work_entries_values(leave.date_from, leave.date_to)
+
+ new_leave_work_entries = self.env['hr.work.entry'].create(work_entries_vals_list)
+
+ if new_leave_work_entries:
+ # 2. Fetch overlapping work entries, grouped by employees
+ start = min(self.mapped('date_from'), default=False)
+ stop = max(self.mapped('date_to'), default=False)
+ work_entry_groups = self.env['hr.work.entry']._read_group([
+ ('date_start', '<', stop),
+ ('date_stop', '>', start),
+ ('employee_id', 'in', self.employee_id.ids),
+ ], ['employee_id'], ['id:recordset'])
+ work_entries_by_employee = {
+ employee.id: work_entries
+ for employee, work_entries in work_entry_groups
+ }
+
+ # 3. Archive work entries included in leaves
+ included = self.env['hr.work.entry']
+ overlappping = self.env['hr.work.entry']
+ for work_entries in work_entries_by_employee.values():
+ # Work entries for this employee
+ new_employee_work_entries = work_entries & new_leave_work_entries
+ previous_employee_work_entries = work_entries - new_leave_work_entries
+
+ # Build intervals from work entries
+ leave_intervals = new_employee_work_entries._to_intervals()
+ conflicts_intervals = previous_employee_work_entries._to_intervals()
+
+ # Compute intervals completely outside any leave
+ # Intervals are outside, but associated records are overlapping.
+ outside_intervals = conflicts_intervals - leave_intervals
+
+ overlappping |= self.env['hr.work.entry']._from_intervals(outside_intervals)
+ included |= previous_employee_work_entries - overlappping
+ overlappping.write({'leave_id': False})
+ included.write({'active': False})
+
+ def write(self, vals):
+ if not self:
+ return True
+ skip_check = not bool({'employee_id', 'state', 'request_date_from', 'request_date_to'} & vals.keys())
+ employee_ids = self.employee_id.ids
+ if 'employee_id' in vals and vals['employee_id']:
+ employee_ids += [vals['employee_id']]
+ # We check a whole day before and after the interval of the earliest
+ # request_date_from and latest request_date_end because date_{from,to}
+ # can lie in this range due to time zone reasons.
+ # (We can't use date_from and date_to as they are not yet computed at
+ # this point.)
+ start_dates = self.filtered('request_date_from').mapped('request_date_from') + [fields.Date.to_date(vals.get('request_date_from', False)) or datetime.max.date()]
+ stop_dates = self.filtered('request_date_to').mapped('request_date_to') + [fields.Date.to_date(vals.get('request_date_to', False)) or datetime.min.date()]
+ start = datetime.combine(min(start_dates) - relativedelta(days=1), time.min)
+ stop = datetime.combine(max(stop_dates) + relativedelta(days=1), time.max)
+ with self.env['hr.work.entry']._error_checking(start=start, stop=stop, skip=skip_check, employee_ids=employee_ids):
+ return super().write(vals)
+
+ @api.model_create_multi
+ def create(self, vals_list):
+ if any(vals.get('holiday_type', 'employee') == 'employee' and not vals.get('multi_employee', False) and not vals.get('employee_id', False) for vals in vals_list):
+ raise ValidationError(_("There is no employee set on the time off. Please make sure you're logged in the correct company."))
+ employee_ids = {v['employee_id'] for v in vals_list if v.get('employee_id')}
+ # We check a whole day before and after the interval of the earliest
+ # request_date_from and latest request_date_end because date_{from,to}
+ # can lie in this range due to time zone reasons.
+ # (We can't use date_from and date_to as they are not yet computed at
+ # this point.)
+ start_dates = [fields.Date.to_date(v.get('request_date_from')) for v in vals_list if v.get('request_date_from')]
+ stop_dates = [fields.Date.to_date(v.get('request_date_to')) for v in vals_list if v.get('request_date_to')]
+ start = datetime.combine(min(start_dates, default=datetime.max.date()) - relativedelta(days=1), time.min)
+ stop = datetime.combine(max(stop_dates, default=datetime.min.date()) + relativedelta(days=1), time.max)
+ with self.env['hr.work.entry']._error_checking(start=start, stop=stop, employee_ids=employee_ids):
+ return super().create(vals_list)
+
+ def action_confirm(self):
+ start = min(self.mapped('date_from'), default=False)
+ stop = max(self.mapped('date_to'), default=False)
+ with self.env['hr.work.entry']._error_checking(start=start, stop=stop, employee_ids=self.employee_id.ids):
+ return super().action_confirm()
+
+ def _get_leaves_on_public_holiday(self):
+ return super()._get_leaves_on_public_holiday().filtered(
+ lambda l: l.holiday_status_id.work_entry_type_id.code not in ['LEAVE110', 'LEAVE210', 'LEAVE280'])
+
+ def _validate_leave_request(self):
+ super(HrLeave, self)._validate_leave_request()
+ self.sudo()._cancel_work_entry_conflict() # delete preexisting conflicting work_entries
+ return True
+
+ def action_refuse(self):
+ """
+ Override to archive linked work entries and recreate attendance work entries
+ where the refused leave was.
+ """
+ res = super(HrLeave, self).action_refuse()
+ self._regen_work_entries()
+ return res
+
+ def _action_user_cancel(self, reason):
+ res = super()._action_user_cancel(reason)
+ self.sudo()._regen_work_entries()
+ return res
+
+ def _regen_work_entries(self):
+ """
+ Called when the leave is refused or cancelled to regenerate the work entries properly for that period.
+ """
+ work_entries = self.env['hr.work.entry'].sudo().search([('leave_id', 'in', self.ids)])
+
+ work_entries.write({'active': False})
+ # Re-create attendance work entries
+ vals_list = []
+ for work_entry in work_entries:
+ vals_list += work_entry.contract_id._get_work_entries_values(work_entry.date_start, work_entry.date_stop)
+ self.env['hr.work.entry'].create(vals_list)
+
+ def _compute_can_cancel(self):
+ super()._compute_can_cancel()
+
+ cancellable_leaves = self.filtered('can_cancel')
+ work_entries = self.env['hr.work.entry'].sudo().search([('state', '=', 'validated'), ('leave_id', 'in', cancellable_leaves.ids)])
+ leave_ids = work_entries.mapped('leave_id').ids
+
+ for leave in cancellable_leaves:
+ leave.can_cancel = leave.id not in leave_ids
diff --git a/models/hr_work_entry.py b/models/hr_work_entry.py
new file mode 100644
index 0000000..13906dd
--- /dev/null
+++ b/models/hr_work_entry.py
@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models
+
+
+class HrWorkEntry(models.Model):
+ _inherit = 'hr.work.entry'
+
+ leave_id = fields.Many2one('hr.leave', string='Time Off')
+ leave_state = fields.Selection(related='leave_id.state')
+
+ def _is_duration_computed_from_calendar(self):
+ return super()._is_duration_computed_from_calendar() or bool(not self.work_entry_type_id and self.leave_id)
+
+ def write(self, vals):
+ if 'state' in vals and vals['state'] == 'cancelled':
+ self.mapped('leave_id').filtered(lambda l: l.state != 'refuse').action_refuse()
+ return super().write(vals)
+
+ def _reset_conflicting_state(self):
+ super()._reset_conflicting_state()
+ attendances = self.filtered(lambda w: w.work_entry_type_id and not w.work_entry_type_id.is_leave)
+ attendances.write({'leave_id': False})
+
+ def _check_if_error(self):
+ res = super()._check_if_error()
+ conflict_with_leaves = self._compute_conflicts_leaves_to_approve()
+ return res or conflict_with_leaves
+
+ def _compute_conflicts_leaves_to_approve(self):
+ if not self:
+ return False
+
+ self.flush_recordset(['date_start', 'date_stop', 'employee_id', 'active'])
+ self.env['hr.leave'].flush_model(['date_from', 'date_to', 'state', 'employee_id'])
+
+ query = """
+ SELECT
+ b.id AS work_entry_id,
+ l.id AS leave_id
+ FROM hr_work_entry b
+ INNER JOIN hr_leave l ON b.employee_id = l.employee_id
+ WHERE
+ b.active = TRUE AND
+ b.id IN %s AND
+ l.date_from < b.date_stop AND
+ l.date_to > b.date_start AND
+ l.state IN ('confirm', 'validate1');
+ """
+ self.env.cr.execute(query, [tuple(self.ids)])
+ conflicts = self.env.cr.dictfetchall()
+ for res in conflicts:
+ self.browse(res.get('work_entry_id')).write({
+ 'state': 'conflict',
+ 'leave_id': res.get('leave_id')
+ })
+ return bool(conflicts)
+
+ def action_approve_leave(self):
+ self.ensure_one()
+ if self.leave_id:
+ # Already confirmed once
+ if self.leave_id.state == 'validate1':
+ self.leave_id.action_validate()
+ # Still in confirmed state
+ else:
+ self.leave_id.action_approve()
+ # If double validation, still have to validate it again
+ if self.leave_id.validation_type == 'both':
+ self.leave_id.action_validate()
+
+ def action_refuse_leave(self):
+ self.ensure_one()
+ leave_sudo = self.leave_id.sudo()
+ if leave_sudo:
+ leave_sudo.action_refuse()
+
+
+class HrWorkEntryType(models.Model):
+ _inherit = 'hr.work.entry.type'
+ _description = 'HR Work Entry Type'
+
+ leave_type_ids = fields.One2many(
+ 'hr.leave.type', 'work_entry_type_id', string='Time Off Type',
+ help="Work entry used in the payslip.")
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..14db658
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import test_leave
+from . import test_multi_contract
+from . import test_payslip_holidays_computation
+from . import test_performance
+from . import test_work_entry
diff --git a/tests/common.py b/tests/common.py
new file mode 100644
index 0000000..f4027f7
--- /dev/null
+++ b/tests/common.py
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from datetime import datetime
+
+from odoo import Command
+from odoo.fields import Datetime
+from odoo.addons.hr_work_entry_contract.tests.common import TestWorkEntryBase
+
+
+class TestWorkEntryHolidaysBase(TestWorkEntryBase):
+
+ @classmethod
+ def setUpClass(cls):
+ super(TestWorkEntryHolidaysBase, cls).setUpClass()
+
+ cls.leave_type = cls.env['hr.leave.type'].create({
+ 'name': 'Legal Leaves',
+ 'time_type': 'leave',
+ 'requires_allocation': 'no',
+ 'responsible_ids': [Command.link(cls.env.ref('base.user_admin').id)],
+ 'work_entry_type_id': cls.work_entry_type_leave.id
+ })
+ cls.env.ref('base.user_admin').notification_type = 'inbox'
+
+ # I create a new employee "Jules"
+ cls.jules_emp = cls.env['hr.employee'].create({
+ 'name': 'Jules',
+ 'gender': 'male',
+ 'birthday': '1984-05-01',
+ 'country_id': cls.env.ref('base.be').id,
+ 'department_id': cls.dep_rd.id,
+ })
+
+ cls.calendar_35h = cls.env['resource.calendar'].create({
+ 'name': '35h calendar',
+ 'attendance_ids': [
+ (0, 0, {'name': 'Monday Morning', 'dayofweek': '0', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
+ (0, 0, {'name': 'Monday Lunch', 'dayofweek': '0', 'hour_from': 12, 'hour_to': 13, 'day_period': 'lunch'}),
+ (0, 0, {'name': 'Monday Evening', 'dayofweek': '0', 'hour_from': 13, 'hour_to': 16, 'day_period': 'afternoon'}),
+ (0, 0, {'name': 'Tuesday Morning', 'dayofweek': '1', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
+ (0, 0, {'name': 'Tuesday Lunch', 'dayofweek': '1', 'hour_from': 12, 'hour_to': 13, 'day_period': 'lunch'}),
+ (0, 0, {'name': 'Tuesday Evening', 'dayofweek': '1', 'hour_from': 13, 'hour_to': 16, 'day_period': 'afternoon'}),
+ (0, 0, {'name': 'Wednesday Morning', 'dayofweek': '2', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
+ (0, 0, {'name': 'Wednesday Lunch', 'dayofweek': '2', 'hour_from': 12, 'hour_to': 13, 'day_period': 'lunch'}),
+ (0, 0, {'name': 'Wednesday Evening', 'dayofweek': '2', 'hour_from': 13, 'hour_to': 16, 'day_period': 'afternoon'}),
+ (0, 0, {'name': 'Thursday Morning', 'dayofweek': '3', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
+ (0, 0, {'name': 'Thursday Lunch', 'dayofweek': '3', 'hour_from': 12, 'hour_to': 13, 'day_period': 'lunch'}),
+ (0, 0, {'name': 'Thursday Evening', 'dayofweek': '3', 'hour_from': 13, 'hour_to': 16, 'day_period': 'afternoon'}),
+ (0, 0, {'name': 'Friday Morning', 'dayofweek': '4', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
+ (0, 0, {'name': 'Friday Lunch', 'dayofweek': '4', 'hour_from': 12, 'hour_to': 13, 'day_period': 'lunch'}),
+ (0, 0, {'name': 'Friday Evening', 'dayofweek': '4', 'hour_from': 13, 'hour_to': 16, 'day_period': 'afternoon'})
+ ]
+ })
+ cls.calendar_40h = cls.env['resource.calendar'].create({'name': 'Default calendar'})
+
+ # This contract ends at the 15th of the month
+ cls.contract_cdd = cls.env['hr.contract'].create({ # Fixed term contract
+ 'date_end': datetime.strptime('2015-11-15', '%Y-%m-%d'),
+ 'date_start': datetime.strptime('2015-01-01', '%Y-%m-%d'),
+ 'name': 'First CDD Contract for Jules',
+ 'resource_calendar_id': cls.calendar_40h.id,
+ 'wage': 5000.0,
+ 'employee_id': cls.jules_emp.id,
+ 'state': 'open',
+ 'kanban_state': 'blocked',
+ 'date_generated_from': datetime.strptime('2015-11-16', '%Y-%m-%d'),
+ 'date_generated_to': datetime.strptime('2015-11-16', '%Y-%m-%d'),
+ })
+
+ # This contract starts the next day
+ cls.contract_cdi = cls.env['hr.contract'].create({
+ 'date_start': datetime.strptime('2015-11-16', '%Y-%m-%d'),
+ 'name': 'Contract for Jules',
+ 'resource_calendar_id': cls.calendar_35h.id,
+ 'wage': 5000.0,
+ 'employee_id': cls.jules_emp.id,
+ 'state': 'open',
+ 'kanban_state': 'normal',
+ 'date_generated_from': datetime.strptime('2015-11-15', '%Y-%m-%d'),
+ 'date_generated_to': datetime.strptime('2015-11-15', '%Y-%m-%d'),
+ })
+
+ @classmethod
+ def create_leave(cls, date_from=None, date_to=None):
+ return cls.env['hr.leave'].create({
+ 'name': 'Holiday!!!',
+ 'employee_id': cls.richard_emp.id,
+ 'holiday_status_id': cls.leave_type.id,
+ 'request_date_to': date_to or Datetime.today(),
+ 'request_date_from': date_from or Datetime.today(),
+ })
diff --git a/tests/test_leave.py b/tests/test_leave.py
new file mode 100644
index 0000000..e688a9f
--- /dev/null
+++ b/tests/test_leave.py
@@ -0,0 +1,188 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from datetime import datetime, date
+from dateutil.relativedelta import relativedelta
+
+from freezegun import freeze_time
+
+from odoo import SUPERUSER_ID
+from odoo.addons.hr_work_entry_holidays.tests.common import TestWorkEntryHolidaysBase
+from odoo.tests import tagged
+
+@tagged('test_leave')
+class TestWorkEntryLeave(TestWorkEntryHolidaysBase):
+
+ def test_resource_leave_has_work_entry_type(self):
+ leave = self.create_leave()
+
+ resource_leave = leave._create_resource_leave()
+ self.assertEqual(resource_leave.work_entry_type_id, self.leave_type.work_entry_type_id, "it should have the corresponding work_entry type")
+
+ def test_resource_leave_in_contract_calendar(self):
+ other_calendar = self.env['resource.calendar'].create({'name': 'New calendar'})
+ contract = self.richard_emp.contract_ids[0]
+ contract.resource_calendar_id = other_calendar
+ contract.state = 'open' # this set richard's calendar to New calendar
+ leave = self.create_leave()
+
+ resource_leave = leave._create_resource_leave()
+ self.assertEqual(len(resource_leave), 1, "it should have created only one resource leave")
+ self.assertEqual(resource_leave.work_entry_type_id, self.leave_type.work_entry_type_id, "it should have the corresponding work_entry type")
+
+ def test_create_mark_conflicting_work_entries(self):
+ work_entry = self.create_work_entry(datetime(2019, 10, 10, 9, 0), datetime(2019, 10, 10, 12, 0))
+ self.assertNotEqual(work_entry.state, 'conflict', "It should not be conflicting")
+ leave = self.create_leave(date(2019, 10, 10), date(2019, 10, 10))
+ self.assertEqual(work_entry.state, 'conflict', "It should be conflicting")
+ self.assertEqual(work_entry.leave_id, leave, "It should be linked to conflicting leave")
+
+ def test_write_mark_conflicting_work_entries(self):
+ leave = self.create_leave(date(2019, 10, 10), datetime(2019, 10, 10))
+ work_entry = self.create_work_entry(leave.date_from - relativedelta(days=1), leave.date_from) # the day before
+ self.assertNotEqual(work_entry.state, 'conflict', "It should not be conflicting")
+ leave.request_date_from = date(2019, 10, 9) # now it conflicts
+ self.assertEqual(work_entry.state, 'conflict', "It should be conflicting")
+ self.assertEqual(work_entry.leave_id, leave, "It should be linked to conflicting leave")
+
+ def test_validate_leave_with_overlap(self):
+ contract = self.richard_emp.contract_ids[:1]
+ contract.state = 'open'
+ contract.date_generated_from = datetime(2019, 10, 10, 9, 0)
+ contract.date_generated_to = datetime(2019, 10, 10, 9, 0)
+ leave = self.create_leave(datetime(2019, 10, 10, 9, 0), datetime(2019, 10, 12, 18, 0))
+ work_entry_1 = self.create_work_entry(datetime(2019, 10, 8, 9, 0), datetime(2019, 10, 11, 9, 0)) # overlaps
+ work_entry_2 = self.create_work_entry(datetime(2019, 10, 11, 9, 0), datetime(2019, 10, 11, 10, 0)) # included
+ adjacent_work_entry = self.create_work_entry(datetime(2019, 10, 12, 18, 0), datetime(2019, 10, 13, 18, 0)) # after and don't overlap
+ leave.action_validate()
+ self.assertNotEqual(adjacent_work_entry.state, 'conflict', "It should not conflict")
+ self.assertFalse(work_entry_2.active, "It should have been archived")
+ self.assertEqual(work_entry_1.state, 'conflict', "It should conflict")
+ self.assertFalse(work_entry_1.leave_id, "It should not be linked to the leave")
+
+ leave_work_entry = self.env['hr.work.entry'].search([('leave_id', '=', leave.id)]) - work_entry_1
+ self.assertTrue(leave_work_entry.work_entry_type_id.is_leave, "It should have created a leave work entry")
+ self.assertEqual(leave_work_entry[:1].state, 'conflict', "The leave work entry should conflict")
+
+ def test_conflict_move_work_entry(self):
+ leave = self.create_leave(datetime(2019, 10, 10, 9, 0), datetime(2019, 10, 12, 18, 0))
+ work_entry = self.create_work_entry(datetime(2019, 10, 8, 9, 0), datetime(2019, 10, 11, 9, 0)) # overlaps
+ self.assertEqual(work_entry.state, 'conflict', "It should be conflicting")
+ self.assertEqual(work_entry.leave_id, leave, "It should be linked to conflicting leave")
+ work_entry.date_stop = datetime(2019, 10, 9, 9, 0) # no longer overlaps
+ self.assertNotEqual(work_entry.state, 'conflict', "It should not be conflicting")
+ self.assertFalse(work_entry.leave_id, "It should not be linked to any leave")
+
+ def test_validate_leave_without_overlap(self):
+ contract = self.richard_emp.contract_ids[:1]
+ contract.state = 'open'
+ contract.date_generated_from = datetime(2019, 10, 10, 9, 0)
+ contract.date_generated_to = datetime(2019, 10, 10, 9, 0)
+ leave = self.create_leave(datetime(2019, 10, 10, 9, 0), datetime(2019, 10, 12, 18, 0))
+ work_entry = self.create_work_entry(datetime(2019, 10, 11, 9, 0), datetime(2019, 10, 11, 10, 0)) # included
+ leave.action_validate()
+ self.assertFalse(work_entry[:1].active, "It should have been archived")
+
+ leave_work_entry = self.env['hr.work.entry'].search([('leave_id', '=', leave.id)])
+ self.assertTrue(leave_work_entry.work_entry_type_id.is_leave, "It should have created a leave work entry")
+ self.assertNotEqual(leave_work_entry[:1].state, 'conflict', "The leave work entry should not conflict")
+
+ def test_refuse_leave(self):
+ leave = self.create_leave(date(2019, 10, 10), date(2019, 10, 10))
+ work_entries = self.richard_emp.contract_id._generate_work_entries(datetime(2019, 10, 10, 0, 0, 0), datetime(2019, 10, 10, 23, 59, 59))
+ adjacent_work_entry = self.create_work_entry(leave.date_from - relativedelta(days=3), leave.date_from)
+ self.assertTrue(all(work_entries.mapped(lambda w: w.state == 'conflict')), "Attendance work entries should all conflict with the leave")
+ self.assertNotEqual(adjacent_work_entry.state, 'conflict', "Non overlapping work entry should not conflict")
+ leave.action_refuse()
+ self.assertTrue(all(work_entries.mapped(lambda w: w.state != 'conflict')), "Attendance work entries should no longer conflict")
+ self.assertNotEqual(adjacent_work_entry.state, 'conflict', "Non overlapping work entry should not conflict")
+
+ def test_refuse_approved_leave(self):
+ start = datetime(2019, 10, 10, 6, 0)
+ end = datetime(2019, 10, 10, 18, 0)
+ # Setup contract generation state
+ contract = self.richard_emp.contract_ids[:1]
+ contract.state = 'open'
+ contract.date_generated_from = start - relativedelta(hours=1)
+ contract.date_generated_to = start - relativedelta(hours=1)
+
+ leave = self.create_leave(start, end)
+ leave.action_validate()
+ work_entries = self.env['hr.work.entry'].search([('employee_id', '=', self.richard_emp.id), ('date_start', '<=', end), ('date_stop', '>=', start)])
+ leave_work_entry = self.richard_emp.contract_ids.generate_work_entries(start.date(), end.date())
+ self.assertEqual(leave_work_entry[:1].leave_id, leave)
+ leave.action_refuse()
+ work_entries = self.env['hr.work.entry'].search([('employee_id', '=', self.richard_emp.id), ('date_start', '>=', start), ('date_stop', '<=', end)])
+ self.assertFalse(leave_work_entry[:1].filtered('leave_id').active)
+ self.assertEqual(len(work_entries), 2, "Attendance work entries should have been re-created (morning and afternoon)")
+ self.assertTrue(all(work_entries.mapped(lambda w: w.state != 'conflict')), "Attendance work entries should not conflict")
+
+ def test_archived_work_entry_conflict(self):
+ self.create_leave(datetime(2019, 10, 10, 9, 0), datetime(2019, 10, 10, 18, 0))
+ work_entry = self.create_work_entry(datetime(2019, 10, 10, 9, 0), datetime(2019, 10, 10, 18, 0))
+ self.assertTrue(work_entry.active)
+ self.assertEqual(work_entry.state, 'conflict', "Attendance work entries should conflict with the leave")
+ work_entry.toggle_active()
+ self.assertEqual(work_entry.state, 'cancelled', "Attendance work entries should be cancelled and not conflict")
+ self.assertFalse(work_entry.active)
+
+ def test_work_entry_cancel_leave(self):
+ user = self.env['res.users'].create({
+ 'name': 'User Employee',
+ 'login': 'jul',
+ 'password': 'julpassword',
+ })
+ self.richard_emp.user_id = user
+ self.richard_emp.contract_ids.state = 'open'
+ with freeze_time(datetime(2022, 3, 21)):
+ # Tests that cancelling a leave archives the work entries.
+ leave = self.env['hr.leave'].with_user(user).create({
+ 'name': 'Sick 1 week during christmas snif',
+ 'employee_id': self.richard_emp.id,
+ 'holiday_status_id': self.leave_type.id,
+ 'request_date_from': date(2022, 3, 22),
+ 'request_date_to': date(2022, 3, 25),
+ })
+ leave.with_user(SUPERUSER_ID).action_validate()
+ # No work entries exist yet
+ self.assertTrue(leave.can_cancel, "The leave should still be cancellable")
+ # can not create in the future
+ self.richard_emp.contract_ids.generate_work_entries(date(2022, 3, 21), date(2022, 3, 25))
+ work_entries = self.env['hr.work.entry'].search([('employee_id', '=', self.richard_emp.id)])
+ leave.invalidate_recordset(['can_cancel'])
+ # Work entries exist but are not locked yet
+ self.assertTrue(leave.can_cancel, "The leave should still be cancellable")
+ work_entries.action_validate()
+ leave.invalidate_recordset(['can_cancel'])
+ # Work entries locked
+ self.assertFalse(leave.can_cancel, "The leave should not be cancellable")
+
+ def test_work_entry_generation_company_time_off(self):
+ existing_leaves = self.env['hr.leave'].search([])
+ existing_leaves.action_refuse()
+ existing_leaves.action_draft()
+ existing_leaves.unlink()
+ start = date(2022, 8, 1)
+ end = date(2022, 8, 31)
+ self.contract_cdi.generate_work_entries(start, end)
+ work_entries = self.env['hr.work.entry'].search([
+ ('employee_id', '=', self.jules_emp.id),
+ ('date_start', '>=', start),
+ ('date_stop', '<=', end),
+ ])
+ self.assertEqual(len(work_entries.work_entry_type_id), 1)
+ leave = self.env['hr.leave'].create({
+ 'name': 'Holiday!!!',
+ 'holiday_type': 'company',
+ 'mode_company_id': self.env.company.id,
+ 'holiday_status_id': self.leave_type.id,
+ 'request_date_from': datetime(2022, 8, 8),
+ 'request_date_to': datetime(2022, 8, 8),
+ })
+ leave.action_validate()
+ work_entries = self.env['hr.work.entry'].search([
+ ('employee_id', '=', self.jules_emp.id),
+ ('date_start', '>=', start),
+ ('date_stop', '<=', end),
+ ])
+ self.assertEqual(len(work_entries.work_entry_type_id), 2)
diff --git a/tests/test_multi_contract.py b/tests/test_multi_contract.py
new file mode 100644
index 0000000..4d5a987
--- /dev/null
+++ b/tests/test_multi_contract.py
@@ -0,0 +1,271 @@
+# # -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from datetime import datetime, date, time
+from odoo.exceptions import ValidationError
+from odoo.tests import tagged
+from odoo.addons.hr_work_entry_holidays.tests.common import TestWorkEntryHolidaysBase
+
+
+@tagged('work_entry_multi_contract')
+class TestWorkEntryHolidaysMultiContract(TestWorkEntryHolidaysBase):
+
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls.leave_type = cls.env['hr.leave.type'].create({
+ 'name': 'Legal Leaves',
+ 'time_type': 'leave',
+ 'requires_allocation': 'no',
+ 'work_entry_type_id': cls.work_entry_type_leave.id
+ })
+
+ def create_leave(self, start, end):
+ return self.env['hr.leave'].create({
+ 'name': 'Doctor Appointment',
+ 'employee_id': self.jules_emp.id,
+ 'holiday_status_id': self.leave_type.id,
+ 'request_date_from': start,
+ 'request_date_to': end,
+ })
+
+ def test_multi_contract_holiday(self):
+ # Leave during second contract
+ leave = self.create_leave(datetime(2015, 11, 17), datetime(2015, 11, 20))
+ leave.action_approve()
+ start = datetime(2015, 11, 1, 0, 0, 0)
+ end_generate = datetime(2015, 11, 30, 23, 59, 59)
+ work_entries = self.jules_emp.contract_ids._generate_work_entries(start, end_generate)
+ work_entries.action_validate()
+ work_entries = work_entries.filtered(lambda we: we.contract_id == self.contract_cdi)
+
+ work = work_entries.filtered(lambda line: line.work_entry_type_id == self.env.ref('hr_work_entry.work_entry_type_attendance'))
+ leave = work_entries.filtered(lambda line: line.work_entry_type_id == self.work_entry_type_leave)
+ self.assertEqual(sum(work.mapped('duration')), 49, "It should be 49 hours of work this month for this contract")
+ self.assertEqual(sum(leave.mapped('duration')), 28, "It should be 28 hours of leave this month for this contract")
+
+ def test_move_contract_in_leave(self):
+ # test move contract dates such that a leave is across two contracts
+ start = datetime.strptime('2015-11-05 07:00:00', '%Y-%m-%d %H:%M:%S')
+ end = datetime.strptime('2015-12-15 18:00:00', '%Y-%m-%d %H:%M:%S')
+ self.contract_cdi.write({'date_start': datetime.strptime('2015-12-30', '%Y-%m-%d').date()})
+ # begins during contract, ends after contract
+ leave = self.create_leave(start, end)
+ leave.action_approve()
+ # move contract in the middle of the leave
+ with self.assertRaises(ValidationError):
+ self.contract_cdi.date_start = datetime.strptime('2015-11-17', '%Y-%m-%d').date()
+
+ def test_create_contract_in_leave(self):
+ # test create contract such that a leave is across two contracts
+ start = datetime.strptime('2015-11-05 07:00:00', '%Y-%m-%d %H:%M:%S')
+ end = datetime.strptime('2015-12-15 18:00:00', '%Y-%m-%d %H:%M:%S')
+ self.contract_cdi.date_start = datetime.strptime('2015-12-30', '%Y-%m-%d').date() # remove this contract to be able to create the leave
+ # begins during contract, ends after contract
+ leave = self.create_leave(start, end)
+ leave.action_approve()
+ # move contract in the middle of the leave
+ with self.assertRaises(ValidationError):
+ self.env['hr.contract'].create({
+ 'date_start': datetime.strptime('2015-11-30', '%Y-%m-%d').date(),
+ 'name': 'Contract for Richard',
+ 'resource_calendar_id': self.calendar_40h.id,
+ 'wage': 5000.0,
+ 'employee_id': self.jules_emp.id,
+ 'state': 'open',
+ 'date_generated_from': datetime.strptime('2015-11-30', '%Y-%m-%d'),
+ 'date_generated_to': datetime.strptime('2015-11-30', '%Y-%m-%d'),
+ })
+
+ def test_leave_outside_contract(self):
+ # Leave outside contract => should not raise
+ start = datetime.strptime('2014-10-18 07:00:00', '%Y-%m-%d %H:%M:%S')
+ end = datetime.strptime('2014-10-20 09:00:00', '%Y-%m-%d %H:%M:%S')
+ self.create_leave(start, end)
+
+ # begins before contract, ends during contract => should not raise
+ start = datetime.strptime('2014-10-25 07:00:00', '%Y-%m-%d %H:%M:%S')
+ end = datetime.strptime('2015-01-15 18:00:00', '%Y-%m-%d %H:%M:%S')
+ self.create_leave(start, end)
+
+ # begins during contract, ends after contract => should not raise
+ self.contract_cdi.date_end = datetime.strptime('2015-11-30', '%Y-%m-%d').date()
+ start = datetime.strptime('2015-11-25 07:00:00', '%Y-%m-%d %H:%M:%S')
+ end = datetime.strptime('2015-12-5 18:00:00', '%Y-%m-%d %H:%M:%S')
+ self.create_leave(start, end)
+
+ def test_no_leave_overlapping_contracts(self):
+ with self.assertRaises(ValidationError):
+ # Overlap two contracts
+ start = datetime.strptime('2015-11-12 07:00:00', '%Y-%m-%d %H:%M:%S')
+ end = datetime.strptime('2015-11-17 18:00:00', '%Y-%m-%d %H:%M:%S')
+ self.create_leave(start, end)
+
+ # Leave inside fixed term contract => should not raise
+ start = datetime.strptime('2015-11-04 07:00:00', '%Y-%m-%d %H:%M:%S')
+ end = datetime.strptime('2015-11-07 09:00:00', '%Y-%m-%d %H:%M:%S')
+ self.create_leave(start, end)
+
+ # Leave inside contract (no end) => should not raise
+ start = datetime.strptime('2015-11-18 07:00:00', '%Y-%m-%d %H:%M:%S')
+ end = datetime.strptime('2015-11-20 09:00:00', '%Y-%m-%d %H:%M:%S')
+ self.create_leave(start, end)
+
+ def test_leave_request_next_contracts(self):
+ start = datetime.strptime('2015-11-23 07:00:00', '%Y-%m-%d %H:%M:%S')
+ end = datetime.strptime('2015-11-24 18:00:00', '%Y-%m-%d %H:%M:%S')
+ leave = self.create_leave(start, end)
+ self.assertEqual(leave.number_of_hours_display, 14, "It should count hours according to the future contract.")
+
+ def test_leave_multi_contracts_same_schedule(self):
+ # Allow leaves overlapping multiple contracts if same
+ # resource calendar
+ leave = self.create_leave(datetime(2022, 6, 1, 7, 0, 0), datetime(2022, 6, 30, 18, 0, 0))
+ leave.action_approve()
+ self.contract_cdi.date_end = date(2022, 6, 15)
+
+ new_contract_cdi = self.env['hr.contract'].create({
+ 'date_start': date(2022, 6, 16),
+ 'name': 'New Contract for Jules',
+ 'resource_calendar_id': self.calendar_35h.id,
+ 'wage': 5000.0,
+ 'employee_id': self.jules_emp.id,
+ 'state': 'draft',
+ 'kanban_state': 'normal',
+ })
+ new_contract_cdi.state = 'open'
+
+ def test_leave_multi_contracts_split(self):
+ # Check that setting a contract as running correctly
+ # splits the existing time off for this employee that
+ # are ovelapping with another contract with another
+ # working schedule
+ leave = self.create_leave(date(2022, 6, 1), date(2022, 6, 30))
+ leave.action_approve()
+ self.assertEqual(leave.number_of_days, 22)
+ self.assertEqual(leave.state, 'validate')
+
+ self.contract_cdi.date_end = date(2022, 6, 15)
+ new_contract_cdi = self.env['hr.contract'].create({
+ 'date_start': date(2022, 6, 16),
+ 'name': 'New Contract for Jules',
+ 'resource_calendar_id': self.calendar_40h.id,
+ 'wage': 5000.0,
+ 'employee_id': self.jules_emp.id,
+ 'state': 'draft',
+ 'kanban_state': 'normal',
+ })
+ new_contract_cdi.state = 'open'
+
+ leaves = self.env['hr.leave'].search([('employee_id', '=', self.jules_emp.id)])
+ self.assertEqual(len(leaves), 3)
+ self.assertEqual(leave.state, 'refuse')
+
+ first_leave = leaves.filtered(lambda l: l.date_from.day == 1 and l.date_to.day == 15)
+ self.assertEqual(first_leave.state, 'validate')
+ self.assertEqual(first_leave.number_of_days, 11)
+
+ second_leave = leaves.filtered(lambda l: l.date_from.day == 16 and l.date_to.day == 30)
+ self.assertEqual(second_leave.state, 'validate')
+ self.assertEqual(second_leave.number_of_days, 11)
+
+ def test_contract_traceability_calculate_nbr_leave(self):
+ """
+ The goal is to test the traceability of contracts in the past,
+ i.e. to check that expired contracts are taken into account
+ to ensure the consistency of leaves (number of days/hours) in the past.
+ """
+ calendar_full, calendar_partial = self.env['resource.calendar'].create([
+ {
+ 'name': 'Full time (5/5)',
+ },
+ {
+ 'name': 'Partial time (4/5)',
+ 'attendance_ids': [
+ (0, 0, {'name': 'Monday Morning', 'dayofweek': '0', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
+ (0, 0, {'name': 'Monday Evening', 'dayofweek': '0', 'hour_from': 13, 'hour_to': 17, 'day_period': 'afternoon'}),
+ (0, 0, {'name': 'Tuesday Morning', 'dayofweek': '1', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
+ (0, 0, {'name': 'Tuesday Evening', 'dayofweek': '1', 'hour_from': 13, 'hour_to': 17, 'day_period': 'afternoon'}),
+ # Does not work on Wednesdays
+ (0, 0, {'name': 'Thursday Morning', 'dayofweek': '3', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
+ (0, 0, {'name': 'Thursday Evening', 'dayofweek': '3', 'hour_from': 13, 'hour_to': 17, 'day_period': 'afternoon'}),
+ (0, 0, {'name': 'Friday Morning', 'dayofweek': '4', 'hour_from': 8, 'hour_to': 12, 'day_period': 'morning'}),
+ (0, 0, {'name': 'Friday Evening', 'dayofweek': '4', 'hour_from': 13, 'hour_to': 17, 'day_period': 'afternoon'})
+ ]
+ },
+ ])
+ employee = self.env['hr.employee'].create({
+ 'name': 'Employee',
+ 'resource_calendar_id': calendar_partial.id,
+ })
+ self.env['hr.contract'].create([
+ {
+ 'name': 'Full time (5/5)',
+ 'employee_id': employee.id,
+ 'date_start': datetime.strptime('2023-01-01', '%Y-%m-%d').date(),
+ 'date_end': datetime.strptime('2023-06-30', '%Y-%m-%d').date(),
+ 'resource_calendar_id': calendar_full.id,
+ 'wage': 1000.0,
+ 'state': 'close', # Old contract
+ 'date_generated_from': datetime.strptime('2023-01-01', '%Y-%m-%d'),
+ 'date_generated_to': datetime.strptime('2023-01-01', '%Y-%m-%d'),
+ },
+ {
+ 'name': 'Partial time (4/5)',
+ 'employee_id': employee.id,
+ 'date_start': datetime.strptime('2023-07-01', '%Y-%m-%d').date(),
+ 'date_end': datetime.strptime('2023-12-31', '%Y-%m-%d').date(),
+ 'resource_calendar_id': calendar_partial.id,
+ 'wage': 1000.0,
+ 'state': 'open', # Current contract
+ 'date_generated_from': datetime.strptime('2023-07-01', '%Y-%m-%d'),
+ 'date_generated_to': datetime.strptime('2023-07-01', '%Y-%m-%d'),
+ },
+ ])
+ leave_type = self.env['hr.leave.type'].create({
+ 'name': 'Leave Type',
+ 'time_type': 'leave',
+ 'requires_allocation': 'yes',
+ 'leave_validation_type': 'hr',
+ 'request_unit': 'day',
+ })
+ allocation = self.env['hr.leave.allocation'].create({
+ 'name': 'Allocation',
+ 'employee_id': employee.id,
+ 'holiday_status_id': leave_type.id,
+ 'number_of_days': 10,
+ 'state': 'confirm',
+ 'date_from': datetime.strptime('2023-01-01', '%Y-%m-%d').date(),
+ 'date_to': datetime.strptime('2023-12-31', '%Y-%m-%d').date(),
+ })
+ allocation.action_validate()
+ leave_during_full_time, leave_during_partial_time = self.env['hr.leave'].create([
+ {
+ 'employee_id': employee.id,
+ 'holiday_status_id': leave_type.id,
+ 'request_date_from': '2023-1-3', # Tuesday
+ 'request_date_to': '2023-1-5', # Thursday
+ },
+ {
+ 'employee_id': employee.id,
+ 'holiday_status_id': leave_type.id,
+ 'request_date_from': '2023-12-5', # Tuesday
+ 'request_date_to': '2023-12-7', # Thursday
+ },
+ ])
+ self.assertEqual(leave_during_full_time.number_of_days_display, 3)
+ self.assertEqual(leave_during_partial_time.number_of_days_display, 2)
+ self.assertEqual(leave_during_full_time.number_of_hours_display, 24)
+ self.assertEqual(leave_during_partial_time.number_of_hours_display, 16)
+ # Simulate the unit change days/hours of the time off type
+ (leave_during_full_time + leave_during_partial_time)._compute_duration()
+ self.assertEqual(leave_during_full_time.number_of_days_display, 3)
+ self.assertEqual(leave_during_partial_time.number_of_days_display, 2)
+ (leave_during_full_time + leave_during_partial_time)._compute_number_of_hours_display()
+ self.assertEqual(leave_during_full_time.number_of_hours_display, 24)
+ self.assertEqual(leave_during_partial_time.number_of_hours_display, 16)
+ # Check after leave approval
+ (leave_during_full_time + leave_during_partial_time).action_approve()
+ (leave_during_full_time + leave_during_partial_time)._compute_number_of_hours_display()
+ self.assertEqual(leave_during_full_time.number_of_hours_display, 24)
+ self.assertEqual(leave_during_partial_time.number_of_hours_display, 16)
diff --git a/tests/test_payslip_holidays_computation.py b/tests/test_payslip_holidays_computation.py
new file mode 100644
index 0000000..e5ef3e5
--- /dev/null
+++ b/tests/test_payslip_holidays_computation.py
@@ -0,0 +1,38 @@
+# # -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from datetime import datetime, date
+
+from odoo.addons.hr_work_entry_holidays.tests.common import TestWorkEntryHolidaysBase
+
+
+class TestPayslipHolidaysComputation(TestWorkEntryHolidaysBase):
+
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+
+ cls.leave_type = cls.env['hr.leave.type'].create({
+ 'name': 'Legal Leaves',
+ 'time_type': 'leave',
+ 'requires_allocation': 'no',
+ 'work_entry_type_id': cls.work_entry_type_leave.id
+ })
+
+ def test_work_data(self):
+ start = datetime(2015, 11, 8, 8, 0)
+ end = datetime(2015, 11, 10, 22, 0)
+ leave = self.env['hr.leave'].create({
+ 'name': 'Doctor Appointment',
+ 'employee_id': self.jules_emp.id,
+ 'holiday_status_id': self.leave_type.id,
+ 'request_date_from': start,
+ 'request_date_to': end,
+ })
+ leave.action_approve()
+
+ work_entries = self.jules_emp.contract_ids.generate_work_entries(date(2015, 11, 10), date(2015, 11, 21))
+ work_entries.action_validate()
+ work_entries = work_entries.filtered(lambda we: we.work_entry_type_id in self.env.ref('hr_work_entry.work_entry_type_attendance'))
+ sum_hours = sum(work_entries.mapped('duration'))
+ self.assertEqual(sum_hours, 59, 'It should count 59 attendance hours') # 24h first contract + 35h second contract
diff --git a/tests/test_performance.py b/tests/test_performance.py
new file mode 100644
index 0000000..31fe439
--- /dev/null
+++ b/tests/test_performance.py
@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from datetime import date, datetime
+
+from odoo.addons.hr_work_entry_holidays.tests.common import TestWorkEntryHolidaysBase
+from odoo.tests.common import users, warmup, tagged
+
+
+@tagged('work_entry_holidays_perf')
+class TestWorkEntryHolidaysPerformance(TestWorkEntryHolidaysBase):
+
+ @classmethod
+ def setUpClass(cls):
+ super(TestWorkEntryHolidaysPerformance, cls).setUpClass()
+ cls.jack = cls.env['hr.employee'].create({'name': 'Jack'})
+ cls.employees = cls.richard_emp | cls.jack
+
+ cls.env['hr.contract'].create([{
+ 'date_start': date(2018, 1, 1),
+ 'date_end': date(2018, 2, 1),
+ 'name': 'Contract for %s' % employee.name,
+ 'wage': 5000.0,
+ 'state': 'open',
+ 'employee_id': employee.id,
+ 'date_generated_from': datetime(2018, 1, 1, 0, 0),
+ 'date_generated_to': datetime(2018, 1, 1, 0, 0),
+ } for employee in cls.employees])
+
+ @users('__system__', 'admin')
+ @warmup
+ def test_performance_leave_validate(self):
+ self.richard_emp.generate_work_entries(date(2018, 1, 1), date(2018, 1, 2))
+ leave = self.create_leave(datetime(2018, 1, 1, 7, 0), datetime(2018, 1, 1, 18, 0))
+
+ with self.assertQueryCount(__system__=101, admin=103): # com 96/97
+ leave.action_validate()
+ leave.action_refuse()
+
+ @users('__system__', 'admin')
+ @warmup
+ def test_performance_leave_write(self):
+ leave = self.create_leave(datetime(2018, 1, 1, 7, 0), datetime(2018, 1, 1, 18, 0))
+
+ with self.assertQueryCount(__system__=30, admin=38):
+ leave.date_to = datetime(2018, 1, 1, 19, 0)
+ leave.action_refuse()
+
+ @users('__system__', 'admin')
+ @warmup
+ def test_performance_leave_create(self):
+ with self.assertQueryCount(__system__=60, admin=60):
+ leave = self.create_leave(datetime(2018, 1, 1, 7, 0), datetime(2018, 1, 1, 18, 0))
+ leave.action_refuse()
+
+ @users('__system__', 'admin')
+ @warmup
+ def test_performance_leave_confirm(self):
+ leave = self.create_leave(datetime(2018, 1, 1, 7, 0), datetime(2018, 1, 1, 18, 0))
+ leave.action_draft()
+ with self.assertQueryCount(__system__=43, admin=42):
+ leave.action_confirm()
+ leave.state = 'refuse'
+
+
+@tagged('work_entry_perf')
+class TestWorkEntryHolidaysPerformancesBigData(TestWorkEntryHolidaysBase):
+
+ @classmethod
+ def setUpClass(cls):
+ super(TestWorkEntryHolidaysPerformancesBigData, cls).setUpClass()
+ cls.company = cls.env['res.company'].create({'name': 'A company'})
+
+ cls.paid_time_off = cls.env['hr.leave.type'].create({
+ 'name': 'Paid Time Off',
+ 'request_unit': 'day',
+ 'leave_validation_type': 'both',
+ 'company_id': cls.company.id,
+ 'requires_allocation': 'no',
+ })
+
+ cls.employees = cls.env['hr.employee'].create([{
+ 'name': 'Employee %s' % i,
+ 'company_id': cls.company.id
+ } for i in range(100)])
+
+ cls.contracts = cls.env['hr.contract'].create([{
+ 'date_start': date(2018, 1, 1),
+ 'date_end': False,
+ 'name': 'Contract for %s' % employee.name,
+ 'wage': 5000.0,
+ 'state': 'open',
+ 'employee_id': employee.id,
+ 'date_generated_from': datetime(2018, 1, 1, 0, 0),
+ 'date_generated_to': datetime(2018, 1, 1, 0, 0),
+ } for employee in cls.employees])
+
+ cls.leaves = cls.env['hr.leave'].create([{
+ 'name': 'Holiday - %s' % employee.name,
+ 'employee_id': employee.id,
+ 'holiday_status_id': cls.paid_time_off.id,
+ 'request_date_from': date(2020, 8, 3),
+ 'request_date_to': date(2020, 8, 7),
+ } for employee in cls.employees])
+ cls.leaves._compute_date_from_to()
+ cls.leaves.action_approve()
+ cls.leaves.action_validate()
+
+ def test_work_entries_generation_perf(self):
+ # Test Case 7: Try to generate work entries for
+ # a hundred employees over a month
+ with self.assertQueryCount(__system__=407, admin=2807): # com: 402 / 2807
+ work_entries = self.contracts.generate_work_entries(date(2020, 7, 1), date(2020, 8, 31))
+
+ # Original work entries to generate when we don't adapt date_generated_from and
+ # date_generated_to when they are equal for old contracts: 138300
+ self.assertEqual(len(work_entries), 8800)
diff --git a/tests/test_work_entry.py b/tests/test_work_entry.py
new file mode 100644
index 0000000..f2d3e7f
--- /dev/null
+++ b/tests/test_work_entry.py
@@ -0,0 +1,230 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from datetime import datetime, date
+from dateutil.relativedelta import relativedelta
+import pytz
+
+from odoo.exceptions import ValidationError
+from odoo.tests.common import tagged
+from odoo.fields import Date
+from odoo.addons.hr_work_entry_holidays.tests.common import TestWorkEntryHolidaysBase
+
+
+@tagged('work_entry')
+class TestWorkeEntryHolidaysWorkEntry(TestWorkEntryHolidaysBase):
+ @classmethod
+ def setUpClass(cls):
+ super(TestWorkeEntryHolidaysWorkEntry, cls).setUpClass()
+ cls.tz = pytz.timezone(cls.richard_emp.tz)
+ cls.start = datetime(2015, 11, 1, 1, 0, 0)
+ cls.end = datetime(2015, 11, 30, 23, 59, 59)
+ cls.resource_calendar_id = cls.env['resource.calendar'].create({'name': 'Zboub'})
+ contract = cls.env['hr.contract'].create({
+ 'date_start': cls.start.date() - relativedelta(days=5),
+ 'name': 'dodo',
+ 'resource_calendar_id': cls.resource_calendar_id.id,
+ 'wage': 1000,
+ 'employee_id': cls.richard_emp.id,
+ 'state': 'open',
+ 'date_generated_from': cls.end.date() + relativedelta(days=5),
+ })
+ cls.richard_emp.resource_calendar_id = cls.resource_calendar_id
+ cls.richard_emp.contract_id = contract
+
+ def test_validate_non_approved_leave_work_entry(self):
+ work_entry1 = self.env['hr.work.entry'].create({
+ 'name': '1',
+ 'employee_id': self.richard_emp.id,
+ 'work_entry_type_id': self.work_entry_type_leave.id,
+ 'contract_id': self.richard_emp.contract_id.id,
+ 'date_start': self.start,
+ 'date_stop': self.end,
+ })
+ self.env['hr.leave'].create({
+ 'name': 'Doctor Appointment',
+ 'employee_id': self.richard_emp.id,
+ 'holiday_status_id': self.leave_type.id,
+ 'request_date_from': self.start.date() - relativedelta(days=1),
+ 'request_date_to': self.start.date(),
+ })
+ self.assertFalse(work_entry1.action_validate(), "It should not validate work_entries conflicting with non approved leaves")
+ self.assertEqual(work_entry1.state, 'conflict')
+
+ def test_refuse_leave_work_entry(self):
+ start = datetime(2015, 11, 1, 9, 0, 0)
+ end = datetime(2015, 11, 3, 13, 0, 0)
+ leave = self.env['hr.leave'].create({
+ 'name': 'Doctor Appointment',
+ 'employee_id': self.richard_emp.id,
+ 'holiday_status_id': self.leave_type.id,
+ 'request_date_from': start,
+ 'request_date_to': start + relativedelta(days=1),
+ })
+ work_entry = self.env['hr.work.entry'].create({
+ 'name': '1',
+ 'employee_id': self.richard_emp.id,
+ 'contract_id': self.richard_emp.contract_id.id,
+ 'work_entry_type_id': self.work_entry_type.id,
+ 'date_start': start,
+ 'date_stop': end,
+ 'leave_id': leave.id
+ })
+ work_entry.action_validate()
+ self.assertEqual(work_entry.state, 'conflict', "It should have an error (conflicting leave to approve")
+ leave.action_refuse()
+ self.assertNotEqual(work_entry.state, 'conflict', "It should not have an error")
+
+ def test_time_week_leave_work_entry(self):
+ # /!\ this is a week day => it exists an calendar attendance at this time
+ leave = self.env['hr.leave'].create({
+ 'name': '1leave',
+ 'employee_id': self.richard_emp.id,
+ 'holiday_status_id': self.leave_type.id,
+ 'request_date_from': date(2015, 11, 2),
+ 'request_date_to': date(2015, 11, 2),
+ 'request_unit_hours': True,
+ 'request_hour_from': '11',
+ 'request_hour_to': '17',
+ })
+ leave.action_validate()
+
+ work_entries = self.richard_emp.contract_id.generate_work_entries(self.start.date(), self.end.date())
+ work_entries.action_validate()
+ leave_work_entry = work_entries.filtered(lambda we: we.work_entry_type_id in self.work_entry_type_leave)
+ sum_hours = sum(leave_work_entry.mapped('duration'))
+
+ self.assertEqual(sum_hours, 5.0, "It should equal the number of hours richard should have worked")
+
+ def test_contract_on_another_company(self):
+ """ Test that the work entry generation still work if
+ the contract is not on the same company than
+ the employee (Internal Use Case)
+ So when generating the work entries in Belgium,
+ there is an issue when accessing to the time off
+ in Hong Kong.
+ """
+ company = self.env['res.company'].create({'name': 'Another Company'})
+
+ employee = self.env['hr.employee'].create({
+ 'name': 'New Employee',
+ 'company_id': company.id,
+ })
+
+ self.env['hr.contract'].create({
+ 'name': 'Employee Contract',
+ 'employee_id': employee.id,
+ 'date_start': Date.from_string('2015-01-01'),
+ 'state': 'open',
+ 'company_id': self.env.ref('base.main_company').id,
+ 'wage': 4000,
+ })
+
+ leave_type = self.env['hr.leave.type'].create({
+ 'name': 'Sick',
+ 'request_unit': 'hour',
+ 'leave_validation_type': 'both',
+ 'requires_allocation': 'no',
+ 'company_id': company.id,
+ })
+ leave1 = self.env['hr.leave'].create({
+ 'name': 'Sick 1 week during christmas snif',
+ 'employee_id': employee.id,
+ 'holiday_status_id': leave_type.id,
+ 'request_date_from': '2019-12-23',
+ 'request_date_to': '2019-12-27',
+ })
+ leave1.action_approve()
+ leave1.action_validate()
+
+ # The work entries generation shouldn't raise an error
+
+ user = self.env['res.users'].create({
+ 'name': 'Classic User',
+ 'login': 'Classic User',
+ 'company_id': self.env.ref('base.main_company').id,
+ 'company_ids': self.env.ref('base.main_company').ids,
+ 'groups_id': [(6, 0, [self.env.ref('hr_contract.group_hr_contract_manager').id, self.env.ref('base.group_user').id])],
+ })
+ self.env['hr.employee'].with_user(user).generate_work_entries('2019-12-01', '2019-12-31')
+
+ def test_work_entries_generation_if_parent_leave_zero_hours(self):
+ # Test case: The employee has a parental leave at 0 hours per week
+ # The employee has a leave during that period
+
+ employee = self.env['hr.employee'].create({'name': 'My employee'})
+ calendar = self.env['resource.calendar'].create({
+ 'name': 'Parental 0h',
+ 'attendance_ids': False,
+ })
+ employee.resource_calendar_id = calendar
+ contract = self.env['hr.contract'].create({
+ 'date_start': self.start.date() - relativedelta(years=1),
+ 'name': 'Contract - Parental 0h',
+ 'resource_calendar_id': calendar.id,
+ 'wage': 1000,
+ 'employee_id': employee.id,
+ 'state': 'open',
+ })
+
+ leave_type = self.env['hr.leave.type'].create({
+ 'name': 'Sick',
+ 'request_unit': 'hour',
+ 'leave_validation_type': 'both',
+ 'requires_allocation': 'no',
+ })
+
+ leave = self.env['hr.leave'].create({
+ 'name': "Sick 1 that doesn't make sense, but it's the prod so YOLO",
+ 'employee_id': employee.id,
+ 'holiday_status_id': leave_type.id,
+ 'request_date_from': date(2020, 9, 4),
+ 'request_date_to': date(2020, 9, 4),
+ })
+
+ # TODO I don't know what this test is supposed to test, but I feel that
+ # in any case it should raise a Validation Error, as it's trying to
+ # validate a leave in a period the employee is not supposed to work.
+ with self.assertRaises(ValidationError), self.cr.savepoint():
+ leave.action_approve()
+ leave.action_validate()
+
+ work_entries = contract.generate_work_entries(date(2020, 7, 1), date(2020, 9, 30))
+
+ self.assertEqual(len(work_entries), 0)
+
+ def test_work_entries_leave_if_leave_conflict_with_public_holiday(self):
+ date_from = datetime(2023, 2, 1, 0, 0, 0)
+ date_to = datetime(2023, 2, 28, 23, 59, 59)
+ work_entry_type_holiday = self.env['hr.work.entry.type'].create({
+ 'name': 'Public Holiday',
+ 'is_leave': True,
+ 'code': 'LEAVETEST500'
+ })
+ self.env['resource.calendar.leaves'].create({
+ 'name': 'Public Holiday',
+ 'date_from': datetime(2023, 2, 6, 0, 0, 0),
+ 'date_to': datetime(2023, 2, 7, 23, 59, 59),
+ 'calendar_id': self.richard_emp.resource_calendar_id.id,
+ 'work_entry_type_id': work_entry_type_holiday.id,
+ })
+ leave = self.env['hr.leave'].create({
+ 'name': 'AL',
+ 'employee_id': self.richard_emp.id,
+ 'holiday_status_id': self.leave_type.id,
+ 'request_date_from': date(2023, 2, 3),
+ 'request_date_to': date(2023, 2, 9),
+ })
+ leave.action_validate()
+
+ self.richard_emp.generate_work_entries(date_from, date_to, True)
+ work_entries = self.env['hr.work.entry'].search([
+ ('employee_id', '=', self.richard_emp.id),
+ ('date_stop', '>=', date_from),
+ ('date_start', '<=', date_to),
+ ('state', '!=', 'validated')])
+ leave_work_entry = work_entries.filtered(lambda we: we.work_entry_type_id in self.work_entry_type_leave)
+ self.assertEqual(leave_work_entry.leave_id.id, leave.id, "Leave work entry should have leave_id value")
+
+ public_holiday_work_entry = work_entries.filtered(lambda we: we.work_entry_type_id == work_entry_type_holiday)
+ self.assertEqual(len(public_holiday_work_entry.leave_id), 0, "Public holiday work entry should not have leave_id")
diff --git a/views/hr_leave_type_views.xml b/views/hr_leave_type_views.xml
new file mode 100644
index 0000000..84bfe13
--- /dev/null
+++ b/views/hr_leave_type_views.xml
@@ -0,0 +1,12 @@
+
+
+
+ hr.leave.type
+
+
+
+
+
+
+
+
diff --git a/views/hr_leave_views.xml b/views/hr_leave_views.xml
new file mode 100644
index 0000000..828e9fb
--- /dev/null
+++ b/views/hr_leave_views.xml
@@ -0,0 +1,31 @@
+
+
+
+
+ work_entry.type.leave.form.inherit
+ hr.leave.type
+
+
+
+
+
+
+
+
+
+
+
+
+
+ hr.holidays.view.tree.inherit.work.entry
+ hr.leave
+
+ primary
+
+
+ date_from
+
+
+
+
+