Daily updates from Odoo
Thursday, July 16, 2026
9 changes · master
Enhancements to existing features
The Sendcloud delivery setting previously called "Use Batch Shipping" is now named "Use Multicollo". This aligns the wording in Odoo with Sendcloud terminology, reducing customer confusion without changing the underlying functionality.
Original PR description
In order to avoid confusion for the customer, "Use Batch Shipping" was renamed to "Use Multicollo".This way it is consistent with the terminology used by Sendcloud. task-6048477 Forward-Port-Of: odoo/enterprise#123195 Forward-Port-Of: odoo/enterprise#122133
Resolved issues and error corrections
Live field service maps no longer recalculate routes when the current user's position changes, because those routes are based on worker pins instead. This reduces unnecessary processing and helps preserve routing service tokens without changing the visible route behavior.
Original PR description
The routing fetching in `updateUserPosition` of the `MapModel` should not be triggered for the live map. Right now, when changing user position, the routes are fetched again. However, for the live map, this should have no effect on routes, as they start from the user pins instead of the current user's position. This will avoid computing all over routes and preserve tokens. task-6307279 Forward-Port-Of: odoo/enterprise#123536 Forward-Port-Of: odoo/enterprise#123294
Subscription products that also allow one-time purchases now display the original price with a strikethrough next to the Buy Once price. This makes discounts or price comparisons clearer for shoppers and helps avoid confusion on product pages.
Original PR description
Version - saas-19.1 Steps to reproduce: - Enable 'Accept One Time Sale' on a subscription product - Open the product page on the website Issue: For subscription products with one time sale enabled, the original price was not shown as a strikethrough next to the Buy Once price. Fix: - Captured and exposed the original price to the template before it gets overwritten during subscription price processing - Added the missing strikethrough element to the Buy Once section of the product page Task ID - 6260207 Forward-Port-Of: odoo/enterprise#123977 Forward-Port-Of: odoo/enterprise#119488
The timesheet activity assistant no longer shows an empty Unmatched section when all items in that section are filtered out as away-from-keyboard events. This keeps the assistant cleaner and avoids confusing users with a header that has no visible content.
Original PR description
The Unmatched group's header renders even when its only entries are afk events, since those are filtered out at display time but still counted when checking if the group has content. With this PR, we first check if a group has visible content before displaying the header Task-6348666 Forward-Port-Of: odoo/enterprise#123286 Forward-Port-Of: odoo/enterprise#122858
Payroll rule parameters are now safely copied before use, preventing one process from accidentally altering cached values used by another. This reduces the risk of hard-to-trace payroll calculation issues caused by shared internal data.
Original PR description
Cached functions with `@ormcache` should not return immutable values, yet `_get_parameter_from_code()` could return dicts/sets/lists/etc. It could lead to very obscure bugs such as: ```python def…
Cached functions with `@ormcache` should not return immutable values, yet `_get_parameter_from_code()` could return dicts/sets/lists/etc.
It could lead to very obscure bugs such as:
```python
def some_innocent_code():
category_dict = self.env["hr.rule.parameter"]._get_parameter_from_code('l10n_be_work_entry_categories')
incapacity_codes = category_dict['partial_incapacity']
incapacity_codes |= category_dict['total_incapacity']
# ... then use incapacity_codes
def print_rule_param():
print(self.env["hr.rule.parameter"]._get_parameter_from_code('l10n_be_work_entry_categories')['partial_incapacity'])
print_rule_param() # OrderedSet(['LEAVE281'])
some_innocent_code()
print_rule_param() # OrderedSet(['LEAVE281', 'LEAVE264', 'LEAVE266', 'LEAVE217', 'LEAVE218', 'LEAVE219', 'MEDIC01'])
```
The solution was to either deepcopy the returned value each time, or to change all the rule parameters to their frozen equivalent. Since we don't have access to frozen objects in rule parameters's xml definitions, we opted for the deepcopy approach.
task-6329380
Forward-Port-Of: odoo/enterprise#124134
Forward-Port-Of: odoo/enterprise#123058This fix prevents an error when users remove the start or end date from a Field Service planning shift. The system now checks that required date values are present before recalculating break time, making shift editing more reliable.
Original PR description
before: when removing the start and end date of a shift, a trace back happens in the `_onchange_break_time` cause: it depends on the start and end date values, so it breaks when they are falsy after: apply a guard to the `_onchange_break_time` function to check on those fields to avoid breaking it --- task-6361418 Forward-Port-Of: odoo/enterprise#123926 Forward-Port-Of: odoo/enterprise#123273
This change adjusts internal automated tests for Field Service planning with sales and timesheets so they run at the correct stage and avoid false warnings. It helps keep quality checks stable without changing day-to-day product behavior for users.
Original PR description
Before this commit, the `TestFsmFlowSaleAtInstall.test_fsm_flow` test throws a warning because of chart template in accounting, the reason is because all tests using accounting test class have to be executed in post_install to avoid having unexpected issue. This commit moves the test in post_install and skip the test is `planning_field_service_sale_stock` module is installed because the behavior tested is altered when that module is installed. runbot-error-240998 Forward-Port-Of: odoo/enterprise#123357 Forward-Port-Of: odoo/enterprise#122306
The Documents search panel was updated to stay compatible with a recent platform change. This prevents crashes when users interact with sortable items in the Documents search panel, improving reliability without changing business workflows.
Original PR description
The web `SearchPanel` root is migrated from the OWL2 compat `useRef` to an OWL3 `signal.ref()` (a function). `DocumentsSearchPanel` passes the inherited `this.root` to `useNestedSortable`, whose `draggable_hook_builder` validates `ref` as an object and reads `ref.el` — so the raw signal function crashed with:
```
Error in hook useNestedSortable: invalid type for property "ref" in parameters: expected { object } and got function.
```
Fix: pass an object ref whose `el` getter reads the signal, keeping `.el` reactive.
Companion of odoo/odoo#272029.Code cleanup and technical improvements
Several Point of Sale localization and payment screens were updated to stay compatible with Odoo's next web interface framework. This is an internal modernization that helps maintain stability during the Owl 3 migration without changing day-to-day business workflows.
Original PR description
`* = ["l10n_de_pos_cert", "l10n_mx_edi_pos", "l10n_pe_edi_pos", "pos_tyro"]` As part of the migration from `owl 2` to `owl 3`, this commit replaces uses of `t-custom-model` with `t-model` or `t-model.proxy`. Community: https://github.com/odoo/odoo/pull/271520