Saturday, May 9, 2026
3 changes · 19.0
Enhancements to existing features
Odoo now accepts Brazil's upcoming alphanumeric CNPJ company registration numbers, matching the government’s planned format change from July 2026. This helps businesses continue validating Brazilian company tax IDs correctly without waiting for dependency updates.
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 Forward-Port-Of: odoo/odoo#262939 Forward-Port-Of: odoo/odoo#260516
The Spanish localization now includes the full set of 5% IGIC taxes and matching fiscal positions for the Canary Islands. This improves tax accuracy by correcting cases where the wrong 3% rate or tax group was previously applied.
Original PR description
- Fix also some errors on the 5% taxes, where a 3 percent was applied or the group was not the right onw @jco-odoo --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257991 Forward-Port-Of: odoo/odoo#231836
This update makes project billing warnings calculate much faster by checking timesheet data more directly. It reduces delays for companies with very large numbers of tasks and timesheet entries, improving responsiveness without changing the user-facing workflow.
Original PR description
Previously, computing warning_employee_rate fetched all analytic lines associated with projects.task_ids to check if any employee lacked a sale_order_line in project.sale.line.employee.map. This…
Previously, computing warning_employee_rate fetched all analytic lines associated with projects.task_ids to check if any employee lacked a sale_order_line in project.sale.line.employee.map. This approach had two major flaws: 1- Iterating over all accessible tasks is highly inefficient for large projects, especially since many tasks do not even have associated analytic lines. 2- Fetching analytic lines blindly by task_id could pull in lines linked to a completely different project_id adding performance issues. **Solution**: Since the compute method for the `project_id` field for the `account.analytic.line` model is making sure that the field `project_id` equal the project for the task, then we can remove the domain matching for the `task_id`. We now can replace the `_read_group` with a simple SQL query, filtering out the unmapped projects directly. The benchmark done below was on a database that had around 10M analytic lines, 2K `project_sale_line_employee_map` records and 1M tasks with the top 80 projects in terms of the number of `analytic.lines` + projects that had the most records in the `project_sale_line_employee_map`. | Before | After | | :--- | :--- | | 33.0s | 170.0ms |