Daily updates from Odoo
Tuesday, August 19, 2025
31 changes · 18.0
Security fixes and vulnerability patches
Copied links from public or portal chatter now open the correct page instead of an unauthorized access page. The change improves customer and visitor access to shared discussion links while preventing token exposure for documents they cannot read.
Original PR description
Before this commit, links produced by the "Copy Link" action on portal or public chatters would redirect to an unathorized page. This happens because the route used in the link would check access rights to the message, which public and portal users usually don't have. This commit fixes the issue by overriding the link route in modules with public chatter such that it would redirect to the page containing the chatter. This commit also removes the possibility to copy links of messages inside portal documents for which a user has no read access to avoid leaking the access token. task-4551910
Enhancements to existing features
This update adds automated checks to make sure barcode lookup correctly retrieves product information and supports product creation across point of sale, stock barcode, and website flows. It helps reduce the risk of errors when teams use barcode-based product setup in day-to-day operations.
Original PR description
*: pos_barcodelookup, stock_barcode_barcodelookup, website_product_barcodelookup In this commit: ------------------- - Added tests for barcodelookup to check whether the data fetched and set properly. - Added tests in respective modules to check the flow and creation of the products using barcodelookup. task - 3920661
Resolved issues and error corrections
This fix ensures Odoo consistently waits for file uploads to finish before users can send messages or manage attachments. It prevents confusing behavior such as attachments being deleted too quickly or messages failing when sent with the Enter key while an upload is still in progress.
Original PR description
\* = im_livechat, website_slides Not waiting for the uploading state to be resolved can lead to unexpected behavior, such as deleting the attachment immediately when clicking on the delete button rather than showing the confirm dialog. This might also prevent the composer from being sent if the attachment is still uploading. This is checked when checking the enabled state of the send button when clicking on it, but it is not checked when pressing enter directly. Some tests also checked uploading was finished but didn't target the correct attachment. https://runbot.odoo.com/odoo/error/230901 https://github.com/odoo/enterprise/pull/92620
This fix restores the review summary information shown in portal rating areas, so customers and visitors can see rating feedback as expected. It also updates related portal and website modules plus tests to prevent the issue from returning.
Original PR description
*: portal_rating, rating, test_mail_full task-4853416
Inter-company customer invoices now correctly display lot and serial numbers for delivered products. This helps businesses keep accurate traceability records when selling between companies in the same Odoo environment.
Original PR description
### Steps to reproduce: - In the settings enable: "show serial numbers/lot on invoice" - Create a product tracked by SN and put SN001 in stock - With company 1, create and confirm an SO for company 2…
### Steps to reproduce: - In the settings enable: "show serial numbers/lot on invoice" - Create a product tracked by SN and put SN001 in stock - With company 1, create and confirm an SO for company 2 (`partner_id`) - Validate the delivery (using SN001) - Create and confirm the invoice associated to the SO. - Print the delivery #### > The lots and serial numbers are not displayed but they would be for any other customer type. ### Cause of the issue: Since 17.2 (commit 08536d687880ca6d9ad5c37b639c0ad4c2599d74), the `location_dest_id` of a delivery for a inter-company partner is set to the `Inter-company transit` location: https://github.com/odoo/odoo/blob/23e63f4394c72939286e00d54ffd5da98d034d24/addons/stock/data/stock_data.xml#L54-L60 However, the lots are only displayed on the invoice if the usage of either the location or destination of the move line is `customer`: https://github.com/odoo/odoo/blob/23e63f4394c72939286e00d54ffd5da98d034d24/addons/sale_stock/models/stock.py#L60-L64 which fails for the `Inter-company transit` which is a transit location. opw-4962700 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects how Odoo tracks changes to an electronic invoice identifier after a previous field rename. It has minimal day-to-day impact, but helps avoid issues for customers who customize screens or workflows to use this field.
Original PR description
In previous PR [1], we renamed field `ubl_xml_id` to `ubl_cii_xml_id`, but failed the compute dependencies. It has next to no impact since this field it not in views, but could lead to problems if people add it through Studio. [1]: https://github.com/odoo/odoo/pull/115627/files#diff-5f7f5f6e9c54527b31f7579db7ef63b5b910794e462cd3346e32387900c13efdR12 task-none Forward-Port-Of: odoo/odoo#223259
This update corrects invalid formatting in delivery reports that could cause problems when editing or generating reports. It helps ensure delivery documents display reliably and avoids issues in the report editor.
Original PR description
because of odoo/odoo#169512, there was some illegal html generated in the delivery report. Indeed a <div> in a <p> is not supported. This created issues in the reportEditor, and possibly elsewhere 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
Combo products now keep the correct pricelist discount from product page through checkout. This prevents customers from seeing misleading original prices or a crossed-out zero price, improving pricing clarity in online purchases.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have a combo product; 2. create a pricelist that gives a 10% discount on the product; 3. go to product's website page; 4. observe the displayed discount; 5. add product to cart; 6. go to checkout. Issue ----- The discount has disappeared, instead it displays the original price next to a stricken-through "$ 0.00" Cause ----- The `_compute_discount` method does not get the correct `pricelist_item_id` for the combo items. Additionally, on checkout, it shows the `price_unit` of the combo line in the strike-through, which is always 0. Solution -------- When computing the discount of a combo item, retrieve the discount of its linked line, which has the correct value. Additionally, when displaying a combo product in eCommerce, use `_get_display_price_ignore_combo` instead of the `price_unit`. opw-4968848
This fixes an intermittent issue in point-of-sale loyalty testing by ensuring the customer appears consistently at the top of the selection list. The change helps keep automated checks stable so loyalty features can be validated more reliably before release.
Original PR description
This commit make sure that the partner is always at the top of the list runbot-230704
Purchase orders now recalculate the company total when the order currency is changed. This prevents outdated totals from being shown after currency changes, improving accuracy for purchasing and reporting.
Original PR description
**Steps to reproduce:** 1. Create a Purchase Order (PO) with a non-company currency (e.g., EUR if the main currency is USD). 2. Add at least one order line so the "Amount Total" is greater than zero. 3. Change the currency of the PO to a different one and save the record. **Expected behavior:** The `Company Total` field is recomputed using the new currency's exchange rate. **Actual behavior:** The `Company Total` remains unchanged, still showing the value in the original currency. **Fix:** Add `currency_id` to the `@api.depends` decorator of the `_amount_all` compute method. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Updating a parent or child contact no longer raises an unnecessary error when one VAT number is blank and the other is empty. This prevents avoidable disruption while still protecting accounting consistency for existing journal items.
Original PR description
An error exists if we update the parent partner and the the VAT number does not match with the child partner to prenvent inconsistencies between journal item created before the change. This error is also triggered when one partner vat is '' and the other is False. This commit aims to fix that. opw-4915851
Fixes an issue where completed manufacturing orders could not be unbuilt if their components were later changed to require lot or serial tracking. This lets businesses reverse eligible production orders without unnecessary blocking errors while preserving normal tracking rules for components that were tracked originally.
Original PR description
**Description of the issue/feature this PR addresses:** This PR fixes a regression when using the _Unbuild_ feature on a previously completed `mrp.production` whose components did not originally…
**Description of the issue/feature this PR addresses:** This PR fixes a regression when using the _Unbuild_ feature on a previously completed `mrp.production` whose components did not originally require tracking (no lot/serial), but have been updated later to require it. When unbuilding such a product, `stock.move.line._action_done` currently raises a UserError requiring a lot/serial number, because the component moves created by `mrp.unbuild`: - do not have a picking_type_id, - are not inventory moves, - are not scrap moves, - and lack lot/serial information. However, in this context, the lot requirement is misleading, as the original `mrp.production` did not generate tracked components. It is valid to restore untracked components even if they are now tracked. **Current behavior before PR:** - Create an `mrp.production` for a product with untracked components. - Complete the production. - Later, enable lot tracking on one or more of the original components. - Attempt to unbuild the production. - ❌ Error is raised: “You need to supply a Lot/Serial Number for product…” **Desired behavior after PR is merged:** - The unbuild operation proceeds without error. - The untracked components are restored correctly. - Behavior remains unchanged for tracked components that did require lot info during the original MO. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217282
Dutch Peppol invoice XML files now use the correct identifier scheme when the company ID is a 20-character OIN number. This helps ensure NLCIUS e-invoices are accepted and interpreted correctly by recipients and Peppol systems.
Original PR description
## Short functional explanation of the error For Dutch companies, when downloading the NLCIUS file of an invoice, the schemeID of the companyID in the XML isn't correct. ## Reproduction Steps 1. Make…
## Short functional explanation of the error For Dutch companies, when downloading the NLCIUS file of an invoice, the schemeID of the companyID in the XML isn't correct. ## Reproduction Steps 1. Make sure you use a dutch company: in apps, download the 'l10n_nl' and 'account_edi_ubl_cii' modules. Then, click on your company and select the NL Company. 2. Go to settings and type Peppol. Under Customer Invoices, check the Peppo format. Then, setup a Peppol Endpoint. Hit save. 3. Go to the Accounting app and click on the customers tab, then invoices. Click on new. 4. Select a customer. Make sure that the customer is from the Netherlands, has an email address, and in the accounting tab, an account number. Still in the accounting tab, under Electronic Invoicing, set the format at NLCIUS, set a Peppol e-address and a Peppol Endpoint that is 20 characters long. 5. Add a product, click confirm then Send & Print. Make sure that NLCIUS is well checked and click again Send & Print. 6. In the bottom right corner of the page, just under the Amount Due, there's a paper clip icon. Click on it and you'll see the XML. Download it. ### Expected behavior As the CompanyID is 20 characters long, the schemeID next to the CompanyID should have the value of 0190. ### Unexpected behavior If you scroll a bit, you'll see that the SchemeID next to the CompanyID has a number of 0106. ## Origin of the issue In the code, the SchemeID will have a value of 0190 if the CompanyID is 9 characters long. __ opw-4943262 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219424
The website events list now uses the visitor’s local day when applying the “Today” filter, instead of relying on UTC. This ensures events are shown on the correct date for users in different time zones, avoiding missed or incorrectly listed events.
Original PR description
The filters use today in UTC to fetch events in db. The commit fixes this by located today first and then converts it in UTC. related odoo/odoo@bfd55de7c846a0d523e4de4b17020341d8fcfd23 task-4796181
The Australian localization now treats the GST Only on Imports tax as fully included for customs calculations again. This restores the intended tax setup so import-related accounting reports and transactions calculate GST correctly.
Original PR description
It was price_include before and got removed with the changes from https://github.com/odoo/odoo/commit/be308e106ce9699f99efe133976c40519d6128f9 Re-add them 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
This fix prevents vendor bills or invoices marked as blocked from being automatically unblocked during reconciliation or related accounting updates. It helps preserve payment controls and avoids accidentally allowing payments that were intentionally put on hold.
Original PR description
Problem: When the `payment_state` field on `account.move` is automatically computed, the logic will prioritize whether the move has been posted over whether it has been blocked. The effect is that if…
Problem: When the `payment_state` field on `account.move` is automatically computed, the logic will prioritize whether the move has been posted over whether it has been blocked. The effect is that if an invoice has been marked as blocked, it might be automatically unblocked during reconciliation. Solution: The `_compute_payment_state` method will now prioritize a move's `payment_state` being blocked over whether it has been posted. This prevents a blocked move from being unblocked unexpectedly. Steps to Replicate (Runbot 18) - Create a product - Track inventory - Cost > 0 - Control policy = On ordered quantities - Product category is valuated in real-time (Inventory Valuation - Automated) (requires 'Stock Accounting Automatic' group) 1. Create a PO for the product 2. Create a bill, validate it 3. Block the bill using the contextual action 4. Receive the product If you navigate back to the Vendor Bill, you will see that it has been unblocked. opw-4981799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Saudi Arabia point-of-sale receipts now encode the local KSA time in their QR codes instead of UTC. This ensures scanned e-invoice details match the printed receipt and follow ZATCA expectations.
Original PR description
**Problem:** If you have an SA company, and try to scan the QR code generated on the receipt, the time will be the UTC time instead of the KSA time, as we are in SA. **Steps to reproduce:** - Change your company to SA and install l10n_sa_pos - Make a purchase with a customer from SA - Scan the QR code from the receipt using an app such as E-invoice QR reader - The invoice date will be the UTC time, or 3 hours less than it should **Why the fix:** Before this fix, the time was always displayed as UTC. It could have been correct if it also displayed a 'Z' in the end, to indicate that it is not local KSA time. We now directly change it using the KSA time, to respect the ZATCA guidelines. The time is now the same on the printed invoice and in the app when scanning the QR code. opw-4769521
Slovenian domestic customers without a VAT number are now assigned the correct domestic fiscal position instead of being treated as EU customers. This prevents domestic sales revenue from being posted to the wrong accounts, improving accounting accuracy for Slovenian businesses.
Original PR description
Before this PR: - Domestic customers without VAT were incorrectly mapped to EU fiscal position, causing domestic revenue accounts (760000) to be mapped to EU accounts (761000). After this PR: - Added new domestic fiscal position for non-VAT customers to ensure proper account mapping for domestic transactions. Task-4918960 Forward-Port-Of: odoo/odoo#217311
## Versions 18.0+ ## Issue The icon's class is changed from `fa fa-bell` to `fa fa-bell me-2` when rendering making the translation unable to find the spot ## Steps to reproduce - Ensure at least 2 languages (with at least one different from English) are set for the website; - Go to a published product without variants (e.g. "Office Chair"): - Ensure the "Track Inventory" checkbox is checked under "General Information" tab; - Set its stock quantity to 0 or less; - Under the "S
Original PR description
## Versions
18.0+
## Issue
The icon's class is changed from `fa fa-bell` to `fa fa-bell me-2` when rendering making the translation unable to find the spot
## Steps to reproduce
- Ensure at least 2 languages (with at least one different from English) are set for the website;
- Go to a published product without variants (e.g. "Office Chair"):
- Ensure the "Track Inventory" checkbox is checked under "General Information" tab;
- Set its stock quantity to 0 or less;
- Under the "Sales" tab, ensure the "Out-of-Stock" checkbox ("Continue Selling") is unchecked;
- Click the "Go to website" smart button;
- Change the website's language for the non-English one;
- As out of stock, as to get notified when the product is back in stock:
- Submit the email address.
opw-4955314Event reminder emails now follow the language selected by the website visitor during registration. This keeps reminder messages consistent with confirmation emails and avoids sending English reminders to attendees using another installed language.
Original PR description
How to reproduce this bug: 1- Create a db with only one language installed e.g. fr_FR and event app installed 2- Create an event and publish it on the website 3- Register for the event using public user 4- The confirmation email is in fr_FR but the reminders are in English This is caused because partner_id.lang is empty as a public user. The correct way to fetch the visitor lang is by `visitor_id.lang.id`. opw-4794184
This fix makes tests consistently verify that files show an uploading state when they are added in messaging, knowledge, helpdesk, spreadsheet comments, and WhatsApp-related areas. It helps prevent regressions where users might not get clear feedback while attachments are being uploaded.
Original PR description
\* = knowledge, test_mail_enterprise, test_spreadsheet_edition, website_helpdesk_knowledge, whatsapp Enterprise counter-part. https://runbot.odoo.com/odoo/error/230901 https://github.com/odoo/odoo/pull/223367
A scheduled billing process could stop too early when the first batch included subscriptions that were not ready to invoice, potentially delaying invoices for other eligible subscriptions. This fix applies the batch limit after checking which subscriptions can actually be invoiced, helping ensure renewal invoices are generated on time.
Original PR description
Change was introduced here https://github.com/odoo/enterprise/pull/82340 that caused the cron trigger to not be activated if any of the 31 in the batch of subscriptions found was not to invoice. This is problematic because there could be other subscriptions that meet the domain requirements and the to invoice requirements that are not being seen because the limit is on the search before we check invoiceability. Added a limit to _get_subscriptions_to_invoice instead of on the search in order to take into account both filters for next cron triggers. opw-4850884
Fixes product searches by Kenya KRA item code so users no longer hit errors or blank results when using the product search filter. This helps Kenyan companies find products more reliably in sales workflows.
Original PR description
This commit odoo/enterprise@c17ebfc7cdf2b218945280e6e3bd09f2b9ee8adc added a [searchview](https://github.com/odoo/enterprise/blob/17.0/l10n_ke_edi_oscu/views/product_views.xml#L74-L84) for `l10n_ke_item_code` but it never worked. as `l10n_ke_item_code` in `product.template` is non-stored field, we generally get error in console about it. fast forward to newer version e.g. saas-18.3, searching on non-stored fields raises traceback on frontend. Step to reproduce: - install L10N_ke and sale_management - switch to kenya company - go to product in sales app - type something in search bar and select 'kra item code' from autocomplete Observation: - nothing happens on frontend - on backend we receive a error `ERROR odoo.osv.expression: Non-stored field product.template.l10n_ke_item_code cannot be searched.` Fix: - we introduce a search method for l10n_ke_item_code field opw-4985176 Forward-Port-Of: odoo/enterprise#91526
Odoo Studio now handles cases where a button points to a deleted server action without crashing. This keeps users able to reopen and edit forms in Studio even after the related action has been removed.
Original PR description
The error is triggered when a user configures a button to execute a serveraction, deletes the associated server action, and then attempts to edit the button. This causes a failure at the line `self.env.ref(str_action)` due to the missing external ID. **Steps to reproduce:** * Install `crm` and `web_studio` * crm > Form View> Studio > `Add a button`> Run a server Action > Enrich * Settings > Technical > Actions > Server Actions > `Enrich` > Delete it * crm > Form View > Studio `ValueError: External ID not found in the system: crm_iap_enrich.action_enrich_mail` **Solution:** * Return `False` when the referenced server action cannot be found or has been removed. **Sentry-6608495874**
Fixes an issue where running a WhatsApp marketing automation test more than once could cause an error and stop the test. The automation now handles each tracking record separately, improving reliability for users validating WhatsApp campaigns.
Original PR description
Currently an error occurs when trying to run whatsapp marketing automation test more than once. **Steps to replicate:** * Install `marketing_automation_whatsapp` * Setup whatsapp integration *…
Currently an error occurs when trying to run whatsapp marketing automation test more than once. **Steps to replicate:** * Install `marketing_automation_whatsapp` * Setup whatsapp integration * Marketing Automation > New > Start From Scratch > Add a new activity * Select Activity Type as Whatsapp Message and a Whatsapp Template * Launch a Test > Pick a contact > Launch > Run (Do this step twice) **Error:** `ValueError: Expected singleton: marketing.trace(6, 4, 3, 2, 1)` **Cause:** This error occurs because the variable `trace` contains multiple records, but the `process_event` method is being called on the entire recordset. Since `process_event` uses `self.ensure_one()`, it expects exactly one record, and therefore raises an error at [1] when multiple records are passed. **Solution:** * Handle trace records one by one using a loop. [1]: https://github.com/odoo/enterprise/blob/624b18bdb5dff0df4756c4e1d37a696631e57a05/marketing_automation_whatsapp/models/marketing_trace.py#L20 **Sentry-6772553612**
The Point of Sale system now checks connected device status less frequently, moving from every 5 seconds to every 60 seconds. This reduces unnecessary background work and can help stores with large product databases avoid slowdowns during PoS use.
Original PR description
We currently check the status of the connected devices every 5s. This is used in only a short selection of the devices and the delay is unnecessarily short. For databases with a lot of products this can unnecesarily slow down their PoS This PR increases the loop until 60s opw-5006302
This fix prevents financial report spreadsheet exports from failing when an account code looks like an extremely large number, such as "1E1000". Users can now export Trial Balance and related accounting reports reliably even when account identifiers contain these values.
Original PR description
_set_xlsx_cell_sizes tries to convert each cell into a float if it's possible. If the cell contains "inf", "1e1000" (or any value such that float(value) = float("inf")), then there is an OverflowError which is not catch by the try/except.
To reproduce, set an account code as "1E1000", make this account appearing in the trial balance (by creating a move) and export it as XLSX.
opw-4981385Non-recurring products sold through upsell orders are now included in the Sales Analysis Report. This gives teams a more complete view of delivered quantities and revenue, improving sales reporting accuracy.
Original PR description
Problem: The non-recurring products added through upsell Sales Orders are not included in the Sales Analysis Report. This results in missing sales data for those products, leading to inaccurate…
Problem:
The non-recurring products added through upsell Sales Orders are not included in the Sales Analysis Report. This results in missing sales data for those products, leading to inaccurate reporting.
Purpose:
To ensure that non-recurring products added through upsell Sales Orders are correctly included in the Sales Analysis Report (report_all_channels_sales_action). This fix updates the report's domain filter to include upsell orders when the product is not recurring, resolving the issue of missing sales data for such products.
Steps to reproduce the bug:
1. Create a Sales Order (SO):
Add two products to the order:
- One recurring product (e.g., a subscription-based product with a recurring billing policy).
- One non-recurring (standard) product.
2. Confirm the SO
3. Generate an Invoice for the confirmed SO.
4. Validate the Invoice and deliver the non-recurring product (process the delivery order fully).
5. Create an Upsell Sales Order:
- From the original SO, create a new upsell SO.
- Add the same non-recurring product again.
6. Navigate to the Non-Recurring Product Page:
- Open the Product form for the non-recurring item.
- Click on the "Sold" smart button (shows delivered/sold quantities in the past 365 days).
- This opens the Sales Analysis Report (report_all_channels_sales_action) filtered by this product.
Issue:
The upsell Sales Order is not included in the Sales Analysis Report for the non-recurring product. As a result, the delivered quantity or revenue from upsell SOs is missing from the report for non-recurring products.
opw-4940977This update fixes how the Indian GST reports determine the month and year for a return period. It helps ensure GST reporting periods are computed consistently, reducing the risk of incorrect report timing or filing data.
Original PR description
Backport of commit: https://github.com/odoo/enterprise/commit/eda621c07393ad8e897503c852a9b00480affc52 Forward-Port-Of: odoo/enterprise#92499
Opening the Journal Audit report no longer fails if the related Journal Report has had all of its lines removed. The system now safely stops processing when there are no lines, preventing an error and improving reliability for accounting users.
Original PR description
Currently, error occurs when user try to open Journal Audit with no lines. Steps to replicate: - Install `accountant`. - Navigate to `Accountant > Configuration > Accounting reports`, search for `Journal Report` and open it. - Under the Lines tab, delete all the records and save. - Open the `Journal Audit` report, and the error will appear. Error: `IndexError: list index out of range` Cause: - An error occurred because the user deleted all the lines from the report, and the code tried to access the first element [1] of those lines (`lines[0]`) which caused the error. Solution: - Added a check if lines are present, if not then returned from the function. [1]: https://github.com/odoo/enterprise/blob/5670a73ef63d313f6c3df2b1ceeec7f7d6cd6a1b/account_reports/models/account_journal_report.py#L167 sentry-6795898305
Documentation and clarification updates
The Adhoc corporate contributor license agreement record was updated to add new members. This keeps Odoo's contribution permissions and legal records current, with no impact on product functionality.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr