Friday, September 5, 2025
8 changes · saas-18.3
Enhancements to existing features
Odoo now sends message reactions made by users through WhatsApp, so customers can see those reactions in their WhatsApp conversation. This makes WhatsApp interactions more consistent between Odoo and the customer's chat experience.
Original PR description
Add support for sending reaction type messages via the WhatsApp API by introducing the `reaction` message type in the WhatsAppApi. This resolves the issue where reactions made by Odoo users are not reflected in the customer's WhatsApp conversation. API Documentation: https://developers.facebook.com/docs/whatsapp/cloud-api/messages/reaction-messages Task-4828394 Forward-Port-Of: odoo/enterprise#93849 Forward-Port-Of: odoo/enterprise#88520
Resolved issues and error corrections
IoT box actions now include a unique identifier so repeated fallback requests are recognized and ignored. This prevents accidental duplicate operations such as repeated registrations or duplicate printing when a connection times out.
Original PR description
Enterprise PR: odoo/enterprise#93985 In the following case an IoT box action can be duplicated: 1. Request is sent over longpolling 2. Action takes longer than 6s to execute, longpolling times out on the client side 3. Websocket request is sent as a fallback 4. Both requests cause an action to be executed (double blackbox registration, double print, etc.) To solve this we will send an ID with every action, and if the ID has already been recently seen we will ignore the action and log a warning. task-5067737 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update brings the spreadsheet engine to its latest maintenance version and fixes several issues affecting imports, exports, pivot tables, formulas, charts, and cell borders. Business users should see more reliable spreadsheet behavior, especially when working with Excel files and advanced reporting features.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/77fd30760 [REL] 18.3.19 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/77fd30760 [REL] 18.3.19 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/dc20407b7 [FIX] menu_items: fix sequence calculation for pivot data sources [Task: 5025230](https://www.odoo.com/odoo/2328/tasks/5025230) https://github.com/odoo/o-spreadsheet/commit/cb952fde2 [FIX] evaluation: fix operation with empty matrices [Task: 5001658](https://www.odoo.com/odoo/2328/tasks/5001658) https://github.com/odoo/o-spreadsheet/commit/7bba725e5 [FIX] xlsx: make import verbose [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/b50dd2aff [FIX] xlsx: cannot import CF with formulas [Task: 4945945](https://www.odoo.com/odoo/2328/tasks/4945945) https://github.com/odoo/o-spreadsheet/commit/5ab44cdbd [FIX] GaugeChart: Update config upon sheet renaming [Task: 4868971](https://www.odoo.com/odoo/2328/tasks/4868971) https://github.com/odoo/o-spreadsheet/commit/f14a2294a [FIX] OT: fix missing transformations [Task: 4868971](https://www.odoo.com/odoo/2328/tasks/4868971) https://github.com/odoo/o-spreadsheet/commit/e031b43cd [FIX] Range: Clean-up of plugins `adaptRange` [Task: 4868971](https://www.odoo.com/odoo/2328/tasks/4868971) https://github.com/odoo/o-spreadsheet/commit/1e3d0ff91 [FIX] figures: fix xlsx export [Task: 4755779](https://www.odoo.com/odoo/2328/tasks/4755779) https://github.com/odoo/o-spreadsheet/commit/9043ef3cb [FIX] pivot: handle vectorized formula [Task: 5043187](https://www.odoo.com/odoo/2328/tasks/5043187) https://github.com/odoo/o-spreadsheet/commit/ca760721e [FIX] composer: fix import from lib [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/a608942b8 [FIX] borders: Recompute borders on `SET_BORDERS_ON_TARGET` [Task: 5024825](https://www.odoo.com/odoo/2328/tasks/5024825) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
This fix prevents errors when website or Studio pages include SVG images. Users can now open generated website pages without the system incorrectly rejecting SVG files as non-images.
Original PR description
Steps to reproduce ================== - Install `hr_contract_salary,web_studio,website` - Go to Employees - Open studio - Click on "Model pages" - Create a new record - Save it - Click on "Go to Website" Error while render the template ValueError: Non-image binary fields can not be converted to HTML Cause of the issue ================== It crashes because the svgs are not supported in the pillow library: https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#fully-supported-formats Solution ======== Skip the image verification if the image is an svg opw-4820322 Forward-Port-Of: odoo/odoo#221936
This fixes an issue where changing the scheduled date for one product line on a receipt could unintentionally update other product lines when delivery features were installed. Warehouse users can now adjust one line's date without causing unexpected scheduling changes elsewhere on the same receipt.
Original PR description
### Steps to reproduce: - Install stock_delivery - Create and confirm a receipt for 2 products: - 1 x P1 - 1 x P2 - Modify the scheduled date of P1 to the day before - Save the picking #### Expected…
### Steps to reproduce:
- Install stock_delivery
- Create and confirm a receipt for 2 products:
- 1 x P1
- 1 x P2
- Modify the scheduled date of P1 to the day before
- Save the picking
#### Expected behavior:
The scheduled date of the picking is updated but not the one of the other move.
#### Current behavior:
The the move scheduled date is also updated.
### Cause of the issue:
Modifying the scheduled date of the move will trigger a call of the onchange on the picking because the `stock_move_ids` field has changed via a `Command.update` on its scheduled date:
https://github.com/odoo/odoo/blob/697278b2e86e5e4ccf53e0d8ead172e3e2a01eea/addons/web/static/src/model/relational_model/record.js#L1214-L1219 However, this onchange will trigger a call of the
`_compute_scheduled_date` on the new records to determine if its value has changed and set the scheduled date of the picking to one day before: https://github.com/odoo/odoo/blob/697278b2e86e5e4ccf53e0d8ead172e3e2a01eea/addons/stock/models/stock_picking.py#L846-L851 This is problematic because since each of these changes happen before the save of the real record, the inverse method of the scheduled date will be called and set the scheduled date of the other moves at save: https://github.com/odoo/odoo/blob/697278b2e86e5e4ccf53e0d8ead172e3e2a01eea/addons/stock/models/stock_picking.py#L897-L901
### Note:
This is not reproducible without `stock_delivery`, changing the scheduled of a `move_ids_without_package` will only trigger the onchange of the `stock.picking` model (and hence the compute on the new records) in case the `move_ids_without_package` is flagged as `onchange=1` by the `get_view`:
https://github.com/odoo/odoo/blob/c9e8a802315be27a076ae677b9191c075e4c239d/odoo/addons/base/models/ir_ui_view.py#L1218-L1225 But, since `move_ids_without_package` do not have `_onchange_methods` they will only be flagged as such if they are in the dependencies of a field present in the view:
https://github.com/odoo/odoo/blob/c9e8a802315be27a076ae677b9191c075e4c239d/odoo/models.py#L7363-L7370 This is the case as soon as `stock_delivery` is installed because of the `is_return_picking` field:
https://github.com/odoo/odoo/blob/c9e8a802315be27a076ae677b9191c075e4c239d/addons/stock_delivery/models/stock_picking.py#L37-L38
opw-5017423
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#224986This fixes an issue where users could see a record mismatch error after editing a task description, moving to another tab, returning, and saving more changes. The editor now keeps the full edit history identifiers needed by the server, preventing unnecessary save failures and helping users avoid lost work.
Original PR description
Problem: When editing a task description, if changes are made and then the tab is switched before returning to the description tab and making further edits, saving raises a record ID mismatch error. Cause: Switching tabs destroys the editor. On reset, the editor retrieves IDs locally from the record and strips them down to the last one. This causes the loss of the last ID known by the server. Solution: On reset, append all IDs from the content instead of only the last one, since the server ID might not be the most recent. Steps to reproduce: 1. Open a task. 2. Change the description. 3. Switch to another tab and return to the description. 4. Make further changes. 5. Save. - An error occurs due to record ID mismatch. opw-5012949 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225366
This fixes an error that could block delivery validation when kit products were invoiced before delivery, especially when components were also sold separately. Businesses can now process these sales and related accounting entries without duplicate reconciliation failures.
Original PR description
#### *mrp_account, purchase_{stock, mrp}, sale_{stock, mrp} ### Steps to reporduced: - In the settings enable: Automatic Accounting - Create 3 storable product: - COMP1, cost 1 $ - COMP2, cost 2 $ -…
#### *mrp_account, purchase_{stock, mrp}, sale_{stock, mrp}
### Steps to reporduced:
- In the settings enable: Automatic Accounting
- Create 3 storable product:
- COMP1, cost 1 $
- COMP2, cost 2 $
- KIT with a kit bom using COMP1 and COMP2, cost 3 $
- Modify the product category of all three products to:
- Costing Method: AVCO
- Inventory Valuation: Automated
- Create and confirm a sale order with 2 lines:
- 1 x KIT
- 1 x COMP2
- Create and confirm the associated invoive
- Try to validate the delivery
#### > UserError: You are trying to reconcile some entries that are already reconciled.
### Cause of the issue:
Validating the delivery will create stock valuation layers related to the associated stock moves — one for COMP1 and two for COMP2 — and then attempt to validate the corresponding accounting entries: https://github.com/odoo/odoo/blob/596937dfef4d203b0cbf5431e71a97f60154d7cb/addons/stock_account/models/stock_move.py#L283-L291
However, during this call, the SVLs are grouped by product_id: https://github.com/odoo/odoo/blob/596937dfef4d203b0cbf5431e71a97f60154d7cb/addons/stock_account/models/stock_valuation_layer.py#L88-L93
As a result, the first time we enter the loop, the accounting entries related to COMP01 will not be reconciled by the
`_stock_account_anglo_saxon_reconcile_valuation` call. This is because we restrict this call using the product COMP01. Therefore, we will not find the invoice needed to reconcile the outgoing moves here: https://github.com/odoo/odoo/blob/596937dfef4d203b0cbf5431e71a97f60154d7cb/addons/stock_account/models/account_move.py#L217-L219 (This happens because the related line of the invoice actually refers to the kit product, as the AMLs were not exploded like the stock moves.)
Now, the issue is that, since the AMLs were not reconciled, they will be added to the pool of lines to be reconciled later: https://github.com/odoo/odoo/blob/596937dfef4d203b0cbf5431e71a97f60154d7cb/addons/stock_account/models/stock_valuation_layer.py#L92-L100
However, the second time we enter the loop — for COMP02 — since COMP02 was sold by itself, there will be an account move line referring to this product on the invoice. The `_stock_account_anglo_saxon_reconcile_valuation` call, now restricted to COMP02, will therefore reconcile the AMLs for both COMP02 and COMP01 related to the kits (as it successfully finds the invoice to reconcile all outgoing moves). This is problematic because the AML related to COMP01 has now been reconciled, despite already having been added to the set of moves to be reconciled. This will raise an error during the second reconciliation attempt: https://github.com/odoo/odoo/blob/596937dfef4d203b0cbf5431e71a97f60154d7cb/addons/account/models/account_move_line.py#L2379-L2380
### Fix:
In the case of kit products, the account move lines of the invoice refer to a different product than the stock valuation layers (because the stock move was exploded but not the AMLs). Therefore, it is important to refer to the kit product during the reconciliation process.
We achieve this by grouping the SVLs using the product of their associated SOL or POL. Unfortunately, we cannot rely on the product from the BoM related to the stock move of the SVL, as kits can be nested within one another. In such cases, the invoice related to the SO or the bill related to the PO would not refer to the intermediate kit we would found that way.
opw-4864925
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#223283
Forward-Port-Of: odoo/odoo#221337This fix prevents IoT actions from running twice when a long-running request times out and is retried through a fallback connection. It reduces the risk of duplicate prints, duplicate fiscal blackbox registrations, and similar repeated operations in IoT and POS workflows.
Original PR description
Community PR: odoo/odoo#225678 In the following case an IoT box action can be duplicated: 1. Request is sent over longpolling 2. Action takes longer than 6s to execute, longpolling times out on the client side 3. Websocket request is sent as a fallback 4. Both requests cause an action to be executed (double blackbox registration, double print, etc.) To solve this we will send an ID with every action, and if the ID has already been recently seen we will ignore the action and log a warning. This PR handles the client side code, which just involves adding the new `action_unique_id` key to all our actions that are using fallbacks. task-5067737