Friday, April 24, 2026
13 changes · saas-18.4
Resolved issues and error corrections
This fixes a French localization setup issue where an EU service tax was incorrectly marked with a tax tag intended only for goods. The correction helps ensure French tax reporting classifies service transactions properly and avoids inaccurate declarations.
Original PR description
**Issue:** In French localization, a tax tag (i.e. "17") was wrongly added on "8.5% EU Service" tax. This tax tag should only be applied on taxes for goods, not service. opw-5871998 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261030 Forward-Port-Of: odoo/odoo#260641
This fixes an issue where cancelling a spreadsheet confirmation did not trigger the expected cancellation action. Users and business flows that rely on this confirmation dialog will now handle cancel choices consistently.
Original PR description
The `cancel` callback of the `env.askConfirmation` method was not called when the user clicked on the cancel button. task-6074948 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#260061
Replacing a styled image with an icon now removes image-specific shape effects such as rounded corners, shadows, or thumbnail borders. This prevents icons from appearing with leftover image formatting and keeps edited content visually consistent.
Original PR description
### Steps to Reproduce: - Go to the To-do app and create a new task. - Upload an image. - Apply shape styling to the image (e.g., rounded, shadow, img-thumbnail). - Replace the image with an icon. ### Description of the issue/feature this PR addresses: - When an image had shape applied (such as rounded, rounded-circle, shadow, or img-thumbnail) and was replaced with an icon, those classes were carried over to the icon. ### Desired behavior after PR is merged: - Since these classes are specific to image shape styling, they are now removed when an image is replaced with an icon. task-6007631 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259459 Forward-Port-Of: odoo/odoo#258060
The scheduled email queue process now catches database conflicts that can happen when emails are changed while the job is running. This prevents the background job from failing noisily and records a warning instead, improving reliability for bulk email operations.
Original PR description
SQL errors can occur during the mail queue cron, often from concurrent updates. These are normally handled during manual mail processing.But they may be missed when running via cron. The scenario…
SQL errors can occur during the mail queue cron, often from concurrent updates. These are normally handled during manual mail processing.But they may be missed when running via cron. The scenario below can trigger this error, though it’s **not the only situation in which it occurs.** **Steps to replicate:** * Install `mass_mailing` * mass_mailing > Mailing Lists > Imported Contacts > Import [Contacts](https://docs.google.com/spreadsheets/d/1SWbca3rNodYYOs_1tlVF88Bl7nkSs1Rr/edit?usp=sharing&ouid=102312580340639170507&rtpof=true&sd=true) * Mailing Lists > Newsletter Send Mailing> New > Choose template and subject >Send * Run scheduled action/cron: `Mail: Email Queue Manager` * Go to Technical>Email>Emails * Filter all outgoing emails and cancel them quickly while cron is running. `InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block` **Solution:** * Catch the error and log a warning using the logger. **Sentry-6375128449**
This fixes a rare issue where starting a new drag action immediately after another could cause the web interface to crash. Users should experience more reliable drag-and-drop behavior in edge cases without any change to normal workflows.
Original PR description
### [FIX] web: fix crash when cancelling drag sequence Before this commit: drag sequences could be aborted by new drag sequences; the way this worked is that a new sequence would register its "cancel" callback in a global variable, and when another sequence is started, it calls that variable to cancel the previous one. The issue was that the variable was assigned too early; before the actual "cancel" callback was available. This means that in edge cases where 2 sequences would be triggered in less than (effectively) a resolved promise, the callback would not be available and a crash would occur. This commit moves the variable assignment *after* the "cancel" callback is made available, ensuring there is no crash. Runbot [243113](https://runbot.odoo.com/odoo/error/243113) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260822 Forward-Port-Of: odoo/odoo#260594
This fixes a display problem on product pages when zero-priced products are blocked from sale. The online shop now hides the price area cleanly in the boxed purchase layout, avoiding confusing or broken-looking content for shoppers.
Original PR description
When `Prevent Sale of Zero Priced Products` is enabled and a product with a sales price of `0` is opened on the website, switching the purchase style to `Box` causes the price text to render…
When `Prevent Sale of Zero Priced Products` is enabled and a product with a sales price of `0` is opened on the website, switching the purchase style to `Box` causes the price text to render incorrectly. Steps to produce: --- - Install the `website_sale` module. - Go to Settings and enable `Prevent Sale of Zero Priced Products`. - Create a product with a sales price of `0` and publish it. - Open the product on the website. - Open the editor and change the purchase style to `Box`. Issue: --- - The price text renders incorrectly inside the box. Root Cause: --- - At [1], the `<span>` element responsible for rendering the price text does not check whether zero-price sale prevention is enabled, causing the price string to appear regardless. - At [2], after hiding the price span, the `o_wsale_cta_wrapper` element still renders an empty box because no corresponding guard exists there either. Solution: --- - Add a conditional check on the price `<span>`: apply `d-none` when zero-price sale prevention is active, so the price string is not displayed. - Also, add the same zero-price sale prevention check on `o_wsale_cta_wrapper` to avoid rendering an empty box when no price is shown. [1]https://github.com/odoo/odoo/blob/71d176d462b9db743788e4889974931ae9afc94d/addons/website_sale/views/templates.xml#L2233 [2]https://github.com/odoo/odoo/blob/71d176d462b9db743788e4889974931ae9afc94d/addons/website_sale/views/templates.xml#L2221 Before: --- <img width="1488" height="689" alt="image" src="https://github.com/user-attachments/assets/5b3a565f-5ced-4d75-b538-63abc3690e09" /> After: --- <img width="1457" height="612" alt="image" src="https://github.com/user-attachments/assets/1e04fe54-98b6-4e1c-bd26-4d56bb34b90e" /> opw-5994812 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Events app now handles ticket links for attendees who have since been deleted without showing an error. This prevents a broken experience for recipients clicking old event ticket emails and keeps the page stable.
Original PR description
Currently, an error occurs when accessing the ticket link after the related attendee has been deleted. **Steps to Reproduce:** - Install the **Events** module. - Create a new event. - Create an attendee with a valid email ID. - Make sure the email is sent successfully. - Delete the attendee for the event. - From the received email, try to click on the **"View Tickets"** link. **Error:** `IndexError - tuple index out of range` **Cause:** The controller filters registrations using the provided `registration_ids`, but when the attendee is deleted, the resulting recordset becomes empty. It raises an error when trying to access the first element of an empty recordset. **Fix:** This commit handles empty recordsets by returning early when no registrations are found. sentry-7357927405 Forward-Port-Of: odoo/odoo#256310
This fixes an issue in the website editor where rapidly clicking delete on an image wall item could trigger an error after the image was already removed. Editors can now remove image wall items without unexpected interruptions or tracebacks.
Original PR description
Error: Cannot read properties of null (reading 'children') Steps to reproduce: 1.Go to Website -> Edit mode. 2.Add an Image Wall snippet. 3.Click on an image, then repeatedly click the Delete button. 4.Traceback occurs. Before this commit: The first delete click correctly removes the target element from the DOM, including its parent. On subsequent rapid clicks, the handler runs again on the same already-removed element. At that point, parentElement is null, so accessing children throws a traceback. After this commit: Added a safety check using `isConnected` in the delete handler to ensure the element is still part of the DOM. If not, the handler returns early. Repeated delete clicks no longer cause a traceback. task-6033622
Peppol invoice status checks now correctly recognize newer response states when deciding whether a document was sent through Peppol. This helps avoid incorrect sending behavior and makes future Peppol status updates easier to support.
Original PR description
With the addition of new peppol_move_state for the Application Responses in Peppol, some checks to know wether the move was sent through Peppol were not updated. This commit does that by adding a common field for it. This is usefull as we might add some extra peppol_move_state values in the near future (Peppol supports more response types than we currently offer to our users). Forward-Port-Of: odoo/odoo#258598
This update resolves an issue where the 'cancel' button within the spreadsheet functionality didn't properly trigger the cancellation process. The fix ensures that clicking the cancel button now correctly removes the user's action, preventing unintended data changes. This improves data integrity and user experience.
Original PR description
The `cancel` callback of the `env.askConfirmation` method was not called when the user clicked on the cancel button. task-6074948 Forward-Port-Of: odoo/enterprise#112987 Forward-Port-Of: odoo/enterprise#112304
This update resolves an issue where barcode quantities were displaying with slight rounding errors due to how JavaScript handles decimal numbers. The fix ensures accurate quantity representation, particularly when dealing with batch transfers and wave operations, improving data reliability.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to Settings and enable: * Storage Locations (Warehouse). * Batch, Wave & Cluster Transfers. * Create a Product and set its on-hand quantity to…
**Steps to reproduce:**
* Install `stock` module.
* Go to Settings and enable:
* Storage Locations (Warehouse).
* Batch, Wave & Cluster Transfers.
* Create a Product and set its on-hand quantity to 60.
* Go to Inventory → Configuration → Operation Types and create a new operation type:
* Set Type of Operation to Internal Transfer.
* In the Barcode App tab, enable Group batch lines.
* Go to Inventory → Operations → Internal Transfers and create a new transfer:
* Select the newly created Operation Type.
* Add the created Product with quantity 4.4.
* Mark the transfer as To Do.
* Create another Internal Transfer with the same configuration:
* Select the same Operation Type.
* Add the same Product with quantity 48.8.
* Mark the transfer as To Do.
* Open the Internal Transfers list view.
* Select both created transfers.
* Click Action → Add to Wave Transfer.
* Choose A new Wave Transfer and confirm.
* In the popup, select both transfers and add them to the wave.
* Open the Barcode application.
* Open the created operation and select the Batch on the right side
to open the wave transfer in the barcode interface.
**Observed behavior:**
- The grouped line quantity is displayed as 53.99999996 instead of
the expected value(53.2).
**Cause:**
- When the Barcode app loads data,` _createState()` is executed,
which calls `groupLines()`.
- Inside this method, quantities are aggregated using standard
JavaScript floating-point addition:
https://github.com/odoo/enterprise/blob/08d0a7f480046bb489ca69e7b3535e99cb20eee5/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L204-L205
- Since JavaScript stores numbers as binary floating-point values,
decimals like 4.4 and 48.8 cannot be represented exactly.
Repeated additions accumulate precision errors, producing results
like 53.99999996 instead of 53.2.
**Fix:**
- Aggregate quantities using `formatFloat` with the barcode precision
before converting them back to floats
- `formatFloat` rounds the value according to the configured precision
of the barcode model, ensuring the intermediate result is normalized
after each addition. Converting the formatted value back with
`parseFloat` guarantees the stored number respects the expected
decimal precision and prevents floating-point accumulation errors.
---
opw-5932329
Forward-Port-Of: odoo/enterprise#114040
Forward-Port-Of: odoo/enterprise#110241This update resolves an issue where the 'Review' button was hidden in the bank reconciliation widget. The change removed a technical restriction (a 't-if' condition) that was preventing the button from appearing. This ensures users can properly review and reconcile bank transactions.
Original PR description
This commit 34014dd6aed2872e102b54dbf0880cf4c842782f removed a condition on the BankRecButtonList t-if, leading to a non-display of the review button in the bank rec widget. This commit fix the t-if so the button is visible again. opw-5502730
This update fixes an issue where the 'Hide lines at 0' setting caused the Trial Balance report to omit its report-level 'Total' line when printed. The change ensures that all report totals, including the root total, are consistently displayed during printing, improving report accuracy and clarity for users.
Original PR description
When "Hide lines at 0" is enabled, printing e.g. the Trial Balance will drop the report-level "Total" line when printing. This commit fixes that. The issue was introduced in this commit[^1], which didn't consider total lines without a parent (i.e. root total lines). [^1]: https://github.com/odoo/enterprise/commit/7fec18b99eb2aa5ebc357dcad5f95f234db5b7d8 Forward-Port-Of: odoo/enterprise#114084