Tuesday, July 14, 2026
35 changes · saas-19.4
New functionality added to Odoo
This pull request updates the Odoo localization files to include translations for the new PayU payment method. This addition expands Odoo's payment options, supporting a wider range of customers and payment gateways. It’s a standard I18N update to ensure the system is properly localized for this new functionality.
Original PR description
Forward-Port-Of: odoo/odoo#275865
Enhancements to existing features
Signature requests created from other apps now include the template name in the request name, file name, and email subject. This makes documents easier to identify and avoids confusion when the linked record name looks like the signer’s name.
Original PR description
When requesting a signature from another app, the request name, filename and email subject only showed the linked record name, which often read as the signer's name. The template name is now added so all three follow the same "<prefix> - <template> - <record>" format. task-6317174 Forward-Port-Of: odoo/enterprise#122963
Resolved issues and error corrections
Printing an appraisal form from the action menu now waits briefly so the menu can close first. This prevents the menu from appearing on the printed document, giving users a cleaner and more professional printout.
Original PR description
When printing the appraisal form from the action (cog) menu, the drop down menu itself was incorrectly showing up in the printed document. This happened because the browser started printing immediately before the menu had time to close. By adding a small delay before triggering the print action, the menu now has time to completely close, so it no longer appears in the final print. task-6369240 Forward-Port-Of: odoo/enterprise#123242
Features or functions removed from Odoo
This update simplifies the restaurant POS system by standardizing payment method names from snake_case to camelCase. This change improves code consistency and prepares the system for future updates. It ensures the payment processing flow remains reliable and efficient.
Original PR description
In this commit: - Use the new method names in the payment adjustment flow. - Replace deprecated snake_case methods with their camelCase equivalents for payment lines, payment terminals, and order totals. Task:6049128 Forward-Port-Of: odoo/odoo#275870 Forward-Port-Of: odoo/odoo#271792
Restricted website editors will no longer see the AI Assistant as an available action when they do not have permission to edit and save pages. The button is disabled with a tooltip explaining the access limitation, reducing confusion for users with limited website permissions.
Original PR description
Restricted Editors do not have permission to edit website pages. However, the AI Assistant button remains available, giving the impression that the feature can be used even though any changes cannot be saved. This commit disables the AI Assistant button for users without 'Editor and Designer' access and adds a tooltip explaining why the feature is unavailable Forward-Port-Of: odoo/enterprise#123047
The Sendcloud delivery setting previously labeled "Use Batch Shipping" is now called "Use Multicollo". This aligns Odoo terminology with Sendcloud wording, reducing confusion for users configuring shipments.
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#122920 Forward-Port-Of: odoo/enterprise#122133
This update streamlines the tracking of continuous production processes within Odoo MRP. The changes enhance the clarity and efficiency of managing ongoing production runs, leading to better visibility and control over manufacturing operations. This improvement focuses on internal operational improvements.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adds tests to ensure task templates, even those without a linked project, function correctly. This improves the reliability of our task creation process and prevents potential errors when using task templates. It follows up on previous development work to enhance the flexibility of our project and task management features.
Original PR description
This PR adds tests to ensure that task templates without a project are correctly handled when creating tasks from task templates or projects from project templates. Follow-up of task-5140018 task-6344060 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The translation configuration now includes the Belgian CODA extension number module. This helps ensure its labels and messages are available for translation, improving localization coverage for Belgian accounting users.
Original PR description
This commit will add l10n_be_coda_extension_number in the weblate json file. no task id Forward-Port-Of: odoo/enterprise#124053
This update makes the database authentication module available for translation work and fixes small wording mistakes. It also tidies an internal validation path that was not reachable from the user interface, improving maintainability without changing normal user workflows.
Original PR description
The aim of this commit is to allow the translator to work on this module translation and fix a typo that was made. Task-id: None Forward-Port-Of: odoo/enterprise#124038
Obox modules are now included in the translation setup, so their user-facing text can be translated. This helps customers use these features in their preferred language and prevents untranslated labels from appearing.
Original PR description
When the Obox modules were added in odoo/enterprise#110834 they were not also added to `.weblate.json`, meaning they will not be translated. This commit fixes the issue. Forward-Port-Of: odoo/enterprise#124227 Forward-Port-Of: odoo/enterprise#124025
Delivery labels sent through Sendcloud now keep address numbers that include dots, such as “12.345”, instead of cutting them short. This helps prevent incorrect shipping label data for customers whose street numbers use this format.
Original PR description
Issue ----- Labels have unexpected format when the delivery address has a dot (`.`) in the number. Steps to reproduce ----- - Set up Sendcloud (carrier shouldn't matter) - Enable logs - Create a customer (with valid address, phone and email) - Address must contain a dot, eg Grand Place 12.345 - Deliver a product to the customer - Add sendcloud as delivery method - Go to the logs - Open the "sendcloud request parcels" log > house_number is 12 Cause ----- The `house_number` field is populated using `_get_house_number`, where the regex used to extract the number from the address line does not accept the `.` character. https://github.com/odoo/enterprise/blob/f93882555864a1f0a2a3e3863780096c78923bfa/delivery_sendcloud/models/sendcloud_service.py#L323 ----- Ticket: opw-6295904 Forward-Port-Of: odoo/enterprise#123820 Forward-Port-Of: odoo/enterprise#123266
Point of Sale receipts using Worldline payment terminals will no longer include the separate terminal receipt text. This keeps customer receipts cleaner and avoids duplicate or unnecessary payment terminal details.
Original PR description
This PR removes the terminal receipt from Worldline we are currently inserting in the Point Of Sale receipt We don't adapt the driver code to get the receipt as we cannot change C method prototypes task-6373975 Forward-Port-Of: odoo/enterprise#123770
This fixes an issue where cached payroll rule settings could be accidentally changed by later calculations. Payroll results are now more reliable because each use gets a safe copy of the stored settings.
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#123058The live field service map no longer recalculates routes when the current user's location changes. This prevents wasted routing requests, helping preserve route service tokens and keeping live map behavior aligned with how routes are actually planned.
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#123294
A payroll correction action now works correctly for both choices shown in the popup. This helps ensure batch decisions are applied consistently to all affected payslips, reducing manual follow-up and payroll processing errors.
Original PR description
**What:** - Corrected the method logic 'action_keep_wrong_version' to make sure that it works for both option in the view popup. task-6356957 Forward-Port-Of: odoo/enterprise#122625
The timesheet assistant now correctly shows the email icon for existing matched email rules again. This prevents users from seeing missing or incorrect icons while preserving support for Gmail-related activities.
Original PR description
Issue: The email activity icon (fa-envelope) is not displayed for matched email rules. Cause: The email icon mapping was replaced with gmail_activity to support Gmail events. However, existing aw.rule records still use the email activity type, causing an icon key mismatch. Fix: Restore the email icon mapping while keeping the gmail_activity mapping so both activity types display the email icon. Task-6370391 Forward-Port-Of: odoo/enterprise#123438
This fix prevents an error from appearing when users remove the start and end dates from a field service planning shift. The system now checks that required date information is present before recalculating break time, making shift editing more stable.
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#123273
Previously paused checks for rental stock and Kenyan stock reporting have been re-enabled and updated to match the latest valuation behavior. This helps ensure purchase receipts and related stock values continue to be validated correctly after recent accounting changes.
Original PR description
*: sale_stock_renting, l10n_ke_edi_oscu_stock Re-enable and adapt the tests skipped to fast merge the valuation refactoring made in 08b62a4bbcc6f9a391b2cc00a621ef4c76100229. The stock IO now values the receipt from the vendor bill, so the shared purchase fixtures `l10n_ke_edi_oscu` need to match the values provided in `l10n_ke_edi_oscu_stock` see for instance: https://github.com/odoo/enterprise/blob/ce68644f97ac28568b9497a18079a4ad5ce4a125/l10n_ke_edi_oscu/tests/expected_requests/save_purchase_2.json#L11-L13 Forward-Port-Of: odoo/enterprise#123165 Forward-Port-Of: odoo/enterprise#122857
This change adjusts when a field service sales timesheet test runs so it avoids accounting setup warnings during automated validation. It also skips that test in cases where an optional stock-related module changes the expected behavior, reducing false failures in release checks.
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#122306
This fixes an error that could occur when opening Dimona information for an employee whose private street address was missing. The change helps Belgian payroll users avoid an unexpected interruption and continue the reporting workflow normally.
Original PR description
action_open_dimona guards on `self.employee_id.private_street` but then runs re.findall on `self.private_street` Forward-Port-Of: odoo/enterprise#124029
This update fixes an issue where the quantity of items delivered was incorrectly calculated after a refund was processed in the point-of-sale system. The change ensures that the system accurately reflects the net quantity of items delivered, preventing double-counting of refunds. A new test has been added to ensure this issue doesn't reappear.
Original PR description
Step to reproduce: - create a SO with a order line - settle it in pos, notice in SO line, qty_delivered is 1 - refund the pos order - notice, in SO qty_delivered is -1 , not 0 Cause: - After commit [1] , `pos_order_line_ids` now includes order and refund lines - while the `_prepare_qty_delivered` relied on fact that refund lines are not part of `pos_order_line_ids` - due to this, quantity was reduced twice (refund amount are considered twice) [1] https://github.com/odoo/odoo/commit/a12db424a6986a58d1a328fd311078994ac17aee Fix: - in the compute, we now seperate refund and order lines and thus compute works perfectly opw-6290161 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274952 Forward-Port-Of: odoo/odoo#269996
This update ensures that the Pos Cashmatic module's text is properly translated into different languages. By adding the module to the translation files (.weblate.json), the system will now display the correct text for users around the world. This improves the user experience for international customers.
Original PR description
This commit add the pos_cashmatic module inside the .weblate.json file so that the srings are translated. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#275863
This update resolves an issue where the order tour would intermittently fail to complete due to a race condition when navigating to pinned messages. The fix ensures the tour waits for the message to fully scroll before proceeding, preventing errors and improving the user experience. This enhances the reliability of the tour feature.
Original PR description
Jumping to the pinned message highlights it and asynchronously scrolls it into view. On a slow browser that scroll can land right after the tour scrolls to the bottom and pull the thread back up to the pinned message. The load-newer observer callback, which awaits the highlight scroll before re-checking visibility, then finds the bottom sentinel hidden and drops the fetch of the following messages, so the final :count(60) step never matches and times out. Wait for the pinned message to be scrolled into view and for its highlight to clear (its scroll is then finished) before scrolling to the bottom, so the jump scroll no longer competes. https://runbot.odoo.com/odoo/error/941509 Forward-Port-Of: odoo/odoo#275289
This update resolves an issue where opening a self-sent email through the Gmail add-in would trigger an error. The fix ensures that users can reliably open and manage emails sent directly to their own addresses without encountering this technical problem. This improves the usability of the email functionality.
Original PR description
Bug === If we email ourselves, and open the Gmail addin on it, then an error is raised. Task-6375862 Forward-Port-Of: odoo/odoo#275810
This update resolves a technical glitch in the mass mailing module that was causing misleading error messages. The fix ensures that errors related to component loading are properly masked, improving the stability and reliability of the mass mailing functionality. This change primarily impacts the backend processes.
Original PR description
Commit [1] introduced an erroneous `!` operator before status, that would throw loading errors even if the component was already destroyed (those errors should be masked). [1]: https://github.com/odoo/odoo/commit/51c7846f99eb061a1d71ca5d9967f5b01f5551a1 Forward-Port-Of: odoo/odoo#275785
This update resolves an issue where triple-clicking within inline editable text boxes in the HTML editor caused the selection to extend beyond the intended area. The fix ensures that triple-clicks accurately select and highlight the intended content, improving the user experience and editor functionality. This change enhances the consistency and reliability of the HTML editor.
Original PR description
Problem: Triple-clicking inside an inline `contenteditable="true"` element causes the selection to extend outside of it. Cause: Inline `contenteditable="true"` elements are not considered when looking for the closest block boundary, allowing the browser selection to expand beyond the editable content. Solution: Treat `contenteditable="true"` elements as block boundaries when searching for the closest block. Steps to reproduce: - Add an inline `contenteditable="true"` element inside an editable area. - Triple-click inside it. - Observe that content outside the `contenteditable` element is also selected. task-6255094 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#267487
This update fixes a visual issue in the API keys kanban view where scope and expiration information for scoped keys were displayed together as a single line. The change now presents these details as separate lines, improving readability and clarity for users managing API keys. This ensures all key information is easily accessible.
Original PR description
The API keys kanban rendered the "Scope:" and "Expires on:" hints as two adjacent inline <small> elements. For a scoped key both are visible, so they were displayed stuck together, e.g. "Scope: rpcExpires on: ...". Render each hint as a block so they stack on their own lines. Keys without a scope are unaffected since the scope hint stays hidden. Description of the issue/feature this PR addresses: Current behavior before PR: <img width="980" height="414" alt="image" src="https://github.com/user-attachments/assets/6cd8b338-1d2e-4abb-a90b-03218aaef941" /> Desired behavior after PR is merged: <img width="979" height="389" alt="image" src="https://github.com/user-attachments/assets/83ffa680-ffb8-415f-af3f-8e53cb8e8351" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#275869
This update simplifies account reconciliation settings by automatically marking accounts as non-reconcilable when bank or cash transactions aren't expected. This ensures that users only attempt reconciliation for accounts that actually require it, streamlining the accounting process and reducing potential errors. The change impacts several localization modules.
Original PR description
Changing the "payment reconciliation" boolean to false where it should be, ie. when no reconciliation with the bank nor cash transaction is expected. task-4902124 Forward-Port-Of: odoo/odoo#273305
This update resolves an error that occurred when multiple product images with identical content were added to a website product page. The fix ensures that the 'Optimize SEO' feature functions correctly by preventing duplicate key errors during image processing. This improves the reliability of the SEO optimization tool.
Original PR description
## Problem: when snippets with identical images are added in the e-commerce website product page, the "Optimize SEO" option in debug mode causes an error to occur with a traceback. The traceback…
## Problem:
when snippets with identical images are added in the e-commerce website product page, the "Optimize SEO" option in debug mode causes an error to occur with a traceback. The traceback calls out a duplicate key in the `t-foreach` of a loop over `state.altAttributes`. the `t-key` for this loop is `img.id` which is generated by the `/website/get_alt_images` controller endpoint.
## Steps to reproduce:
1. Go to a product page and click on "go to website" smart nav btn.
2. Add a snippet with an image in the `description_ecommerce` field
3. Add a snippet with the same image in the `website_description` field.
4. In debug mode, open `site > Optimize SEO`
5. An error `Got duplicate key in t-foreach` is thrown.
## Solution:
The solution was simple to add a qualifier in the compound key generated by the controller action for the `id` field. The chosen qualifier in this case was `model['field']`. `field` is the position in the template where the image came from.
So now the keys for the two identical images go
FROM
> `${model}-${id}-${index}`
>
> 1st image of `website_description`:
> `product.template-6-0`
>
> 1st image of `description_ecommerce`:
> `product.template-6-0`
TO
> `${model}-${id}-${field}-${index}`
>
> 1st image of `website_description`:
> `product.template-6-website_description-0`
>
> 1st image of `description_ecommerce`:
> `product.template-6-description_ecommerce-0`
task-6325786
Forward-Port-Of: odoo/odoo#275941
Forward-Port-Of: odoo/odoo#272846This update ensures that employee working schedules are consistently synchronized with their associated resource records, regardless of the version being used. Previously, changes to future employee versions could cause incorrect display of employee availability in the Attendance Gantt view. This fix resolves a visual discrepancy and improves data accuracy.
Original PR description
Steps to reproduce: 1. Create a new version on an employee with a future start date 2. Ensure the new version has a different working schedule 3. After the new version becomes active, observe that…
Steps to reproduce: 1. Create a new version on an employee with a future start date 2. Ensure the new version has a different working schedule 3. After the new version becomes active, observe that the working schedule on the employees record is different from the one on the employee's resource record Every employee has an associated resource record associated with them. Normally, the employee's working schedule (`hr_employee.resource_calendar_id`) should always be in sync with their associated resource record (`hr_employee.resource_id.calendar_id`). When we update the employee's working schedule through the UI on a currently active version, it will also update their associated resource record with the same working schedule. However, if we change the working schedule for a future version, when `_cron_update_current_version_id()` runs and changes the active version, there is no mechanism to update the associated resource with the new working schedule. This change will ensure we keep the working schedules in sync, as if they are not, strange behaviors can occur. One side effect of this problem: When a new version becomes active, and working schedules become de-synced, this can cause the Attendance gannt view to display incorrect unavailable intervals for an employee (this appears as a grayed-out time slot). This is because `_attendance_intervals_batch()` pulls from the working schedule of an employee's associated resource record, rather than the employee record itself. This is what occurred on the linked ticket. [opw-6352770](https://www.odoo.com/odoo/my-tasks/6352770?debug=assets) Forward-Port-Of: odoo/odoo#275430
This update corrects a bug where an attendance record was incorrectly created with overtime when an employee was on leave. The fix ensures that attendances are only generated when necessary, preventing misleading log notes and inaccurate reporting. This change was introduced in a previous version and is now resolved.
Original PR description
# How to reproduce - In the settings, enable Absence Mangement - Create an employee with a Contract - Create a Time off for that employee for yesterday - Manually run the scheduled action…
# How to reproduce - In the settings, enable Absence Mangement - Create an employee with a Contract - Create a Time off for that employee for yesterday - Manually run the scheduled action "Attendance: Detect Absences for employees" - Go to the attendance dashboard for that employee # The issue An attendance with no overtime was created for yesterday for that employee with a log note saying "This attendance was automatically created to cover an unjustified absence on that day." However, the absence was justified as the employee took a time off. # Cause of the issue When running the `_cron_absence_detection` cron job, we create "empty" attendances for the employees that were absent yesterday. If those attendance's `overtime_hours` are 0, then we unlink them : https://github.com/odoo/odoo/blob/a73428187112b3948a11810abae2a3c82c9c7bcd/addons/hr_attendance/models/hr_attendance.py#L659-L666 But, since `check_in` and `check_out` cannot be the same, we cannot really create an empty attedance. We instead create an attendance of 1 second : https://github.com/odoo/odoo/blob/a73428187112b3948a11810abae2a3c82c9c7bcd/addons/hr_attendance/models/hr_attendance.py#L652-L653 This will create an overtime of 0.003 seconds if there was a leave that day (which is our case). This duration will be reflected in the attendance's `overtime_hours`. The issue is that we simply do `== 0` when trying to find the attendances without overtime, so we don't unlink them. The issue was introduced by : https://github.com/odoo/odoo/commit/8d7859a569d9ac7303ca0b9be6c56496be14c544 Because `round(0.003, 3)` => 0 but `round(0.003, 4)` => 0.003 The issue is not present in 18.0+ because we don't create overtime if the duration is `float_is_zero(overtime_duration, 2)` : https://github.com/odoo/odoo/blob/39cce855aa27aa4af9225a61a3e1425383a9f49f/addons/hr_attendance/models/hr_attendance.py#L405 opw-6321883 Forward-Port-Of: odoo/odoo#275133 Forward-Port-Of: odoo/odoo#272089
This update enhances the reliability of Odoo's database rollback process, particularly when updating modules. It prevents errors that could leave the system in an inconsistent state after a rollback, ensuring smoother and more dependable updates.
Original PR description
Registry loading may fail to upgrade the modules and should reset the module state in such a scenario. However, the rollback can raise an exception leaving the modules in the previous state. We ensure that the rollback is more stable: - when resetting the transaction, make sure the transaction is clear before re-setting up models - when postrollback fails, retry the rollback without any hooks - sale_gelato: be more explicit that the call is in a separate cursor --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures that the date and time of sales are now displayed on the 'Print Report' generated from the Point of Sale system. Previously, a recent update to the system's templates removed this important information. This fix restores the standard reporting functionality, providing users with complete sale details.
Original PR description
When printing the sale details report from the POS ("Print Report"), no date or time appeared on the ticket.
During the receipt refactor to shared backend templates, the sale details template and its frontend data builder stopped rendering the print date that previous versions displayed at the bottom of the report.
This commit adds the current date and time to the sale details `extra_data` and renders it after the totals, restoring the previous behavior.
opw-6348476
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#273734This update resolves an issue where the company logo option wasn't consistently hiding after changing the logo type to text. The fix ensures the toggle correctly hides the logo when the 'Text' option is selected for the navbar logo, improving the user experience. It was necessary to update how the system reads configuration settings for the logo.
Original PR description
Steps to reproduce: - Enter in edit mode - Click on the navbar logo - Change "Logo" option from "Image" to "Text" - Toggle "Company Logo" in "Visuals" option - Traceback appears: it should hide the logo This commit awaits `loadConfigKey` so `websiteLogoParams` reads the loaded config; otherwise the button targeted the wrong brand view and collided on the `#o_fake_navbar_brand` xpath. task-6284593 Forward-Port-Of: odoo/odoo#276108 Forward-Port-Of: odoo/odoo#275363