Tuesday, June 23, 2026
17 changes · saas-19.2
New functionality added to Odoo
This update streamlines connections to remote SaaS databases for users created through the Databases module. Now, users will automatically authenticate upon connecting, eliminating the need for manual login screens and improving the overall user experience.
Original PR description
## [IMP] databases: SSO smooth connection and setup The aim of this commit is to allow databases_user to be directly connected to any remote SaaS database to which they have access. When they click…
## [IMP] databases: SSO smooth connection and setup
The aim of this commit is to allow databases_user to be directly connected to
any remote SaaS database to which they have access.
When they click the "connect" button, they will bypass the login screen and be
authenticated automatically.
To achieve this, when a user tries to connect to an accessible SaaS database, we
quickly write their `oauth_uid` to that remote database right before the
connection is initiated.
Before this commit:
A user that was created in the remote db using the create user feature from the
databases module wouldn't get automatically authenticated through the Odoo
OAuth SSO feature.
After this commit:
Users attempting to connect to a SaaS database will be directly connected if the
settings was activated.
task-id: 6071808
## TODO:
- [x] check if we always have oauth_uid for saas db
- [x] think about making the oauth module autoinstall (make a bridge module? or overkill?)
- We can avoid that and have everything work in place directly, avoiding an inheritance nightmare at installation time.
- [x] handle cases where it isn't there on both the remote db and the managing one
- [x] write some tests to ensure the code is free from traceback
- [x] add a feature allowing to:
- [x] add it to all server on which the user has access
- [x] add it to a specific server (may require the db list view on `res.users`
- [x] remove the previous and do everything when the user click on "connect"
- [x] would be better to put the code in a new module with auto install => people get auto-install + no "hacky" code.
- The "hacky" code is not so hacky and with that we can directly advertise the installation of `auth_oauth` in an action
- [x] add a config in the settings
Forward-Port-Of: odoo/enterprise#112369This update adds the ability to generate invoice PDF reports in multiple formats (Original, Duplicate, and Triplicate) to meet government regulations regarding GST documentation. Users can now print two or three copies of an invoice with distinct titles for different recipients, ensuring accurate record-keeping for transporters and suppliers. This improves compliance and reporting accuracy.
Original PR description
The Goverment specifies that invoice should be printed in different formats as per the different parties the invoice is been given to. Invoice should be marked as "Original" for receiver's copy. Invoice should be marked as "Duplicate" for transporter's (incase of goods supply) or supplier's copy. Invoice should be marked as "Triplicate" for supplier's (incase of goods supply) copy. This commit adds two new report actions, for Duplicate and Triplicate on invoice, visible in the Print section under the gear icon. When user prints Duplicate, 2 copies will be printed and for Triplicate, 3 copies will be printed at once, with different titles set on each copy of invoice. task-5899610 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270813
Enhancements to existing features
This update allows customers using the self-order system to pay at the counter, even if they've already selected a payment method within the self-order process. This provides greater flexibility for customers and streamlines the checkout experience, particularly in scenarios where a customer wants to pay with cash after selecting a payment method digitally.
Original PR description
pos*: point_of_sale, pos_self_order This commit allows the user to allow his customer to pay at the counter even if they already have payment method set in the self order. task-id: 5960666 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250364
Resolved issues and error corrections
This update prevents users from incorrectly increasing refund quantities when processing gift card or e-wallet orders in the ticket screen. Previously, clicking these orderlines would lead to unintended quantity adjustments. This change ensures accurate refund processing and improves the overall reliability of the point-of-sale system.
Original PR description
Before this commit: =================== - Clicking an e-wallet or gift card orderline in the ticket screen increased the refund quantity. After this commit: ================== - Gift card and e-wallet products are now restricted from refund quantity increments in the ticket screen. Task - 6200888
This update fixes an issue where preparation times weren't accurately calculated when order stages changed and where the preparation time report incorrectly included data from all companies. The changes now ensure preparation times are correctly updated and that reports only show data for the active company, improving the accuracy of order preparation tracking.
Original PR description
Issues: - Preparation time for order lines was not computed when the preparation order stage changed. - Preparation time report aggregated orders across all companies instead of showing records for the active company only. Fixes: - Ensure preparation time is properly recomputed when the order stage changes. - Add company domain filtering to the preparation time report. Task-6250974 Forward-Port-Of: odoo/enterprise#118738
This update resolves an issue that prevented efficient processing of invoices with multiple related documents (specifically those related to Mexican tax filings - CFDI). By using a specialized index, the system now handles complex cancellation scenarios and large volumes of data more effectively, ensuring smoother invoice workflows.
Original PR description
The field `l10n_mx_edi_cfdi_origin` can contain a large number of associated UUIDs, especially in complex cancellation scenarios. The default B-tree index fails when this field exceeds 2704 bytes, which occurs after approximately 20 UUIDs. By switching to a trigram index, we avoid the entry size limit of PostgreSQL's B-tree nodes. This ensures that invoices with many related documents can be processed while maintaining efficient search performance for partial matches on this field. **Video before the fix:** https://youtu.be/24u0HbxwIH8 **Video after the fix:** https://youtu.be/sUelv1HZMvI Forward-Port-Of: odoo/enterprise#118868
This update corrects a previous issue where Odoo was incorrectly selecting unavailable couriers from Shiprocket. The fix now filters out 'blocked' couriers, ensuring only service-eligible options are considered for shipping rates and selections. Additionally, the system is more robust to handle potential errors in Shiprocket's data.
Original PR description
Shiprocket provides an odablock flag in the courier serviceability response. Couriers with odablock=True are not serviceable for the requested route and should not be considered for rate calculation or selection. Before this change, Odoo selected the first courier returned by Shiprocket regardless of its ODA status. As a result, unavailable couriers could be proposed to users and selected for shipments. The fix filters out ODA-blocked couriers before evaluating available services, ensuring that only serviceable couriers are considered. Additionally, freight charge parsing is hardened to gracefully handle non-numeric values returned by Shiprocket, preventing errors during AWB assignment and price computation. FYI: Shiprocket uses odablock=False for serviceable routes and odablock=True for routes that are blocked for a given courier. opw-6288768,6152279 Forward-Port-Of: odoo/enterprise#120374
This fix resolves an issue where extra prices were incorrectly applied to products with 'always' attributes when creating point-of-sale combos. The update ensures that extra prices are now set on the combo creation page for 'always' attributes, aligning with how the system should calculate prices for these product variations.
Original PR description
## Steps to reproduce - Create an attribute A, of type always, with 2 values, one should have an extra price - Create an attribute B, of type never, with 2 values - Create a product that has both…
## Steps to reproduce - Create an attribute A, of type always, with 2 values, one should have an extra price - Create an attribute B, of type never, with 2 values - Create a product that has both those attributes - Create a combo with that product with both values for A - Go to the PoS and order that combo with the value that has an extra price for A - The extra price is added ## Why the fix: For variants of type always, a product is created, meaning we can chose which products of this variants to have in our combo. As we can chose this, it means that we can and should chose the extra price on the combo creation page, not on the attribute page. It does not make sense to take the attribute extra price into account, as we do not take the unit price of combo items into account, so this extra price should be set on the combo page and we should ignore the attribute's extra price if the type is "always". The variants are then considered as different products, as they should in this case. If the type of the attribute is never, we can't chose which one gets an extra price on the combo page, so we should still take the attribute's extra price in this situation, as we have no other way to set it. We need to have both an always and a never attribute in order to reproduce this bug because if we only have "always" values, the configuration of the combo item is bypassed and is undefined, so **attribute_value_ids** will be undefined in this code and we won't get any value for the extra price in this code: https://github.com/odoo/odoo/blob/c09e8b2fc24ee75495fc947924e29cf5c601506f/addons/point_of_sale/static/src/app/models/utils/compute_combo_items.js#L44-L49 We now ignore the attribute's extra price if it's type is always, otherwise, it the behavior stays the same. opw-6262431 Forward-Port-Of: odoo/odoo#270894 Forward-Port-Of: odoo/odoo#268567
This update resolves an issue where recurring plans would disappear from the website when a product's quantity was increased. The original fix only worked on the initial page load, but this change ensures the recurring plan selection remains accurate even after updates to the product's price or variant. This improves the user experience for subscription customers.
Original PR description
# Introduction note This PR fixes two bugs introduced by the same commit : https://github.com/odoo/enterprise/commit/106d70a1ef0ddbd61a74b7cac82dfce1e316beaa The original commit fixed multiple issues…
# Introduction note This PR fixes two bugs introduced by the same commit : https://github.com/odoo/enterprise/commit/106d70a1ef0ddbd61a74b7cac82dfce1e316beaa The original commit fixed multiple issues regarding the display of recurring plans when the One-time purchase option was enabled, but it also introduced new ones. Theses new issues are due to multiple new checks on `allow_one_time_sale`, but this variable only indicates that the One-time purchase option is available to the user, not that it is actually selected. So the fixes of the original commit works when first loading the page, but fails when the content of the page is updated. # Shared steps - Activate Subscriptions & eCommerce modules - Create a subscription product, enable 'Accept One-Time' and publish it on the website # Bug 1 ## How to reproduce - Add atleast two recurring plans to the product - Go to the product page on the website - Select one of the recurring plans - Increase the quantity of the product ## The problem The recurring plan selection is removed ## Cause The condition `!combination_info.allow_one_time_sale` was added on the `t-att-checked` of the recurring plan selection display. This correctly fixed the issue when first loading the page, but when the user changes the price or the variant, the recurring plan are recomputed and rerendered : https://github.com/odoo/enterprise/blob/0b408acbadb2cfcbc844521f3244a06b7ae7be22/website_sale_subscription/static/src/interactions/product_page.js#L37-L40 When that is the case, that condition blocks the proper display of the selected recurring plan. ## Proposed Solution When loading the recurring plan selection, what defines wich plan is selected is the `subscription_default_pricing_plan_id` variable, which is based on the `plan_id` value given in the request to the server : https://github.com/odoo/enterprise/blob/0b408acbadb2cfcbc844521f3244a06b7ae7be22/website_sale_subscription/models/product_template.py#L222 We make it so if no `plan_id` is sent to the server and `allow_one_time_sale` is enabled, then the server does not give back any `subscription_default_pricing_plan_id` opw-6131532 # Bug 2 ## How to reproduce - Add an attribute with values A & B for the product - Define atleast two recurring plans for the variant with attribute B - Publish the product - Go to the product page - Select the variant with attribute B ## The problem The recurring plan is not displayed. If the order of the attribute is reversed, then it works as expected. ## Cause The pricings are correcly sent to the front-end but they are not added to selection because of the check on `allow_one_time_sale` : https://github.com/odoo/enterprise/blob/0b408acbadb2cfcbc844521f3244a06b7ae7be22/website_sale_subscription/static/src/interactions/product_page.js#L42-L50 opw-6132160 Forward-Port-Of: odoo/enterprise#120873 Forward-Port-Of: odoo/enterprise#115446
This update fixes a bug in the stock valuation calculation that incorrectly displayed product values when multiple companies and currencies were involved. The fix ensures that values are accurately converted to the main company's currency (USD) for a correct total value calculation. This impacts how stock values are reported across different company setups.
Original PR description
**Steps to reproduce:** - make sure your main company (company 1) has dollars as its main currency - create second company (company 2) and a warehouse in this second company - set euro has the main…
**Steps to reproduce:** - make sure your main company (company 1) has dollars as its main currency - create second company (company 2) and a warehouse in this second company - set euro has the main currency in the company 2 From company 1: - set an exchange rate of 1$ = 0.5 eur on the euro currency - create a storable product with a cost of 10$ and an on-hand quantity of 1 From company 2: - set the cost to 10 eur and set an on-hand quantity of 1 with both company selected and company 1 as the main company selected: - open the stock view and look for your product **Current behavior:** the total value is 20$ **Expected behavior:** with conversion rate, it should be 30$ **Cause of the issue:** when computing the total value we do not apply a conversion rate from the value of the company to the main company selected https://github.com/odoo/odoo/blob/8759429547e42e9f63b15a7c80475be46ef437e2/addons/stock_account/models/product.py#L273 opw-6280108 Forward-Port-Of: odoo/odoo#270575
A recent update caused the Point of Sale system to incorrectly add the 'S' variant when scanning a barcode for the 'M' variant of a product with dynamic attributes. This fix ensures that the correct variant is always added, improving the accuracy of sales transactions. The change corrects a logic error in how the system handles product variants with dynamic attributes.
Original PR description
Steps to reproduce ------------------ 1. Create a product with two attributes: - Size with values S and M (Variants Creation: "Instantly") - a second attribute with a single value (Variants Creation: "Dynamically") 2. Set a different barcode on the S and the M variant. 3. Open PoS, scan the barcode of M. -> The S variant is added instead. Why the issue ------------- In 390b48a1ba24, when a product has a single-value attribute set to "dynamic", we look for the first variant that has this value and use it instead of the preselected variant. This is wrong when several variants share this value: in our case both S and M have it, so scanning M is overridden by the first variant, S. The fix ------- We now keep the preselected variant if it already has this value, and only look for or create one otherwise. opw-6272739 Forward-Port-Of: odoo/odoo#268590
This update fixes an issue where reordering rules were incorrectly creating purchase orders linked to sales orders. Now, reordering rules will always generate new, separate purchase orders, ensuring accurate inventory management and preventing duplicate purchase orders. This improves order fulfillment efficiency.
Original PR description
Steps to reproduce the bug: - Go to contact: - azure interior: - Group RFQ: On Order - Create two storable products P1 and P2, both with the Buy route and Azure interior as vendor - Confirm a sale…
Steps to reproduce the bug:
- Go to contact:
- azure interior: - Group RFQ: On Order
- Create two storable products P1 and P2, both with the Buy route and Azure interior as vendor
- Confirm a sale order with P1 (MTO+Buy):
- a purchase order PO1 is created, linked to the sale order via reference_ids
- Create a reordering rule for P2 and trigger it
Problem:
The reordering rule procurement for P2 was merged into PO1 (the sale order's purchase order) instead of creating a new separate PO.
In _make_po_get_domain (purchase_stock/models/stock_rule.py), when group_rfq == 'default' (On Order), the domain only adds a reference_ids filter when the procurement carries reference_ids. When the procurement comes from a reordering rule (no sale order, no reference_ids), no filter was added, so the search matched any draft PO from that vendor, including PO1, which has reference_ids pointing to the sale order.
Solution:
When group_rfq == 'default' and the procurement has no reference_ids, add ('reference_ids', '=', False) to the domain so the search only matches POs that are also not linked to any sale order.
opw-6167835
Forward-Port-Of: odoo/odoo#270735This update corrects a scheduling issue in manufacturing orders where operations with dependencies were not always processed in the correct order. The fix ensures operations are planned based on their dependencies, preventing delays and improving production efficiency. This resolves a conflict when planning operations with shared blockers.
Original PR description
Bug introduced in: https://github.com/odoo/odoo/commit/cfc5c998035b4268c36f5097782888e18e21b4fe Steps to reproduce the bug: - Create a product with a BoM with operation dependencies enabled - Add 4…
Bug introduced in: https://github.com/odoo/odoo/commit/cfc5c998035b4268c36f5097782888e18e21b4fe
Steps to reproduce the bug:
- Create a product with a BoM with operation dependencies enabled
- Add 4 operations on the same workcenter:
- opA: no blocker
- opB: blocked by opA
- opC: blocked by opA
- opD: blocked by opC
- Confirm a manufacturing order from this BoM
- Click Plan
Problem:
opA was scheduled after opB, violating the dependency.
`_plan_workorders` starts planning from the "leaf" workorders (those
with no dependents). Given the structure above, the initial set is
[opB, opD]. Processing opB first correctly plans opA then opB. But
processing opD triggers a recursive chain opD→opC→opA which calls
`action_unplan(opA)` and replans it from scratch. By then, opB already
occupies the workcenter slot that opA originally held, so opA ends up
scheduled after opB.
Solution:
Add `and not wo.is_planned` to the filter on `blocked_by_workorder_ids` in the recursive call inside `_plan_workorders`. Workorders that are already planned are skipped instead of being unplanned and replanned, preserving the correct order.
opw-6299179This update resolves a bug where clicking gift cards, e-wallets, or discount order lines in the ticket screen incorrectly increased refund quantities. Now, these product types are properly restricted from quantity increments during refunds, ensuring accurate transaction processing.
Original PR description
pos*: point_of_sale, pos_loyalty, pos_discount Before this commit: =================== - Clicking an e-wallet, gift card, discount order line in the ticket screen increased the refund quantity. After this commit: ================== - Gift card, e-wallet and discount products are now restricted from refund quantity increments in the ticket screen. Task-6200888 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a crash that occurred when users tried to view Instagram videos within Odoo. The fix now displays the video link instead of attempting to render the video as an image, ensuring a stable preview experience. This improves usability and prevents disruptions for users accessing Instagram content.
Original PR description
Purpose ======= When we have a real on Instagram, we try to show the video as an image. When clicking on the broken image, the previewer crash. To fix that issue, we know show the link of the video in the message. Task-5491124 Forward-Port-Of: odoo/enterprise#121176 Forward-Port-Of: odoo/enterprise#113487
This update corrects a bug where the invoice status cron job only processed invoices for the main company. Now, it accurately retrieves and updates the status of invoices across all companies within the Odoo system. This ensures accurate reporting and compliance for all business entities.
Original PR description
The invoice status cron was only fetching the main company's invoices. Fetch all companies' invoice statuses. Reference: https://github.com/odoo/odoo/pull/267144#discussion_r3441968099 no-task Forward-Port-Of: odoo/odoo#271227
This update resolves an issue where the partner associated with a bill was incorrectly overridden during UBL XML import processes. The fix ensures that the purchase order always serves as the primary source for partner information on bills, improving data accuracy and consistency. This prevents errors related to mismatched partner information in invoices.
Original PR description
Fix a bug where the partner of a bill is overriden by the PO matching The chosen logic here is to say that in the context of a purchase, the purchase order is the single source of truth to set the partner on a bill Steps to reproduce: - Create a partner with is_company = True - Create a contact type 'invoice' for this partner - Create a purchase order for the first partner - Import an XML (UBL) that matches this PO - You can see in the import logs that the partner was correctly found first, and then the PO matching override it to set the contact as the partner task-6289358 Forward-Port-Of: odoo/odoo#271133 Forward-Port-Of: odoo/odoo#269223