Wednesday, February 11, 2026
10 changes · saas-18.4
Resolved issues and error corrections
This fix improves how Odoo checks access to messages and activities in batches, preventing unnecessary repeated lookups and reducing the risk of incorrect access handling in some linked documents. It also adds broader test coverage to ensure mail-related permissions behave consistently across calendar, CRM, forum, and website-related records.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247997 Forward-Port-Of: odoo/odoo#245744
Sales orders imported into Point of Sale and paid with an online payment method are now correctly confirmed instead of remaining as quotations. This keeps sales records aligned with completed POS payments and reduces manual follow-up for staff.
Original PR description
When a Sale Order was imported in PoS and paid using online payment method, the SO's state stayed in Quotation. Steps to reproduce: ------------------- * Create a new Sale Order with a product available in POS * Add Online Payment in the Payment Methods * Import and settle the Order in POS * Pay the order with the Online Payment > Observation: In Sale app, the Sale Order is still in Quotation state. Why the fix: ------------ Online payments call `action_pos_order_paid()` directly, which only sets the POS order state to paid and never confirms the linked sale.order. Other payment methods do it in `sync_from_ui()`. Extended `action_pos_order_paid()` in pos_sale will now confirm linked quotations after POS marks the order as paid. opw-5022526 Forward-Port-Of: odoo/odoo#247998 Forward-Port-Of: odoo/odoo#230112
The manufacturing Bill of Materials report now keeps the selected product variant aligned between the system and the screen. This prevents users from being blocked when switching between variants whose internal ordering differs from their IDs.
Original PR description
Steps to reproduce on runbot ------------------ Select a product with several variants and a Bill of Materials (e.g. Stool). Change the variants order so that their ids are not ordered, this can be…
Steps to reproduce on runbot ------------------ Select a product with several variants and a Bill of Materials (e.g. Stool). Change the variants order so that their ids are not ordered, this can be done by modifying the default_code for example (e.g. Internal Reference for variant "Color: Green" set to "A"). When accessing the BoM report, you won’t be able to switch to one of the possible variants (in the example the Dark Blue variant). Why it is happening ------------------ The default variant to be displayed when opening the report is selected in the backend using the product_variant_id field. This field is computed as the first element in product_variant_ids as they are ordered in the model. We then send this variant’s information to the frontend and a dictionary containing every variant (key= id and value = display_name). In the serialization process, the object is reordered based on the keys. Thus, if the variants were not ordered based on their ids in python, the order will change. The displayed variant is correct as it has been passed directly but the frontend also computes the currentVariant attribute. This is computed as the first element in the dictionary but in this case, it is not the one that has been selected in the backend, as the order changed. As a result, you see the report for a variant A but the frontend considers you are on the report for variant B so you cannot switch to variant B as you are supposed to be already on it. The fix ------------------ I propose to use the explicitly passed id as the currentVariantId. opw-5409493 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247851 Forward-Port-Of: odoo/odoo#241603
This fixes how accounting entries are created when landed costs are applied to subcontracted stock movements. It helps ensure inventory valuation and cost reporting stay accurate for businesses using subcontracting and landed cost workflows.
Original PR description
faire test et commit msg et compléter titre
Orders scheduled for a future pickup or service slot can now be canceled correctly from the point of sale. This prevents canceled self-checkout orders from reappearing after a refresh, improving order accuracy for staff and customers.
Original PR description
Before this fix, when we placed an order from the self-checkout with a preset slot for a future date, we weren't able to cancel it from the POS. The UI showed it as canceled, but after refreshing, the order was still there. Now, when we cancel an order scheduled for the future, it is correctly canceled both in the UI and in the POS. task : 5246089 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244359 Forward-Port-Of: odoo/odoo#235775
This fixes an issue where deleting selected content in the website editor could remove protected dynamic snippet content and later crash the page when discarding changes. The editor now respects non-editable areas so business content blocks remain intact during editing.
Original PR description
**Steps to reproduce:** - Drop a dynamic snippet, for example Recent Blogs → “Latest Stories”. - Click on the section title. - Press Ctrl + A. - Press Delete. **Description of the issue:** - The content part is removed even though it is inside a contenteditable false container. doing discard after it crash the page. **Cause:** - In `removeNode`, there is no check to prevent removal of children of a contenteditable false element. - As a result, if a contenteditable false element itself is unremovable, the parent node is preserved, but its children are still removed. **Solution:** - In `removeNode`, add a check to return false if node is not `isNodeEditable`. task-5858259
Fixes an issue where a selected serial number could disappear after saving a repair order line for products whose tracking settings had changed. This keeps repair order information accurate and prevents confusion when assigning stock that was originally recorded without serial numbers.
Original PR description
Steps to reproduce: 1. Create a storable product with tracking set to 'By Quantity'. 2. Update the Quantity on Hand (e.g., 100 units). 3. Change the product tracking to 'By Serial Number'. 4. Create…
Steps to reproduce: 1. Create a storable product with tracking set to 'By Quantity'. 2. Update the Quantity on Hand (e.g., 100 units). 3. Change the product tracking to 'By Serial Number'. 4. Create a Repair Order for this product. 5. Add a line, select a specific Serial Number, and click Save. 6. Observe that the serial number disappears. Cause: When reserving stock that was originally created as 'Generic' (no serial), the `_prepare_move_line_vals` method returns `lot_id=False`. The repair view uses `_compute_lot_ids` to display selected lots, which filters out any move lines where `lot_id` is False. This causes the new line to be effectively invisible to the UI immediately after creation. Solution: In the `_set_lot_ids` inverse method, explicitly force the `lot_id` into the create values dictionary (`move_line_vals`). This ensures that even if Odoo reserves generic stock, the resulting move line is born with the correct Serial Number identity, keeping it visible and valid. opw-5156267 Forward-Port-Of: odoo/odoo#247885 Forward-Port-Of: odoo/odoo#247150
Payment amounts are now consistently rounded down to the currency's smallest supported unit before validation. This prevents legitimate payments from failing with providers such as Adyen, Mercado Pago, and Stripe when currency decimal settings use extra precision.
Original PR description
*: payment{,_adyen,_mercado_pago,_stripe} ### Issue: The payment in some payment providers are failing to due setting currency decimals. #### Steps to reproduce: 1- In USD currency form in developer…
*: payment{,_adyen,_mercado_pago,_stripe}
### Issue:
The payment in some payment providers are failing to due setting
currency decimals.
#### Steps to reproduce:
1- In USD currency form in developer mode, set the rounding factor
to `0.001000`, so we have 3 decimal places.
2- From `Decimal Accuracy` set Price Unit to 4 digits.
3- Refresh the page.
4- Create a SO and add a line. Set the price to `200.7647`.
5- Refresh the page again and generate a payment link.
6- Pay through Adyen. As you see payments fail.
### Cause and Fix:
This issue is the same as https://github.com/odoo/odoo/pull/245059. That fix only focused on Stripe, however, the same issue is reproducible on other providers e.g. `Adyen`. In order to avoid the same issue, we can have a general fix to round down all payment transaction amounts to currency's minor unit in `_validate_amount_and_currency`.
---
There is another issue in Mercado Pago which the if currency is not one of these currencies then it will not be sent to provider rounded:
https://github.com/odoo/odoo/blob/035b701cbf7bd654f56f07244e606e4038c4115a/addons/payment_mercado_pago/const.py#L39-L43
Mercado Pago rounds **up** in these cases, which will cause mismatch in `_validate_amount_and_currency`.
opw-5871470Payments can now be updated reliably even when their journal entry contains multiple liquidity lines. This prevents an error that blocked users from changing payment amounts after adjusting and re-posting related journal entries.
Original PR description
This PR improves payment move synchronization and fixes an error that is caused while changing amount of a Payment that has multiple liquidity lines. Steps to reproduce: 1. Create payment with x…
This PR improves payment move synchronization and fixes an error that is caused while changing amount of a Payment that has multiple liquidity lines. Steps to reproduce: 1. Create payment with x amount and validate it. 2. Open the payment journal entry. 3. Reset to draft and update the liquidity line amount from x to (x - y) 4. Create another liquidity line with amount y to balance entry and post it. 5. Draft the payment and try to update the amount. A traceback will appear. `ValueError: Expected singleton` Cause: The lines for payment JE are prepared for the case assuming that there will be only 1 liquidity line, but since we have more than 1, we get a Singleton error. Description of changes made: While preparing values for move in `synchronize_to_moves()` check for multiple liquidity lines and append all values to write. Further, the `_prepare_move_line_default_vals()` is also improved in order to manage different type of move lines individually. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246675
This update resolves an issue where reports for Peruvian VAT returns were occasionally failing due to inconsistent data selection. The fix ensures that the correct stock valuation layer is always chosen, leading to reliable reporting. This improves the accuracy of financial data for our Peruvian clients.
Original PR description
Occasionally the test_kardex_report test fails: ``` Traceback (most recent call last): File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in…
Occasionally the test_kardex_report test fails:
```
Traceback (most recent call last):
File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in test_kardex_report
self.assertSequenceEqual(
AssertionError: Sequences differ: ['M1|[18 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[313 chars], ''] != ['M1|[18 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[313 chars], '']
First differing element 0:
'M1|0[17 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[21 chars]0|1|'
'M1|0[17 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[21 chars]0|1|'
- ['M1|0000|1|99|FURN9999|1||02/01/2024|01|FBILL202401|0002|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
+ ['M1|0000|1|99|FURN9999|1||01/01/2024|01|FBILL202401|0001|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
```
The issue was reproducible locally by disabling nested loop joins: `self.env.cr.execute("SET LOCAL enable_nestloop = off")` to nudge Postgres to use a different join strategy.
The test creates a PO that is picked and invoiced in two steps (first quantity 3, then the remaining 2). As a result, the `stock.valuation.layer` ends up being linked to two `account.move.line`s because the join goes through the same `purchase_order_line`. So it will appear twice in the `_get_ple_reports_data()` query. A `DISTINCT
ON (stock_valuation_layer.id)` was already there with the goal of picking one of them. Which one depends on the order, but it's not deterministic: the valuation layer's `id`, `product_id`, and `create_date` will all be the same.
This commit makes the behavior deterministic by sorting on PO line and SO line ids.
runbot-error-238888
Forward-Port-Of: odoo/enterprise#107047