Thursday, January 22, 2026
21 changes · saas-18.4
Enhancements to existing features
This update enhances the user experience by adding a cursor pointer to the headers of statement summaries within the accounting module. This allows users to easily navigate and explore their financial data more efficiently. It's a simple change designed to improve usability.
Original PR description
This improves the user experience by indicating that the headers are clickable. No task ID Forward-Port-Of: odoo/enterprise#105023
Resolved issues and error corrections
Fixed an issue where sending an Italian electronic invoice in a foreign currency could fail when discounts reduced the total to zero. Businesses can now process these zero-amount invoices without interruption.
Original PR description
**Steps to reproduce:** 1. Install the `l10n_it_edi` and switch to IT company 2. Go to Accounting → Invoice. 3. Create an invoice add partner and change the currency to USD 4. Add a product and apply tax and discount of 100% and confirm 3. Click on Send **Issue:** A ZeroDivisionError is raised during the Italian EDI XML generation. `ZeroDivisionError: float division by zero` **Cause:** The conversion rate is computed by dividing `amount_total` by `amount_total_signed` without handling the case where `amount_total_signed` is `0.0`. **Solution:** Skip the conversion rate computation when the signed total amount is zero, preventing the division by zero **opw-5481821** Forward-Port-Of: odoo/odoo#244423
Code cleanup and technical improvements
The accounting test framework now includes a more reliable way to compare expected results, and the Argentinian localization test suites were updated to use it consistently. This improves confidence that invoices, point of sale, stock, website sale, and withholding flows for Argentina continue to work correctly without changing day-to-day user behavior.
Original PR description
- Implemented a working `assert_json` method on `AccountTestInvoicingCommon`, that also supports the ignore_schema system and quick save using the `SAVE_JSON` test tag. - Refactors the whole test suite of `l10n_ar*` modules to use the new accounting test helpers properly. task-4891206 Forward-Port-Of: odoo/odoo#244466 Forward-Port-Of: odoo/odoo#242309
Editing a message in the Mail app now keeps any role mentions instead of removing them. This prevents important notifications or references from being lost when users update previously sent messages.
Original PR description
**Current behavior before PR:** Editing a message with a role mention would cause the mention to be lost. **Desired behavior after PR is merged:** Role mentions are now preserved when editing a message. task-4702960 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218992
Accounting document imports now better recognize XML files that use namespaces. This helps prevent valid supplier documents or invoices from being missed during import, reducing manual correction work.
Original PR description
Because parsers treat <tag> and <ns:tag> as completely different elements, we need to adapt the search in case we are dealing with an xml using namespaces. opw-5362664
Belgian Peppol invoices using the "Pack of 6" unit of measure could fail validation because the exported unit code was not accepted by Peppol. This fix removes that unsupported code so affected invoices can be sent successfully through Peppol.
Original PR description
**Steps to reproduce:** - Use a Belgian company - Create a Belgian contact with "EU Standard (Peppol Bis 3.0)" as eInvoice format - Create an invoice for that customer with a product using "Pack of 6" as unit of measure - Confirm the invoice - Send it to Peppol **Issue:** The validation of the invoice fails with the following error: "[BR-CL-23]-Unit code MUST be coded according to the UN/ECE Recommendation 20 with Rec 21 extension" **Cause:** The UNECE code used for "Pack of 6" UoM is "HD". "HD" is a correct UNECE code for "Half Dozen". However, it is not part of the subset of codes accepted by Peppol. opw-5463212 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244668
Delivery documents now avoid showing the product name twice when an order line uses a free text product attribute. This keeps warehouse and customer-facing delivery slips clearer and reduces confusion during fulfillment.
Original PR description
****Behavior:**** **Current:** When creating a quotation with a product that has a free text attribute. The stock move and delivery slip show the product name another time in the description. This is…
****Behavior:**** **Current:** When creating a quotation with a product that has a free text attribute. The stock move and delivery slip show the product name another time in the description. This is caused because the XML template checks if the description differs from the product name (which is the default) before rendering. However for products with free text attribute, the description contains both the duplicate name aswell as the custom value of the attribute, which slips through the template check and causes the name to appear twice. **Expected:** We want the picking description to appear only when it has been set. So an additional check ensuring the description differs from the product name was added before it is merged with the free text attribute. **Steps to reproduce:** - Create an attribute with a free text value. - Create a product with the said attribute - Create a quotation containing the product - Confirm the quotation - Open the related delivery order - You should observe that the name of the product is duplicated - If you try to print the delivery slip you should observe the same thing. opw-5118725
This fix prevents an error that could appear when opening an employee's Work Information from an already-loaded organization chart. Users can continue viewing employee reporting structures without being interrupted by a crash.
Original PR description
When User tries to Open Work Information of an employee, A traceback will appear. In [Commit](https://github.com/odoo/odoo/commit/fefe07041c2559a6d1bb39f367477264aa5c3fb2), ``max_level`` key is added in the context, However, organization charts that were already loaded before this change will not have the ``max_level`` key in their context, leading to the error. https://github.com/odoo/odoo/blob/fe252296d1534a01f7fd777275a643af3726f4c9/addons/hr_org_chart/controllers/hr_org_chart.py#L56 Traceback: ``KeyError: 'max_level'`` sentry-6834408745 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A small typo was fixed in automated tests for the Mail app's search highlighting behavior. This helps keep internal quality checks accurate and reduces the chance of false test issues, with no expected change for end users.
Original PR description
Intoduced by https://github.com/odoo/odoo/pull/118794 Forward-Port-Of: odoo/odoo#244832 Forward-Port-Of: odoo/odoo#244720
The website header now reappears more smoothly when users scroll back to the top, especially on mobile and right-to-left language pages. This prevents a brief horizontal scrollbar or shifted layout, improving the browsing experience without changing functionality.
Original PR description
There was an horizontal scrollbar that would appear for a short time after scrolling back to the top of the page. This would occur because the header would still have the "transform" property but the class "o_header_affixed" was already removed. To fix the issue, the header transform is now applied using dynamicContent, to synchronize the style and class correctly. This requires the standard header to have "transition: none" applied after it is scrolled since "translate(0, -100%)" would trigger an animation when hiding the header. task-5155878 Forward-Port-Of: odoo/odoo#241980
Fixes an issue in the HTML editor where applying a text color to a full list could leave the bullet or number marker unchanged. This keeps list formatting visually consistent for users creating or editing content.
Original PR description
### Steps to reproduce: - Create a list and type some text. - Press Ctrl + A and apply a text color from the toolbar. - Observe that the list marker is not colored. ### Description of the issue/feature this PR addresses: - `getFonts` looked for the closest element with a text color class, and this also matched `<li>` elements. When a `<li>` was selected, its text color class was removed and moved to a new <font> element created inside the `<li>`. - As a result, the color class was removed from the list item itself, which broke list marker coloring. ### Desired behavior after PR is merged: - Text color classes remain on list item, so list markers are colored correctly. task-5454639 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes an automated website editor test wait until the editor is fully ready after switching to the Sidebar header layout. It helps prevent false test failures, improving confidence in website customization stability without changing customer-facing behavior.
Original PR description
When changing the header template to 'Sidebar', the loading screen disappears but the WebsiteBuilder component remounts asynchronously. If the tour proceeds to the theme tab before the remount completes, the builder resets to the Edit tab (its initial state), breaking the test flow. We wait for the builder to remount, and add `.editor_enable` class to the body of the iframe, so then nothing disrupts the flow. runbot-234504
PDF quote templates can now detect form fields that are organized in a hierarchy, not only simple flat fields. This helps sales teams use a wider range of PDF quote templates without missing fields during quote generation.
Original PR description
- For Hierarchy objects, we have to check '/T' in '/Parent' instead directly within '/Annot' like flat fields. Desired behavior after PR is merged: - Support form fields with Hierarchy objects. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238323
Direct sale orders in the restaurant point of sale now show the customer-facing tracking number instead of the internal POS reference. This makes floating orders easier for staff to identify and reduces confusion during service.
Original PR description
Before this commit, when making a direct sale, the floating order name was the pos reference instead of the tracking number. This is now fixed. task-id: 5470874 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242359
This update resolves an error that occurred when generating PDF reports for accounting, specifically when a contact didn't have a name assigned. The fix ensures that reports now function correctly even with contacts lacking a name, improving the reliability of the reporting process.
Original PR description
Currently, an error occurs when exporting an accounting report to PDF if any of the selected contacts do not have a name. **Steps to reproduce:** - Install the `account_reports` and `contacts`…
Currently, an error occurs when exporting an accounting report to PDF if any of the selected contacts do not have a name. **Steps to reproduce:** - Install the `account_reports` and `contacts` modules. - Go to Contacts and open any contact (e.g., Azure Interior). - Click `Add` > `Save & Close`, then `save` the contact. - Navigate to Accounting > Reporting > Aged Receivable. - Click `Partners` button and select the newly created contact (e.g., `Azure Interior, Other Address`). - Click `PDF` to export the report. **Error:** `TypeError: sequence item 0: expected str instance, bool found` **Root Cause:** At [1], `options['selected_partner_ids']` is built using `partner.name`, which may be `False` for unnamed contacts. At [2], the `partner_value` list may therefore contain `False` entries coming from `options['selected_partner_ids']`. When calling `', '.join(partner_value)`, an error is raised because the list contains `non-string` (`bool`) values. **Fix:** This commit prevents errors when exporting reports to PDF and ensures that partner names are displayed in the report the same way as in the partner selection widget. [1]: https://github.com/odoo/enterprise/blob/a0ec2fcdc043cf52f1a646e84b9b97466072d47f/account_reports/models/account_report.py#L745 [2]: https://github.com/odoo/enterprise/blob/099c7b94ad08f83873c05ec528e16fbf806f47f2/account_reports/data/pdf_export_templates.xml#L84-L93 opw-5467321 Forward-Port-Of: odoo/enterprise#105025 Forward-Port-Of: odoo/enterprise#103828
This update resolves a problem where FedEx labels incorrectly displayed addresses containing special characters (like accented letters). The code has been updated to ensure all addresses are converted to ASCII characters before being sent to FedEx, preventing display issues on labels. This ensures accurate and consistent address formatting for shipments.
Original PR description
Issue ----- Fedex does not handle special characters in addresses, so passing an address such as "Rue de Libération 15" will show as "Rue de Lib...ration 15" on labels. ----- Ticket: opw-5419724 Forward-Port-Of: odoo/enterprise#104979 Forward-Port-Of: odoo/enterprise#104265
This update addresses a technical issue that was causing a test to fail in Odoo's HR payroll module. The fix ensures that pages transition correctly during tests involving changes to employee job roles, preventing unexpected test failures. This improves the reliability of our automated testing process.
Original PR description
In the test tour related to the correct change of the salary configurator when the job changes on the employee, some missing expectUnloadPage options were causing the test to crash because the page was changing unexpectedly. With this PR we fix this error. Runbot Error: 231605
A test was failing intermittently due to an issue with redirect URLs being incorrectly formatted. This update corrects the test to handle these URLs properly, ensuring consistent test results. This resolves a technical problem that could have impacted the stability of the system.
Original PR description
Bug === On some runs, the redirect URL is absolute and not relative, (eg: `http://127.0.0.1:8069/web/signup?db=...`) and so the test needs to be adapted. Task-5857520 Forward-Port-Of: odoo/enterprise#105027
This update ensures our subscription icon aligns with the established Milky icon design guidelines. This improves the visual consistency of our SaaS offering and reinforces our brand identity. The change is a minor update to maintain a polished user experience.
Original PR description
This `network_light.svg` wasn't quite aligned with Milky picto's design guidelines. In this PR the pictogram has been tweaked in order for it to follow the guidelines. task-5126719 Forward-Port-Of: odoo/enterprise#95895
This update resolves an issue where the 'Pending' button in the manufacturing order workflow incorrectly stopped productivity records for all employees involved, instead of just the current one. The fix ensures that only the employee actively working on the operation is impacted, improving workflow efficiency and preventing unnecessary resource allocation.
Original PR description
Steps to reproduce the bug:
- Create a storable product P1 with the following BoM:
- Create a new operation OP1
- Create a manufacturing order to produce one unit of P1
- Confirm the manufacturing order
- Log in as Mitchel (admin) and start OP1
- Log in as Marc (demo) and also start OP1
- Click on Pending
Problem:
Both “mrp.workcenter.productivity” records are stopped, instead of stopping only the one linked to
The `button_pending` method was stopping productivity records for all employees linked to the work order.
opw-5453752
Forward-Port-Of: odoo/enterprise#103853
Forward-Port-Of: odoo/enterprise#103553This update streamlines the testing process for the Ar-EDI module by automatically verifying data against JSON files. This change allows tests to run without external dependencies and simplifies updates to test data through a simple tag.
Original PR description
This commit refactors the whole `l10n_ar_edi` test suite to use the new helpers, and made it possible for the test to (finally) be run without external mode. Now, when running these new tests, the test framework will by default assert the request data with their associated JSON file. When a change is made, new overwrites for the test files can be easily changed by just adding the `SAVE_JSON` test tag on the command to run the tests. task-4891206 Forward-Port-Of: odoo/enterprise#104886 Forward-Port-Of: odoo/enterprise#103370