Wednesday, May 6, 2026
15 changes · saas-18.4
Enhancements to existing features
Customer VAT numbers for Iceland and Albania now retain their country code prefix when saved. This prevents Peppol invoice sending errors caused by missing prefixes and helps businesses invoice these customers more reliably.
Original PR description
Current behavior before PR: To send an invoice via Peppol, the customer's VAT must have the country code as a prefix. But while creating customers from countries like Iceland and Albania, It removes the country code prefix. Which later raises an error while sending the invoice that "The VAT of the customer should be prefixed with its country code." Desired behavior after PR is merged: VAT numbers for customers in Iceland and Albania now keep their country code prefix, letting users to send invoices via Peppol. task-6050791 Forward-Port-Of: odoo/odoo#259105
Resolved issues and error corrections
This fix prevents the point-of-sale flow from crashing when a cashier selects cash payment on a Razorpay terminal configured for all payment modes. It improves checkout reliability by safely handling missing payment data instead of showing an error.
Original PR description
Steps: - Open a POS configuration with the Razorpay payment method set to all payment modes. - Process an order and initiate a Razorpay transaction. - Select a cash payment option on the terminal. Issue: - A traceback occurs with the error: `Cannot read properties of null (reading 'replace')`. Cause: - The code attempts to call the replace method on a null value. Fix: - Ensure the replace method is called only when the value is a valid string. Task-6190355 Forward-Port-Of: odoo/odoo#261922
Code cleanup and technical improvements
This change reorganizes how website builder plugins define which submit buttons should be excluded when saving snippets. It makes the behavior easier to maintain and lets related website features add their own rules without changing shared base logic.
Original PR description
\* = website, website_payment Previously submit button selectors were defined in a single hardcoded string in the save snippet logic. This made the list harder to maintain and required modifying the base code whenever a new plugin needed to exclude its submit button from being saved as a snippet. Introduce a resource allowing plugins to register their own submit button selectors. Plugins can now extend this list directly from their code without modifying the base implementation. This makes the logic easier to maintain and provides a reusable extension point for other submit-button related behaviors in plugins. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes contact ordering in Discuss so people whose email addresses start with the typed search terms are properly prioritized. It makes search results more relevant and helps users find the intended contact faster.
Original PR description
In Discuss, the function used to sort partners prioritizes those whose email addresses start with the search terms. However, due to an error in the programming of the corresponding condition, this check could never be true. This commit adjusts the condition so that it behaves as expected. Forward-Port-Of: odoo/odoo#262583
This fixes an unstable automated test in the HTML editor related to showing and hiding power buttons. The change helps reduce false failures in the validation pipeline, improving confidence in releases without changing end-user functionality.
Original PR description
The previous fix [1] removed one animation frame too many because the first one after arow down is needed in order to trigger the hiding of the power buttons in the first place, otherwise the timer can have elapsed without an animation frame when the runbot is slow. Then, for the other ones, the animation frame must not be awaited, otherwise we risk having an animation frame when the runbot waited more than the debouce delay, as explained in [1]. runbot-242466 [1]: https://github.com/odoo/odoo/pull/259654 Forward-Port-Of: odoo/odoo#262679
This fixes an issue in the HTML editor where using Undo after deleting text could restore the cursor and formatting toolbar to the wrong line. The editor now saves the cursor position before deletion, making Undo behave more predictably for users editing formatted text.
Original PR description
Problem: In some cases, undo restores the selection to an incorrect position. Cause: The selection state was not staged before the deletion started, leading to an inconsistent selection being restored during undo. Solution: Stage the selection before performing the deletion to ensure it can be restored to the correct position. Steps to reproduce: - Go to To-Do → Create New. - Type something on the first line and press Enter. - Type something on the second line and apply styling to it. - Use the Up arrow key to move to the first line. - Remove a character. - Press Undo (Ctrl + Z). - Observe that the selection and toolbar appear on the second line. task-6142055 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260630
Employees with access limited to their own timesheets can now open the details of projects assigned to them without seeing an access error. This prevents a blocker when recording or reviewing time on sales-related projects, while keeping broader Project app access restrictions intact.
Original PR description
### Steps to reproduce: - Download 'Sales', 'Project', 'Employees', and 'Timesheets' apps - Create an employee and link them to a user that doesn't have any access rights except to 'Timesheets =…
### Steps to reproduce:
- Download 'Sales', 'Project', 'Employees', and 'Timesheets' apps
- Create an employee and link them to a user that doesn't have any access rights except to 'Timesheets = User:own timesheets'
- In Sales, create a service with the following specifications:
- 'Create on Order' is 'Project'
- 'Invoicing Policy' is 'Based on Timesheets'
- Create a new quotation that requests this service and click 'Confirm'
- In 'Project' > 'Configuration' > 'Projects', choose the newly created project and add a line that has the new employee in the 'Invoicing' tab
- Log in as that employee and go to 'Timesheets'
- Create a new entry for the newly created project
- Click the project's name
> Access Error: You are not allowed to access 'Collaborators in project shared'
(project.collaborator) records.
### Cause of Issue:
This happens because the user doesn't have access rights to the 'Project' app, hence they don't have access to `collaborator_ids` which are retrieved here. https://github.com/odoo/odoo/blob/3dfb2849acd899ccbf4048f2a15dff3c74aed96d/addons/project/models/project_project.py#L1113-L1120
### Fix:
Since an access to the 'Projects' app isn't necessary to view a project assigned to you, `sudo()` is necessary for hr_timesheet users without project access rights.
opw-6074833
Forward-Port-Of: odoo/odoo#262649
Forward-Port-Of: odoo/odoo#258370Creating a company from customer or vendor autocomplete now follows the same rules as the contact form. DnB industry information is no longer saved as partner tags, keeping contact records cleaner and consistent across workflows.
Original PR description
Partner Autocomplete was updated so DnB industry data (UNSPSC) is no longer stored on Partner Tags. That behavior was applied to the name/VAT char widget, but creating a company from a Partner…
Partner Autocomplete was updated so DnB industry data (UNSPSC) is no longer stored on Partner Tags. That behavior was applied to the name/VAT char widget, but creating a company from a Partner many2one (e.g. customer/vendor on an invoice) still used the old path: calling an IAP suggestion `iap_partner_autocomplete_add_tags` Steps to reproduce: ------------------- * Open a customer invoice (draft). * On Customer, search a company name and pick a Partner Autocomplete line to create a new company. * Save the quick-create dialog. > Observation: The new contact still had Partner Tags populated from DnB industry data (UNSPSC), unlike contacts created or enriched from the contact form autocomplete. (see video on ticket to avoid using more IAP credits) Why the fix: ------------ Align `res_partner_many2one` with `field_partner_autocomplete`: do not call `iap_partner_autocomplete_add_tags`. From task-5373200, industries from DnB must no longer be added as Partner Tags. opw-5972360 Forward-Port-Of: odoo/odoo#262615 Forward-Port-Of: odoo/odoo#260078
Searches for employee records by start or end date now return the correct versions. This prevents misleading HR search results when teams filter employee history by specific dates.
Original PR description
Previously, the searches defaulted to delegating the search to the contract_date_start/end fields instead of mapping to the actual computes of date_start and date_end, which caused incorrect results when searching for versions with a specified date_start or date_end. This PR fixes this by implementing the search method on date_start and date_end to correctly map the search to the expected values for date_start and date_end. Task-6067139 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
Sales orders now calculate invoiced quantities consistently when products are sold in packages and later partially returned or credited. This prevents small mismatches between delivered and invoiced quantities, helping teams avoid confusion during billing and order follow-up.
Original PR description
Steps to reproduce: --- - Install the `Sales and Inventory` modules. - Enable `Units of Measure & Packagings` from Settings. - Go to `Sales > Configuration > Products > Units & Packagings.` - Create…
Steps to reproduce: --- - Install the `Sales and Inventory` modules. - Enable `Units of Measure & Packagings` from Settings. - Go to `Sales > Configuration > Products > Units & Packagings.` - Create a new unit > Pack of 12 with quantity 12 and unit Units. - Create a new product > enable Track Inventory, set Quantity On Hand to 100, and in the `sales` tab, under `Upsell & Cross-Sell`, set `packaging` as` Pack of 12`. - Create a Sales Order > add the product and set the quantity to 3, with a unit Pack of 12. - Confirm the order and validate the delivery. - Create and confirm the invoice. - Return `1 unit` from the delivery and validate it. - From the invoice, create a `credit note` with quantity 1 unit and confirm it. - Go back to the Sales Order. Issue: --- - On the Sales Order: `Delivered Quantity` shows` 2.92` while `Invoiced Quantity` shows `2.91`. Root cause: --- - At [1] & [2], in `_compute_qty_invoiced`, the `_compute_quantity` method is called without specifying a `rounding_method`, so it defaults to `UP` (1/12 rounded to 0.09), while `_compute_qty_delivered` explicitly uses `HALF-UP` (1/12 rounded to 0.08), leading to inconsistent rounding. Solution: --- - In this PR, the same rounding method (HALF-UP) is applied when computing the invoiced quantity to ensure consistency with the delivered quantity. [1]https://github.com/odoo/odoo/blob/64c1f1a7d3b24ca613d0b29a2412f1094fea08d9/addons/sale/models/sale_order_line.py#L896-L912 [2]https://github.com/odoo/odoo/blob/64c1f1a7d3b24ca613d0b29a2412f1094fea08d9/addons/sale_stock/models/sale_order_line.py#L193-L209 opw-6073690 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258024
A minor correction was made to the French financial reports (pnl) to ensure accurate reporting. Specifically, a typo was fixed where 'exceptionnel' was incorrectly using masculine language when referring to charges. This ensures compliance with French accounting standards.
Original PR description
There was a small typo in section 8 of the pnl report. "exceptionnel" must go feminine when referring to charges. Forward-Port-Of: odoo/enterprise#116198
This update resolves a bug that prevented accurate bank reconciliation balances when changing currencies for a transaction. Specifically, editing a bank statement line after switching currencies would reset the balance to zero. This ensures correct balance calculations during bank reconciliation processes.
Original PR description
Fixed an issue where when editing a move line for the bank reconciliation and setting the currency to a currency other than the company's currency if we edit the move line again we will find that the balance is equal to 0. task-6037835 Forward-Port-Of: odoo/enterprise#114898
This update corrects an issue where payslips were incorrectly linked to contract dates instead of the correct version date. The fix ensures payslips accurately reflect the version they belong to, improving payroll accuracy and reporting. This change was enabled by a related update to Odoo's search functionality.
Original PR description
Prior to this commit, the version domain on payslips only looked at the contract dates rather than the version's dates. The domain was fixed in this commit to limit the domain based on the version's dates instead, and this was allowed after the searches on the version date_start and date_end fields were fixed in the odoo/odoo#256581. task-6067139
This update automatically refreshes the payment screen when the PIS payment status changes. Previously, users had to manually refresh the page to see the updated status, leading to delays. This improvement ensures payment information is always current and accurate for users.
Original PR description
There were some buttons like sign payment that were visible even when the PIS status was signed which needed a manual page refresh for the update to reflect, now it's reflected automatically on the PIS status change. task-5417365 Forward-Port-Of: odoo/enterprise#114299
This update resolves an issue where free FSM services with prepaid invoicing were not appearing on invoices. The change adjusts a calculation to correctly reflect the quantity of services, ensuring these services are now properly included when generating invoices. This improves the accuracy of invoicing for service-based contracts.
Original PR description
Changed _compute_qty_to_invoice in industry_fsm_sale, SaleOrderLine to no longer set qty_to_invoice to 0 for free services with prepaid invoicing. Previous changes seem intended for goods. Steps to reproduce: - Create service product with 0 price, prepaid invoice policy, creates FSM task - Create/Confirm sales order with created product - Attempt to create invoice, get 0 quantity to invoice error Current Behavior: Free services linked to FSM tasks do not appear on invoices due to compute 0 qty_to_invoice Expected Behavior: Prepaid Invoice Services linked to FSM tasks appear on invoices. Other invoice policies can be invoiced through the generated sales order lines (timesheets, delivered quantity, etc.) opw-6047992 Forward-Port-Of: odoo/enterprise#113718