From 2b7912125c17f7eb411ec44bc3bcfa85a1b8ad09 Mon Sep 17 00:00:00 2001 From: arpi-odoo Date: Mon, 27 Oct 2025 15:41:17 +0100 Subject: [PATCH 1/9] [FIX] hr: new contract button invisible --- .../src/components/button_new_contract/button_new_contract.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hr/static/src/components/button_new_contract/button_new_contract.xml b/addons/hr/static/src/components/button_new_contract/button_new_contract.xml index cb5594de67892..ff1d8447bf582 100644 --- a/addons/hr/static/src/components/button_new_contract/button_new_contract.xml +++ b/addons/hr/static/src/components/button_new_contract/button_new_contract.xml @@ -3,7 +3,7 @@ + t-ref="datetime-picker-target-new-contract">New Contract From 7584c84e1d5fa6ddfb6733743633b70897efa26a Mon Sep 17 00:00:00 2001 From: arpi-odoo Date: Tue, 28 Oct 2025 10:12:15 +0100 Subject: [PATCH 2/9] [IMP] hr_skills: cleanup certification reporting --- ...hr_employee_certification_report_views.xml | 24 +++++++++++++++++++ .../report/hr_employee_skill_report_views.xml | 2 +- addons/hr_skills/views/hr_views.xml | 8 ++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/addons/hr_skills/report/hr_employee_certification_report_views.xml b/addons/hr_skills/report/hr_employee_certification_report_views.xml index 779796d0449fe..079ef1f790fd9 100644 --- a/addons/hr_skills/report/hr_employee_certification_report_views.xml +++ b/addons/hr_skills/report/hr_employee_certification_report_views.xml @@ -44,4 +44,28 @@ + + + Certification + hr.employee.certification.report + + list,pivot + { + 'search_default_employee': 1, + } + +

+

+ This report will give you an overview of the certification per Employee. + Create them in configuration and add them on the Employee. +

