Friday, March 13, 2026
31 changes · saas-19.2
Enhancements to existing features
This update enhances the statement line dropdown by visually highlighting matching move lines with the same amount and currency. This provides users with quicker identification of related transactions, streamlining reconciliation processes. The change also includes an optional display setting for this feature.
Original PR description
This will add a new colored bubble on the dropdown of a statement line when there is a move line that has the same amount currency or amount. task-5493859 Forward-Port-Of: odoo/enterprise#104896
Resolved issues and error corrections
This update resolves an issue where the HTML editor wasn't accurately reflecting changes made by users. Previously, multiple edits within the same field could lead to incorrect status indicators. Now, the system reliably tracks changes within the HTML editor, ensuring users receive accurate feedback and can correctly update content.
Original PR description
Prior to this commit, it was possible to: - make change A inside a html_field - save/commitChanges - make change B inside the html_field, before the end of the save/commitChanges - the field ends up incorrectly marked as "not dirty" (user can't use the FormStatusIndicator) even though change B was not committed yet. Solution: Give an id to the dirtiness, and associate that id with an extracted value from the editor. When the record update is done, mark the field as not dirty ONLY IF the current dirty id is the same as the id previously associated with the extracted value, else the field stays dirty. task-5976348 Forward-Port-Of: odoo/odoo#253280 Forward-Port-Of: odoo/odoo#252655
This update fixes an issue where social media posts weren't correctly displaying blog post cover images. The change ensures the correct image format is used when generating social media content, resolving a problem caused by a recent code update. This improves the visual consistency of blog posts shared on social media.
Original PR description
Scenario:
- set cover image of a blog post
- post blog post on social media (or check og:image/twitter:image tags)
Result: the social media is a dead image like:
http://site/blog/1/"/web/image/3198-3915f222/cover%20image.webp"
Cause: the code setting social image expected it to be in the
cover_properties background-image in url('{image}') or url({image})
format, but since 1b0852948c070d4d936bd00b3dd1c0e5501a1300 the format is
url("{image}") so it was gotten incorrectly.
Fix: also strip doubles quote and have the code working with
cover_properties background image with:
- no quote: for cover_properties before 18.4
- single quote: not sure in what situation this can happen
- double quote: for cover_properties since 18.4
opw-5471804
Forward-Port-Of: odoo/odoo#253206
Forward-Port-Of: odoo/odoo#252028This update resolves intermittent test failures in the sign-up process by using dedicated, consistent test users instead of the default 'admin' and 'demo' accounts. This ensures test results are reliable and predictable, improving the quality and stability of our sign-up feature.
Original PR description
Relying on the default `admin` and `demo` users caused random runbot failures, as their access rights can be altered by other modules. This commit replaces them with freshly created test users to strictly simulate the presence or absence of the `sign.group_sign_user` group, ensuring the test remains deterministic. Runbot error: https://runbot.odoo.com/odoo/runbot.build.error/241216 Forward-Port-Of: odoo/enterprise#110454
This update corrects a bug where users weren't seeing all their ratings in helpdesk average rating views. The fix ensures that users associated with helpdesk teams, even if not directly listed in the team's member list, accurately reflect their ratings in these views. This improves the accuracy of customer feedback data.
Original PR description
Steps to reproduce: - Configure a helpdesk team to be viewable by the test user - Remove test user from member_ids of helpdesk team - With that team selected, create a helpdesk ticket assigned to test user - Submit a rating for the ticket as the customer - As the test user in the helpdesk app overview, click on today average rating or last 7 days average rating Current behavior: - In both views, the test user won't see ratings for tickets attached to helpdesk teams where they are not listed in member_ids Expected behavior: - In both views, the test user should see all ratings of assigned tickets regardless if they are included in a helpdesk team's member_ids Note: member_ids in helpdesk.team appear to be only used for auto assigning new helpdesk tickets, so checking member_ids doesn't account for all potential users working in a team opw-5949917 Forward-Port-Of: odoo/enterprise#109470 Forward-Port-Of: odoo/enterprise#109136
This update resolves an issue where image shape transformations (rotations and flips) were not being properly cleared when changing image shapes. A new button has been added to manually reset these transformations, ensuring consistent behavior and a better user experience when working with image snippets.
Original PR description
Image shape transformations (flip and rotate) were never reset when changing or removing a shape; the dataset persisted indefinitely. Additionally, there was no way to manually reset a transformation, without undoing each operation manually. This commit ensures the dataset is cleaned when SetImageShapeAction is called and introduces a new button to manually reset transformations. Steps to reproduce: - Drop a snippet with image - Apply `solid_blob_4` shape on image (supports transformation) - Rotate or flip the shape - Change to `solid_blob_2` (does not support transformation) - Switch back to `solid_blob_4`, the first transformation is still there, it should have been reset task-5972945 Forward-Port-Of: odoo/odoo#253279 Forward-Port-Of: odoo/odoo#250875
This update fixes a missing 'Reset' button for specific Spanish informational reports. A recent configuration change made the standard reset button invisible. This fix adds a dedicated reset button that appears when the reports are completed, ensuring data can be cleared correctly.
Original PR description
- The `Reset` button was missing from the dropdown menu for Spanish informational reports (Mod 130, 347, 349, 390). - This occurred because these reports were recently configured with `is_tax_return_type = False` in this [commit](https://github.com/odoo/enterprise/commit/d2b1d29542c0350c267fecffd70d3e288364d8ab). However, the standard reset button (`action_reset_tax_return_common`) is configured to be invisible when `is_tax_return` is false. - This fix adds a reset button specifically for these Spanish reports that appears when the report is completed. task-5214023 Forward-Port-Of: odoo/enterprise#110271 Forward-Port-Of: odoo/enterprise#104739
This update fixes a server error that occurred when merging tables in the restaurant POS system. Specifically, the system now waits for order synchronization before completing the merge process, ensuring a smoother and more reliable experience for restaurant staff. This prevents errors and improves table management functionality.
Original PR description
Steps to reproduce: - On an empty table, change the guest count - Create an order and send it to the kitchen - Open another table without an order - Merge the first table with the second one Issue: - A server error occurs during table merge Fix: - Wait for the merge order to sync before returning the result Task-5502511 Related: https://github.com/odoo/enterprise/pull/104577 Forward-Port-Of: odoo/odoo#252942 Forward-Port-Of: odoo/odoo#245162
This update fixes a server error that occurred when merging tables in the Point of Sale system, specifically when a table had no associated order. The fix ensures the system waits for order synchronization before merging, preventing the error and improving table management functionality. This enhances the reliability of the POS experience.
Original PR description
Steps to reproduce: - On an empty table, change the guest count - Create an order and send it to the kitchen - Open another table without an order - Merge the first table with the second one Issue: - A server error occurs while merging the tables Fix: - Wait for the merge order to sync before returning the result Task-5502511 Related PR - https://github.com/odoo/odoo/pull/245162 Forward-Port-Of: odoo/enterprise#110052 Forward-Port-Of: odoo/enterprise#104577
This update fixes a technical problem that could prevent the Odoo Enterprise payroll module from being uninstalled correctly. Removing work entries previously caused lingering references, leading to an error. This ensures a smoother and more reliable uninstall process.
Original PR description
Purpose: After work entries removal, some references weren't removed from payroll `uninstall_hook` so a traceback happens when trying to uninstall the module. task-id: 5955553
This update resolves an issue impacting the PnL and Balance Sheet reports specifically for French association companies. The changes address minor data discrepancies within the reports, ensuring accurate financial reporting without requiring a major system overhaul. This improves the reliability of financial data for our French association clients.
Original PR description
The aim of this commit is fixing the Pnl & Balance Sheet report in France for association company. This commit ensures that we don't have any duplicate errors in the PnL & Balance Sheet. We kept some errors in the Balance Sheet (especially about the brut - amort - net) as we can't use aggregation with groupby but the data are not really duplicated. no task id Forward-Port-Of: odoo/enterprise#110163
This update adds a test to ensure the `_prepare_payment_data` method in the account online payment module functions correctly. The previous implementation relied on a field that was removed during a recent update, and this fix prevents potential issues with payment processing. It's a proactive measure to maintain system stability.
Original PR description
This commit safeguards the `_prepare_payment_data` method. Reason: We were using a field that no longer exists due to an oversight during a FW and having no tests to catch it. Fix here https://github.com/odoo/enterprise/pull/110266 No task ID
This update corrects a technical issue that previously caused export errors when working with worksheet templates in Odoo Enterprise. By removing outdated references to fields no longer present in the template, the export process now functions correctly and reliably.
Original PR description
Before this commit when exporting records from the `worksheet.template` model , it raises a traceback regarding the `model_id`, `action_id` which are not present on the `worksheet.template` anymore* In this commit we are updating the export logic by removing the custom logic for the `worksheet.template` model. *https://github.com/odoo/enterprise/pull/104754
A bug was preventing users from loading sample recruitment data. This fix updates the sample data to correctly reference the `recruiter_id` field, resolving a data parsing error. This ensures the recruitment scenario data can be properly loaded and used.
Original PR description
Currently an error occurs when user tries to load scenario data for recruitment. Steps to replicate: - Install `hr_recruitment`. - Open Recruitment and Click `Load sample Data`. Error: ```py…
Currently an error occurs when user tries to load scenario data for recruitment.
Steps to replicate:
- Install `hr_recruitment`.
- Open Recruitment and Click `Load sample Data`.
Error:
```py
ValueError: Invalid field 'user_id' in 'hr.applicant'
odoo.tools.convert.ParseError: while parsing /home/odoo/odoo19/community/addons/hr_recruitment/data/scenarios/hr_recruitment_scenario.xml:72, somewhere inside
<record id='scenario_applicant_macm_helen' model='hr.applicant'>
<field name=email_from>helenlee@exampe.email.com</field>
<field name=partner_name>Helen Lee</field>...
```
Cause:
- The field `user_id` was changed to `recruiter_id` from the [PR].
- But the scenario data still had the field `user_id`, this caused the error.
Solution:
- Replace user_id in the sample data with recruiter_id and use an employee as a value instead of a user. One additional detail is that since this is sample data that can potentially be applied on a db that already has some records. There is a case where creating an employee in the sample file and linking them to the admin user, but that can cause an exception if the admin user is already linked to an employee. To circumvent this, we first check if there is an employee linked to the admin user. If not we create a new one and make the sample data use whichever employee that is linked to the admin user.
Backport for the PR: https://github.com/odoo/odoo/pull/246362
[PR]: https://github.com/odoo/odoo/pull/229665
sentry-7324422905
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves an issue where VIES validation errors caused system slowdowns and errors. By catching a wider range of exceptions from the VIES service, the system is now more robust and reliable when checking VAT numbers, preventing disruptions to key processes like OCR invoice updates. This improves overall system stability.
Original PR description
Catch all `zeep` exceptions instead of only `zeep.Fault`. On 14th of February 2026, the VIES service wasn't working properly, they were returning invalid XML in their response. This caused the `check_vies` call to raise a `zeep.XMLSyntaxError` which wasn't caught, causing a traceback every time VIES was used to validate a VAT number. opw-5938723 (OCR couldn't be refreshed on an invoice because it tried to create a partner from its VAT number and it couldn't be checked with VIES). Forward-Port-Of: odoo/odoo#251947 Forward-Port-Of: odoo/odoo#249853
This update fixes an error in how the system maps CPV codes for Romanian VAT invoices. Previously, the system incorrectly used 'CPV' instead of 'STI' for the ItemClassificationCode/listID, which is the correct code according to PEPPOL standards. This ensures accurate VAT processing and compliance.
Original PR description
The value of `ItemClassificationCode/listID` that corresponds to `CPV` classification is `STI` not `CPV`. See https://docs.peppol.eu/poacc/billing/3.0/codelist/UNCL7143/ task-5416833 Forward-Port-Of: odoo/odoo#251311 Forward-Port-Of: odoo/odoo#250045
This update resolves an issue where the font size in the HTML editor toolbar would disappear when navigating within a document. The fix ensures that the editor's state, including font size settings, is preserved across toolbar redraws. This improves the user experience and prevents data loss during document editing.
Original PR description
Since [1], the font size in editor's toolbar is a `button` that contains an `iframe`. An `input` is put within this `iframe` so that when it is focused, the selection in the edited document is not lost. Unfortunately, when an `iframe` is moved in the DOM, it is restarted. In this case, the `iframe` has no source, so it becomes empty, and the content that was added into it `onMounted` is lost. This commit solves this by listening to every `load` events on the `iframe` instead of only the initial one. Steps to reproduce: - Go to a "To Do" note - Create a table with `/table` - Press Enter to confirm the 3x3 size - Select the last two cells of the first column - Move the mouse upwards to the next cell => The font size disappeared [1]: https://github.com/odoo/odoo/commit/a468de9d1099931d8f553c8569359996e7b694f2 task-6003539 Forward-Port-Of: odoo/odoo#252013
This update ensures that the country associated with a phone number (e.g., +1 or +32) always matches the currently selected country in the user interface. Previously, the system incorrectly used a fallback country, leading to inconsistencies. A new test has been added to verify this fix.
Original PR description
When parsing a keypad number, we were formatting the phone number with a fallback country (from the currently selected flag) but still resolving the returned country/flag from the pre-format parsing context (see [1]). This could lead to inconsistencies where the number is normalized as +1... while the UI country remains the previously selected one (e.g. Belgium). This commit recomputes country information from the formatted number before returning countryId/storeData, so the softphone flag matches the normalized phone number. Also adds a controller regression test covering this behavior. [1]: https://github.com/odoo/enterprise/commit/708aea78760392207f9148c31c67212dacaf3294 task-5995387 Forward-Port-Of: odoo/enterprise#109365
This update resolves a technical issue related to XML files used for Swedish payment processing (pain.001.001.09). The fix ensures the correct XML format is used, aligning with industry standards and improving the reliability of payment transactions in Sweden. This change primarily impacts the handling of financial data.
Original PR description
In Sweden, pain.001.001.09 XML files should use `<BICFI>` node, not `<BIC>`. This commit fix an XML test file to use BICFI. runbot-241221 Forward-Port-Of: odoo/enterprise#109930
A warning message was appearing unexpectedly when adjusting the B1 field in French tax reports. This fix removes a redundant reference to 'box_B1' within the report's calculation logic, ensuring the system functions correctly without displaying the error. This improves the user experience for French accounting users.
Original PR description
Steps to reproduce: 1- Install Accounting and l10n_fr and switch to French company 2- Go to [Settings > Accounting] and make sure fiscal localization is set to France 3. Go to [Accounting > Reporting > Tax return] and change the Report to Tax Report (FR) 4. Make an adjustment to the B1 field Description of issue: Warning message displayed where the text does not mention B1 Expected behavior: No warning message should be displayed when editing B1 Why this happens: 'box_B1' is used in the the expression total comparison when it should not be opw-5960001 Forward-Port-Of: odoo/enterprise#110169
This update resolves an issue where the invoice button wasn't correctly triggering invoice creation for orders in the Indian localization. The fix ensures the 'to_invoice' field is properly set when the button is clicked and the order is validated, preventing invoices from being missed. This improves the order processing workflow.
Original PR description
For some unknown reason, with the indian localization, in some tests, when the invoice button was clicked and the order was validated right after, the to_invoice field was not set to true and no invoice was created. This led to problem cause when we click on the button we want it to be taken into account. This commit fix this by checking that the button is unchecked, then clicked and then check that the button changed state. runbot-error: 238505 Community PR: https://github.com/odoo/odoo/pull/253119
This update resolves an issue where the invoice button within the Point of Sale system was not being properly accounted for. The fix involves adding a test method to ensure the button's functionality is correctly recognized. This ensures accurate invoice generation from Point of Sale transactions.
Original PR description
This commit adds a method used in some tests. runbot-error: 238505 Enterprise PR: https://github.com/odoo/enterprise/pull/110171 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a visual issue where empty options were being saved and displayed in dropdown selectors within the BuilderList. The change ensures that empty selections are no longer persisted, improving the user experience and data consistency. This was caused by a previous code adjustment.
Original PR description
**Description of the problem** Before this commit, the user could entry empty many2one options in a form, and these would be saved and displayed in the website as empty entries in a dropdown…
**Description of the problem** Before this commit, the user could entry empty many2one options in a form, and these would be saved and displayed in the website as empty entries in a dropdown selector. **How to reproduce the problem** 1. Drop a form 2. Add a "Selection" field (many2one) 3. Clear the text in one of the options in "Option List" 4. Save 5. The empty option is not removed, and shows up in the dropdown selector **Why the problem happens** Commit [1] introduced some changes to the action `SetFormCustomFieldValueListAction`, as a result, empty many2one options are not dropped anymore on apply. **Solution** The solution is applied on `BuilderList` (not only forms), as required by the task. `BuilderList.handleValueChange` now drops empty text fields before commiting changes, unless this violates `props.forbidLastItemRemoval`. The form action `setFormCustomFieldValueList` is changed such that the last entry is never removed even if its text is empty (unless `props.forbidLastItemRemoval` is false). task-5925171 [1]: https://github.com/odoo/odoo/commit/cb8469e9fe73f5c10b4e49d3462e0b23df2a047d Forward-Port-Of: odoo/odoo#249546
This update corrects a minor syntax error in the PWA service's CSS selector, which was preventing the application from correctly registering during installation. This fix ensures that the PWA installation process works reliably, resolving a potential issue that could have disrupted the user experience. The change targets a known problem in versions 18.0 and 19.0.
Original PR description
Description of the issue/feature this PR addresses:
Fixes a typo in the manifest selector used by the PWA service.
document.querySelector("link[rel=manifest") was missing the closing ], making the selector invalid.
Current behavior before PR:
Calling getManifest() could throw a DOMException due to an invalid CSS selector, preventing manifest retrieval and potentially breaking PWA install flow.
Desired behavior after PR is merged:
getManifest() correctly queries link[rel=manifest], retrieves the manifest URL, and keeps the existing manifest-fetch behavior intact (including test coverage already present in pwa_service.test.js).
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#251376This update corrects a recent issue where quotation documents with lines having a zero subtotal amount were being discarded during upload. The fix ensures that all lines, including those with zero subtotal, are correctly processed, maintaining accurate quotation data. This resolves a regression introduced in a previous update.
Original PR description
Versions: --- Reproducible on 18.0+ Fix targets 16.0 to keep the code consistent across versions Issue: --- Due to this issue, a line with zero subtotal amount will be discarded in quotation document…
Versions: --- Reproducible on 18.0+ Fix targets 16.0 to keep the code consistent across versions Issue: --- Due to this issue, a line with zero subtotal amount will be discarded in quotation document upload. Steps to reproduce: --- 1- In sale app, upload a quotation document without line amount. (You could use the one attached in the ticket) 2- As you see, lines are discarded. Cause: --- This regression is introduced in https://github.com/odoo/odoo/pull/245862, to prevent lines with zero amount in accounting. The https://github.com/odoo/odoo/pull/245862 targets 16.0. However, the `sale_edi_ubl` is introduced on 18.0. Fix: --- Instead of `_retrieve_line_vals` (`_import_fill_invoice_line_values` on 16.0) returning `None` when `price_subtotal` is not present, it can keep returning `dict` with an extra key `price_subtotal`, and filter out unwanted line in `_retrieve_invoice_line_vals` itself. opw-5977735 Forward-Port-Of: odoo/odoo#253149 Forward-Port-Of: odoo/odoo#251463
This update fixes a bug that prevented users from seeing subtasks within the Kanban mobile view of tasks. The issue stemmed from a missing configuration element, now resolved. This enhancement improves task management visibility for mobile users.
Original PR description
Example of steps: - Install `industry_fsm` - Create a task with a subtask - Enable mobile view with devtools - Open a task - Navigate to sub-tasks tab - Traceback ``` TypeError: undefined is not an object (evaluating 'ctx['record'].parent_id.raw_value') ``` parent_id was missing from "view_task_kanban" opw-5981990 Forward-Port-Of: odoo/odoo#253623
A bug preventing users from copying their two-factor authentication secret via the portal has been resolved. The update corrected a technical issue related to how the 'Copy' button's functionality was implemented, ensuring users can now reliably access and copy their security codes.
Original PR description
__Problem__ Since odoo/odoo@e3da5f1 the onclick listener set on `copyButton` is lost because we give the HTML of the body as argument at the dialog creation. __Steps to reproduce__ 1. Go to `/my/security` 2. Click on "Enable two-factor authentication" 3. Confirm password 4. Click on "Cannot scan it?" 5. The "Copy" button doesn't work __Fix__ - Inherit from `InputConfirmationDialog` to add a listener to the button. - At the same time, remove the remaining jQuery dependency in this part of the code Forward-Port-Of: odoo/odoo#253314 Forward-Port-Of: odoo/odoo#251429
This update resolves a technical issue preventing correct receipt generation in the l10n_sa_pos module. The fix corrects an incorrect override condition, ensuring receipts are now generated accurately. This improves the user experience for South African POS customers.
Original PR description
With the commit moving receipt template to the backend, an override on the l10n_sa receipt was wrongly modified. This commit fixes the issue by changing the override condition to the correct one. runbot-error: 239134 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where contacts without names or email addresses in Odoo's chatter interface were displaying as 'Unnamed'. Now, when a contact lacks this information, the system will automatically show their display name instead, providing a more user-friendly experience. This ensures all contacts are correctly identified within conversations.
Original PR description
Steps to reproduce =============== 1. Create a contact of type invoice address without name and email. 2. Go to any app with chatter. 3. Add this user to the recipient ----> Only the blue tick will be visible (recipient name will be empty) After this commit, we will use the display_name as a fallback to show in the chatter. Forward-Port-Of: odoo/odoo#241830 Forward-Port-Of: odoo/odoo#213545
This update fixes a bug preventing customers from seeing their available payment methods within the customer portal. The issue stemmed from an incorrect configuration that was overlooked. The fix ensures all payment methods are correctly displayed, improving the customer experience and streamlining the payment process.
Original PR description
Versions: --- saas-19.1+ Issue -- Payment methods are not shown in portal page. Cause: --- In #212880 two issues were overlooked: 1. The payment portal entry ID is `payment_methods_portal_entry`, but the `should_show_portal_card` override was using the wrong external ID: `portal_payment_orders`. 2. The payment card should have `is_config_card=True`, which was missed. Because of this, the superclass implementation (which checks `is_config_card`) returns False and hides the card. Setting `is_config_card=True` would normally fix the issue, but it would require updating views for already existing databases. To avoid this, the override is adjusted to not `&` with the parent implementation. In master we can restore the `&` superclass. This change should have no negative impact since the issue only affects versions saas-19.1, saas-19.2 and there should be no custom overrides in saas versions. opw-6013786 Forward-Port-Of: odoo/odoo#253085
This update fixes an issue where 'sandwich leave' calculations involving company-specific public holidays were inaccurate. The fix ensures that all date calculations are properly localized to the company's timezone, guaranteeing the correct leave duration is determined. This improves the reliability of leave requests and reporting.
Original PR description
Steps to Reproduce: 1. Install the `l10n_in_hr_holidays` module. 2. Enable the "sandwich leave" option for the time off type. 3. Create public holidays that last the entire day, for example from 00:00 to 23:59. 4. Create a leave around the public holiday 5. Duration should be 3 days instead of 1 Cause: When creating a dictionary for company-specific public holidays, the dates from and to are not converted to the company's timezone when calculating the days between public holidays. Fix: To resolve this, the first step is to localize the `date_from` and `date_to` to the company's timezone before counting the days between the public holidays. Task-6012992 Forward-Port-Of: odoo/odoo#253489 Forward-Port-Of: odoo/odoo#252466