Monday, October 27, 2025
9 changes · 17.0
Resolved issues and error corrections
This fix restores the Swedish POS rule that limits receipt reprints to one time, helping businesses stay compliant with local fiscal requirements. It also improves blackbox error handling so disconnected devices or unexpected errors are reported more reliably instead of leaving the cashier interface stuck.
Original PR description
Before this commit, the receipt reprint check logic (which only allows a receipt to be reprinted once) was not working. There were two issues preventing it from working: - The name of the function had changed but not been updated in this module, so the override was not applied. - The ID being used to check the order was incorrect. A few smaller issues were also fixed: - A logging issue in the IoT driver, which prevented the error severity from being printed. - An infinite loading UI if the blackbox was disconnected. - The blackbox error handler swallowing up some errors due to only expecting one specific format.
Fixes an issue that could prevent Chilean electronic invoicing users from saving a digital certificate. The change ensures the certificate file is handled correctly, avoiding a validation error during setup.
Original PR description
This must be taken into account to be able to save the digital certificate, otherwise the following error appears 'Invalid base64-encoded string: number of data characters (5) cannot be 1 more than a multiple of 4'. It could be improved even more by working with the context in the view perhaps... that's why I left a TODO
Lithuanian payroll no longer applies the pension contribution twice for employees participating in the pension accumulation system. This helps ensure payslips calculate the expected employee social security contribution and avoids over-deducting payroll amounts.
Original PR description
**Issue**
When generating a payslip for an employee with the `l10n_lt_pension` setting enabled on the contract ("Participate to pension accumulation system"):
- the SSC is raised from 19.5% to 22.5%
- a 3% pension contribution ("Pension Scheme") is added This effectively doubles the expected contribution.
Various sources (e.g. https://taxsummaries.pwc.com/lithuania/individual/other-taxes) seem to show this is not correct.
opw-5067664This update speeds up how Odoo finds usable SEPA direct debit mandates when processing payments. Businesses handling many payments should see faster payment preparation and less waiting time, with no change to the underlying payment rules.
Original PR description
affected versions: 16, 17 The query for `_sdd_get_usable_mandate` is far from optimal. An EXPLAIN ANALYZE shows some pain points that we address in this PR:…
affected versions: 16, 17 The query for `_sdd_get_usable_mandate` is far from optimal. An EXPLAIN ANALYZE shows some pain points that we address in this PR: https://explain.dalibo.com/plan/c4eddda16fa4cf39 - Indexing `sdd_mandate` in `account.move` lets the subquery use an Index Scan instead of a full-table Seq Scan. - Without changing the logic of the subquery it is now way more performant using NOT EXISTS, which avoids the Aggregate node and enables early exit. These two minor changes yield a ~10x speedup in our tests. (probably there's more performance to gain, although this seems to be an issue that will cease on later versions) Some captures on performance over ~2000 payments. Before, a big chunk of the time was spent retrieving the mandate. The more operations the larger the time: <img width="1246" height="655" alt="image" src="https://github.com/user-attachments/assets/3b6695e1-dbb0-46fa-a22c-fba0e9c2ec2b" /> Now over the same amount of payments, the mandates retrievement isn't that troubling anymore: <img width="1050" height="609" alt="image" src="https://github.com/user-attachments/assets/63ad88d1-51a0-4607-ae50-8022cf4cffc7" /> cc @moduon MT-11292 fyi @yajo Forward-Port-Of: odoo/enterprise#97410
This fix stops users from accidentally deleting stock movement lines from receipts or transfers that are already ready to process. It preserves inventory accuracy by ensuring only valid draft or cancelled movements can be removed manually, while still allowing approved internal system cleanup.
Original PR description
Steps to Reproduce: ------------------------- 1. Create a PO with 2 PO lines. 2. On receipt, delete 1 move line. Observation: ------------------------- 1. No user error is raised. Issue:…
Steps to Reproduce: ------------------------- 1. Create a PO with 2 PO lines. 2. On receipt, delete 1 move line. Observation: ------------------------- 1. No user error is raised. Issue: ------------------------- When deleting a move from the receipt, if the move is not linked to any parent (`move_orig_ids`) or child (`move_dest_ids`) moves, the condition in the code evaluates to `False`. As a result, the `UserError` meant to prevent deletion is bypassed. https://github.com/odoo/odoo/blob/ff1893a627fdde7cf752a0f6c19a02780cdf9774/addons/stock/models/stock_move.py#L1993-L1995 Solution: ------------------------- 1. When the unlink method is called internally (from the ORM side), pass a specific context key (e.g. skip_state_check=True). Inside the `_unlink_if_draft_or_cancel` method, use this context to bypass the state check. 2. When the user manually performs a delete operation (from the UI), no such context will be passed. In that case, the state check will still apply, and a `UserError` will be raised if the record is not in a valid state. opw-5081681
Fixed an issue where point-of-sale imports of sale orders could skip lot-tracked products when some quantities were not assigned to existing lots. This helps cashiers process sale orders more reliably without manually re-adding missing product lines.
Original PR description
## Issue: When you have a Sale Order containing products tracked by lots, and there are not enough quantities in the existing lots, importing the SO into the POS does not add the sub-lines that are not linked to a lot However, it is still possible to add these products manually in the POS interface ## Cause: The sub lines are only added for the quantities linked to lots using a loop on `lot_names`: https://github.com/odoo/odoo/blob/47898975c7af83559ea95fb86e07c19feea1d2d7/addons/pos_sale/static/src/app/order_management_screen/sale_order_management_screen/sale_order_management_screen.js#L257-L269 If there is no `lot_names` or there is missing quantity, the condition doesn’t match to add the line and the sub line is skipped ## Steps to reproduce: - Create a storable product tracked by lots - Create a Sale Order for that product - Open a POS session and open the Sale Order - Before the fix, product lines without lots were not added automatically opw-5099616
Batch payments now show a clear warning when SEPA Credit Transfer recipients are missing required country or city details for structured addresses. This helps users correct partner records before generating payment XML files that could become invalid under the upcoming rules.
Original PR description
Starting from November 15th, 2026, SEPA Credit Transfer (SCT) payments require both the partner's country and city to be defined when using structured addresses. If missing, the generated XML file will be invalid. This change adds a non-blocking red banner on the batch payment form to warn users and provide a link to review the affected partners. task-5156613
This update fixes several visual issues introduced by the customer portal redesign, including overflowing sidebars, missing spacing above the footer, inconsistent alert styling, and a missing border around the chatter composer. These changes make portal pages easier to read and use across sales, purchases, accounting, and timesheet views.
Original PR description
This PR aims to fix issues introduced after the portal redesign. task-3714408 part of task-3703251 - Requires https://github.com/odoo/enterprise/pull/55519 ----------- ## Overflowing sidebar With the…
This PR aims to fix issues introduced after the portal redesign. task-3714408 part of task-3703251 - Requires https://github.com/odoo/enterprise/pull/55519 ----------- ## Overflowing sidebar With the portal redesign, we now use a two columns layout with a `d-inline-block` on the left one (sidebar), which allows the sidebar column to grow depending on its content. While this brought more fluidity to the layout, it also introduced an issue, having a very long amount would make the sidebar overflow on the right column. ## Missing padding-bottom on container Commit[1] removed a `padding-bottom` class from the container in order to reduce the vertical whitespace, but this introduced an issue in some cases, depending on the footer in use. By removing the `padding-bottom` utility class, the content of the customer portal would sometimes stick to the footer of the page. ## View timesheet button display Depending on the sidebar layout, the View timesheet button will be display next to two other buttons, and with a `btn-link` class. We adapt the styling and position of the button to make it consistent with other views in which it is also displayed. ## Alerts While fixing the sidebar issue, this PR also fix some inconsistencies in the alerts used within Portal. Mainly about text alignment, and alerts with a link that were missing an `alert-link` class.
Odoo now prevents the built-in Public User from being deleted, avoiding a situation where the login page could become inaccessible. This keeps databases reachable even when the Website app is not installed, and adds test coverage to confirm the safeguard works.
Original PR description
Steps to Reproduce:
1. Create a database without installing the Website module.
2. Navigate to archived users and delete the "Public User."
3. Attempt to log in to the database from another browser or incognito
mode.
4. An internal server error occurs because the public user does not
exist, making the login page inaccessible.
Issue:
Previously, it was possible to delete the public user, leading to an
internal server error due to its absence, which prevented public access
to the login page.
Solution:
- Implemented a restriction to prevent the deletion of the public user,
similar to portal and default users.
- Added a test case to validate this functionality and ensure the
public user cannot be deleted.
task-4423568