Daily updates from Odoo
Tuesday, July 22, 2025
25 changes · saas-18.4
Resolved issues and error corrections
Sales orders with multiple make-to-order purchased products now continue processing even if one product has no vendor configured. The product without a vendor falls back to stock fulfillment and responsible users are notified, while purchase orders for correctly configured products are still created.
Original PR description
Bug introduced in: https://github.com/odoo/odoo/commit/eb26262f17cf0c828e8fdf03a8e2f916e3619d81
Steps to reproduce the bug:
- Create two storable products:
- P1:
- Routes: Make To Order (MTO) + Buy - Vendor: Azure Interior
- P2:
- Routes: Make To Order (MTO) + Buy
- No vendor defined
- Create a sales order with one unit of P1 and one unit of P2
- Confirm the SO
Problem:
The stock move for P2 is created with the procurement method Make To
Stock (MTS), while P1 uses Make To Order. but the purchase order for P1
is not created, because When processing P2 the `run_buy`, a return
occurs and function is stopped instead of continuing to process
the other moves/flow.
Solution:
Ensure that the absence of a vendor for MTO+Buy products only causes a fallback to MTS and notify responsible, without breaking the processing of other moves.
opw-4945468
Forward-Port-Of: odoo/odoo#219302Italian electronic invoices will no longer include references to related documents dated after the current document. This prevents SDI rejections caused by invalid future-dated invoice links, improving reliability for Italian invoicing workflows.
Original PR description
In a FatturaElettronica xml document <DatiFattureCollegate> allow us to specify any references to other previously sent documents. However, it is currently possible that the system populate this element with moves dated after the current document, causing the SDI to reject the document. Steps to reproduce: - Create an invoice A and register a full payment via the button - Create a credit note for the invoice, unreconcile the credit note if necessary - Create a new invoice B and add the credit note as payment - Create the XML of the credit note Issue: The XML includes info about invoice B, created after the credit note. If invoice B is dated after the credit note, the SDI will reject the xml Solution: Avoid including reconciled elements with date later than the current document date opw-4795664 Forward-Port-Of: odoo/odoo#219646 Forward-Port-Of: odoo/odoo#219106
This fixes an issue in Point of Sale where searching while a product category was selected could make the screen go blank. Cashiers can now filter by category and search products without interrupting sales operations.
Original PR description
This commit https://github.com/odoo/odoo/pull/217898/commits/9b1477f2693fb0678ca073d36ad6630c3034df00 introduced a bug where, when the user had a category selected and he would type a word in the search bar, he would have a white screen. This is fixed by reverting the change that was doing it and was not necessary. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219311
Messages received while the Discuss app is open no longer create chat bubbles that appear later after leaving Discuss. Users still receive notifications, while live chat conversations continue to show bubbles as expected.
Original PR description
**Current behavior before PR:** Receiving a new message while the Discuss app is open creates a chat bubble in the background. These bubbles become visible after leaving the Discuss app. **Desired behavior after PR is merged:** Chat bubbles are no longer created while the Discuss app is open, except for livechat messages. Messages still trigger notifications, but no background bubbles are inserted. task-[4752392](https://www.odoo.com/odoo/project/1519/tasks/4752392) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219806 Forward-Port-Of: odoo/odoo#215125
This fix makes an automated test for the messaging connection warning more reliable by shortening simulated reconnection timing during the test. It helps prevent false test failures in busy environments without changing the user-facing behavior of the product.
Original PR description
The "show warning when bus connection encounters issues" test simulates a disconnected WebSocket that fails to reconnect. In this scenario, an alert is shown to warn the user that some features may…
The "show warning when bus connection encounters issues" test simulates a disconnected WebSocket that fails to reconnect. In this scenario, an alert is shown to warn the user that some features may be unavailable or slow. However, the websocket worker’s initial reconnect delay is 1.5s, with an added random jitter up to 1 second which means the first reconnect attempt can take up to 2.5s. The test waits up to 2.5s for the alert to show, which is not always enough. The reconnect attempt alone may be that long, and under high CPU load, processing the resulting event can take even longer. This commit reduces the initial reconnect delay and the jitter during this test, ensuring that the reconnect attempt fails and the alert is shown within the expected time. fixes runbot-226443 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#219649
This fix ensures purchase orders that were manually locked can be unlocked even when the automatic 'Lock Confirmed Orders' setting is not enabled. It prevents users from getting stuck with locked purchase orders after customizing the interface or using Studio.
Original PR description
Steps to reproduce the bug: - Do not enable the “Lock Confirmed Orders” setting. - Create a Purchase Order: - Add any product. - Confirm the PO. Problem: The `Lock` button is not visible. Starting from version 18.3, users must enable the setting, and all POs are locked automatically: [Commit reference](https://github.com/odoo/odoo/commit/63bfd81dfdec9ef2d928aed439bb7b97841e76d7) However, a user can edit the view or use Studio to manually display the Lock button and lock the PO. But when attempting to unlock it, an error is triggered: > “Unlocking the order is not allowed as 'Lock Confirmed Orders' is enabled.” **opw-4948226** Forward-Port-Of: odoo/odoo#219463
The task dependency list now shows task priority correctly in the Blocked by tab. The priority column is hidden by default to keep the view focused on key details like status, task name, and assignees.
Original PR description
Before this commit, the priority field of project.task was not correctly rendered inside the sub-list view of task dependencies (in "Blocked by" tab in task form view). This commit makes sure the priority field of project.task is correctly in that sub-list view. Also, it also hides by default the column to let more spaces for the most relevant fields (state, name and assignees). Forward-Port-Of: odoo/odoo#219706
French electronic invoices sent through Peppol now use the correct identifier field in BIS Billing 3.0 XML. This helps prevent invoice rejection due to invalid XML formatting when using Chorus Pro/Factur-X with French SIRET identifiers.
Original PR description
### Issue: BIS3 XML is not valid for Peppol ### Steps to reproduce: - Install l10n_fr_facturx_chorus_pro and switch to french company - Activate peppol - Create a French customer - Under Sales and…
### Issue: BIS3 XML is not valid for Peppol ### Steps to reproduce: - Install l10n_fr_facturx_chorus_pro and switch to french company - Activate peppol - Create a French customer - Under Sales and Purchase tab, set SIRET to "11000201100044" - Under Accounting tab, set the following: - Invoice sending = Peppol - Einvoice format = BIS Billing 3.0 - peppol_eas = France SIRET - peppol endpoint = 11000201100044 - Use Invoice/Invoiced smart button, then select New to create an invoice for this french customer - Add any non-zero invoice line, then confirm - Send and print, send to peppol - Download the XML. The /PartyIdentification/ID element will have the schemeName attribute set. ### Cause: Previous [commit](https://github.com/odoo/odoo/commit/0f3a9dee5cf15fa978a1857c184413003147c4a6#diff-10c62c279423109c43458eab15a3177ff5592d6570451f890fead74389bc3740) added `schemeName`. But Peppol doesn't want any `schemeName`, see the [doc](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/UBL-DT-08/). ### Solution: The correct attribute here seems to be `schemeID`. See an [example from the docs of Peppol](https://docs.peppol.eu/poacc/billing/3.0/bis/#_parties_2). Change `schemeName` to `schemeID`. opw-4934436 Forward-Port-Of: odoo/odoo#219586 Forward-Port-Of: odoo/odoo#219012
Reinstalling the Amazon sales connector on databases with many past Amazon sale lines could run out of memory. This change limits the data loaded during setup, reducing peak memory use and making reinstalls more reliable for affected customers.
Original PR description
Description ----------- On databases that had `sale_amazon` installed in the past, were used for sales for a certain period, then had the module uninstalled, and later attempted to re-install it, a…
Description ----------- On databases that had `sale_amazon` installed in the past, were used for sales for a certain period, then had the module uninstalled, and later attempted to re-install it, a memory error will occur. The peak memory usage stems from `sale.order.line._compute_is_service`. The reason the compute is triggered is because of the "re-creation" of the master data products `default_product` & `shipping_product`, which writes `type`, which the compute depends on. So the compute will be triggered for all `sale.order.line` records that had those products. This commit avoids the excessive memory usage by explicitly fetching the fields that are needed for the compute, which avoids fetching large fields like the different products' HTML descriptions. Benchmark --------- On a database with 400k+ `sale.order.line` with an amazon related product, installing `sale_amazon` peak memory usage was: | | Peak Mem. | |--------|-----------| | Before | 3.8 GiB | | After | 580 MiB | Reference --------- opw-4915892 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219599
Vendor bills using the Saudi 15% reverse charge tax now create the expected reverse charge accounting entry. This ensures the tax amount is reflected in the correct account and appears properly on VAT filing reports.
Original PR description
Steps to reproduce: - With a SA Company setup - Create a Vendor Bill - Add a Service product and apply 15% R C tax - Confirm Issue: The reverse charge account is not hit by the tax amount, no reverse charge entry is created and it does not show on the VAT filling report opw-4755993 Forward-Port-Of: odoo/odoo#219135 Forward-Port-Of: odoo/odoo#217384
Fixes an issue in the HTML editor where pressing backspace after an emptied file attachment box could delete both the box and the preceding character. This helps users edit content with attached files more safely and prevents unintended text loss.
Original PR description
Problem: When pressing backspace after text followed by an `o_file_box`, both the last character and the file box are deleted at once. Cause: An empty `o_file_box` is skipped in `findPosition` because it's treated like a zero-width space (`.textContent === "\ufeef"`), causing incorrect position resolution. Solution: `o_file_box` elements should not be skipped during position checks, even when empty. Steps to reproduce: - Go to Quality ---> Quality Control --> Control Points - Create New. - Add text - Add a file just after the text - Delete all content of the file box - Place the cursor after the file box and press backspace -> The character before the file box is also deleted opw-4903841 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219358 Forward-Port-Of: odoo/odoo#216559
This update fixes an intermittent failure in an automated website editor test by making the test wait for background requests to finish before continuing. It helps keep validation runs stable and reduces false failures during quality checks.
Original PR description
This commit fix the tour `test_restricted_editor_only` which was failing on runbot. runbot-226535
This fix ensures message updates in Discuss, Mail, and Live Chat are applied in the right order even when background notifications are delayed. Users are less likely to see old message content return after editing, improving reliability in busy or slow environments.
Original PR description
Before this commit, discuss RPCs like update_content were prone to race-condition that can lead to UI showing outdated content of a message that was just edited. This happens because some store data…
Before this commit, discuss RPCs like update_content were prone to race-condition that can lead to UI showing outdated content of a message that was just edited. This happens because some store data are exclusively feed from return data of RPC whereas some store data are feed from bus notifications. Ordering of data are essentially sound among RPC returns and bus notifications, but not between the 2 groups. Therefore RPC return or bus notifications can come before or after the other one, and the ordering may be wrong and result in wrong store data. In practice bus notifications usually before return of RPCs. Most of discuss code is robust against this ordering, even though there's likely many potential of race conditions that may happen and are genuine bugs. When bus notifications come after returned RPCs, however, problems are more apparent. This may happen when the bus notification queue is slow, but also in tests this is likely to happen because RPCs are simulated with single micro-tick whereas handling of bus notification is usually more than 1 micro-tick. The test "Can edit message comment in chatter" is showing this problem: it's a relatively long test that interacts a lot with message edition, which has the message content being obtained from both bus notifications and RPC returns. When the CPU load is high, test takes much more time to run, e.g. 400ms becomes 2500ms. This CPU load affects barely RPC returns but bus notifications are heavily throttled and therefore causes bus notifications to come much later than expected. Test edits message twice with different content and then once without any change. The high CPU load can make test fail after 3rd edit step because the content of message is the 1st edited content instead of the last. The last edition is coming later in the bus notification, but due to timing constraints of 3 seconds assertion can lead to timeout of test because the message is not showing the most recent edited content. Roughly: 1. message is "original message" 2. message is edited to "edited message" 3. message shows "edited message (edited)" 4. message is edited to "edited again" 5. message shows "edited again (edited)" 6. message editing is started => message content in composer is "edited message" instead of "edited again", so crash after 3 seconds Step 6 fails because message content between 5 and 6 is changed to "edited message" from the bus notification. All previous steps had the message edited relatively quickly (500ms each) by returned RPC. The bus notifications are throttled to about 3 seconds, thus the "edited message" bus notification arrived very late when starting edition in step 5. The composer content is wrong and the contains wait for at least 3 seconds, but due to heavy throttle of bus notifications from CPU load, the test fails. This commit fixes the issue by introducing a `busRpc()` function on bus_service and have message edition flow use this busRpc() rather than `rpc()`. This `busRpc()` function is a special flavour of `rpc()` that awaits until the RPC and related notifications have been received. `busRPC()` works by forging a UUID bus_rpc_uuid that the RPC sends back at end of RPC. The `busRPC()` function waits until this notification is received.s This commit ensures ordering of store data received from server is good, because RPC properly awaits bus notification. Store data of RPC return makes sense after these bus notifications, but ideally it should also be sent to bus notification and business code should ignore returned data from RPC, so that ordering of store data is always good even with interleaving if discuss actions. This also solves the race condition in the test "Can edit message comment in chatter", because each assertion of message content ensures we are in the window of data feed by related bus notifications. When a message is being edited the composer is not affected by new message content from store data of bus notifications, but the save of the message edition should necessarily have to await related bus notifications, ensuring no previous bus notifications can be feed after this store data state. Fixes runbot 227618 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 change reverts a previous accounting update that caused problems when validating transactions using mandatory analytic information. It restores the prior behavior to prevent errors for users working with expense accounts and analytic plans.
Original PR description
This reverts commit 8194c6e2bfedc9437964090b1a498c3e8cff225c. opw-4936028 opw-4933629 opw-4935236 opw-4933456 opw-4933652 opw-4935789 opw-4938570 opw-4938388 opw-4935709 opw-4940233 opw-4938849 Forward-Port-Of: odoo/odoo#218833
Expense approval activities are now assigned to the manager chosen on the expense, rather than automatically going to the employee's default manager. This helps ensure the right person is notified and can act on expense submissions without delays or misrouting.
Original PR description
When an expense is submited and you've selected a different manager than the default one, this is not the right person that gets the activity linked to the expense. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213162
The automatic invoice sending scheduled job now reports how many invoices it has processed and how many remain. This avoids misleading status messages that previously suggested no records were processed, making monitoring more reliable for administrators.
Original PR description
The scheduled action for the automatic sending of invoices currently does not explictly use the `_notify_progress` method introduced since Odoo 18 to track the progress of CRON jobs. This means that implicitly, by default the CRON will log `processed 0 records, 0 records remaining` at each run. This can be confusing, as the automatic invoice sending CRON is batched, and might run multiple times in sucession, reporting each time that it processed 0 records (which might not be true). ## Proposed fix: We correctly count the total account moves that need to be processed (using a `search_count`) and calculate the number of processed records and the remaining ones. opw-4926541 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218763
The live chat test now uses a dedicated user instead of the demo user, preventing other demo data from changing the expected email address. This keeps nightly demo builds stable and reduces false test failures without changing customer-facing behavior.
Original PR description
This commit fixes a failing test in the nightly "With Demo" build. The test fails because it checks the email of the demo user, which is overridden by the demo data from another module. This commit fixes the issue by making the test run with a different user than the demo user, so that the email remains predictable. fixes runbot-229925 Forward-Port-Of: odoo/odoo#219421
This fix makes automated website tours more reliable when they move to a different page. It helps prevent inconsistent test behavior caused by page unload events, reducing false failures during quality checks.
Original PR description
In this commit, we add expectUloadPage to goToUrl util. This util redirect to another page an involves a unload event so we need to add this key to this util to avoid undeterministic behaviors in tours that use it. 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#219672
Fixed an issue where shops using an UrbanPiper payment method could become unable to close their point-of-sale session after completing an order. The closing screen now avoids duplicate payment method entries, preventing the session from getting stuck and helping staff finish end-of-day operations normally.
Original PR description
Currently if setting a urban piper payment method on a shop and using it at checkout will not allow you to close the session. Steps to reproduce: ------------------- * Go in the setting and set up…
Currently if setting a urban piper payment method on a shop and using it at checkout will not allow you to close the session. Steps to reproduce: ------------------- * Go in the setting and set up urban piper (no need for credentials) testing with random keys will do * Go into the payment methods and take one of the urban piper one and assign it to a shop * Open that shop * Place an order and use the urban piper payment method * Validate * Try closing the session > Observation: Nothing happen, we're now unable to select the menu. If doing the same steps but in debug mode, a traceback is shown indicating a duplicate key in a t-foreach Why the fix: ------------ The duplicate key is happening when rendering the closing popup because the function `get_closing_control_data()` was returning twice the information related to the urban piper payment method. Even though urban piper wasn't build with the use case in mind we want to keep it possible. We avoid sending twice the urban piper methods if they were already computed in the super method. opw-4874699 Forward-Port-Of: odoo/enterprise#90427 Forward-Port-Of: odoo/enterprise#88156
This fixes an issue where Belgian POS settings did not correctly limit IoT device choices to blackbox devices. The change helps businesses configure compliant fiscal devices more reliably and avoids showing irrelevant hardware options.
Original PR description
The domain to display only blackboxes in the IoT devices configuration on pos.config was a string, so not correctly passed to res.config.settings in the related field. This commit fixes this issue by computing the domain with a lambda method.
Fixes an error that occurred when website editors chose specific appointment types for an Appointment Button. Selected appointment types now display their names correctly, making the setup flow reliable and easier to understand.
Original PR description
Since [1], the conversion of actions to classes introduced a forgotten shared function, leading to a traceback when specifying appointment types under the "Appointments" option. Additionally, this commit corrects the missing `display_name` in `SetAppTypesAction`. Previously, this omission caused the selected appointment types to appear empty without a name in the UI. Steps to reproduce: - Drop "Appointment Button" - Change "Appointments" option to "Specific Types" - Click on "Specify" option and choose any record from the list - Traceback occurs [1]: https://github.com/odoo/enterprise/commit/1f8b599a23330b03bffd898d85fe74a0f0eeda1f
Project profitability now includes budget lines even when their analytic account belongs to a different analytic plan than the project's main plan. This prevents valid budget information from being hidden after analytic account setup changes or upgrades, giving users a more accurate profitability view.
Original PR description
In version 17.3, the analytic mixin was introduced in budget.line model to allow to link a budget line to multiple analytic accounts belonging to different analytic plans. The issue is that we have…
In version 17.3, the analytic mixin was introduced in budget.line model to allow to link a budget line to multiple analytic accounts belonging to different analytic plans. The issue is that we have not adapted the code in project profitability, to take those changes into account. A problematic situation could be the following: 1. We have a project where the account "X" is set to the main project plan (the first one) "Projects" BUT the account "X" actually belongs to the analytic plan "Departments" (yes, it's possible that there is a mismatch between the project plan and the analytic plan, especially after the 18.0 upgrade where "analytic_account_id" just became "account_id", no matter in which plan it was). 2. We have a budget line linked to the account "X" for the plan "Departments". 3. We want to display the budget lines in project profitability, but this line does not appear. That's because we currently only look for the budget lines belonging to the analytic plan "Projects" aka the main/first plan, that match the account "X" of the project. But as account "X" actually belongs to the analytic plan "Departments", no budget lines are found. task-4901400 version-18.0 Forward-Port-Of: odoo/enterprise#88658
Users who process invoices can now use the Reload AI Data button without needing administrator settings access. This prevents an error during invoice AI data refreshes and keeps the workflow available to functional accounting users.
Original PR description
When clicking on the "Reload AI Data" button (`account.move::action_reload_ai_data`), a user not in `base.group_system` group encounters an access rights error when searching on `ir.module.module` model in `account.move::is_indian_taxes()`:
```python
def is_indian_taxes(self):
l10n_in = self.env['ir.module.module'].search([('name', '=', 'l10n_in')])
return self.company_id.country_id.code == "IN" and l10n_in and l10n_in.state == 'installed'
```
This commit adds `sudo()` to the `search` call to ensure that the check for the 'l10n_in' module does not fail for users not belonging to "Administration/Settings" group.
This prevents a traceback and ensures that functional users can reload AI data.
Forward-Port-Of: odoo/enterprise#90021Fixed an issue that could cause spreadsheets to crash when users autofilled pivot columns that were themselves created through autofill, especially with dates beyond the original range. This makes spreadsheet pivot editing more reliable and helps users continue their analysis without interruption.
Original PR description
Fix crash when autofilling columns which where created by autofill. Task: 4719884 Forward-Port-Of: odoo/enterprise#90462 Forward-Port-Of: odoo/enterprise#83314
The Brazil AvaTax integration now handles tax provider error responses gracefully instead of failing unexpectedly. This reduces disruption when external tax calculations return errors and removes leftover debugging output.
Original PR description
Oversight of odoo/enterprise#82623. There won't be a 'lines' key in the response if the API returned errors. This also removes a logger meant for debugging. Noticed by VBE during review of odoo/enterprise#90156.