Friday, December 5, 2025
10 changes · 18.0
Resolved issues and error corrections
This update resolves a bug where the aged receivable report was not displaying correct data for invoices without a due date. The fix ensures the report accurately reflects outstanding balances by aligning the data source used in the report with the invoice's date. This improves report accuracy and data reliability.
Original PR description
step to reproduce: - create a invoice and confirm it - remove due date from it and save it - ensure the confirmed invoice do not payment term or due date - open aged receivable report - open this…
step to reproduce: - create a invoice and confirm it - remove due date from it and save it - ensure the confirmed invoice do not payment term or due date - open aged receivable report - open this entry <img width="1599" height="238" alt="image" src="https://github.com/user-attachments/assets/010f97f4-0d50-4e5a-9366-ae67d17e2bb7" /> Observation: - on clicking the entry, when redirected to list view, there are `0` records. Issue: - The query which is used to display data on report uses `COALESCE(account_move_line.date_maturity, account_move_line.date)` https://github.com/odoo/enterprise/blob/ffc329e4ff2bd6512164ecd4206210fd5c9264b9/account_reports/models/account_aged_partner_balance.py#L222-L226 - while the method `_build_domain_from_period` uses only `date_maturity` in domain redirecting to list view - This creates inconsistencies between two. https://github.com/odoo/enterprise/blob/ffc329e4ff2bd6512164ecd4206210fd5c9264b9/account_reports/models/account_aged_partner_balance.py#L383-L394 opw-5237298 Forward-Port-Of: odoo/enterprise#99883
This update prevents users from accidentally triggering email sends when using the 'Send' button in the Email Marketing app. Previously, clicking 'Cancel' while the email was in the 'In Queue' state didn't stop the immediate sending process. The fix hides the 'Cancel' button during immediate scheduling to avoid this unintended behavior.
Original PR description
**Steps to reproduce:** - Go to `Email Marketing` app - Create a new marketing campaign - Click on `Send` button - `Cancel` button appears during `In Queue` state - Clicking `Cancel` set the state back to draft - Mails are sent out anyway **Issue:** As the mails are added directly when clicking the `Send` button, they are sent out immediately (added to the queue and cron job is triggered). While `Cancel` button is still clickable (unless the page is refreshed), it has no effect on the mailing itself (it just changes the state to `Draft`). **Fix:** Hide `Cancel` button when sending directly. We could also consider adding a short delay to allow users to cancel their campaign. opw-4937725 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix resolves an issue where reordering rules would incorrectly attempt to update locked manufacturing orders (MOs) after a quality check was completed. The update was prevented in newer versions by a change in how the system handles state transitions. This ensures the system correctly handles MOs that are blocked due to quality checks, preventing errors and maintaining data integrity.
Original PR description
### Issue: In 18.0-18.2, for product with a Manufacturing BoM containing a Component, a WO and a Quality Point If a Reordering Rule is triggered, odoo try to add the newly ordered quantity to an…
### Issue: In 18.0-18.2, for product with a Manufacturing BoM containing a Component, a WO and a Quality Point If a Reordering Rule is triggered, odoo try to add the newly ordered quantity to an existing MO But if the MO is "locked" because a quality check has been performed, a Error is raised: ``` Odoo Warning You cannot update the quantity to do of an ongoing manufacturing order for which quality checks have been performed. ``` ### Steps to reproduce: - Create a product tracked by quantity - Add a BoM (1 component tracked by Quantity, 1 Operation with 1 Quality Point) - Create a Reordering Rule (Route: Manufacture, Trigger: Manual, Min/Max: 1) - Click on Order - Open the created MO and the Shop Floor (Remove the filters to see the WO) - Complete the Quality Point - Modify the Reordering Rule (Min/Max: 2) - Click on Order - the error should be raised ### Cause: The MO to update is retrieved here: https://github.com/odoo/odoo/blob/45184da06cf7b92a48e3e4e90bf8b285bdd9ad6a/addons/mrp/models/stock_rule.py#L53-L57 Using a domain defined in this function: https://github.com/odoo/odoo/blob/45184da06cf7b92a48e3e4e90bf8b285bdd9ad6a/addons/mrp/models/stock_rule.py#L130-L153 In 18.0-18.2, when validating a `quality check` from the Shop Floor while the WO is in `waiting` state, the MO remains in `confirmed` state This makes the domain match the current WO and MO, triggering `change_prod_qty` even though the MO is locked In 18.3–18.4, a similar issue can occur with multiple WOs when the first blocks the second and a `quality check` is performed on the latter The `blocked` state behaves like `waiting`, but the issue is avoided when using the Shop Floor because this commit ensures that clicking a card starts the timer and changes the state to `progress`: 67c2127 However, it could still theoretically be triggered under specific conditions In 19.0, the new stock.reference system (odoo/odoo#212679) ensures the MO is detected as different, so a new one is always created opw-5012588 enterprise: https://github.com/odoo/enterprise/pull/101313
This update resolves an issue where by-products weren't correctly registered during multi-step manufacturing processes. The fix ensures that by-product lines are created with the correct pre-production and production locations, streamlining the manufacturing workflow. This issue is now resolved in version 18.0.
Original PR description
### Steps to reproduce: - In the settings enable By-Products an Multi-step routes - Put your warehouse in manufacturing in 3 steps - Create two storable products: - Final Product (FP) with an empty…
### Steps to reproduce:
- In the settings enable By-Products an Multi-step routes
- Put your warehouse in manufacturing in 3 steps
- Create two storable products:
- Final Product (FP) with an empty bom
- By Product (BP)
- Go to the barcode app > Operations > Manufacturing > New
- Scan FP > Register By-Products
- Scan BP
#### > The line is created with pre-prod as location and prod as destination
### Cause of the issue:
Since no existing line refers to the by product, a new line is created and its `location_id` and `location_dest_id` are provided by the `_getNewLineDefaultValues`:
https://github.com/odoo/enterprise/blob/17fd46b04d87585b7ed46c00d9559414daa17384/stock_barcode/static/src/models/barcode_model.js#L562-L566 However, at this point nothing had set the `params.newByProduct` in the `processBarcode`:
https://github.com/odoo/enterprise/blob/17fd46b04d87585b7ed46c00d9559414daa17384/stock_barcode_mrp/static/src/models/barcode_mrp_model.js#L375-L383 In fact, the only thing indicating that we are creating a by prodcut line at this point is the `displayByProduct`.
### Note:
The issue is no longer reproducible in 18.0+ as this change has already been applied in 2d5dbb93e6b33c2be786f9b2361c993f715d1a7f
opw-5350222
Forward-Port-Of: odoo/enterprise#101087This update corrects a bug where overdue recruitment activities weren't correctly reflected on the dashboard after marking them as done. The fix ensures that only active activities are considered in the dashboard count, resolving an issue related to how archived activities were handled. This improves the accuracy of recruitment reporting.
Original PR description
**Steps to reproduce:** - Create an activity type with `keep_done` enabled - Go to Recruitment - Open a job position - Select an application - Create an activity with the new activity type - Ensure its date is in the past - Go to the dashboard, you will see the overdue activity - Go to the record and mark the activity as done - Go back to the dashboard, the activity count is not updated **Issue:** Before https://github.com/odoo/odoo/commit/d290f3f3f23e activities were not kept by default in the database when marked as done. But it was still possible to enable this in the activity type using `keep_done`. The current behavior is to always keep the activity and archive it on done. In both cases the `_compute_activities` raw query should not take archived activities into account. **Fix:** Added the activity active check to the raw query. opw-5108204
This update optimizes product searches using a new approach that significantly speeds up the process. Previously, complex searches with multiple criteria resulted in slow database queries. Now, the system efficiently uses individual subqueries to improve search speed, especially with large product catalogs.
Original PR description
When doing a name_search with positive operators (=, ilike, in) the resulting query combines domains with the OR operator. This works fine when the leaves are all on the same table (product_product…
When doing a name_search with positive operators (=, ilike, in) the resulting query combines domains with the OR operator. This works fine when the leaves are all on the same table (product_product or product_template) as postgresql uses a Bitmap OR when everything is properly indexed.
When leaves are on multiple tables however postgresql has to plan a Seq Scan. For instance, let's take a simple domain on product.product of the form `['|', ('name', 'ilike', 'test'), ('default_code', 'ilike', 'test')]`. Because `name` is an inherited field via `product_tmpl_id`, the resulting query has the where clause `join_table.name ilike %s OR product_product.default_code ilike %s` with `join_table` the table you get after joining product_product and product_template. Since it's an `OR` condition, postgresql does not know in advance whether a given row will pass this condition. There's no way to filter the tables before the join. The condition moves therefore to a `Join Filter` node and postgresql has to scan the whole join table to fetch the correct tuples.
Same thing when there's a subquery. In case of a where clause `cond OR cond OR subquery`, postgresql does not know in advance whether or not a given row is gonna pass the subquery condition. So it has to scan the whole table.
In both cases this becomes a bottlneck when the number of products increaases. This commit introduces the use of `UNION ALL` instead of `OR`. There's one SubPlan for each individual table in the domain. The results are then appended to get the final products matching the conditions. Thanks to each table having its own SubPlan postgresql can now properly hit indexes for each table, greatly improving the performances.
#### speedup
In a database with 2.5M product_product, the name_search on product with a partner_id in the context and the ilike operator goes from 8s -> 5ms.
In another database with 500k product_template, the name_search on template with a partner_id in the context and the ilike operator goes from 1.8s -> 5ms.
opw-4921944
opw-5103287
opw-5049054
opw-5256691
opw-5221753
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves an issue related to how the state of manufacturing orders (MOs), work orders (WOs), and related components are calculated. A previous fix inadvertently caused problems with state computations, leading to incorrect data. This change ensures accurate state updates, particularly during inventory adjustments, and is now addressed with a broader update.
Original PR description
Due to the dependencies between mo state, components_availability_state, reservation state and wo state, we had to make sure that the state is always computed before the reservation_state. This is the purpose of (1) merged in 17.0 A non-related mrp_account fix (2) has been merged in 18.0 with the side-effect of firing a reservation_state compute with no state, invalidating the previous fix. As _post_inventory occurs under button_mark_done which changes at least the mo's state and may fire the computes on another mos, we have to make sure reservation_state and state are computed in one go, the correct order being handled by (1). Please note that of workorder revamp (3) has been merged in 18.3, solving the dependencies. (1) https://github.com/odoo/odoo/pull/185092 (2) https://github.com/odoo/odoo/pull/201764 (3) https://github.com/odoo/odoo/pull/194841 task: 5247116 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This pull request reverted a previous change that was causing problems with customer data in multi-company Odoo environments. The update focused on ensuring helpdesk teams were correctly linked to resources within their own company. We are now investigating a more permanent solution to this issue.
Original PR description
Reverting https://github.com/odoo/enterprise/pull/99614 as it is causing issues in customer databases, while we investigate for a better fix.
This update ensures quality checks remain active for split pickings (backorders) where the original picking hasn't been fully completed. Previously, Odoo automatically removed these checks, which could lead to issues with inventory accuracy and quality control. This fix maintains the integrity of the quality check process for partially processed orders.
Original PR description
When splitting a picking (thus creating a backorder), the quality checks that are still in state 'none' are deleted because Odoo assumes that the old picking is done and the QCs are not needed anymore. This fix ensures that QCs for split pickings that are still in progress remain. opw-5193424
This update resolves an issue preventing users from adding products from the parent company to quotation templates within Odoo's multi-company setup. Previously, this was allowed in standard sales orders, but not quotation templates. The change ensures quotation templates can now utilize products defined within the parent company, aligning with existing sales order functionality.
Original PR description
### Issue In this issue, having multi-company setup, we cannot make a quotation template with a product from the parent company. While this is allowed in sale order. #### To reproduce: 1- Create a product and in the product form, set the the company field to the parent company. 2- Create a quotation template and set the company field to the child branch. 3- In the quotation template, add a line and use the created product from the parent company. 4- Saving the form will raise an error. Talked with PO about the issue and he agreed that the quotation template should allow product from the parent company. This is already the flow in the quotation itself. opw-5177590