Wednesday, February 18, 2026
15 changes · 18.0
Enhancements to existing features
This update switches the GSP provider for Indian GST e-invoices to align with recent integration changes. This ensures Odoo correctly transmits GST data, complying with updated Indian regulations and operational requirements. It’s a necessary update to maintain accurate and compliant GST reporting in India.
Original PR description
Update the Indian localization to switch the GST e-invoice GSP (GST Suvidha Provider) configuration to a new provider as required by recent integration updates. This change ensures that GST credentials uses the new GSP configuration and aligns with updated operational requirements. Task: 5379879 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243296
This update switches the GSP (GST Suvidha Provider) configuration for Indian GST e-invoices to align with recent integration updates. This change ensures Odoo correctly processes and reports on Indian GST data, complying with evolving regulatory requirements. It’s a necessary update to maintain accurate reporting for our Indian customers.
Original PR description
Update the Indian localization to switch the GST e-invoice GSP (GST Suvidha Provider) configuration to a new provider as required by recent integration updates. This change ensures that GST credentials uses the new GSP configuration and aligns with updated operational requirements. Task: 5379879 Forward-Port-Of: odoo/enterprise#103984
Resolved issues and error corrections
This update fixes an issue where table menus would overflow and prevent users from accessing table UI menus when hovering over lists within table cells. The change introduces a local overlay to contain the table menu, ensuring menus are always displayed correctly when hovering over list elements, improving the user experience.
Original PR description
**Current behavior before PR:** - Table menu handlers could overflow into adjacent table areas when the targeted part of the table was only partially visible within the container. - When a table cell contained a list, hovering over the list element did not display the table UI menus, even though the mouse was inside the cell. **Desired behavior after PR is merged:** - Use a local overlay for the table menu to prevent overflow into adjacent cells. - Table UI menus are now correctly displayed when hovering over list elements inside a table cell. task-5353518
This update fixes an issue where the default putaway strategy wasn't consistently applied, leading to incorrect location assignments during manufacturing and by-product processes. The change ensures the strategy defaults to child locations, aligning with expected workflow and improving inventory management accuracy.
Original PR description
Steps to reproduce ----- - Enable locations & by products - Create 4 locations - View A of type view (parent: Stock) - View B of type view (parent: Stock) - Storage A of type internal location…
Steps to reproduce ----- - Enable locations & by products - Create 4 locations - View A of type view (parent: Stock) - View B of type view (parent: Stock) - Storage A of type internal location (parent: View A) - Storage B of type internal location (parent: View B) - Create a "Manufacture to A" route - Rule 1: Manufacture, Stock -> Stock - Rule 2: Push To, Internal Transfer, Stock -> View A - Create a "By Products to B" route - Rule 1: Push To, Internal Transfer, Stock -> View B - Create a "Bonus" product with route "By Products to B" - Create a "Finished" product with route "Manufacture to A" - BoM with "Bonus" as by product - Create a MO for Finished, and produce it - Open the linked transfers' list view - Open the "Bonus" transfer > "Destination Location" states View B - Open the line's details (hamburger button) > "Store To" states View A/Storage A Cause ----- When retrieving the location in https://github.com/odoo/odoo/blob/26dbbdaf460a91ef4b33392c27a28951d5de2c57/addons/stock/models/stock_move_line.py#L280-L282 we pass `locations` as a context key. The problem is that `locations` contains the childs of **all** of the SMLs' locations https://github.com/odoo/odoo/blob/26dbbdaf460a91ef4b33392c27a28951d5de2c57/addons/stock/models/stock_move_line.py#L260 This means that, in `_get_putaway_strategy`, when no `putaway_location` is found, we end up defaulting to the first element of the list https://github.com/odoo/odoo/blob/26dbbdaf460a91ef4b33392c27a28951d5de2c57/addons/stock/models/stock_location.py#L370-L371 which might not be a child of the location. Solution ----- By removing the context key, locations get populated as such https://github.com/odoo/odoo/blob/26dbbdaf460a91ef4b33392c27a28951d5de2c57/addons/stock/models/stock_location.py#L328-L330 This is ok because we know the call to `_get_putaway_strategy` is made on a single record (`sml.move_id.location_dest_id`) so the default will correctly be a child of said location. ----- Ticket: opw-5359945
This update fixes an error in the Time Off balance report that was incorrectly calculating remaining time off days for employees with allocations across different periods. The fix reorders allocations by start date to ensure accurate calculations when filters are applied. This ensures employees see the correct remaining time off balance.
Original PR description
The balance report aggregates allocations regardless of the period in which they occur resulting in wrong information when an employee has two allocations in different periods and a filter is used in the report Steps to reproduce: 1. Install Time Off app 2. Open Time Off app and go to Management > Allocations 3. Create a new allocation of 100 days for employee "Mitchell Admin" of time off type "Paid Time Off" with a validity period from 01/01/2027 to 31/12/2027 and approve it 4. Activate debug mode 5. Go to Time Off > Reporting > Balance 6. The number of days left for "Mitchell Admin" for "Paid Time Off" is 120 days even though the default filter is on the period of 2026 Solution: Refactor the entire query: we order the allocations by date_from so we can subtract taken leaves from the allocations in that order opw-5156142
This update resolves an issue where customers placing multiple Click & Collect orders from different store locations could inadvertently create duplicate address records. The fix ensures correct address hierarchy management, preventing confusion and streamlining the order process for customers.
Original PR description
## Versions 18.0+ Not visible in 19.0 because the UI prevents this behavior but it still occurs in the backend. ## Issue In eCommerce, when a customer places an order for in-store pickup at one…
## Versions
18.0+
Not visible in 19.0 because the UI prevents this behavior but it still occurs in the backend.
## Issue
In eCommerce, when a customer places an order for in-store pickup at one location, then places another order for pickup at a different store, a problematic address record can be created iff they select the previously used store address (created during the first order) as the delivery address.
This leads to a third address being created with a name combining both store locations, due to improper address parent-child relationships.
## Steps to reproduce
With Admin user:
- In Inventory's "Warehouses", duplicate the existing warehous:
- Change the duplicated one's address (create one if needed).
- Activate "Click & Collect" in Settings app;
- Setup "Pickup Locations":
- Under "Pick up in store", add both warehouses.
- Go to a storable and published product (eg. Acoustic Bloc Screens):
- Set On Hand quantity to at least 2 units per warehouse.
With Portal user logged in:
- Access the shop:
- Order 1 unit of the setup product;
- Process checkout up to Delivery step:
- Select user's address (only available "DELIVERY ADDRESS");
- Select a store location;
- Confirm and finalize the order.
- Order 1 unit of the setup product (bis);
- Process checkout up to Delivery step (bis):
- Select the store address (newly created "DELIVERY ADDRESS");
- Select the other store location;
- Confirm and finalize the order.
- Order 1 unit of the setup product (ter);
- Process checkout up to Delivery step (ter):
- A third address shows up named after both store locations.
## Cause
The `_action_confirm` method looks for an existing partner based on `parent_id`: https://github.com/odoo/odoo/blob/d80628a45bcfe5192f1b95286a6758fe6616fbec/addons/delivery/models/sale_order.py#L169-L176
The issue comes from:
https://github.com/odoo/odoo/blob/d80628a45bcfe5192f1b95286a6758fe6616fbec/addons/delivery/models/sale_order.py#L164 https://github.com/odoo/odoo/blob/d80628a45bcfe5192f1b95286a6758fe6616fbec/addons/delivery/models/sale_order.py#L178-L189
On the first order:
- A new delivery address is created.
- Its `parent_id` is set to the customer (order partner).
On the second order:
- The user selects the previously created store address as delivery address.
- Odoo sets the `parent_id` of the new address to this store address (instead of the customer).
- This creates an unintended hierarchy, causing further confusion in subsequent orders.
opw-5340953This update resolves a bug where clicking the 'More options' button in the HTML editor caused it to lose focus. Additionally, it corrects a filtering issue within the powerbox, ensuring commands are properly displayed when typing. This improves the editor's usability and responsiveness.
Original PR description
**Issue 1:** Steps to Reproduce - Click on the More options button in the power buttons. - The powerbox opens, but the editor loses focus and the button receives focus. Description of the issue: -…
**Issue 1:** Steps to Reproduce - Click on the More options button in the power buttons. - The powerbox opens, but the editor loses focus and the button receives focus. Description of the issue: - After clicking the power button, the button becomes focused and the editor loses focus. Solution - When clicking the power button, after the command is executed in the click event, explicitly restore focus to the editable area so the editor remains focused. **Issue 2:** Steps to reproduce - Click More options in the Power Buttons to open the powerbox. - Start typing `heading`. Description of the issue: - The powerbox does not filter commands and continues to show all commands. Cause: - In `search_powerbox_plugin`, commands are filtered only when `shouldUpdate` is true. - `shouldUpdate` is set only when the powerbox is opened through `search_powerbox_plugin`. - Power Buttons open the powerbox via `powerbox_plugin`, so `shouldUpdate` remains false and filtering is not triggered. Solution: - Introduced `openSearchPowerbox` in `searchPowerboxPlugin`. - Updated the implementation to use this method instead of `openPowerbox` in `search_powerbox_plugin`. - Instead of opening the powerbox via `powerbox_plugin`, it is now opened via `search_powerbox_plugin`, ensuring `shouldUpdate` is set correctly and commands are filtered on keypress. task-5485088
This update resolves an issue where the delivery charge was being calculated twice during Stripe express checkout, leading to incorrect order totals. The fix ensures accurate delivery pricing by excluding delivery lines from tax calculations. This improves the customer experience and prevents financial discrepancies.
Original PR description
Versions: --- - 17.0+ Issue: --- Delivery amount is doubled in stripe express payment checkout. Steps to reproduce: --- 1- Setup a stripe payment express checkout. (In my client case it is apple pay…
Versions: --- - 17.0+ Issue: --- Delivery amount is doubled in stripe express payment checkout. Steps to reproduce: --- 1- Setup a stripe payment express checkout. (In my client case it is apple pay express checkout but we also reproduced it in google pay) 2- Set fixed price on standard delivery: 10 3- Navigate to website: add a product to cart. Use express checkout. Outcome: The delivery price is calculated twice which is wrong. Cause: --- This regression is due to #238574. Once `/compute_taxes` is called, there is delivery lines included in SO. As a result returning `amount_total` will cause `this.paymentContext['minorAmount']` to include delivery amount. Then we add delivery carrier `minorAmount`: https://github.com/odoo/odoo/blob/469220cde82ecebf4a59451cc1325add6bfc3e69/addons/payment_stripe/static/src/js/express_checkout_form.js#L188-L196 Which cause delivery amount be added twice. Fix: --- We could exclude delivery amount from total amount in `express_checkout_shipping_address_compute_taxes`, which is going to calculate the tax for lines excluding delivery lines. opw-5424398 Forward-Port-Of: odoo/odoo#248415
This update fixes an error in how holiday pay recovery is calculated for employees with non-standard working schedules (e.g., 40 hours/week) in Belgium. Previously, the calculation used outdated standard hours, leading to incorrect deductions. Now, the system accurately uses the employee's actual weekly hours to ensure correct holiday pay recovery amounts.
Original PR description
**Steps to Reproduce:** 1 - create an employee in Belgium company with hourly rate 20.62 and 40h/week working schedule 2 - Set 10 paid time off to this employee 3 - Set 2000 euros in recovery amount…
**Steps to Reproduce:** 1 - create an employee in Belgium company with hourly rate 20.62 and 40h/week working schedule 2 - Set 10 paid time off to this employee 3 - Set 2000 euros in recovery amount holiday n-1 4 - Set 10 days in recovery day holiday n-1 5 - Employee takes 5 paid time off in February and 5 in December 6 - Do one payslip for this employee for February and validate it 7 - Do one payslip for this employee for December Current behaviour : - the holiday n-1 amount for February = 824.80 - the holiday n-1 amount for December = 742.32 Expected behaviour : - the holiday n-1 amount for December should be 20.62 (hourly_rate) * 5 (days) * 8 (hours) = 824.80 **Reason** - The daily recovery amount was calculated using hardcoded standard working hours (38h/week) instead of the employee's actual schedule (40h/week), causing an incorrect deduction rate for non-standard schedules. **Solution** - Replace the hardcoded reference with the actual hours per week from the employee's resource calendar to ensure the correct hourly rate is applied. Forward-Port-Of: odoo/enterprise#106205
This update resolves an issue where Peppol invoices were incorrectly using the wrong company context, leading to errors and inconsistencies when creating invoices. The fix ensures invoices are processed with the correct company details, preventing data mismatches and improving data accuracy for cross-company transactions.
Original PR description
Currently, the created move does not always use the company context of the related move/proxy user. As a result, default values may be taken from another company, which can lead to cross-company inconsistencies and access errors. Steps to reproduce: - Set up two companies, A and B - In company A, configure a default value for the partner.company_id field, applicable only to company A - When a Peppol invoice arrives for company B but is processed using the context of company A, and a new partner must be created, the partner is created with company A as the default value - This results in an incompatible companies on record error This fix ensures that the company context of the move or EDI user is used when creating the move, preventing cross-company issues. opw-5473233 Forward-Port-Of: odoo/odoo#249059
This update corrects a critical issue in the account_edi_ubl_cii module for Belgium, ensuring that the company registry is correctly identified within UBL invoices. This ensures compliance with industry standards and accurate invoice generation for Belgian businesses. The fix also addresses a related issue with PartyLegalEntity data for the Netherlands.
Original PR description
1) This commit adds the new generic methods to build an UBL file. The big objective is to remove the hierarchy of UBL later on and make BIS3 completely standalone. In this commit, BIS3 is not independent of UBL 2.1 & 2.0. 2) Missing schemeID for Belgium Company registry Since https://github.com/odoo/odoo/commit/d40652c17b43b6a9fd4d19ce84b943b2a51fad9c, in Belgium, we set by default the company registry. However the schemeID is missing and should be part of the ISO 6523 ICD list: https://docs.peppol.eu/poacc/billing/3.0/codelist/ICD/ 3) Fix PartyLegalEntity when the country is NL and there is no company registry/EAS/Endpoint That case was raising a traceback before this commit. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a synchronization issue that occurred when orders had both terminal and online payments. Previously, removing an online payment didn't properly remove the corresponding terminal payment from the system, leading to data inconsistencies. Now, only online payments are deleted, ensuring accurate order synchronization across the UI and server.
Original PR description
Before this commit, if an order had a terminal payment and an online payment was added accidentally, and then get removed, the terminal payment would get removed from server, while it won't be removed from the UI, resulting in a mismatch between the server and the UI, and the order would no be synced correctly. opw-5911699 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where OCR-extracted expense receipts were incorrectly converting foreign currencies to USD, forcing a 1:1 exchange rate. The fix ensures that the 'Total' amount is accurately displayed in the company's currency based on the system's exchange rates, improving the reliability of expense reporting.
Original PR description
Steps to reproduce: 1. Initialize an expense with a foreign currency (e.g., EUR). 2. Trigger OCR extraction on a receipt with a specific total. 3. Observe that both 'Total In Currency' and 'Total' (USD) are set to the same value. 4. The exchange rate is forced to 1.0, ignoring the system's exchange rate. Cause: The _fill_document_with_results method assigned the OCR total to both 'total_amount_currency' and 'total_amount' as a placeholder. This triggered the field's inverse logic during the write() call, causing Odoo to treat the input as a manual exchange rate override of 1:1. Solution: Remove the 1:1 placeholder assignment. The method now explicitly calculates 'total_amount' using the _convert() helper once the currency is identified, ensuring the company currency total reflects the actual system exchange rate. opw-5437611
This update corrects a bug where the 'CFDI to Public' checkbox was incorrectly checked when creating new invoices in the Mexican accounting module. The fix ensures this checkbox remains unchecked unless a customer is selected, preventing potential compliance issues. This change improves invoice creation processes for Mexican businesses.
Original PR description
Steps to produce: --- - Install `l10n_mx` and `accountant` modules. - Switch to a Mexican company. - Go to Accounting > Customers > Invoices. - Click on New to create a new invoice. Issue: --- - The `CFDI to Public` checkbox is automatically checked even when no customer is selected. Root cause: --- - Here at [1], the field l10n_mx_edi_partner_address_complete evaluates to False when no partner is set. - Due to the OR condition, this causes l10n_mx_edi_cfdi_to_public to be set to True, even though no partner has been selected yet. Solution: --- - We should only evaluate partner address completeness when a partner is explicitly set. - Also, add VAT check for `l10n_mx_edi_partner_address_complete`, as requested by mial(PO). [1] https://github.com/odoo/enterprise/blob/cc00e8f3bb75b8c782fea3a42ad3bbcdbc240e2f/l10n_mx_edi/models/account_move.py#L649 opw-5911542 ---
This update corrects a recent change that was causing all upsell quotes to be canceled, disrupting legitimate business processes. The fix resolves a technical error related to quote handling and prevents a potential ValueError, ensuring quotes are processed correctly.
Original PR description
…mmit/55b6bbe27cc31abcaee40cd4a196e087fdfd4ce5 This commit introduced an issue. All upsell quote were canceled and no filtering was done on "alternative quotes". As a result it could disrupt legit business flow. Moreover, action_cancel was called instead of _action_cancell which can lead to ValueError: Expected singleton as action_cancel can require single record sometimes. Forward-Port-Of: odoo/enterprise#107417