Wednesday, October 29, 2025
19 changes · saas-18.3
Enhancements to existing features
The accounting accrued orders wizard now includes a cleaner extension point for creating reversal entries. This makes it easier for custom modules to support accruals spread across multiple periods, helping match reversals more accurately with future invoices.
Original PR description
Add a dedicated hook method to facilitate customization of reversal entry generation in the accrued orders wizard. Reason: The current implementation creates a single reversal entry that is applied in the next period. For scenarios requiring accrual allocation across multiple periods, modules need the ability to generate multiple reversal entries (one per period) to properly net-off against actual invoices --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233295 Forward-Port-Of: odoo/odoo#233142
Resolved issues and error corrections
A test for timesheets involving time off and public holidays now uses the correct user context instead of an employee record. This helps keep automated checks accurate and reduces the risk of regressions in timesheet and holiday handling.
Original PR description
In the 'test_timesheet_time_off_including_public_holiday' test case, 'employee' was mistakenly passed to 'with_user'. This commit replaces 'employee' with 'user' for consistency. task-4809916 Forward-Port-Of: odoo/odoo#233366
Updating a customer statement email template no longer fails when all recipients have been removed. This prevents an unexpected error and lets users continue editing the email before choosing recipients.
Original PR description
Currently, an error occurs if the recipients of the statement report are removed and the user tries to update the email template. **Steps to Reproduce:** 1. Install Accounting. 2. Customers (list view) > select any record > Actions > Customer Statement > Send. 3. Remove recipients and try to update the email template. **Error:** `KeyError - False` **Cause:** The system tries to fetch mail field values from an empty recipient list, leading to a KeyError. **Fix:** This commit recomputes the recipient partners before updating the email subject and body from the template. sentry-6918345730 Forward-Port-Of: odoo/enterprise#96273
This fix prevents Swedish payment batches using IBAN accounts from being incorrectly identified as local BBAN payments when account type details are missing. It helps avoid misclassification in payment processing and restores the expected behavior validated by automated tests.
Original PR description
The method `_is_se_bban` is supposed to flag if payments are bban or iban. But since 8d77c0442d7912880c5da5976c92b24d3f9885ca,
the method returns True for batch of iban payments when you don't provide the `partner_acc_type` params, because
`len({'bban_se', 'plusgiro', 'bankgiro', *(partner_acc_type or {})}) == 3`
is always True if `partner_acc_type` is None.
This commit fix that behaviour, by replacing the empty set by `{'iban'}`, meaning the second condition will always be
False when `partner_acc_type` is None.
This bug has been found by failing runbot tests (error: 233465)
no-task
Forward-Port-Of: odoo/enterprise#97876This fix restores the intended accounting setup for rounding differences in the French localization. It ensures those amounts are assigned to the correct type of account, helping keep financial records consistent and compliant.
Original PR description
These accounts were changed by mistake. Even more, they're of the wrong type. Re-add account to be consistent with 758 opw-5180702 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232902
This fix ensures Peppol-related partner screens are built on the correct accounting e-invoicing views. It prevents upgrade or installation errors when the expected e-invoicing fields are not available in the base partner view.
Original PR description
Currently the following views inherit from `base.view_partner_tree`: - `res_partner_form_account_peppol` - `res_partner_view_tree` The views mentioned about contain xpath expressions based on the `ubl_cii_format` field. But the view in `base` does not include the field yet. It is added in module `account_edi_ubl_cii`. This commit changes the inheritance to be from the equivalent views in `account_edi_ubl_cii` instead. Otherwise there is an error in a test when upgrading from 16.0 to 17.0 with the backported `account_peppol` to 16.0. task-4925169 Forward-Port-Of: odoo/odoo#233461 Forward-Port-Of: odoo/odoo#231637
Website forms no longer crash when a field originally set to prefill contact details is changed into an attachment upload field. This keeps form editing and saving reliable for website managers making changes to contact forms.
Original PR description
Steps to reproduce: =================== 1- Add a Contact Us form. 2- Change the "Phone" field type to "Attachment" and save. → Traceback occurs. Cause: ====== After changing the field type, the field…
Steps to reproduce: =================== 1- Add a Contact Us form. 2- Change the "Phone" field type to "Attachment" and save. → Traceback occurs. Cause: ====== After changing the field type, the field still keeps its `fillWith` value. When saving or refreshing, the system tries to prefill it with a phone number. Since the type is now "file", it cannot be prefilled, causing a traceback. Why it didn't happen before: ============================ In older versions, fields were fetched using `serializeArray()`: https://github.com/odoo/odoo/blob/ad03751ef0a9e617c2b24a30b1c06aa4e25d48a1/addons/website/static/src/snippets/s_website_form/000.js#L167 That method automatically filtered out unsupported input types: https://github.com/odoo/odoo/blob/ad03751ef0a9e617c2b24a30b1c06aa4e25d48a1/addons/web/static/lib/jquery/jquery.js#L9001 Fix: ==== Exclude fields of file-like types from the prefill logic, similar to the behavior of `serializeArray()`. opw-5145855 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231185
This fixes an issue where customer information chosen after adding an online payment in Point of Sale was not saved correctly once the payment was completed. It helps ensure orders paid online are linked to the right customer for receipts, reporting, and follow-up.
Original PR description
Before this commit, if a partner was selected after adding an online payment line, the partner was not synced after completing the online payment. opw-5098127 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232547 Forward-Port-Of: odoo/odoo#232455
Product packaging conversion lists now show a proper unit name instead of displaying “Undefined” when a unit has no related reference unit set. This prevents confusing packaging information for users setting up or reviewing product sales units.
Original PR description
### Steps to reproduce: - In the settings enable "Product Packaging" - Create a product and set its `uom_id` (next to sales price) to "pack of 6" - In the sales tab click on Packagings > This opens a list view of units with convertions #### > The "Units" is converted to "1 Undefined" ### Cause of the issue: The "Units" uom does not have any set `relative_uom_id` so that `record.relative_uom_id[1] ` is undefined: https://github.com/odoo/odoo/blob/e44ea4adbe56586349b78ae4796803777d8a782a/addons/uom/static/src/components/many2x_uom_tags/many2x_uom_tags.js#L74 opw-5189284 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233074
This fix prevents accounting updates from failing when analytic lines have no distribution information. Odoo now skips those empty entries safely, helping analytic accounting workflows continue without interruption.
Original PR description
Description of the issue/feature this PR addresses: This pull request addresses a bug in Odoo's analytic accounting module. Specifically, when updating analytic lines that have empty distributions,…
Description of the issue/feature this PR addresses: This pull request addresses a bug in Odoo's analytic accounting module. Specifically, when updating analytic lines that have empty distributions, the vals_list[0] ends up being empty. This situation causes an error in the write method, which prevents the system from properly updating analytic lines without distributions. Current behavior before PR: Before this fix, attempting to update analytic lines with empty distributions triggers an error in the write method. As a result, operations that involve updating such lines fail, potentially interrupting normal accounting workflows. Desired behavior after PR is merged: After merging this PR, the system will first check whether an analytic line has a valid distribution before attempting to update it. Lines with empty distributions will be safely skipped, preventing errors and allowing the rest of the analytic updates to proceed smoothly. This ensures more robust handling of analytic lines and avoids runtime exceptions during updates. Video: https://app.screencastify.com/watch/03zuCLh984kWun2Q71tK Odoo Task: https://www.odoo.com/es_ES/my/tasks/5181171 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232176
This fix prevents SAF-T general ledger reporting from failing when an accounting entry has no linked partner. It improves report reliability for businesses exporting compliance data.
Original PR description
### Issue: After #95804 , some of the code was improved but the consideration for partner_id being None was not expected. To fix this issue, we add partner_id on the domain. OPW-5177365 Forward-Port-Of: odoo/enterprise#98240
Repair order users can no longer enter a serial number on a new repair line before that line has been saved. This prevents the serial number from being lost during save and avoids confusion or rework when handling serialized products.
Original PR description
When creating a repair order, if you add a line and assign a serial number before saving the line, the serial number is removed when saving. Steps to reproduce: - Create a repair order and save it. - Add a repair line with a product tracked by serial number. - Without saving the repair order, add a serial number on the line. - Save the repair order. - You will notice that the serial number is no longer assigned to the repair line. This PR fixes the issue by making the serial number field read-only until the repair line is saved. opw-5156267 Forward-Port-Of: odoo/odoo#233264 Forward-Port-Of: odoo/odoo#232973
This fix prevents editor-specific list styling from unintentionally changing regular page content when the editor is loaded. It keeps website and backend content looking consistent by limiting the styling to the intended editor area.
Original PR description
Problem: The CSS selector `li *` was applied globally, affecting all list content on pages where the editor is loaded — including frontend content outside the editor. Cause: The selector was not scoped to the editor context, so its styling leaked into non-editor elements. Solution: Restrict the `li *` selector to apply only within headers inside the editor to prevent unwanted global styling. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232336
Fixed an issue where course slide names containing a vertical bar could cause the browser title to show the wrong website name after switching slides. This keeps the page title consistent and avoids confusion for learners navigating course content.
Original PR description
How to reproduce: - Go to a course with a slide containing "|" in its name. (e.g. Basics of Gardening) - Change slide to this special named slide. - Change back to another slide. - The browser title contains the string part after the "|" instead of the website name. This commit now handles slides with name containing the "|" character. Task-5152858 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230489
This update makes the online shop wishlist test start from a clean wishlist before continuing. It helps prevent random test failures, improving confidence in the stability of future website shop updates.
Original PR description
Add a step to make sure the wishlist is empty before continuing the tour runbot-229616 Forward-Port-Of: odoo/odoo#233262
The Tasks shortcut on a sales order now preserves the user's current language and other settings when opening related tasks. This prevents menus from unexpectedly switching back to English for users working in another language.
Original PR description
Repro:
- Activate any language different than english
- Create a service product with create Project & Task
- Create a sales order with the product
- Navigate with smart buttons Project > Tasks > Activate Top Menu
- All good
- Now navigate directly to Tasks from the sales order
- Top Menu is in English
Issue:
- The issue here is the context language being lost due to context overriding in the code.
Fix:
- In this commit, I have updated the method from `with_context({'active_id': self.id})` to
`with_context(active_id=self.id)`. This fix ensures that the previous context is retained.
opw-5160373
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#233362This update ensures Odoo can still be installed on newer Debian and Ubuntu versions after an older PDF-related system package was removed. It falls back to the replacement package, reducing installation failures for supported environments.
Original PR description
pypdf2 is not present anymore in debian/trixie Fallback on pypdf if pypdf2 is not available Note that it should mainly fix the deb_install but future fixes may be needed Forward-Port-Of: odoo/odoo#233598
This fix helps automated tests end cleanly by detecting processes that are still running after a test finishes. It also logs a warning when leftover processes are found during server shutdown, reducing the risk of stalled test runs and improving reliability for future releases.
Original PR description
In some case a process could remain aive at the end of a tests In addition to possible race condition, this can also cause a program to remain stuck at the end of the tests. This commit proposes to - catch all remaining processes at the end of a base case. - log a message if a process is found at the shutdown of the server. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231942
This fixes an internal manufacturing test that could pass or fail depending on tiny timing differences during work order processing. The change improves reliability of automated checks, reducing false failures without changing customer-facing manufacturing behavior.
Original PR description
### Issue: The test `test_mrp_backorder_operations` behaves non-deterministically. It may fail at this assertion:…
### Issue: The test `test_mrp_backorder_operations` behaves non-deterministically. It may fail at this assertion: https://github.com/odoo/odoo/blob/6e37542b53f9c9ec1baf8d58b1eeca376252186f/addons/mrp/tests/test_backorder.py#L986-L989 Because the `duration` of done workorder can vary. ### Cause: The delta time between `button_start()` and `button_finish()` https://github.com/odoo/odoo/blob/6e37542b53f9c9ec1baf8d58b1eeca376252186f/addons/mrp/tests/test_backorder.py#L983-L985 `button_finish()` triggers `Productivity._close()` https://github.com/odoo/odoo/blob/6e37542b53f9c9ec1baf8d58b1eeca376252186f/addons/mrp/models/mrp_workcenter.py#L572-L576 Which sets `Productivity.duration` to 0 if delta time is zero. Consequently, `workorder.duration` also becomes zero. When `bo_2.button_mark_done()` is called, the duration is set to `duration_expected` (240 in this test), which the assertion only can pass in that case. If delta time isn't zero, then duration will also be non-zero. So it will not set to `duration_expected`. As a result the assertion will fail. runbot-233247 Forward-Port-Of: odoo/odoo#231650