Monday, May 11, 2026
18 changes · saas-18.3
Resolved issues and error corrections
This update fixes a bug where the PDF viewer field didn't save the uploaded file's name. Now, when you upload a PDF, the correct filename is stored, improving file management and organization within the system. This ensures users can easily identify and access their uploaded documents.
Original PR description
When uploading a file using the PDF viewer field, the filename was not stored in the corresponding filename field. This commit updates the PdfViewerField to support a filename field via the `filename` attribute. task-4825728 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262767 Forward-Port-Of: odoo/odoo#259795
This update fixes a previous issue where Helpdesk tickets couldn't process returns for orders that were shipped via dropshipping. Now, users can correctly initiate returns for dropshipped transfers, streamlining the returns process and improving customer service. This ensures all order types, including dropshipped ones, can be managed within the Helpdesk system.
Original PR description
### Steps to Reproduce: - Enable dropshipping in Inventory settings - Create a product with inventory tracking enabled - Enable dropship under the Inventory tab for the product - Add a vendor and…
### Steps to Reproduce: - Enable dropshipping in Inventory settings - Create a product with inventory tracking enabled - Enable dropship under the Inventory tab for the product - Add a vendor and quantity under the Purchase tab - Create a sale order for the product - Go to the Purchase stat button and confirm the order - Click on the Dropship stat button and validate the transfer - Open Helpdesk and create a new ticket for the same partner ### Issue: The "Returns" stat button is not visible for dropshipped deliveries. ### Current behaviour: - The helpdesk ticket allows returns of customer orders only if the order is outgoing. However, this does not cover the usecase where the order was dropshipped and still needs to be returned to the vendor. - With the current behavior, the user needs to find the customer's order to return the transfer as it is not possible to do from the ticket. ### Expected behaviour: Helpdesk tickets should also allow returns of dropshipped transfers (done and linked to the SO). ### Fix: The helpdesk return logic was limited to only 'outgoing' pickings. This commit extends the 'return' button should be visible if there is at least one delivery or dropship order linked to the partner of the ticket Issue:https://github.com/odoo/enterprise/pull/81378 task-4881338 Forward-Port-Of: odoo/enterprise#91402
This update optimizes how accounts are excluded from reconciliation processes. Previously, a workaround involved inefficient database operations that hindered performance. Now, developers can directly override account conditions, leading to faster and more reliable reconciliation results.
Original PR description
See https://github.com/odoo/enterprise/pull/115581 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263207 Forward-Port-Of: odoo/odoo#261931
This update significantly speeds up the stock reconciliation process by optimizing how the system identifies and excludes valuation accounts. The previous method was inefficient, leading to slow performance, but this change creates a more efficient database index, dramatically reducing processing time.
Original PR description
Currently to exclude valuation accounts from the reconciliation we modify the domain by adding a second condition on the field account_id of the account_move_line table to exclude these accounts…
Currently to exclude valuation accounts from the reconciliation we modify the domain by adding a second condition on the field account_id of the account_move_line table to exclude these accounts while including them in a first condition in the method we override.
This is not very efficient as it prevents the use of indexes on that second NOT IN condition.
Indeed PostgreSQL prioritizes the use of the index on the IN condition and then applies the NOT IN condition in a filtering step, which is very costly when there are many account_move_line records belonging to the inventory valuation accounts.
Here is an example of the before after on a database with 87 million account_move_line records total and 9.5 million account_move_line records matching the first IN condition via an index while only 1 million remain after applying the filtering of the NOT IN condition.
All measures are performed with a warmed up cache
[Explain Before](https://explain.dalibo.com/plan/d0d14efbe51ch359)
### Benchmark:
<table>
<thead>
<tr>
<th># of aml</th>
<th>Before</th>
<th>After</th>
</tr>
</thead>
<tbody>
<tr>
<td>87713812</td>
<td>~9s</td>
<td>~1.5s</td>
</tr>
</tbody>
</table>
[Explain After](https://explain.dalibo.com/plan/e882cf62d1ga6955)
## Potential further improvement:
Add a partial index:
```SQL
CREATE INDEX CONCURRENTLY idx_aml_company_id_account_id_unreconciled_posted
ON account_move_line (company_id, account_id)
WHERE parent_state = 'posted'
AND (reconciled IS NULL OR reconciled = FALSE)
AND (display_type IS NULL OR display_type NOT IN ('line_section', 'line_note'));
```
### Benchmark:
<table>
<thead>
<tr>
<th># of aml</th>
<th>Before</th>
<th>After</th>
</tr>
</thead>
<tbody>
<tr>
<td>87713812</td>
<td>~1.5s</td>
<td>~900ms</td>
</tr>
</tbody>
</table>
[Explain After + Index](https://explain.dalibo.com/plan/56dfdh554668ed43)
Part of https://github.com/odoo/odoo/pull/261931
Forward-Port-Of: odoo/enterprise#116524
Forward-Port-Of: odoo/enterprise#115581This update corrects a flaw in how missing transactions are identified for online statements. Previously, the system only checked transactions from the last sync date, potentially missing transactions before that date. Now, the system prioritizes the provided starting date, ensuring a more complete and accurate retrieval of online statement data.
Original PR description
When you want to find missing transactions, you have to put a starting date. But we don't use this starting date to find the last statement line, we only use the last sync date, which is wrong, because if the last sync date is after the starting date, the online transaction identifier will have the wrong date. It means we will only fetch the transactions from last sync date to today. This commit makes sure we take the start date first if it exists, then the last sync date. task-6197277 Forward-Port-Of: odoo/enterprise#116624
This update fixes an issue where contacts sharing common courses were incorrectly merged within the Odoo system. Now, attempts to merge these contacts will be blocked, preventing duplicate course information and ensuring data accuracy. This improves the reliability of our contact management features.
Original PR description
Expected Behaviour: Contacts enrolled in common courses should not be merged and the merge should fail. Steps to reproduce: 1- Go to one of the courses 2- Add two attendees to the course 3- Go to Contacts App 4- Select the two attendees you added to the course 5- Try merging the two contacts Actual Behaviour before the Fix: Contacts enrolled in common courses are getting merged and the common courses are kept in the destination contact. Behaviour with the Fix: Contacts enrolled in common courses are blocked from being merged and an error message is shown to the user saying that the reason the merge is blocked is a duplicate course. opw-5417223 Forward-Port-Of: odoo/odoo#244500
This update adjusts payroll deductions for employees 60 or older. The system now automatically stops NSSF (National Social Security Fund) contributions when an employee's birthday passes, aligning with Kenyan regulations. A new test has been added to ensure this functionality works correctly.
Original PR description
[IMP] l10n_ke_payroll: stop NSSF deductions after 60
When the user is creating a payslip and if the age of employee is >=60 the NSSF deductions must stop
(If the 60 years is finished in 10th of March -> it will stop in April (deduction stop starts from next month))
Test:
Unit test is written to check stopping NSSF deductions with dynamic birthday.
task - 6074658
Forward-Port-Of: odoo/enterprise#115236This update resolves an issue where the 'Add a line' button was unresponsive on the top part of mobile grid views, such as the Timesheets grid. The fix adjusts how elements are sized on mobile devices, ensuring the button is always clickable. This improves the user experience for mobile users accessing these grids.
Original PR description
**Steps to reproduce** On mobile: - Open a grid view (e.g. Timesheets > All timesheets) - Try to click on "Add a line" for the first employee - Issue: nothing happens. Notice that by scrolling down the list to employees at the bottom, it becomes possible to click on "Add a line". **Cause** `o_grid_cell_overlay` elements (with `h-100`) were taking more than the expected height in mobile, because the `o_grid_section_title` divs only have `position: sticky` on larger viewports. With the default `position: static`, the child element's height was exceeding its parent's height. opw-5853489 Forward-Port-Of: odoo/enterprise#113400
This update fixes a technical issue causing warnings when using filters on the job listings page. The change ensures that comparisons between filter values and record data are handled correctly, improving the stability and performance of the recruitment process. This resolves a potential source of errors and enhances the user experience.
Original PR description
Since templates refactoring in odoo/odoo@9a267abb9afe, when some filters are enabled on the /jobs page, a warning is logged for *each comparaison* with a reccord. Ex. when enabling the "Countries" filter: `py.warnings: <20856>:103: UserWarning: unsupported operand type(s) for "==": 'res.country()' == ''all''` This commit ensure we compare value of compatible types. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where product revaluations incorrectly included default tax lines in journal entries. The fix ensures that tax lines are only generated when explicitly defined, addressing compatibility problems with localization modules that use default tax accounts. This improves the accuracy of financial reporting.
Original PR description
Issue ----- If the account on which stock revaluation is registered has a default tax, the account moves generated by changing the price of the product include the tax. For context, the issue was…
Issue ----- If the account on which stock revaluation is registered has a default tax, the account moves generated by changing the price of the product include the tax. For context, the issue was reported because some l10n modules use accounts with default taxes (eg l10n_de). Steps to reproduce ----- - Install a localisation to have default accounts set up - Create a product category (Cat1) - Set Inventory Valuation to "Automated" - Set a default tax on the Expense Account - Create a product Prod1 - Storable - Category set to Cat1 - Cost set to 500 - Update the on hand quantity of Prod1 to 1 - Change the price of Prod1 to 300 - Go to Accounting > Accounting > Journal > Journal Entries --> There is an AM for 200 + tax instead of just 200 Discussion ----- When manually changing the cost of the product, we call https://github.com/odoo/odoo/blob/09c366dcfa5fe550a1afef813faa79f43767d0a5/addons/stock_account/models/product.py#L354 Where we create the AMs https://github.com/odoo/odoo/blob/09c366dcfa5fe550a1afef813faa79f43767d0a5/addons/stock_account/models/stock_valuation_layer.py#L294 This creates the corresponding debit/credit AMLs. Afterwards, we go through https://github.com/odoo/odoo/blob/09c366dcfa5fe550a1afef813faa79f43767d0a5/addons/account/models/account_move.py#L3210 Which calls `_sync_tax_lines` where AMLs are created for the taxes https://github.com/odoo/odoo/blob/09c366dcfa5fe550a1afef813faa79f43767d0a5/addons/account/models/account_move.py#L3088 Solution ----- The AML's `tax_ids` field is precomputed https://github.com/odoo/odoo/blob/09c366dcfa5fe550a1afef813faa79f43767d0a5/addons/account/models/account_move_line.py#L192-L198 and takes the taxes from the account https://github.com/odoo/odoo/blob/09c366dcfa5fe550a1afef813faa79f43767d0a5/addons/account/models/account_move_line.py#L894 By explicitly stating an empty value when we create the AM in `_change_standart_price_accounting_entries`, we avoid the compute so tax lines don't get created. ----- Ticket: opw-5929774 Forward-Port-Of: odoo/odoo#256024
This update resolves an issue where the composer field in the portal chatter wouldn't automatically focus after an emoji was added. The fix ensures the composer always receives focus, improving the user experience. This was caused by a missing default value for the composer's autofocus property.
Original PR description
Before this commit, after adding an emoji via the emoji picker in the portal chatter, the composer would not be focused. This is due to the `autofocus` prop of the composer being optional and not having a default value, leading to `NaN` when being incremented while `undefined`. This commit fixes the issue by giving it a default value of 0. task-6204911 Forward-Port-Of: odoo/odoo#263494
This update ensures that delivery orders are created correctly when sales orders are cancelled and then settled through the Point of Sale (PoS) system. Previously, products marked as 'delivered' on the original sales order remained so even after settlement, leading to inaccurate inventory tracking. This fix now generates the necessary delivery orders, resolving this discrepancy.
Original PR description
Steps to reproduce ------------------ 1. Create a sale order with 2 products, confirm it 2. Cancel the SO, then click "Set to Quotation" 3. Open PoS, settle the order and pay 4. Check the delivery…
Steps to reproduce ------------------ 1. Create a sale order with 2 products, confirm it 2. Cancel the SO, then click "Set to Quotation" 3. Open PoS, settle the order and pay 4. Check the delivery order linked to the PoS order The delivery is empty, yet the products still show as "delivered" on the sale order. Why it's happening ------------------ When the SO is cancelled, its moves go to 'cancel' state. After resetting to quotation, those moves stay cancelled. When PoS creates the delivery, the filter in `_create_move_from_pos_order_lines` checks `has_valued_move_ids()` which returns False (all moves are cancelled), and `not move_ids` is also False (cancelled moves still exist). So the lines coming from the SO are excluded from the delivery. The fix ------- We now also create deliveries for lines whose SO moves are all cancelled. These are lines coming from a cancelled SO that now need to be shipped after we have settled their order from PoS. Note ---- The commit c0f338711f028088c98ea459f27c1669b29738d7 fixes this starting from saas-18.2, by introducing a separate `pos_repair` module which simplifies the main `pos_sale` code. In 18.2+, only the test will be forward ported. opw-6055856 Forward-Port-Of: odoo/odoo#263369 Forward-Port-Of: odoo/odoo#256693
This update resolves an issue preventing the POS scale integration from working correctly with the latest IoT box version. The IoT box is now sending data differently, and this fix adjusts the system to handle the new response format. This ensures accurate weight readings for products sold through the POS scale.
Original PR description
Steps to reproduce - Use a localisation other than a european one (l10n_eu_iot_scale_cert must not be installed) - Setup the scale for the POS - Open the POS - Add a product to be weighted by scale to the order - Sell one of the weighted product Error: value.toFixed is not a function Cause: New versions of the IoT box send response status via data.status instead of data.status.status. [opw-6121011](https://www.odoo.com/odoo/project/49/tasks/6121011) Forward-Port-Of: odoo/enterprise#116579
The 'Waiting for Me' filter in the Sign app was incorrectly displaying all documents instead of filtering those requiring the current user's signature. This update fixes a bug caused by an ORM optimization, ensuring the filter accurately shows only relevant documents for users. This improves the user experience and prevents unnecessary document loading.
Original PR description
When applying the 'Waiting for me' filter in the Sign app, all documents are fetched instead of filtering out documents that do not need the current user's signature. Steps to reproduce: 1) Install…
When applying the 'Waiting for me' filter in the Sign app, all documents are fetched instead of filtering out documents that do not need the current user's signature.
Steps to reproduce:
1) Install sign with demo data
2) Open sign app and remove default filter
3) Add a filter Waiting for me
Observed Behavior:
All the documents are fetched.
Expected Behavior:
Documents should be filtered out to only show those where the current user is a signer.
Root Cause:
Since [commit](https://github.com/odoo/enterprise/pull/76079/changes/8b5048f63f91a38a710b611d17f5cf27fbd0a18a), The `_search_need_my_signature` method returned `NotImplemented` for any operator other than `in` at [1]. While the filter uses `=` at [2]. Following a recent ORM optimization with the mentioned commit, the operators are now standardized as shown
From:
`('need_my_signature', '=', True)]`
To:
`[('need_my_signature', 'in', [True])]`
This means the search method now receives the expected `in` operator. However, the return logic uses a `not in` condition when filtering documents waiting for signature.
As a result, instead of filtering documents, all documents are returned.
[1]- https://github.com/odoo/enterprise/blob/012b42c20b48e8e36298875e3291936e68e72375/sign/models/sign_request.py#L107-L108
[2]- https://github.com/odoo/enterprise/blob/012b42c20b48e8e36298875e3291936e68e72375/sign/views/sign_request_views.xml#L177
Fix:
Corrected the return domain logic to fetch the correct documents.
opw-6026935This change resolves a test failure in the MRP module related to multi-lot consumption. The test was failing because the user account lacked the necessary 'lot tracking' group. By explicitly granting this group in the test setup, the expected 'lot_id' field is now correctly displayed, ensuring the test passes.
Original PR description
The test uses the stock move line detailed operations form and expects the `lot_id` field to be present in the view. Without demo data, the current user may not belong to the `stock.group_production_lot` group, causing the field to be absent from the rendered form view and the test to fail. Causing: `AssertionError: 'lot_id' was not found in the view` in line: https://github.com/odoo/odoo/blob/0442c66d26b0c23313f17c566b16e34e7b22c2b6/addons/mrp/tests/test_consume_component.py#L477 Grant the lot tracking group explicitly in the test setup. runbot-243588
This update resolves an issue where Italian EDI bank account imports weren't automatically creating new bank accounts in the system. The fix ensures that bank accounts are now created and properly assigned to the corresponding commercial partner, streamlining the accounting process. This improvement addresses a previous bug impacting Italian business users.
Original PR description
The Italian EDI import didn't create new bank account by itself. IBAN info was just logged in the chatter, leaving it up for the accountant to create the bank account record. The bank account should be created and assigned to the corresponding commercial partner and set to not trusted yet. Enterprise PR: odoo/enterprise#112794 Task [link](https://www.odoo.com/odoo/project.task/6046189) task-6046189 Forward-Port-Of: odoo/odoo#263524 Forward-Port-Of: odoo/odoo#254505
This update resolves a test failure related to importing partner and bank account data for Italian reporting (l10n_it_reports). The change restores the test data to a consistent state, ensuring the tests continue to run successfully. This prevents disruptions to the reporting functionality.
Original PR description
The related PR brings a data change in a test file that is used here. We bring back the state of that data in the test class, so that the tests don't fail anymore. Community PR: odoo/odoo#254505 Task [link](https://www.odoo.com/odoo/project.task/6046189) task-6046189 Forward-Port-Of: odoo/enterprise#116726 Forward-Port-Of: odoo/enterprise#112794
This update corrects a bug where the total tax amount on purchase bills was incorrectly recalculated and overwritten after manual adjustments. The fix prevents this by temporarily disabling automatic tax synchronization when creating price difference lines, ensuring accurate tax reporting. This improves the reliability of financial data.
Original PR description
**Steps to reproduce:** - On a new company, activate automatic valuation and anglo-saxon accounting. - Create a new product, and set the cost to 5. - On the product category, set the costing method…
**Steps to reproduce:** - On a new company, activate automatic valuation and anglo-saxon accounting. - Create a new product, and set the cost to 5. - On the product category, set the costing method to AVCO and the valuation to automatic. - Create a Purchase Order for the product, confirm it and recieve it, but don't create a Bill yet. - Create a sales order with the same quantity as the purchase order, and deliver it. - Now create a bill for the original Purchase Order, and change the price to 6. - Manually change the total tax amount on the Bill, and then post it. **Issue:** After posting the Bill, the value set manually on the total tax is recomputed and overwritten. This is because the price difference between the bill and the original cost creates two new price difference lines on the bill, and this triggers the move sync to recompute the tax. **Solution:** Set the context `skip_invoice_sync` to True when creating the price difference lines. opw-5478005 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259331