Tuesday, July 22, 2025
15 changes · saas-18.4
Enhancements to existing features
The mail chatter now receives recipient field information as part of its standard mail data, avoiding extra background requests. This should make opening and updating chatter recipient information faster and reduce server calls without changing the visible workflow for users.
Original PR description
This PR removes `/mail/thread/recipients/fields` by embedding the value inside `/mail/data`. This removes up to 2 RPCs done inside chatter `onWillStart` and `updateRecipients`. PR enterprise: https://github.com/odoo/enterprise/pull/84661 Task-4685400 Forward-Port-Of: odoo/odoo#219345 Forward-Port-Of: odoo/odoo#208393
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 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
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
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
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
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
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.