Friday, September 5, 2025
16 changes · saas-18.4
Enhancements to existing features
Odoo now sends message reactions made by users to the customer's WhatsApp conversation. This keeps WhatsApp chats more consistent across Odoo and the customer's messaging app, reducing confusion when users react to messages.
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
This update brings the embedded spreadsheet engine up to its latest maintenance version and fixes several issues affecting imports, exports, charts, pivot data, formulas, and borders. Business users should see more reliable spreadsheet handling, especially when working with Excel files, pivot tables, and charts.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/a26187362 [REL] 18.4.9 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/a26187362 [REL] 18.4.9 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/a9afde995 [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/90d1bb354 [FIX] evaluation: fix operation with empty matrices [Task: 5001658](https://www.odoo.com/odoo/2328/tasks/5001658) https://github.com/odoo/o-spreadsheet/commit/0b84fb5d9 [FIX] xlsx: make import verbose [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/c0f001d94 [FIX] xlsx: cannot import CF with formulas [Task: 4945945](https://www.odoo.com/odoo/2328/tasks/4945945) https://github.com/odoo/o-spreadsheet/commit/ebb8c9556 [FIX] full_screen_chart: prevent fullscreen chart from closing on drag-out [Task: 5005933](https://www.odoo.com/odoo/2328/tasks/5005933) https://github.com/odoo/o-spreadsheet/commit/1ee20185f [FIX] figures: fix xlsx export [Task: 4755779](https://www.odoo.com/odoo/2328/tasks/4755779) https://github.com/odoo/o-spreadsheet/commit/497c8183f [FIX] GaugeChart: Update config upon sheet renaming [Task: 4868971](https://www.odoo.com/odoo/2328/tasks/4868971) https://github.com/odoo/o-spreadsheet/commit/4123c854c [FIX] OT: fix missing transformations [Task: 4868971](https://www.odoo.com/odoo/2328/tasks/4868971) https://github.com/odoo/o-spreadsheet/commit/331cc7d49 [FIX] Range: Clean-up of plugins `adaptRange` [Task: 4868971](https://www.odoo.com/odoo/2328/tasks/4868971) https://github.com/odoo/o-spreadsheet/commit/f7721afc9 [FIX] pivot: handle vectorized formula [Task: 5043187](https://www.odoo.com/odoo/2328/tasks/5043187) https://github.com/odoo/o-spreadsheet/commit/be9b20b7a [FIX] composer: fix import from lib [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/f4607eaaf [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 website pages created through Studio from failing when they include SVG images. Users can now navigate to generated website pages without hitting an image conversion error, improving reliability for affected HR and website workflows.
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 Swiss companies could not see domestic taxes when choosing replacement taxes for a new tax. The domestic fiscal position is now recognized even when it is defined through a country group, ensuring the expected Swiss tax options appear.
Original PR description
#### Issue: No taxes appear in the replace field when creating a new tax in a company based in Switzerland. #### Step to reproduce: - In a company based in Switzerland (l10n_ch) - Create a new tax -…
#### Issue: No taxes appear in the replace field when creating a new tax in a company based in Switzerland. #### Step to reproduce: - In a company based in Switzerland (l10n_ch) - Create a new tax - Add a Fiscal position other than "Switzerland national (+ Liechtenstein)" - Click on the "Replace" field #### Current behavior: - No records are found #### Expected behavior: - Taxes from the "Switzerland national (+Liechtenstein)" fiscal position should appear #### Cause of the issue The Replace field display domestic taxes. Domestic taxes are part of the same fiscal position which is computed as domestic. In the l10n_ch module no fiscal position is computed as `domestic_fiscal_position_id`. Indeed in `account.fiscal.position-ch.csv` the fiscal position we want to be domestic is linked to a `country_group_id`, but no `country_id`. However the domestic fiscal position is computed from `country_id` only. Therefore Switzerland has no `domestic_fiscal_position_id`. #### Solution: This issue already happened [once](https://github.com/odoo/odoo/pull/208810) for an other localization. To avoid the situation to happen again in the future this commit adapts the `_compute_domestic_fiscal_position_id` to include fiscal position with no `country_id` but a `country_group_id`. opw-5011527 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224599
This fixes an issue where users could lose the ability to save task description edits after navigating away from the description tab and returning. The editor now keeps the full set of tracking IDs needed to match the server record, preventing confusing save errors and preserving a smoother task editing workflow.
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
Duplicated mega menu links are now preserved as separate items when a page is saved, even if they point to the same destination. This prevents website editors from losing repeated menu entries and keeps navigation layouts consistent after editing.
Original PR description
Before this commit, if the user clicks the "Duplicate" button on a mega menu link and saves the page without changing the href of the newly generated link, the new link is merged with the previous one. This doesn't happen in 18.3. The problem origins from the normalize handler of `FormatPlugin`. The function `mergeAdjacentInlines` merges the links if they are found to be identical. This commit introduces an `unsplittable_node_predicates` in `MegaMenuOptionPlugin` which prevents the mega menu links from being merged, even if they are consecutive and have the same href. How to reproduce the problem: 1. Create a new mega menu (click on navbar link -> edit menu -> add mega menu item) 2. Open the mega menu, click on a link, click on "Duplicate" at least twice 3. Save 4. PROBLEM: after saving, the new links have been merged with the previous Task-4367641
This fixes a Point of Sale issue where starting a new order with a default preset, such as takeout, did not ask for the customer name when required. Staff will now see the expected name prompt, helping restaurants capture needed order details consistently.
Original PR description
Steps to reproduce: - go to the setting of your pos.config - set the default preset as takeout (or any other that require the name) - open your pos - click on new order - the slot selection opens (only if set so it's ok) - but then no dialog to enter the name of the client Issue: The handleSelectNamePreset method in the POS Restaurant module attempts to access the selected preset through the order, but the preset has not yet been set on the order at that point. Fix: Make sure the preset is set on the order before calling handleSelectNamePreset. Task-5030520 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#225304
Fixed an issue where redirected cart URLs could cause the checkout page to fail with a server error. Customers can now reach checkout normally even when the website uses URL rewrite rules, helping avoid interrupted purchases.
Original PR description
Steps: - create a 308 rewrite from /shop/cart to /test/cart - go to /shop/cart Result: An error 500 is shown with this traceback in server log: odoo.addons.base.models.ir_qweb.QWebException: Error while render the template KeyError: 'current_step' Template: website.step_wizard Path: /t/div/div[1]/div/div/a/span Node: <span t-field="current_step.name"/> Cause: The code of website()._get_checkout_step_values doesn't take into account possible URL rewrite, so we get an error when showing website.step_wizard template that expect to have found a current_step. Fix: use url_rewrite to match the current URL to the current step and use the step_href of the step as current_website_checkout_step_href to have it not rewritten. Note: without the fix, the added test fail with the error shown above. opw-5037289 Forward-Port-Of: odoo/odoo#224480
Fixes an issue where Point of Sale loyalty discounts for specific products could disappear after scanning an unknown barcode. This keeps eligible discounts available and reapplicable, preventing checkout disruption for cashiers and customers.
Original PR description
With a discount applied on specific products, after scanning an unknown product, the discount disappeared and could not be reapplied. Steps to reproduce: ------------------- * Create a promotion…
With a discount applied on specific products, after scanning an unknown product, the discount disappeared and could not be reapplied. Steps to reproduce: ------------------- * Create a promotion program that grants a discount on a specific product category * Open PoS * Add to the order a product that triggers the discount * Scan an unknown barcode * (Try to reapply the discount) > Observation: The discount disappears and cannot be reapplied Why the fix: ------------ In v18.0, the method used `reward.update(...)` to apply the computed list of discountable products, ensuring proper handling by the reactive OWL model. In v18.2, a direct assignment was used instead, which did not properly set the internal state. When the filtered product list was empty, the resulting structure `[['link']]` became invalid, causing the discount to disappear and preventing it from being reapplied. opw-4923687 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222892 Forward-Port-Of: odoo/odoo#222017
This fixes an issue where editing a job offer page could crash after selecting the location under the job title. The website editor now handles missing record identifiers correctly, improving reliability for recruitment website content editing.
Original PR description
Previously, ORM read would receive `NaN` when there was no specific id. Since website refactoring [1], it was receiving `null` which would cause an error. Steps to reproduce: - Install website_hr_recruitment - Go on /jobs page - Go on a job offer - Enter editing mode - Click on location below the job title - Traceback occurs [1]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-5003375
The point of sale now waits until a discount has been fully applied before allowing the cashier to proceed to payment. This prevents incorrect payment amounts from being sent to terminals when discount processing is delayed.
Original PR description
pos*: point_of_sale, pos_restaurant Before this commit, if a discount was applied with the blackbox, it was applied after communication with blackbox which could be slow. If the user was clicking payment before this disound was applied and had only one payment method, a payment line with the old amount was added which could lead to confusion and errors when this payment line was sent to a terminal. This is fixed by waiting for the discount to be applied before being able to click on payment. Enterprise PR: https://github.com/odoo/enterprise/pull/91256 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221020
The website editor now removes links that have no visible label, even when those links contain extra styling or translation-related markers. This prevents invisible or empty buttons from being saved on pages, keeping website content cleaner for visitors and editors.
Original PR description
The link plugin was removing empty links only if they only had classes that were known or that were system classes. But this limits a lot the possibility to add other classes to link elements. For example, website builder adds a class `o_translate_inline` on some links. That unfortunately prevents their removal by the link plugin. With this commit, link plugin removes empty links, unless they match a handler of `unremovable_node_predicates` or `keep_empty_link_predicates` Steps to reproduce: - Open website builder - Create a new link - Make the link appear as a button to see it easily - Delete its label (but not the link itself) - Save - Bug: the empty link has not been removed task-4975547
The Chilean electronic invoicing POS receipt now handles missing resolution date information without crashing. This allows stores using Chilean localization settings to validate sales normally even when optional tax service provider settings are not completed.
Original PR description
Currently, when having a CL Company an dusing the POS, it is possible to have the POS crash when validating orders. Steps to reproduce: ------------------- * Install l10n_cl_edi_pos * Create a new…
Currently, when having a CL Company an dusing the POS, it is possible to have the POS crash when validating orders. Steps to reproduce: ------------------- * Install l10n_cl_edi_pos * Create a new company * Put Chile as country * Switch to that company * Create a shop and open it * Make a sale, validate order > Observation: POS Crashes Why the fix: ------------ The crash is happening upon trying to render the receipt because `l10n_cl_dte_resolution_date` is undefined. `l10n_cl_dte_resolution_date`is a field that can be found on the company settings only if the field `l10n_cl_dte_service_provider` is set and is required when the later has either `SII` or `SIITEST` as value. For companies in Chile, there is therefore two setups that leads to having `l10n_cl_dte_resolution_date` undefined. Either the service provider is set to demo, which case clients don't need to fill in the resolution date, either the provider is left empty (since not required upon company creation). Since the field can be undefined, we don't render it when it is. opw-5034091 Forward-Port-Of: odoo/enterprise#93185
The salary contract signing flow no longer assumes that every contract needs exactly two signatures. This prevents signing errors for contracts with different approval requirements and keeps related holiday and Belgian payroll flows working correctly.
Original PR description
The issue was that it was assumed all contracts will have the same number of signatures(2). This is now generalized for any number of signatures. Task - 5005069
When an employee signs a newer salary contract, the previous contract now automatically receives an end date set to the day before the new contract begins. This keeps contract records accurate and avoids confusion in HR administration and payroll-related follow-up.
Original PR description
When a newer contract for employee is double signed, the older version is closed. However, the 'contract_end_date' for the old version is not automatically updated. The logic has been adjusted to end old contract date the day before the new contract's start date.
The point of sale now waits until a Belgian blackbox discount has fully applied before allowing the cashier to proceed to payment. This prevents payment lines from being created with an outdated amount, reducing cashier confusion and payment terminal errors.
Original PR description
Before this commit, if a discount was applied with the blackbox, it was applied after communication with blackbox which could be slow. If the user was clicking payment before this disound was applied and had only one payment method, a payment line with the old amount was added which could lead to confusion and errors when this payment line was sent to a terminal. This is fixed by waiting for the discount to be applied before being able to click on payment. Community PR: https://github.com/odoo/odoo/pull/221020 Forward-Port-Of: odoo/enterprise#91256