Tuesday, March 17, 2026
15 changes · master
Resolved issues and error corrections
This update resolves several issues related to the integration of Field Service into planning, improving access to intervention portals and enhancing the user experience within the Field Service module. Key changes include streamlined portal access, improved reporting, and enhanced functionality for scheduling and communication.
Original PR description
[FIX] planning_field_service: fix follow-up (round 4) This commit continues to fix the various issues found due to the refactoring of Field Service feature to integrate it into planning instead of…
[FIX] planning_field_service: fix follow-up (round 4) This commit continues to fix the various issues found due to the refactoring of Field Service feature to integrate it into planning instead of being an extension of project. This commit will: - fix 'Print' action and ticket to intervention portal access - always display in range mode for planned dates in planning.slot view - update billable and non-billable filters to take into account `under_warranty` field - review search view of planning.slot, some filters have been renamed and moved. - use employees instead of resources in portal list (no need to display the material resource in the portal views in other words) - add "Send mail", "Send SMS", "Send Report" and "Add/Remove followers" buttons in cog menu of list and kanban views of planning.slot model. - remove helper in ticket button since it does not bring useful information. - add ticket description on related shift, when the user plans an intervention from a helpdesk ticket, the new shift created from that action, will have the description of the related ticket inside Note field (name field) - fix display_name, to avoid displaying the field used in the group by in the display name since it is a bit redundant - take into account worksheet set in product as default - fix some labels, visibility conditions, dates format, group_expand - add default company of the slot when the user creates a resource from the form view of planning.slot model - show customer preview stat button once the intervention is completed and a report is available for that intervention - update tooltip for employee product to bring more context to explain how that new field works. - make sure the SOL for timesheet is not generated when we complete an intervention if the project linked is non billable - add icon on stat button of timesheet - make sure the user can only create service product in product field in employee - show "X Products" button to non sale user in the form view of planning.slot - make project billable and timesheetable by default when the user wants to create a new project from the project_id field inside the form view of planning.slot model - hide schedule stat button in the form view of project.task if the task is a template or linked to a project template - update visibility condition of sign in in calendar, to make visible for planning manager when the slot is published even if the shift is not assigned to that user and the slot is in the past. task-6009593 Forward-Port-Of: odoo/enterprise#110178
This update fixes an issue where payslips weren't properly connected to their corresponding pay runs. Now, when a payslip is added to a pay run, it's correctly linked to the employee version, ensuring accurate payroll processing. This improves data integrity and reporting.
Original PR description
**Description** . When creating or adding a payslip to a Pay Run, the corresponding employee version (contract record) was not being linked to the Pay Run's version_ids. Instead it include all the employee versions **Implementation** . Link payslip's version_ids to payrun . Remove create() method . Add dates constraints . Add corresponding tests task-5959481
This update optimizes the process of deleting `mail.activity` and `mail.message` records linked to `voip.call` records. Previously, a slow scan of the database occurred, impacting performance. Adding an index significantly speeds up these deletions, resulting in faster database operations.
Original PR description
Description ----------- Commit odoo/enterprise@5751f93c53d3cf37ae8cb627fb8d10a81b7b8833 adds a few new `Many2one` fields, but they're are not indexed, leading to a `Seq.Scan` on `voip.call` when deleting a `mail.activity` or `mail.message`, whos tables are usually large. This commit adds an index on the fields to speed up the deletion. Benchmark --------- Deletion of a `mail.activity` on a database with a `voip.call` table with ~13M rows. (on hot) | Before | After | |--------|---------| | 2.3s | 0.85 ms | Forward-Port-Of: odoo/enterprise#110707 Forward-Port-Of: odoo/enterprise#110622
This update resolves an issue where rental income was incorrectly included in the Total Income batch calculation for Hong Kong payroll. The fix removes these rental amounts, ensuring more accurate payroll reporting and compliance with local tax regulations. This improves the reliability of financial data within the Odoo Enterprise system.
Original PR description
. Removing any rental amounts in calculating Total Income batch task-6006636 Forward-Port-Of: odoo/enterprise#110730 Forward-Port-Of: odoo/enterprise#109919
This update allows portal users to upload attachments to knowledge articles. Previously, access restrictions prevented this functionality. This change improves the user experience by enabling users to share richer content within the knowledge base.
Original PR description
Previously, portal users were unable to upload attachments due to access restrictions on ir.attachments. This task overrides those access rights, allowing portal users to upload attachments. Task-4334962
This update adds a warning to salary rules in Odoo when critical fields are missing from their XML definitions. This prevents unexpected runtime values from being used, ensuring accurate payroll calculations. The system automatically backfills existing rules with these missing fields to maintain data integrity.
Original PR description
Reset cron restores salary rules from XML values. If reset-critical fields are omitted in explicit rule definitions, cron can keep unexpected runtime values instead of restoring intended defaults.…
Reset cron restores salary rules from XML values.
If reset-critical fields are omitted in explicit rule definitions, cron can keep
unexpected runtime values instead of restoring intended defaults.
This change does 2 things:
- adds create-time warning for missing reset-critical explicit fields
- backfills existing standard/localization salary rule XML records with those
fields
Warning scope:
- selector fields: condition_select, amount_select
- amount-dependent: quantity (for fix/percentage)
- property_input technical fields only (kept strict, low-noise)
- excludes cosmetic fields (name/description/section/etc.) to avoid warning
noise
Example:
```
<record id="l10n_au_ote_structure_1" model="hr.salary.rule">
<field name="category_ids"
eval="[(6, 0, [ref('l10n_au_hr_payroll.rule_category_ote')])]"/>
<field name="name">Ordinary Time Earnings</field>
<field name="code">OTE</field>
<field name="sequence">20</field>
+ <field name="condition_select">none</field>
<field name="amount_select">code</field>
<field name="amount_python_compute">
...
</field>
</record>
```
Example (amount-dependent quantity):
```
<record id="some_fixed_rule" model="hr.salary.rule">
<field name="condition_select">none</field>
<field name="amount_select">fix</field>
+ <field name="quantity">1.0</field>
<field name="amount_fix">1000.0</field>
</record>
```
task-6033101This update enforces a critical rule: each pay structure must have unique salary rule codes. Previously, duplicate codes caused errors, and the system would use only one. Now, a validation error alerts users to duplicates, and the system adds '(copy)' to the code to differentiate them, ensuring accurate payroll calculations.
Original PR description
Before: - Salary rules with the same code could exist in the same pay structure. - Only one of them was used during payroll computation. - Duplicated salary rules kept the same code. After: - Salary rule codes must be unique within a pay structure. - A validation error is shown when a duplicate code is used. - Duplicated salary rules now get `(copy)` added to the code. task-5424386
This update resolves an issue where the annual report generated from the accountant_knowledge module was not fully translated, displaying only the title and index in the selected language. By restoring the original field definition, the full content of the report sections is now correctly translated, ensuring consistent localization for all users.
Original PR description
### Issue before this commit: When changing the system language, the annual report generated from the accountant_knowledge module was only partially translated. While the index and article titles…
### Issue before this commit: When changing the system language, the annual report generated from the accountant_knowledge module was only partially translated. While the index and article titles were correctly displayed in the selected language, the content of each section remained in English. This behavior was also visible in the exported PDF version of the report, resulting in a document where only structural elements were localized while the body text of the report sections was not. ### Steps to reproduce the issue: 1. Install another language than english and switch to that one 2. Install Accounting app and audit modules 3. Go to Accounting > Revision > Annual Report 4. Create an Annual Report and click on it 5. Index is in the correct language but the text inside a title is not ### Cause of the issue: The issue was caused by a modification in the knowledge_article model where the template_body field definition was changed. In the previous implementation, the field was defined as a Text field with translate=html_translate, which allowed the HTML content of the template body to be extracted and processed by Odoo’s translation system. In the modified version, the field was converted to an Html field without specifying the translate parameter. As a result, the content stored in template_body was no longer marked as translatable, preventing the translation extraction mechanism from generating translation entries for the article body. ### Reason to introduce the fix: Restoring the translation capability for the template_body field ensures that the full content of the annual report can be localized according to the user’s selected language. opw-5958383
This update fixes a potential issue where incorrect payroll property settings could lead to inconsistent payroll calculations. The change enforces validation rules to prevent setting properties on incompatible salary rules, ensuring more reliable and accurate payroll processing. This improves the overall stability and trustworthiness of the Odoo Enterprise payroll system.
Original PR description
Issue: - Payroll properties could be set on salary rules not configured for employee inputs, leading to inconsistent behavior during payroll computation. Fix: - Raise a validation error when attempting to set a payroll property on an invalid salary rule. - Remove incorrect test usages relying on unsupported salary rules. - Align payroll property update logic with employee input configuration. Task: 5410254
This update fixes an issue where users could successfully cancel subscriptions that already had invoices generated. The change adds a check to ensure subscriptions with active invoices cannot be cancelled after they've been closed, preventing potential revenue discrepancies. This ensures accurate subscription management and billing.
Original PR description
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to…
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to cancel the subscription * A ValidationError is correctly raised 5. Close the subscription by selecting any close (churn) reason 6. Attempt to cancel the same closed subscription again Observation: -------------------------------- The subscription is successfully cancelled even though it already has invoices Issue: -------------------------------- In the following code: https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/sale_subscription/models/sale_order.py#L741-L742 The cancellation logic does not check whether a subscription is already churned and still has active invoices Solution: -------------------------------- Added an additional condition to prevent cancelling churned subscriptions that still have active invoices opw-5479719 Forward-Port-Of: odoo/enterprise#109755 Forward-Port-Of: odoo/enterprise#106596
This update resolves a delay issue experienced on iOS devices when interacting with the Point of Sale system. The fix involves adjusting how the system responds to user touches, specifically addressing differences between iOS and Android devices. Additionally, pinch-zoom functionality has been temporarily disabled to ensure optimal performance.
Original PR description
On IOS devices, there was a latency issue when hitting different elements in the POS and self. Actually, the issue is because IOS devices don't react in the same way as Android devices. IOS adds a delay of +/-300ms when the element is not considered as a button. Instead of replacing a lot of elements with a button element we can add the parameter role="button". I also disabled the pinch zoom in the POS, self and preparation display. It's mandatory to add the parameter touch-action: pan-x pan-y to the * selector. task: 5976364 community pr : https://github.com/odoo/odoo/pull/251198 Forward-Port-Of: odoo/enterprise#110627 Forward-Port-Of: odoo/enterprise#109483
This update resolves an issue where employee skills weren't being copied to newly created appraisals generated by the automated appraisal process. The fix adds a necessary step to ensure skills are correctly populated when appraisals are initially created in the 'pending' state, guaranteeing accurate appraisal data.
Original PR description
Steps to reproduce: ------------------------------------- 1. Install `hr_appraisal_skills` module 2. Create a new employee and assign at least one skill to the employee 3. Set the Next Appraisal Date…
Steps to reproduce: ------------------------------------- 1. Install `hr_appraisal_skills` module 2. Create a new employee and assign at least one skill to the employee 3. Set the Next Appraisal Date to today 4. Go to Scheduled Actions > Appraisal: Run employee appraisal > Run Manually 5. Open the newly created appraisal for the employee Observation: ------------------------------------- In the Skills tab, the employee's skills are not populated even though the appraisal is already in the confirmed stage Issue: ------------------------------------- When the cron `_run_employee_appraisal_plans` creates an appraisal, it is created directly in `pending` state via `create()`. The skill-copying logic only lived in the `write()` override, which triggers on state transitions from 'new' to 'pending'. Since `create()` bypasses `write()`, Employee skills were never copied to cron-created appraisals https://github.com/odoo/enterprise/blob/451dce92a087086fc3d5d5f610626312f32bcd13/hr_appraisal_skills/models/hr_skills.py#L12-L15 Solution: ------------------------------------- Add a `create()` override to call `_copy_skills_when_confirmed` when an appraisal is created directly in the `pending` state, ensuring employee skills are properly copied. opw-5491433 Forward-Port-Of: odoo/enterprise#110601 Forward-Port-Of: odoo/enterprise#107760
This update fixes an issue where the system incorrectly calculated demand for dependent components within the MRP planning process. Previously, it defaulted to the oldest BoM, leading to inaccurate forecasts. Now, the system uses the BoM selected by the user within the MPS, ensuring accurate demand calculations and updated component quantities.
Original PR description
## Issue: When computing the product tree, the system would use `_bom_find` to find the BoM. However, it's possible to have multiple BoM for the same product, and the user should have chosen which…
## Issue:
When computing the product tree, the system would use `_bom_find` to find the BoM. However, it's possible to have multiple BoM for the same product, and the user should have chosen which BoM he wants to use. `_bom_find` ignores the user configuration in MPS, and simply select the first (oldest) BoM in the list. This means that the components in the MPS would not be correctly updated.
---
## How to reproduce:
https://github.com/user-attachments/assets/c7e6f4d4-332a-4e2b-a40a-1b831daeb6c8
- Create Products FNS & CMP
- Create BoM for FNS without bom line (V1)
- Create BoM for FNS with CMP in bom lines (V2)
- Add FNS to MPS using bom V2
- Set Forecast Qty of FNS to 10
- => Indirect Demand Qty for CMP is not shown (because it's 0)
---
## Test Result without fix:
```
2026-03-05 15:00:24,601 52396 INFO oes_test_18.0 odoo.addons.mrp_mps.tests.test_mrp_mps: Starting TestMpsMps.test_indirect_multiple_boms ...
2026-03-05 15:00:24,742 52396 INFO oes_test_18.0 odoo.addons.mrp_mps.tests.test_mrp_mps: ======================================================================
2026-03-05 15:00:24,742 52396 ERROR oes_test_18.0 odoo.addons.mrp_mps.tests.test_mrp_mps: FAIL: TestMpsMps.test_indirect_multiple_boms
Traceback (most recent call last):
File "/home/odoo/Odoo/src/18.0/enterprise/mrp_mps/tests/test_mrp_mps.py", line 1556, in test_indirect_multiple_boms
self.assertEqual(forecast_cmp['forecast_ids'][0]['indirect_demand_qty'], 10)
AssertionError: 0.0 != 10
```
---
OPW-5979738
Forward-Port-Of: odoo/enterprise#110526
Forward-Port-Of: odoo/enterprise#109693This update fixes a performance issue in the Web Studio module by ensuring binary asset bundles are pregenerated during test runs. Previously, tests repeatedly regenerated these bundles, slowing down the testing process. Now, bundles are created once and reused, significantly improving test execution speed and stability.
Original PR description
The commit odoo/odoo@a5c02da5c24bfc85b3bbb7d1410d489d3c7185b8 introducing binary asset bundle support overlooked the pregeneration of said bundles for the tests runs. This leads to hot-regeneration of those bundles during tests runs on the runbot (multiple hundreds of times) instead of only once and reusing them. This commit adds support for those binary bundles during pregeneration. Forward-Port-Of: odoo/enterprise#110555
This update fixes a key issue preventing UK users from correctly setting up their Stripe accounts for expense reimbursement. The team added specific instructions for UK account creation and implemented a secondary check for Euro currency settings to ensure users in the UK receive the appropriate funding instructions. This improves the user experience and ensures compliance with Stripe's UK implementation.
Original PR description
### [IMP] hr_expense_stripe: Rework tests for UK Rework the test framework to handle the United Kingdom specific tests ### [FIX] hr_expense_stripe: Fix UK account creation Add UK account creation funding instructions as it was made available to us by Stripe ### [FIX] hr_expense_stripe: Fix funding instruction EU Before this commit: The funding instructions were using the country group Europe as a reference to see if the country should use the EU funding instructions The issue comes from the fact that a lot of people remove their country from that country group, locking themselves out of stripe issuing EU. This adds second way of telling the user is in the EU flow if their stripe currency is set to Euros. Forward-Port-Of: odoo/enterprise#110416 Forward-Port-Of: odoo/enterprise#109667