Thursday, May 7, 2026
9 changes · saas-18.3
New functionality added to Odoo
This update backports a new feature that allows businesses to automatically verify Polish bank accounts against government data. This improves compliance with local regulations and streamlines the process of onboarding new customers by reducing manual verification efforts. The change was previously developed and tracked in odoo/odoo#250400.
Original PR description
[ADD] l10n_pl_bank_verification: Backport bank account verification Backport of the feature that implements PL Bank Account Verification against the government API See odoo/odoo#250400 task-4637086 Forward-Port-Of: odoo/odoo#262518
Enhancements to existing features
This update ensures Odoo complies with Belgian regulations requiring a legal note on invoices when using the 'Co-Contractant' tax scheme. It adds the necessary fields to capture tax exemption reasons and codes, aligning with legal requirements. This change is important for accurate financial reporting and compliance in Belgium.
Original PR description
It is mandatory in BE to add a legal note on the invoice when using a "Co-Contractant" tax task-5905176 Forward-Port-Of: odoo/odoo#262496 Forward-Port-Of: odoo/odoo#251797
Resolved issues and error corrections
This update resolves a bug that prevented users from merging mailing lists, resulting in an error message. The fix ensures that the system correctly identifies and accesses mailing list IDs during the merge process, improving the reliability of this key feature. This change avoids a frustrating user experience.
Original PR description
Currently, error occurs when user tries to merge a mailing list. Steps to replicate: - Install `mass_mailing`. - Open Email Marketing > Mailing Lists > Mailing Lists and switch to list view. - Select…
Currently, error occurs when user tries to merge a mailing list.
Steps to replicate:
- Install `mass_mailing`.
- Open Email Marketing > Mailing Lists > Mailing Lists and switch to list view.
- Select a single record, and from cog menu Click merge.
Warning:
```
odoo.http: Record does not exist or has been deleted.
(Record: mailing.list(6,), User: 2)
```
Cause:
- When the user clicks Merge, the `mailing.list.merge` form opens and `default_get()` is executed to populate defaults.
- At this point, `src_list_ids` is added to res in a structured format like `[(6, 0, ids)]` [1].
- Later, `res.get('src_list_ids')` is reused and assigned to `src_list_ids` [2].
- Taking `src_list_ids[0]` [3] returns `(6, 0, ids)`, and its first element `6` is incorrectly treated as a record ID and assigned to `dest_list_id`.
- This leads to an attempt to access a record with ID 6, which does not exist, causing the error.
Solution:
- Instead of reading `src_list_ids` back from `res` after it has been set, we initialize and reuse local variables (src_list_ids, active_ids) at the beginning of the method.
- This avoids relying on transformed values in `res` and ensures that `dest_list_id` is computed using a consistent and valid list record IDs.
[1]: https://github.com/odoo/odoo/blob/21877c09863222a237fe99334787ac46935dcca4/addons/mass_mailing/wizard/mailing_list_merge.py#L20-L22
[2]: https://github.com/odoo/odoo/blob/21877c09863222a237fe99334787ac46935dcca4/addons/mass_mailing/wizard/mailing_list_merge.py#L24
[3]: https://github.com/odoo/odoo/blob/21877c09863222a237fe99334787ac46935dcca4/addons/mass_mailing/wizard/mailing_list_merge.py#L26
sentry-7447326420
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#262466This update corrects a display issue where archived opportunity activities were incorrectly shown in activity-related fields within contact lists. The fix ensures that 'Next Activity' fields always reflect the most current, active activities, providing a more reliable view of opportunity progress. This improves data accuracy for sales and customer management.
Original PR description
Steps to reproduce 1. Install crm, contact 1. Contacts → open a contact with an opportunity, if not present, create it. 2. From the Opportunities list view, add Studio fields “Next Activity Summary”…
Steps to reproduce 1. Install crm, contact 1. Contacts → open a contact with an opportunity, if not present, create it. 2. From the Opportunities list view, add Studio fields “Next Activity Summary” and “Next Activity Type”. 3. In the opportunity, create an activity and see the list view of opportunity now from Contacts → opportunity. 4. Mark the current activity as done and create a new activity. 5. Observe the list view again: it still shows the old activity summary/type. Issue - When opening Opportunities from a Contact, archived (done) activities are included in activity-related fields, so “Next Activity” fields can point to old activities. Root cause - Done activity records are now set to archived. The Contact → Opportunities action sets `active_test=False`. https://github.com/odoo/odoo/blob/9b071683e0eb270811302a4dd0ad10e0baaa0834/addons/crm/models/res_partner.py#L57 Since `activity_ids` had no domain, it included inactive activities, and related fields (`activity_summary`, `activity_type_id`) resolve to archived records. https://github.com/odoo/odoo/blob/9b071683e0eb270811302a4dd0ad10e0baaa0834/addons/mail/models/mail_activity_mixin.py#L49 Solution - Instead of passing active_test in context we will pass the domain to prevent the context interfear with activity fields. opw-5942696
This update fixes an issue where users were redirected to the standard form view when opening documents linked through a Many2One field. Now, users can directly access the Kanban or List view, allowing them to preview and navigate documents, especially folders, more effectively. This enhances usability for document management.
Original PR description
Problem: When opening a linked `documents.document` record from a Many2One field added via Studio, the user is redirected to the standard form view. This is problematic because the form view does not allow the user to preview the actual document or navigate into it if the record is a folder. Solution: override `get_formview_action` to open the Kanban/List/Activity views. task-6068437 Forward-Port-Of: odoo/enterprise#116275 Forward-Port-Of: odoo/enterprise#113149
This update resolves an issue where users could incorrectly manage bank accounts across multiple companies within the accounting system. The fix ensures that validation checks accurately reflect the current company configuration, preventing errors when attempting to delete accounts linked to multiple entities. This improves data integrity and reduces potential user confusion.
Original PR description
Steps to reproduce: - Install `l10n_dk` module - Create the test branches under the `DK Company` - Add both companies(parent and branch) in `Bank and Cash` account - Go to Chart of Accounts and try…
Steps to reproduce:
- Install `l10n_dk` module
- Create the test branches under the `DK Company`
- Add both companies(parent and branch) in `Bank and Cash` account
- Go to Chart of Accounts and try to delete any account
Cause:
This error occurs because users can add multiple companies to a `Bank and Cash` account, although it should be prevented by the `_check_company_consistency` [constrain]. However, the code still allows it because, in this [commit], `depends_context=('uid',)` was set on the `company_ids` field to keep separate sudo/non-sudo caches for the field. As a result, during the validation [check], the user may still have stale cached values, causing the system to detect only a single company.
Solution:
Here, we first clear all cached values for the old record and force the ORM to re-fetch the values from the database, ensuring an updated recordset. So, the validation error is raised when saving multiple companies.
[constrain]: https://github.com/odoo/odoo/blob/177fc59b7df7c8522234aaa4dbaeb4fba3bb2131/addons/account/models/account_account.py#L309-L310
[check]: https://github.com/odoo/odoo/blob/177fc59b7df7c8522234aaa4dbaeb4fba3bb2131/addons/account/models/account_account.py#L309-L310
[commit]: https://github.com/odoo/odoo/pull/220294/changes/5096d083a38968425920aa5bf466b156eebb3dc7
Ticket [link](https://www.odoo.com/odoo/project.task/6125840)
opw-6125840
Forward-Port-Of: odoo/odoo#260261This update corrects a bug where company-owned products weren't visible in the ecommerce shop. The issue stemmed from inconsistent website domain retrieval, leading to incorrect filtering of products based on company ID. By standardizing the website domain, this fix ensures all products, regardless of their ownership, are correctly displayed.
Original PR description
## Description ### Problem [sale_product_domain](file:///home/imanie/Documents/IRC/18.0/odoo/addons/website_sale/models/website.py#367-376) uses `self.get_current_website()` for the website domain…
## Description
### Problem
[sale_product_domain](file:///home/imanie/Documents/IRC/18.0/odoo/addons/website_sale/models/website.py#367-376) uses `self.get_current_website()` for the website domain
but `self.company_id` for the company domain. This causes two issues:
1. **`company_id` is `False` when called from [models](https://github.com/odoo/odoo/blob/b011c1e3cc4597c713dfe7041c58dc224f8f758d/addons/website_sale/models/product_template.py#L278)**: Methods like
[_get_website_accessory_product](file:///home/imanie/Documents/IRC/18.0/odoo/addons/website_sale/models/product_template.py#198-203) and [_get_website_alternative_product](file:///home/imanie/Documents/IRC/18.0/odoo/addons/website_sale/models/product_template.py#204-207) call
`self.env['website'].sale_product_domain()` — an empty recordset where
`self.company_id.id` evaluates to `False`. The resulting company domain
[('company_id', 'in', [False, False])](file:///home/imanie/Documents/IRC/18.0/odoo/addons/website_sale/controllers/main.py#757-802) filters out all company-owned
products.
https://github.com/odoo/odoo/blob/b011c1e3cc4597c713dfe7041c58dc224f8f758d/addons/website_sale/models/product_template.py#L279
2. **Inconsistent website references**: Even when `self` is a real website
record, `get_current_website()` could return a different website, leading to
the website domain and company domain referring to different websites.
### Steps to reproduce
1. Add accessory products to a product template
2. Visit the product page on the ecommerce shop
3. Accessory products belonging to the website's company may not appear
### Solution
Store the resolved website in a local variable (`self or self.get_current_website()`),
preferring `self` when it is a real record and falling back to
`get_current_website()` otherwise. Use this single variable for both the website
domain and the company domain.
```diff
def sale_product_domain(self):
- website_domain = self.get_current_website().website_domain()
+ website = self or self.get_current_website()
+ website_domain = website.website_domain()
if not self.env.user._is_internal():
website_domain = expression.AND([website_domain, [
('is_published', '=', True),
('service_tracking', 'in', self.env['product.template']._get_saleable_tracking_types()),
]])
- company_domain = [('company_id', 'in', [False, self.company_id.id])]
+ company_domain = [('company_id', 'in', [False, website.company_id.id])]
return expression.AND([self._product_domain(), website_domain, company_domain])
```
https://github.com/odoo/odoo/pull/260138
Forward-Port-Of: odoo/odoo#263185This pull request updates the core spreadsheet component, addressing several bugs and improving stability. It fixes issues related to chart visibility, error messages, and button functionality within the spreadsheet interface. The update also includes code improvements for consistency and dependency management.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/d88c24e795 [FIX] chart: ensure chart values remain visible (remove clipping) [Task:…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/d88c24e795 [FIX] chart: ensure chart values remain visible (remove clipping) [Task: 5993132](https://www.odoo.com/odoo/2328/tasks/5993132) https://github.com/odoo/o-spreadsheet/commit/d854983ab3 [FIX] Gauge chart: error message in the side panel [Task: 6179300](https://www.odoo.com/odoo/2328/tasks/6179300) https://github.com/odoo/o-spreadsheet/commit/49d0b4dffa [FIX] grid overlay: unhide buttons visibility [Task: 6127335](https://www.odoo.com/odoo/2328/tasks/6127335) https://github.com/odoo/o-spreadsheet/commit/dd00c1135e [REF] lint: enforce braces for all control statements [Task: 6140827](https://www.odoo.com/odoo/2328/tasks/6140827) https://github.com/odoo/o-spreadsheet/commit/e2e096d9cb [FIX] package: add missing types dependency [Task: 6140820](https://www.odoo.com/odoo/2328/tasks/6140820) https://github.com/odoo/o-spreadsheet/commit/b24082bd32 [FIX] pivot: `getPivotCellFromPosition` will throw on invalid formula [Task: 6109696](https://www.odoo.com/odoo/2328/tasks/6109696) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update ensures that if a Stripe terminal payment capture fails, the payment status in Odoo POS is correctly set to 'retry' instead of being marked as 'done' silently. This prevents inaccurate payment records and ensures that payment issues are visible and addressed within the POS system.
Original PR description
Before this commit, a Stripe terminal payment could still be marked as `done` even if the capture step failed. This happens when the card authorization succeeds, `processPayment` returns a payment…
Before this commit, a Stripe terminal payment could still be marked as `done` even if the capture step failed.
This happens when the card authorization succeeds, `processPayment` returns a payment intent, but the subsequent `stripe_capture_payment` RPC fails and `capturePaymentStripe()` returns `false`. The capture flow did not guard that return value and still fell through to `line.set_payment_status("done")`.
In practice, this can happen for example if the Odoo server cannot resolve `api.stripe.com` while capturing the payment intent. Stripe then keeps the payment in `requires_capture`, while the POS line is still synced as paid.
Guard the failed capture path and stop the flow before marking the line as done. In that case, the payment line is put back to `retry` so the failure is visible in the POS instead of silently creating a paid, uncaptured payment.
opw-6075384
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#261521