Monday, March 16, 2026
9 changes · 17.0
Enhancements to existing features
This update implements the latest withholding tax percentages for Ecuador, as mandated by a recent government resolution. The changes ensure Odoo accurately calculates and reports these taxes, maintaining historical data and compatibility with existing tax configurations. This update addresses specific naming inconsistencies and formatting issues for improved accuracy.
Original PR description
Implement the new withholding tax percentages according to "Resolución N.º NAC-DGERCGC26-00000009" for Ecuador, following internal implementation guidelines by TRESCLOUD. SPECIFICATION: - Created the new withholding percentages as new tax records. - Set the previous withholding percentages as inactive to preserve historical data. - Ensured compatibility with existing tax configurations and fiscal mappings. Table with the changes established in "Resolución N.º NAC-DGERCGC26-00000009". <img width="1676" height="303" alt="image" src="https://github.com/user-attachments/assets/79ae91b2-6d31-442f-af3c-74304742c8b6" /> BP: #252917
Resolved issues and error corrections
This update resolves an issue that occurred when merging customer contacts in the 'l10n_in' module for Russia. Previously, attempting to remove a customer during a merge operation would cause a system error. This fix ensures that the contact merge process functions correctly, regardless of multiple customers being involved, improving data integrity and preventing disruptions to invoicing workflows.
Original PR description
When we select multiple customers and attempt to merge their contacts by removing one of the customers, this error occurs. Steps to reproduce: - Install the 'l10n_in' module - Switch to 'IN company' - Invoicing > Customers >Customers - Go to list view > Select all Customers > Actions > Merge - Click on 'Deco Addict', now come back and remove it - Click on 'Merge Contacts' Traceback:ValueError Expected singleton: res.partner(50, 46, 43, 36) This error occurred at [1] because multiple values are getting in self. This commit will fix the above error by adding it to the loop. 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
This update ensures shift emails are automatically sent in the employee's preferred language, rather than the user's. Previously, the system defaulted to the current user's language, causing confusion. This change improves communication and user experience for employees receiving shift notifications.
Original PR description
Steps to reproduce: ------------------------- 1. Install Planning and Contacts. 2. Install any language other than English (e.g., Arabic). 3. Change an employee's contact language to that language.…
Steps to reproduce: ------------------------- 1. Install Planning and Contacts. 2. Install any language other than English (e.g., Arabic). 3. Change an employee's contact language to that language. 4. Create a shift for that employee and click "Send". 5. Check the message in Settings > Technical > Discuss > Messages. Issue: --------- The email is sent in the language of the current user rather than the language of the employee receiving the shift. Cause: --------- The mail template rendering logic ([_render_lang](https://github.com/odoo/odoo/blob/0dbfa8b99d5c28a7d84e781a7f23b226fd964e95/addons/mail/models/mail_render_mixin.py#L549-L566)) fails to determine a valid language on the planning slot record because it is not directly linked to a `partner_id`. As a result, it falls back to the current user's language. Solution: ------------ Explicitly pass the employee partner's language in the mail context so that the email is sent in the correct language. opw-5928676
This update fixes a vulnerability where email bots were incorrectly triggering meeting cancellations due to links that initiated actions when visited. We've changed the email format to use buttons with post requests, which email bots cannot interact with, ensuring meetings are only cancelled by users.
Original PR description
Mails are sent to users containing an acceptation and cancellation link that accepts GET requests but performs an action on visit Some mail defender software analyzes urls in links by actually visiting the URL. This leads to both actions being triggered without user input. Instead we now send buttons with a neutralizing parameter in the mail. Recipients may then visit the url and click a form button to "accept" or "decline". As these are post requests, the email bots should avoid clicking them. task-4555579
This update fixes a bug preventing the partner autocomplete feature from correctly recognizing valid Non-Resident (NRI) GSTINs. The issue stemmed from an outdated validation rule within the module. The fix ensures that a wider range of valid NRI GSTINs are now accepted, improving data accuracy for users.
Original PR description
Currently, certain `valid GSTINs` for Non-Resident taxpayers are not recognized by the partner `autocomplete` feature. **Steps to reproduce:** - Install the `l10n_in` and `partner_autocomplete`…
Currently, certain `valid GSTINs` for Non-Resident taxpayers are not recognized by the partner `autocomplete` feature. **Steps to reproduce:** - Install the `l10n_in` and `partner_autocomplete` modules. - Navigate to Settings > Users & Companies > Companies. - Click `New` and set `Tax ID` to `9922JPN29001OSU`. - Wait for 5–10 seconds. **Observation:** The partner autocomplete does not trigger, although it is valid and verifiable on the official GST portal: https://services.gst.gov.in/services/searchtp **Root Cause:** The issue was already fixed in core validation by PR [1], but the GSTIN validation logic used in partner autocomplete was not updated. At [2], the GSTIN validation regex for NRI taxpayers only supports formats ending with `NRX` (X = any alphanumeric character). However, certain valid GSTINs follow a revised structure and therefore are not matched by the existing regex. **Fix**: This commit ensures that valid NRI GSTIN formats are accepted during validation by applying a fix similar to [1] to the partner autocomplete GSTIN validation at [2]. Related IAP PR: https://github.com/odoo/iap-apps/pull/1491 [1]: https://github.com/odoo/odoo/pull/251760 [2]: https://github.com/odoo/odoo/blob/3016c08a7aa8701ec9b0092b5aafc282b16dd9f3/addons/partner_autocomplete/static/src/js/partner_autocomplete_core.js#L36-L52
This update fixes an issue where invoices with exchange differences booked as write-offs were incorrectly fully reconciled even when the user chose to keep the invoice open for partial payment. The change ensures that the system accurately reflects the partial payment and exchange difference, preventing incorrect reconciliation and improving financial reporting.
Original PR description
Currently, if a user selects an exchange difference account as a write-off but then decides to keep the invoice open, the system still fully reconciles the invoice. Steps to reproduce: - Create an invoice in foreign currency - Click 'Register Payment' - Select company currency - Change the amount to a lower one - Select 'Mark as fully paid' - Add the exchange difference loss/gain account as write off account - Select 'Keep open' - Click 'Create payment' Issue: Even though the user selected the option to create a partial payment and keep the invoice open, it is totally reconciled with a difference booked in the selected exchange account. Analysis: This occurs because the use of the exchange account as write off account trigger a specific flow used in localization where a writeoff is not allowed. Once the payment registration process is ongoing, the system does not check that user kept the same choice on how to handle the payment difference. opw-5468052
This update resolves an issue causing duplicate push notification popups and a subscription error. By optimizing Firebase integration and ensuring the service worker is properly configured, the application now reliably delivers push notifications across browsers, enhancing the user experience.
Original PR description
When the user sends a push notification through Social Marketing, the application displays two notification popups because: 1. The Firebase SDK automatically displays a notification popup if the…
When the user sends a push notification through Social Marketing, the application displays two notification popups because: 1. The Firebase SDK automatically displays a notification popup if the request made to Firebase includes a `notification` field. 2. Our service worker displays a notification popup when receiving a background message from Firebase. To prevent duplicate notifications, we will remove the custom event listeners in the service worker and update the request made to Firebase so that the Firebase SDK opens a notification for us. Furthermore, this PR fixes the error `Failed to execute 'subscribe' on 'PushManager': Subscription failed - no active Service Worker` occurring when the user accepts the push notifications. To fix that issue, we will: 1. Ensure that the service worker reaches the `ready` state before communicating with it. 2. Set the service worker's scope to `/` so it controls all pages on the origin, ensuring push subscriptions succeed and the worker can communicate with any page. Finally, we will use the legacy `importScripts` syntax to load Firebase dependencies because the ECMAScript module syntax is not supported for service workers in Firefox. This approach improves push notification compatibility across browsers. Task-5124645 Forward-Port-Of: odoo/enterprise#96029
This update resolves a memory issue that occurred when filtering CRM leads, specifically when searching by email. The change disables prefetching of large fields like descriptions, preventing excessive data retrieval and potential 'MemoryError' crashes. This ensures smoother CRM performance, especially with large lead databases.
Original PR description
Use `with_context(prefetch_fields=False)` when evaluating `filtered('email_normalized')` to prevent the ORM from prefetching a large group of fields. This avoids fetching heavy fields such as…
Use `with_context(prefetch_fields=False)` when evaluating `filtered('email_normalized')` to prevent the ORM from prefetching a large group of fields. This avoids fetching heavy fields such as `description` for the whole batch, as by default all the stored fields share the same prefetch group.
which could lead to excessive memory usage and `MemoryError` during recomputation.
```sql
apan_3928644=> select pg_size_pretty(sum(pg_column_size(description))) from crm_lead where description is not null;
pg_size_pretty
----------------
18 GB
(1 row)
```
MemoryError faced with target db:
```py
File "/home/odoo/src/odoo/17.0/addons/crm/models/crm_lead.py", line 465, in _compute_email_domain_criterion
for lead in self.filtered('email_normalized'):
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 6166, in filtered
return self.browse([rec.id for rec in self if func(rec)])
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 6166, in <listcomp>
return self.browse([rec.id for rec in self if func(rec)])
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 6165, in <lambda>
func = lambda rec: any(rec.mapped(name))
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 6142, in mapped
recs = recs._fields[name].mapped(recs)
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 1293, in mapped
self.__get__(first(remaining), type(remaining))
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 1182, in __get__
recs._fetch_field(self)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 3824, in _fetch_field
self.fetch(fnames)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 3874, in fetch
fetched = self._fetch_query(query, fields_to_fetch)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 3967, in _fetch_query
rows = self.env.cr.fetchall()
MemoryError
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update ensures our Ecuadorian accounting software accurately reflects the latest withholding tax regulations (Resolución N.º NAC-DGERCGC26-00000009) issued by the Ecuadorian government. The changes involve updating unit tests to use the correct withholding percentages for 2026, ensuring accurate reporting and compliance.
Original PR description
In accordance with the implementation of the new withholding tax percentages according to "Resolución N.º NAC-DGERCGC26-00000009" for Ecuador, following internal implementation guidelines by TRESCLOUD. Unit tests are updated to be based on the new withholding percentages. BP #110343