Friday, April 24, 2026
10 changes · 17.0
Enhancements to existing features
This update prepares Odoo to handle the upcoming transition to alphanumeric CNPJs for Brazilian businesses. The Brazilian government is expanding the CNPJ number system, and this change ensures Odoo can continue to accurately process and validate these new formats. A new validation method has been implemented to avoid dependency issues with older Odoo versions.
Original PR description
Purpose: The Brazilian Federal Government, through the Brazilian Federal Revenue Service (Receita Federal do Brasil), is implementing the alphanumeric CNPJ to address the imminent depletion of its…
Purpose: The Brazilian Federal Government, through the Brazilian Federal Revenue Service (Receita Federal do Brasil), is implementing the alphanumeric CNPJ to address the imminent depletion of its capacity to generate new CNPJ numbers. The current, exclusively numeric model is approaching its limit. The transition to a format that includes letters and numbers expands the number of possible combinations, ensuring the future availability of registrations for new companies. With the government expanding the CNPJ numbers, we need to implement a solution to support the alphanumeric CNPJ that will be issued starting July 2026. Current Behavior: The method, `is_valid,` from stdnum is currently used to determine whether the CNPJ is valid or not. This is now considered an outdated method to determine the validation. Changed Behavior: The new validation logic by stdnum, found here https://github.com/arthurdejong/python-stdnum/commit/d3ec3bd7fefe0d0a708b6594a66de28777eb9b8d, is patched into `check_vat_br.` The reasoning for patching this rather than calling stdnum is because using stdnum will cause library dependency issues for older versions of Odoo. task-5234869 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This update resolves an issue that previously caused errors when deleting empty Kanban columns within the To-Do app. The fix ensures the correct arguments are passed during column deletion, preventing a technical error and improving the stability of the application.
Original PR description
Currently, an error occurs when deleting a kanban column that is empty in the To-do app ### **Steps to reproduce:** 1) Open To-do app. 2) In Kanban, create or locate an empty column (no tasks). 3) Click the column gear icon and choose Delete. ### **Error:** TypeError: Cannot read properties of undefined (reading 'map') ### **Root Cause** The `ProjectTaskKanbanDynamicGroupList` override of `_unlinkGroups` did not forward the `groups` argument to `super._unlinkGroups()` at [1], so the superclass received undefined and attempted to call groups.map(), causing the Error. [1]- https://github.com/odoo/odoo/blob/9468ff7a47d78447b66a4cdf1d33f8c21f51c309/addons/project/static/src/views/project_task_kanban/project_task_kanban_model.js#L24 ### **Fix:** This commit prevents error by ensuring the `groups` argument is passed to super method. **opw-6129664**
This update fixes a labeling issue within the Odoo Enterprise payroll module for Belgium. Specifically, the label for 'insured dependents' on the employee form was incorrect. The change updates the string option to ensure accurate and consistent reporting for payroll calculations and compliance.
Original PR description
Step to reproduce: install l10_be_hr_payroll and go on employee form, payroll tab Cause: wrong string for string option Solution: update the string option Task: 6094807
This update fixes a formatting issue in the e-waybill document date field. Previously, the date displayed included the time, which wasn't the standard requirement. Now, only the date is shown, ensuring consistency and accuracy in e-waybill documentation.
Original PR description
The `document_date` field in e-waybill form view previously included both date and time, which is not as per the expected format. This fix ensures that only the date is shown, hiding the time component.
This update resolves an error that occurred when an invoice was deleted after being sent via post. The system now checks if the invoice exists before attempting to attach the snailmail letter, preventing a 'Record does not exist' error. This ensures the Snailmail process continues to function smoothly.
Original PR description
Currently, an error occurs when the `Snailmail: process letters queue` scheduled action is triggered. Steps to reproduce: - Install the `website` and `account` modules. - Create a `Invoice` >…
Currently, an error occurs when the `Snailmail: process letters queue` scheduled action is triggered. Steps to reproduce: - Install the `website` and `account` modules. - Create a `Invoice` > `Confirm` > `Send` > check the `By Post` checkbox. - `Reset to Draft` newly created invoice and delete it. - Run the `Snailmail: process letters queue` scheduled action. `MissingError: Record does not exist or has been deleted. (Record: account.move(27,), User: 1)` This error occurs when the user sends the invoice by post, which creates a Snailmail letter record related to the invoice. If the invoice is subsequently deleted, the Snailmail: Process Letters Queue scheduled action run and attempt to fetch the attachment of related snailmail letter and invoice[1] but the invoice is not exists [2] and raise a MissingError. [1] https://github.com/odoo/odoo/blob/cc368d553cd94bee8b09d4981cb8f1dbc27a34b3/addons/snailmail/models/snailmail_letter.py#L149 [2] https://github.com/odoo/odoo/blob/420765c787b33f79ee8814f799de721508858319/addons/account/models/account_move.py#L3605 This commit ensures that the system evaluates the attachment only if the invoice also exists. sentry-6635629791 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a technical issue where the OAuth sign-in process would display a generic error message when required information was missing. Now, a more standard error is raised, making it easier to identify and resolve issues during the sign-in flow. This improves the overall user experience and stability of the authentication process.
Original PR description
When required parameters are missing from the OAuth sign-in request to the /auth_oauth/signin route, a generic Exception with the message "invalid_request" is raised. This behavior does not align with standard error handling practices. `Exception: invalid_request` This commit ensures that a ValidationError is raised instead of a generic Exception when the request is invalid. Sentry-6400398175 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the OAuth sign-in process would fail if the 'state' parameter was missing. The change ensures the system safely retrieves this parameter, and raises an error if it's missing or empty, preventing disruptions to user authentication.
Original PR description
The OAuth sign-in route `/auth_oauth/signin` raises a `KeyError` when the `state` parameter is missing from the request.
KeyError: 'state'
This commit ensures the sign-in method uses `kw.get('state', '{}')` to safely retrieve the state parameter. It raises a BadRequest if the state is not present or is empty after parsing.
Sentry-6521782565
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update simplifies the process for creating Unsplash attachments within Odoo. Previously, overly broad access rights were required, but this fix now restricts sudo permissions to only setting the attachment URL, reducing complexity and potential security risks. This change ensures employees can upload Unsplash images efficiently.
Original PR description
Only grant `sudo` to set the attachment `url` rather than applying sudo on the whole `.create` dict The purpose of the previous `_can_bypass_rights_on_media_dialog` was to allow employees uploading unsplash images to be able to create an attachment with an `url` while being a `type='binary'`, for the images to be able to be served with the URL `/unsplash/...`. Just applying `sudo` at the right needed spot rather than on the whole `create` requires less code to achieve the same goal.
This update adjusts the sales subscription module to align with recent changes in the Odoo community. Specifically, it removes a reference to a removed signature tab in the Sales Order view, ensuring the template continues to function correctly after the community update. This ensures consistent PDF generation for sales subscriptions.
Original PR description
In a https://github.com/odoo/odoo/pull/261288, we removed the customer's signature of all generated Quotation/SO's PDF except from the one they actually signed. We also removed the "Customer Signature" tab from the Sales order view. This tab was referenced to extend the template in the `sale_subscription` module. In this commit, we remove this reference and replace it for a reference to the tab before the removed one. task-5421716 opw-6159170 Back port of https://github.com/odoo/enterprise/pull/107529
This update fixes an issue where styled headings in the table of content weren't correctly translated when switching languages. The fix ensures that changes to the table of content are also saved, allowing for consistent translation across all languages. This improves the user experience and ensures accurate content display.
Original PR description
Scenario: - drop table of content snippet in a page - in a title (present in the table of content) add some styling such as bold / color - in a secondary language, change the translation of that header - save Result: the heading in the table of content is not translatable. Cause: the table of content entry is translated by translating the corresponding heading. When the heading is changed, it is synced to the table of content entry with the inline style removed. But when we save, we only save the dirty node so we are only saving the original heading. But since the heading translation doesn't match the table of content entry (because the style tag removal), only the heading translation is updated. Fix: when the table of content entry is updated, set it as o_dirty so it is also saved. opw-5413915 opw-5926501