Friday, January 16, 2026
13 changes · saas-18.2
Resolved issues and error corrections
This update corrects a bug where custom button snippets were incorrectly wrapped in paragraph tags when placed next to existing buttons. The fix ensures custom buttons are consistently displayed in the snippet panel, improving usability for users creating and managing buttons. This resolves an issue where custom buttons weren't always visible.
Original PR description
### Issue: When a custom button snippet was dropped next to an existing button wrapped in a `<div>`, it was incorrectly and unconditionally wrapped in a paragraph `<p>` tag. This issue did not occur…
### Issue: When a custom button snippet was dropped next to an existing button wrapped in a `<div>`, it was incorrectly and unconditionally wrapped in a paragraph `<p>` tag. This issue did not occur with standard button snippets or when the buttons were wrapped in a `<p>` tag. ### Steps to reproduce: 1. Drag a standard "Button" snippet next to an existing button (e.g., in the navbar). The structure is correctly `<a/><a/>`. 2. Save a button as a custom snippet. 3. Drag this new custom button snippet next to a button wrapped in a `<div>` (navbar in our example). 4. Observe the structure: `<div><a/><p><a class="s_custom_snippet"/></p></div>`, but it should be like `<div><a/><a class="s_custom_snippet"/></div>`. ### Fix The logic has been corrected to only wrap a button snippet in a paragraph tag if it has no sibling buttons and is not already inside a `<p>`. This ensures consistent behaviour between standard and custom button snippets. A tour test is also added, ensuring the behaviour is correct. Backport of https://github.com/odoo/odoo/commit/3a8f2cc418510c3b91f8b9086bb4a89a1745e40d task-[5032130](https://www.odoo.com/odoo/project/974/tasks/5032130) Forward-Port-Of: odoo/odoo#241937 Forward-Port-Of: odoo/odoo#224476
This update corrects a technical issue that caused the IoT Box to freeze when used as a kiosk. The team adjusted how the browser arguments are passed, preventing excessive memory consumption and ensuring stable operation. This resolves a critical bug impacting the functionality of our IoT Box devices.
Original PR description
In odoo/odoo#233676 we switched from `chromium-browser` to `chromium` to adapt to new executable name in raspbian. We also need to update this name in the check to set the arguments of the browser, or they will never be passed. This fixes the issue where the IoT Box freezes when using it for kiosk, as the browser was eating all the memory. Forward-Port-Of: odoo/odoo#243979
This update provides users with detailed error messages from HMRC when document sending fails, instead of generic alerts. By displaying the specific error code and message, users can quickly diagnose and resolve issues, reducing support requests and improving efficiency.
Original PR description
Currently, when an error occurs while sending a document to HMRC, the user only receives a generic error message. This change enhances the error feedback by including the error code and message returned by HMRC, giving the user clearer insight into the cause of the failure. This helps users identify issues more easily and reduces unnecessary support requests. Forward-Port-Of: odoo/enterprise#104407
This update fixes an issue where invoices generated for EU Standard (Peppol Bis 3.0) eInvoices were incorrectly using the customer's VAT number instead of the company's registration number in the XML format. This ensures compliance with EU regulations and accurate data transmission for e-invoicing. The change prioritizes using the company's registration number (company_registry) when available.
Original PR description
The base `_get_party_node` uses `commercial_partner.ref` for `PartyIdentification` and `commercial_partner.vat` for `CompanyID`. There was no logic to prefer `company_registry` when available. Refs:…
The base `_get_party_node` uses `commercial_partner.ref` for `PartyIdentification` and `commercial_partner.vat` for `CompanyID`. There was no logic to prefer `company_registry` when available. Refs: An independent invoice example: https://developer.vertexinc.com/einvoicing/docs/belgium-example-documents https://github.com/odoo/odoo/blob/40c862476382c68d7f452284074f5b44955d1f98/addons/account_edi_ubl_cii/models/account_edi_xml_ubl_20.py#L1564-L1566 https://github.com/odoo/odoo/blob/40c862476382c68d7f452284074f5b44955d1f98/addons/account_edi_ubl_cii/models/account_edi_xml_ubl_20.py#L1585 Steps To Reproduce: - Have accounting, account_edi_ubl_cii and contacts installed. - Create a Belgian company and set the VAT, Company ID and Reference (under Sales & Purchase tab). - Create a contact and set his eInvoice format in Accounting tab to EU Standard (Peppol Bis 3.0) and make sure to give him a country. - Go to accounting -> Customers -> Invoices and create an invoice for the contact you created. - Send the invoice to the contact and download the XML from the chatter and inspect it. - PartyIdentification/ID shows the partner's ref field value (e.g., "(odoobe)") instead of the company registration number. - PartyLegalEntity/CompanyID uses the VAT number instead of the company registration number (ondernemingsnummer). Ticket [link](https://www.odoo.com/odoo/project.task/5418190) opw-5418190 Forward-Port-Of: odoo/odoo#243143
This update fixes an issue where users couldn't easily manage their consent for online account synchronization. The change allows users to actively control their data sharing preferences, enhancing privacy and compliance. The update also modernizes the system to support various data providers.
Original PR description
In this commit:https://github.com/odoo/enterprise/commit/bf5b7d03fe8e138ee8bc0246d3d148638db5d620 we introduce a message on the account_online_link to be able to manage the consent. But since manage_consent is not a field of account.online.linki would traceback, we changed the position of the code by popping the value. Also changed the url to use the provider_type to be able to use the route with any provider if needed task-5187621 Forward-Port-Of: odoo/enterprise#104442 Forward-Port-Of: odoo/enterprise#102428
This update resolves an issue where shared subfolders within the Documents app weren't initially visible to users. The fix ensures that subfolders are correctly loaded upon first access, eliminating the need for a refresh. This enhances the user experience when accessing shared documents via links.
Original PR description
**Steps to reproduce:** - Create a portal user - Go to the documents app - Click on the marketing folder - Share the marketing folder through a link (Anyone with a link = viewer + discoverable) -…
**Steps to reproduce:** - Create a portal user - Go to the documents app - Click on the marketing folder - Share the marketing folder through a link (Anyone with a link = viewer + discoverable) - Copy the share link - Login with the portal user in an incognito window - Paste the share link in an incognito browser - Click on "brand 1" folder, result nothing is showing while there should be a folder and a picture - Click on "brand 2" - Click back on "brand 1" and now the folder and picture are visible - If you click on a subfolder of "brand 1" you also get an error **Issue:** Discoverable subfolders accessed using `accessToken` are not available on the first read of a user and this happens for each level of the hierarchy (refresh is needed each time). When using sharing link to display folders with a user, the subfolder document access is created on `/documents/touch/` using `_from_access_token`. But on the js side the call is delayed (with debounce) and occurs after the `web_search_read`. This means that subfolders are only accessible after a refresh or by switching back and forth between folders. Also, even after the folder is displayed, if there are other subfolders in it, going deeper in the hierarchy won't work as well without a refresh due to the `search_panel_select_range` missing the new folder. **Fix:** Not sure on the best way to fix this, the issue will always be related to performance. Current fix checks if a reload is needed by sending a flag in the `/documents/touch/<access_token>` request result when a new document access was created. opw-5156297 Forward-Port-Of: odoo/enterprise#99820
This update resolves an issue where importing dates incorrectly caused errors when mapping to boolean or one-to-many fields. The fix ensures accurate handling of datetime values during the import process, preventing data import failures. This improves the reliability of data updates.
Original PR description
When mapping a datetime value to fields of type boolean or one2many, an error is raised. Steps to Reproduce: 1) Install CRM 2) Navigate to CRM and upload [this…
When mapping a datetime value to fields of type boolean or one2many, an error is raised. Steps to Reproduce: 1) Install CRM 2) Navigate to CRM and upload [this file](https://docs.google.com/spreadsheets/d/1eRhIy3Zt8kD-_sH8Lp2N9IE9zflYB5CX/edit?usp=sharing&ouid=101212513075316114369&rtpof=true&sd=true) 3) Map 'Created on' with 'Active' and click on Test. Error-1 : `AttributeError: 'datetime.date' object has no attribute 'lower'` If you upload [this file](https://docs.google.com/spreadsheets/d/18xTvxjc9EsXf86N5Y8ekq-AZocQSNwEM/edit?usp=sharing&ouid=101212513075316114369&rtpof=true&sd=true) and click on Test, the following error is raised: Error-2: `AttributeError: 'datetime.date' object has no attribute 'split'` Root Cause: This type of issue was previously addressed in [commit 1](https://github.com/odoo/odoo/commit/83034f4752fd2a126851d6308a3ad39221dcab6a), but its changes were reverted in [commit 2], which only handled char fields. As a result, cases for `bool` and `one2many` fields were missed. Since the `_parse_datetime_data` check at [1] was removed after [commit 2], the error reappears. Fix: Following the logic of [commit 2], this fix extends the handling to bool and one2many fields. [1]- https://github.com/odoo/odoo/blob/462f620803e22da4a2d08915eb31fcda876ec73e/addons/base_import/models/base_import.py#L1466-L1467 [commit 2]: https://github.com/odoo/odoo/commit/743ae7f6555160415b33ba3afb3de7bc78cede81 sentry-6979678378,6924909613
This update corrects an error that prevented payslips from generating correctly when an employee was linked to multiple commission plans using the same input. The fix ensures accurate currency conversion for each commission, preventing a technical error that impacted payslip generation.
Original PR description
Currently, an error occurs while generating a payslip for an employee who is linked to more than one commission plan using the same payslip input. **Steps to Reproduce:** 1. Install the…
Currently, an error occurs while generating a payslip for an employee who is linked to more than one commission plan using the same payslip input. **Steps to Reproduce:** 1. Install the hr_payroll_sale_commission module. 2. Create a user and link to an employee. Set a contract for the employee. 3. Create two commission plans for the same user: - Use the same Payslip Input in both plans. - Set the Target Frequency to "Monthly" for both. 4. Generate a payslip for the employee. Ref: [Video](https://drive.google.com/file/d/1HhtUL2xznS_Aoi9ePL0OJLdGaXU8ZFZR/view?usp=sharing) **Error:** `ValueError - Expected singleton: sale.commission.report(30026010100009, 40026010100009)` **Cause:** When multiple commission records belong to the same payslip input, it tries to convert the commission amount using `coms.commission`, where coms has multiple recordsets. This leads to a singleton error during currency conversion. **Fix:** This commit ensures the currency conversion is applied per commission and prevents the singleton error. sentry-7187854690
This update fixes a discrepancy in the XML export of tax reports. Previously, the exported data didn't align with the report's data due to a mismatch in date calculations (invoice vs. reconciliation). This change ensures the XML export accurately reflects the data within the tax reports, improving data consistency and report accuracy.
Original PR description
## Issue: Invoices exported in the XML did not match the data in section D of the report for the same month The exported data should match the report ## Cause: XML export used the invoice dates (bills invoiced in the period), while the report data is based on the reconciliation entry dates This mismatch caused some invoices to be missing or incorrectly included in the XML ## Steps to reproduce: - Install `l10n_ma_reports` and switch to the MA company - Create and confirm a bill: Bill Date: 10/01/2025 Vendor: Azure Interior Invoice Lines: Price 100, Taxes 20% (S 140) - Go to `Bank Reconciliation` - Add a transaction (Vendor: Azure Interior, Amount: -120 DH, any Memo) - Select the transaction and the invoice, then click Validate - Open the Tax Return for November. Section D should show data linked to the created invoice - Export the XML using the Gear → XML The created bill is missing in the XML and others may be present, showing inconsistent data opw-5002779
This update optimizes the SQL query for the budget report, resulting in significantly faster performance, especially when dealing with large datasets. The change separates the query logic to allow for a more efficient join strategy, reducing processing time and improving report generation speed. This improves the overall user experience for financial reporting.
Original PR description
Before this commit, the SQL query generated in `_get_aal_query` utilized a `LEFT JOIN` with a complex `OR` condition on the join clause: `(bl.company_id IS NULL OR bl.company_id = al.company_id)`.…
Before this commit, the SQL query generated in `_get_aal_query` utilized a `LEFT JOIN` with a complex `OR` condition on the join clause: `(bl.company_id IS NULL OR bl.company_id = al.company_id)`. Because this condition lacks a strict equality constraint, the planner cannot build a hash table for the join. Consequently, it is forced to fallback to a Nested Loop Join strategy, evaluating the condition as a filter for every row pair. This results in significant performance degradation on large datasets. This commit optimizes the query by splitting the logic into two separate `SELECT` statements combined with a `UNION ALL`: 1. Matches where `company_id` is explicitly equal. 2. Matches where `company_id` is NULL. By separating these conditions, the planner can now prioritize a Hash Join for the equality check and handle the NULL join separately, significantly reducing execution time. References: - Original PR introducing the logic: https://github.com/odoo/enterprise/pull/82955 - Plan Before (Join Filter): https://explain.dalibo.com/plan/a55476hgb73ea7g6#plan - Plan After (Hash Cond): https://explain.dalibo.com/plan/3b9g484569a86efb#plan opw-5460862 Forward-Port-Of: odoo/enterprise#104299
This update resolves a problem where imported sales orders containing kit products were incorrectly splitting the order into multiple lots during the POS process. The change prevents this splitting behavior, ensuring accurate sales tracking for kit products, regardless of whether they are tracked by lots. This improves the reliability of the POS system.
Original PR description
When a kit product with tracked components is sold, and if the kit is tracked by lots, the imported sale order lines were being split by lots causing issues in the POS session. Although kits are not supposed to be tracked by lots, this commit prevents the splitting of sale order lines by lots when the product is a kit. opw-5423833 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242785
This update resolves an issue preventing stable IoT Box devices from sending data correctly. The system now correctly interprets data from these devices, ensuring reliable reporting and improved functionality. This change enhances the overall stability and performance of the IoT integration.
Original PR description
We now read data in result key if it exists to ensure readability of stable IoT Box responses. Forward-Port-Of: odoo/enterprise#104194 Forward-Port-Of: odoo/enterprise#104113
This update resolves an issue where canceling self-checkout orders scheduled for a future date didn't consistently remove them from the POS system. Now, cancellations are correctly applied in both the user interface and the POS, ensuring accurate order management. This improves the reliability of the self-checkout experience.
Original PR description
Before this fix, when we placed an order from the self-checkout with a preset slot for a future date, we weren't able to cancel it from the POS. The UI showed it as canceled, but after refreshing, the order was still there. Now, when we cancel an order scheduled for the future, it is correctly canceled both in the UI and in the POS. task : 5246089 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr