Wednesday, June 3, 2026
3 changes · 17.0
Resolved issues and error corrections
This update resolves an issue where FedEx was rejecting shipments due to the format of VAT numbers, specifically those used by countries like Switzerland. The change ensures that VAT numbers are properly sanitized to meet FedEx's requirements, preventing delivery errors and maintaining accurate data.
Original PR description
Backport of af0e834068a9ada2ad1d974c2dd6e75f876d68d9 Original PR: #109999 ----- Ticket: opw-6197750
This update resolves an issue where spreadsheet formulas in the accounting module were sending incorrect data types to the server, leading to errors. Now, all company IDs are automatically converted to numbers, ensuring formulas work correctly regardless of the input format (string or number).
Original PR description
Current behavior before PR: - The `ODOO.CREDIT`, `ODOO.DEBIT`, and `ODOO.BALANCE` formulas passed `companyId.value` directly to the server without converting it to a number. - If a user passed company_id as a string (e.g., '1' from a cell), it was sent to the server as a string, causing a server error. Desired behavior after PR is merged: - `companyId` is converted using toNumber() before being passed to the getter and the server, so '1' becomes 1. - null is preserved as-is (no company filter) while any non-null value is safely cast to an integer. Task: [6240005](https://www.odoo.com/odoo/project/2328/tasks/6240005) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update addresses a technical bug related to how Odoo copies data using OrderedSets in Python 3.14. The fix ensures that the copy process is more stable by utilizing the dictionary's native copy method, preventing errors caused by the Python Garbage Collector. This improves the reliability of Odoo's internal data management.
Original PR description
In Python 3.14, iterating over weak references (like `transaction.envs`) can trigger a `RuntimeError: dictionary changed size during iteration`. This happens mostly because the Garbage Collector can remove a weakref while `OrderedSet.copy()` is rebuilding the set via `dict.fromkeys()`. Instead of re-initializing the set by iterating over its elements, we now directly use the dictionary's native `.copy()` method. This atomic operation prevents the GC from modifying the size of the underlying `_map` during the copy.