+
+
+ + diff --git a/addons/hr_skills/report/hr_employee_skill_report_views.xml b/addons/hr_skills/report/hr_employee_skill_report_views.xml index 86b997da5ffbb..bddca497eb6ef 100644 --- a/addons/hr_skills/report/hr_employee_skill_report_views.xml +++ b/addons/hr_skills/report/hr_employee_skill_report_views.xml @@ -89,6 +89,6 @@ id="hr_employee_skill_inventory_report_menu" name="Skills Inventory" action="hr_employee_skill_report_action" - parent="hr.hr_menu_hr_reports" + parent="hr_skills.hr_employee_skill_report_menu" sequence="15"/> diff --git a/addons/hr_skills/views/hr_views.xml b/addons/hr_skills/views/hr_views.xml index 3e6e8d47e4ca9..d90f958e3c858 100644 --- a/addons/hr_skills/views/hr_views.xml +++ b/addons/hr_skills/views/hr_views.xml @@ -593,7 +593,7 @@ hr.employee.skill certifications [('is_certification', '=', True)] - {'show_employee': True} + {'show_employee': True, 'search_default_group_by_type': 1} list,form + + Date: Tue, 28 Oct 2025 13:49:16 +0100 Subject: [PATCH 3/9] [IMP] hr_payroll: constraint positive wage --- addons/hr/models/hr_version.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/addons/hr/models/hr_version.py b/addons/hr/models/hr_version.py index dc0db8c913f95..93a658d9321d6 100644 --- a/addons/hr/models/hr_version.py +++ b/addons/hr/models/hr_version.py @@ -195,11 +195,6 @@ def _get_hr_responsible_domain(self): 'An employee cannot have multiple active versions sharing the same effective date.', ) - _check_wage_positive = models.Constraint( - 'CHECK(wage >= 0)', - 'The wage must be a positive value.', - ) - @api.depends('employee_id.company_id') def _compute_company_id(self): for version in self: From 96c5fe9c5ed01f4dd27f401e3214a43b845dba76 Mon Sep 17 00:00:00 2001 From: arpi-odoo Date: Wed, 29 Oct 2025 14:08:21 +0100 Subject: [PATCH 4/9] [FIX] hr_holidays: fix traceback leave type --- addons/hr_holidays/models/hr_leave_type.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/hr_holidays/models/hr_leave_type.py b/addons/hr_holidays/models/hr_leave_type.py index dd65558ae9c06..a01f11cb2e07a 100644 --- a/addons/hr_holidays/models/hr_leave_type.py +++ b/addons/hr_holidays/models/hr_leave_type.py @@ -272,14 +272,14 @@ def _search_max_leaves(self, operator, value): return [('id', 'in', valid_leaves)] def _search_virtual_remaining_leaves(self, operator, value): - def is_valid(leave_type): - return not leave_type.requires_allocation or op(leave_type.virtual_remaining_leaves, value) op = PY_OPERATORS.get(operator) if not op: return NotImplemented if operator != 'in': value = float(value) leave_types = self.env['hr.leave.type'].search([]) + def is_valid(leave_type): + return not leave_type.requires_allocation or op(leave_type.virtual_remaining_leaves) return [('id', 'in', leave_types.filtered(is_valid).ids)] @api.depends_context('employee_id', 'default_employee_id', 'leave_date_from', 'default_date_from') From 9f1162291504cc4dc3de1e4606ac6a32871dc9a8 Mon Sep 17 00:00:00 2001 From: arpi-odoo Date: Wed, 29 Oct 2025 14:44:15 +0100 Subject: [PATCH 5/9] [FIX] hr: fix delete version --- addons/hr/models/hr_employee.py | 3 +-- addons/hr/tests/test_hr_version.py | 21 --------------------- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/addons/hr/models/hr_employee.py b/addons/hr/models/hr_employee.py index b470d2d7f557e..dc20f57822e22 100644 --- a/addons/hr/models/hr_employee.py +++ b/addons/hr/models/hr_employee.py @@ -495,8 +495,7 @@ def _compute_legal_name(self): @api.depends('current_version_id') @api.depends_context('version_id') def _compute_version_id(self): - context_version_id = self.env.context.get('version_id', False) - context_version = self.env['hr.version'].browse(context_version_id).exists() if context_version_id else self.env['hr.version'] + context_version = self.env['hr.version'].browse(self.env.context.get('version_id', False)) for employee in self: if context_version.employee_id == self: diff --git a/addons/hr/tests/test_hr_version.py b/addons/hr/tests/test_hr_version.py index a2b8e3ab298c2..ab585bc77163f 100644 --- a/addons/hr/tests/test_hr_version.py +++ b/addons/hr/tests/test_hr_version.py @@ -520,27 +520,6 @@ def test_multi_edit_other_and_contract_date_sync(self): self.assertEqual(version.job_id.id, jobB.id) self.assertEqual(version.contract_date_end, date(2020, 9, 30)) - def test_delete_version(self): - employee = self.env['hr.employee'].create({ - 'name': 'John Doe', - 'date_version': '2020-01-01', - }) - v1 = employee.version_id - v2 = employee.create_version({ - 'date_version': '2021-01-01', - }) - v3 = employee.create_version({ - 'date_version': '2022-01-01', - }) - self.assertEqual(employee.current_version_id, v3) - - v3.unlink() - self.assertEqual(employee.current_version_id, v2) - v1.unlink() - self.assertEqual(employee.current_version_id, v2) - with self.assertRaises(ValidationError): - v2.unlink() - def test_multi_edit_multi_employees_no_contract(self): """ Test the multi-edit when there is one version per employee, without contract From af46c2ae194b16327ceec62b39e2a61de366f693 Mon Sep 17 00:00:00 2001 From: arpi-odoo Date: Wed, 29 Oct 2025 14:54:31 +0100 Subject: [PATCH 6/9] [FIX] hr: fix various bugs --- addons/hr_holidays/models/hr_leave_type.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/hr_holidays/models/hr_leave_type.py b/addons/hr_holidays/models/hr_leave_type.py index a01f11cb2e07a..8cedee4bed916 100644 --- a/addons/hr_holidays/models/hr_leave_type.py +++ b/addons/hr_holidays/models/hr_leave_type.py @@ -278,6 +278,7 @@ def _search_virtual_remaining_leaves(self, operator, value): if operator != 'in': value = float(value) leave_types = self.env['hr.leave.type'].search([]) + def is_valid(leave_type): return not leave_type.requires_allocation or op(leave_type.virtual_remaining_leaves) return [('id', 'in', leave_types.filtered(is_valid).ids)] From 6ce5b8304500540b9ff334146a19b289f998b585 Mon Sep 17 00:00:00 2001 From: arpi-odoo Date: Mon, 3 Nov 2025 14:59:10 +0100 Subject: [PATCH 7/9] [IMP] empty From 1a3087944523300ada7b7114ba73c69f40fa4237 Mon Sep 17 00:00:00 2001 From: "Mohamed (moaln)" Date: Mon, 3 Nov 2025 13:57:41 +0100 Subject: [PATCH 8/9] [FIX] hr: fix new contract button visibility Made the new contract button invisible when no contract start date Task 5231718 --- .../src/components/button_new_contract/button_new_contract.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hr/static/src/components/button_new_contract/button_new_contract.xml b/addons/hr/static/src/components/button_new_contract/button_new_contract.xml index ff1d8447bf582..cb5594de67892 100644 --- a/addons/hr/static/src/components/button_new_contract/button_new_contract.xml +++ b/addons/hr/static/src/components/button_new_contract/button_new_contract.xml @@ -3,7 +3,7 @@ + t-ref="datetime-picker-target-new-contract" t-if="props.record.data.contract_date_start">New Contract From dc29dc6fefb5a2ca74775cb8551f51c5ec7d2fa3 Mon Sep 17 00:00:00 2001 From: "Mohamed (moaln)" Date: Thu, 6 Nov 2025 09:54:31 +0100 Subject: [PATCH 9/9] [FIX] hr_holidays: fix time off type error in time off form view 1. Go to **Time Off > Configuration > Time Off Types**. 2. Open a type and click the "Time Off" smart button. 3. Click **New**. 4. An error appears. [[Reference Video](https://drive.google.com/file/d/1vi_apL24Km5tSomQtwcTArqqWvrBR5ni/view)] In the `_search_virtual_remaining_leaves` method, the code tries to use an operator (like `>`) to compare the `virtual_remaining_leaves`. This operator requires **two** arguments to work. However, the code was only passing **one** argument, missing the `value` to compare against. This caused the "expects 2 arguments" error. Passed the missing `value` to the operator call so the comparison can be completed correctly. Task: 5241685 --- addons/hr_holidays/models/hr_leave_type.py | 2 +- .../hr_holidays/tests/test_hr_leave_type.py | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/addons/hr_holidays/models/hr_leave_type.py b/addons/hr_holidays/models/hr_leave_type.py index 8cedee4bed916..f93d621cc8a73 100644 --- a/addons/hr_holidays/models/hr_leave_type.py +++ b/addons/hr_holidays/models/hr_leave_type.py @@ -280,7 +280,7 @@ def _search_virtual_remaining_leaves(self, operator, value): leave_types = self.env['hr.leave.type'].search([]) def is_valid(leave_type): - return not leave_type.requires_allocation or op(leave_type.virtual_remaining_leaves) + return not leave_type.requires_allocation or op(leave_type.virtual_remaining_leaves, value) return [('id', 'in', leave_types.filtered(is_valid).ids)] @api.depends_context('employee_id', 'default_employee_id', 'leave_date_from', 'default_date_from') diff --git a/addons/hr_holidays/tests/test_hr_leave_type.py b/addons/hr_holidays/tests/test_hr_leave_type.py index b7732013987c5..b13b589c53ad1 100644 --- a/addons/hr_holidays/tests/test_hr_leave_type.py +++ b/addons/hr_holidays/tests/test_hr_leave_type.py @@ -114,3 +114,27 @@ def test_users_tz_shift_back(self): ).search([('has_valid_allocation', '=', True)], limit=1) self.assertFalse(leave_types, "Got valid leaves outside vaild period") + + def test_search_virtual_remaining_leaves(self): + employee_id = self.env['hr.employee'].create({'name': 'Test Employee'}) + leave_type1, leave_type2 = self.env['hr.leave.type'].create([ + { + 'name': 'Leave type 1', + 'time_type': 'leave', + 'requires_allocation': True, + }, { + 'name': 'Leave type 2', + 'time_type': 'leave', + 'requires_allocation': True, + }, + ]) + self.env['hr.leave.allocation'].create([{ + 'name': 'Leave type 1 allocation', + 'holiday_status_id': leave_type1.id, + 'number_of_days': 1, + 'employee_id': employee_id.id, + 'state': 'confirm', + }]).action_approve() + leave_type_ids = self.env['hr.leave.type'].with_context(employee_id=employee_id.id).search([('virtual_remaining_leaves', '>', 0)]) + self.assertIn(leave_type1, leave_type_ids) + self.assertNotIn(leave_type2, leave_type_ids)