Wednesday, February 4, 2026
18 changes · saas-19.1
Enhancements to existing features
This update significantly improves the speed of database synchronization for our SaaS customers. By intelligently grouping and processing database requests in parallel, we've reduced synchronization times from 50 seconds to just 15 seconds. This translates to a more responsive and efficient system for our users.
Original PR description
With this commit, the requests sent to retrieve the information from the databases are grouped by IP, and each group is treated in parallel using a ThreadPoolExecutor, which uses a pool of 5 times the number of CPUs. On a set of SaaS databases, we reduced the time needed to synchronize 30 databases from 50s to 15s. Forward-Port-Of: odoo/enterprise#105673
This update ensures Odoo complies with Mexican tax regulations (SAT) regarding the descriptions of refunded products. Specifically, for global invoices, refund descriptions now include the return amount, discounts, or bonuses, as required by the SAT. This change simplifies reporting and reduces the risk of compliance issues.
Original PR description
The SAT specifies how the description of refunded product should be set and specifically for refunds of global invoices it should contain the amount of the return, discount or bonus and why. Currently, Odoo when a credit note of a global invoice is issued, it sets an specific label for the description. To keep with what SAT asks for, we will keep that label only for credit notes of pos global invoices, and for the others, we keep from what the user put as an input on the line task-5170675 target: 19.0 -> master Forward-Port-Of: odoo/enterprise#97681
Resolved issues and error corrections
This update resolves an issue where the carrier type selection would become disabled after validating a mobile barcode. The fix ensures the carrier number input remains editable whenever the carrier type is changed, allowing users to correctly select and input carrier information during the order process. This prevents data loss and improves the user experience.
Original PR description
carrier type After the user clicks on "Validate" button to validate the mobile barcode, the carrier type selection is disabled and the carrier type pass to the SO is None. This commit fixes the issue by instead of disabling the carrier type selection, we just set the input box of carrier number to readonly and set back the carrier number to not readonly when the user changes the carrier type to ensure the carrier number input is editable. task-5880421 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#246767 Forward-Port-Of: odoo/odoo#246053
This update resolves an issue where the cost of kit products was incorrectly reset to zero when a delivery was validated. The fix ensures the correct kit price is calculated by using the sale order line's product ID instead of the stock move record, leading to accurate cost calculations for delivered orders.
Original PR description
Currently when the user validates a sale order delivery which has a kit the cost gets reset to 0. <h2>Steps to produce:</h2> * Install sale_margin, sale_management, mrp * Create a product with an…
Currently when the user validates a sale order delivery which has a kit the cost gets reset to 0. <h2>Steps to produce:</h2> * Install sale_margin, sale_management, mrp * Create a product with an AVCO or FIFO product category * Create a BOM of type ‘Kit’ for that product. * Add components A and B to the BOM, each with an on-hand quantity and a cost of 10. * On the kit product compute the cost according to the BOM * Create and confirm SO for 1 unit of the kit product * Delivery > Validate the Delivery and go back to the Sale Order Replication video: [Link](https://drive.google.com/file/d/1PgAh1xwBZX7RsRQ5ZsQipqYjuxvex2CA/view?usp=sharing) <h2>Observed Behavior:</h2> The product cost on the sale order is set to 0, but it should be 20. <h2>Root cause:</h2> After commit [1], an override for `_get_price_unit` was added to correctly calculate kit prices for BOM products. The goal was to prevent the cost from being set to 0 after a delivery is validated. However, when this logic is triggered during delivery validation, it doesn’t behave as intended. After the delivery is validated, compute [2] runs and calls function [3]. However, `self` at [3] refers to a stock move record, so we get the components of the kit instead of the kit product itself. The function `_bom_find` expects the main kit product, not the components. Because of this, the kit’s unit price isn’t calculated, and the parent function [4] ends up setting the purchase price to 0. <h2>Solution:</h2> Use the kit product IDs from the sale order lines instead of the move lines, ensuring the main kit product (not its components) is used and the BOM is found properly. Return unit price for kit products instead of total value for the function `_get_kit_price_unit` Update the test case to account for delivered quantities: **Before:** The sales order used Units as the unit of measure while the product and stock moves use a pack of 10. Since only 3 units get delivered and one product equals 10 units, this was not counted as a full delivery. Therefore, the delivered quantity was treated as 0, which allowed the product cost to be set at [5] and pass the test case **After:** The test now covers the case where a full quantity is delivered by using a pack of 10 as the unit of measure on the sales order. This ensures the product cost is handled correctly when the delivered quantity is 1 or more. [1]: https://github.com/odoo/odoo/commit/5a44ae1ec71573c57a5d60903f9b81e842fc582b [2]- https://github.com/odoo/odoo/blob/d4b6897211c65ba6d6ba8132480627e6fa66c481/addons/sale_stock_margin/models/sale_order_line.py#L11-L34 [3]- https://github.com/odoo/odoo/blob/d4b6897211c65ba6d6ba8132480627e6fa66c481/addons/sale_mrp/models/stock_move.py#L9-L16 [4]- https://github.com/odoo/odoo/blob/d4b6897211c65ba6d6ba8132480627e6fa66c481/addons/stock_account/models/stock_move.py#L230-L233 [5]- https://github.com/odoo/odoo/blob/d4b6897211c65ba6d6ba8132480627e6fa66c481/addons/sale_stock_margin/models/sale_order_line.py#L21-L22 opw-5479266 Forward-Port-Of: odoo/odoo#246030
This update resolves an issue where website editing was blocked while the global search modal was open. The change automatically closes the search modal when you enter edit mode, allowing users to seamlessly add and manage website snippets. This improves the overall website editing experience.
Original PR description
Steps to reproduce: 1. Go to the Website. 2. Click the search icon in the header. 3. When the search modal opens, click 'Edit' to enable website editing. 4. Attempt to add a snippet. Observed behavior: - Snippets cannot be added while the global search modal remains open. Expected behavior: - Snippets should be draggable and added normally in edit mode. This commit ensures that the global search modal is closed when entering edit mode, preventing it from blocking add snippet. task-5421051 Forward-Port-Of: odoo/odoo#241414
This fix addresses an issue where users could attempt to consolidate invoices for multiple orders within the Veri*Factu POS module. The system has been updated to prevent this consolidation, ensuring that invoices are created for each order individually. This change improves data accuracy and avoids potential errors related to combining multiple sales transactions.
Original PR description
Step to reproduce: - install `l10n_es_edi_verifactu_pos` and open POS - finalize 2 order with same customer (do not invoive it) - close session - go to pos orders, select both order and try to create…
Step to reproduce:
- install `l10n_es_edi_verifactu_pos` and open POS
- finalize 2 order with same customer (do not invoive it)
- close session
- go to pos orders, select both order and try to create consolidated invoice
Traceback:
```
File "/home/odoo/addons/l10n_es_edi_verifactu_pos/models/pos_order.py", line 293, in _prepare_invoice_vals
res['l10n_es_edi_verifactu_refund_reason'] = self.l10n_es_edi_verifactu_refund_reason
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/orm/fields.py", line 1365, in __get__
record.ensure_one()
```
Cause:
- `_prepare_invoice_vals` is written to accept only one order at time but it can contain multiple orders
Fix:
- we now do not allow invoice consolidation for Veri*Factu
- the consolidation flag has been made invisible so every order now has
to be invoiced individually.
opw-5379577
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#239391This update resolves an issue where setting a receivable or payable account on the 'Expense Account' or 'Income Account' settings would trigger an error when creating a bill. The fix ensures the correct domain constraint is applied to related fields, preventing this user error and improving bill creation functionality.
Original PR description
**Steps to reproduce:** - Install Accounting - Go to "Accounting / Configuration / Settings" - Edit "Expense Account" property **Issue:** It is possible to set a receivable or payable account for the property. If a payable account is set, a constraint will trigger a UserError when trying to create a bill with that account. The same issue happens for "Income Account". **Cause:** The field is a related field. On the original field, there is a domain to prevent selecting these types of account, but the domain is not applied to the related field. **Solution:** Checking the company will retrieve the domain set on the original field. opw-5492092 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246798
This update resolves an issue where enabling tracking on custom HTML fields within invoices caused update failures. The change hides the 'Enable Ordered Tracking' option for these fields, preventing the error and ensuring data updates work correctly. This improves stability and reliability for users modifying invoice data.
Original PR description
From https://github.com/odoo/odoo/pull/241367#issuecomment-3711040501 Nothing prevent tracking from being enabled on HTML fields, but if it is enabled, updates of the field systematically fail. This commit avoids this error by hiding the "Enable Ordered Tracking" for HTML fields. Steps to reproduce: - Install sale and web_studio - Activate debug mode - Add a custom HTML field inside the invoice form view - Open the "More..." of the field (or go to Settings/Technical/Field) and go to the new field - Set "Enable Ordered Tracking" to 1 - Save - Go to an invoice and modify the new field - Save => An error was displayed task-5236436 Forward-Port-Of: odoo/odoo#242183
This pull request addresses several bugs and improvements within the Hoot system, enhancing its reliability and test coverage. The fixes include correcting error messages, expanding the mocked API for more robust testing, and streamlining test assertions. These changes ensure Hoot functions correctly and provides a more stable experience.
Original PR description
### [FIX] Hoot fixes This PR contains several fixes for the Hoot system. See each commit description for more details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246402 Forward-Port-Of: odoo/odoo#244726
This update adjusts the size of confirmation dialogs across Odoo to better align with frontend design standards and prevent interruptions. By allowing different sizes, the dialogs are now more appropriately sized for various scenarios, improving the user experience and reducing context-switching. This change ensures a smoother and more intuitive confirmation process.
Original PR description
### Context: A confirmation dialog must be small and minimal for several reasons: - Users are being interrupted mid-task. A wall of text forces them to context-switch and parse information when they…
### Context: A confirmation dialog must be small and minimal for several reasons: - Users are being interrupted mid-task. A wall of text forces them to context-switch and parse information when they just need to make a quick decision - The goal is a binary choice (confirm/discard). Too much content complicates what should be a simple yes/no moment - ... In the backend, our dialogs `SM` size is set to a **forgiving** `460px`. This value allows dialogs to be relatively small, while still providing enough tolerance to showcase more content if necessary. In the frontend, instead, the default value in use is BS default, thus `300px`. A website default font-size is also much bigger, `16px` against `13px` in the backend. As a result, the dialog may be too small when used in scenarios that are not "confirmation dialogs" strictly speaking. ### The issue: In some cases, enforcing SM size to any confirmation dialog gives bad results in the frontend. | backend | fronted | |--------|--------| | <img width="644" height="370" alt="image" src="https://github.com/user-attachments/assets/ab40312a-06df-4203-8b3d-3b2074341986" /> | <img width="667" height="416" alt="image" src="https://github.com/user-attachments/assets/c0770de4-e3c0-4a15-b2a5-6a498c94fb20" /> | Enforcing a higher `SM` value for the frontend (eg. `500px`) is not a solution because the default BS value is technically correct and users can customize it anyway by overriding this setting. ### The solution: Allow the ConfirmationDialog component to use sizes different from `SM`. This commit sets some portal dialogs to MD size. | saas-19.1 | this pr | |--------|--------| | <img width="667" height="416" alt="image" src="https://github.com/user-attachments/assets/c0770de4-e3c0-4a15-b2a5-6a498c94fb20" /> | <img width="953" height="605" alt="image" src="https://github.com/user-attachments/assets/07eab456-97c3-4e9d-8ce2-dd79ac5b82d4" /> | task-5906425 note: Several design improvements are necessary and will be handled in forward-port targeting master --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the color filter applied to video backgrounds would disappear after saving the page. The fix ensures that the color filter is correctly re-applied when a video background block is selected and saved, maintaining the intended visual style. This improves the consistency and reliability of video background customizations.
Original PR description
The color filter applied to a video background would disappear after selecting the block and saving the page again. Steps to reproduce: =================== 1. Enter Edit mode on the website. 2. Drag…
The color filter applied to a video background would disappear after selecting the block and saving the page again. Steps to reproduce: =================== 1. Enter Edit mode on the website. 2. Drag and drop a snippet (e.g., "Intro"). 3. Set a video background for the block and apply a color filter. 4. Save the page. 5. Enter Edit mode again, click the block to select it, and Save. -> The color filter is removed from the video background. Cause: ====== Selecting the block triggers the `toggleBgImageClasses()` function. This function attempts to determine the background configuration. Since a video background is used, there is no standard image URL, so the code proceeds to call `setImageBackground` with an empty URL ([1]). This update process involves re-applying the color filter via the `selectFilterColor` action. However, the current background image style (the filter color) was not being passed to this function during this specific update flow. Consequently, the function assumed no filter existed and removed it ([2]). Solution: ========= Retrieve the current `filterColor` (which exists in background-image style) and pass it explicitly when calling the apply function. [1]: https://github.com/odoo/odoo/blob/fa482e36bc36809e55b6a11ebcc5bb130f20fd31/addons/html_builder/static/src/plugins/background_option/background_image_option.js#L18-L20 [2]: https://github.com/odoo/odoo/blob/fa482e36bc36809e55b6a11ebcc5bb130f20fd31/addons/html_builder/static/src/plugins/background_option/background_image_option_plugin.js#L170 opw-5448696 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242236
This pull request restores previously disabled tests in the project and stock accounting modules. A recent change removed key code components needed for accurate accounting related to manufacturing orders, causing tests to fail. The fix reintroduces these components with updated names and necessary sudo permissions to ensure correct operation.
Original PR description
Bring back all tests temporarily disabled by [1]. Below are the explanations about the needed changes in the code. --- Change in `/project_mrp_account:MrpProduction.write` Tested by…
Bring back all tests temporarily disabled by [1]. Below are the explanations about the needed changes in the code. --- Change in `/project_mrp_account:MrpProduction.write` Tested by `/project_mrp_account.test_changing_mo_analytic_account` In the test, when changing the project of the MO: https://github.com/odoo/odoo/blob/08b62a4bbcc6f9a391b2cc00a621ef4c76100229/addons/project_mrp_account/tests/test_analytic_account.py#L211-L212 We reach the override in `project_mrp_account`. On Odoo 18.0, a line calls the method `_account_analytic_entry_move`: https://github.com/odoo/odoo/blob/706431510110a005618a2acaf6566f2bb61d5114/addons/project_mrp_account/models/mrp_production.py#L31 This line is in charge of creating AA/AAL related to the SM. However, the commit [1] has removed `account_analytic_entry_move` and all its calls. This is why the test fails in the first assert: https://github.com/odoo/odoo/blob/08b62a4bbcc6f9a391b2cc00a621ef4c76100229/addons/project_mrp_account/tests/test_analytic_account.py#L210 It doesn't find anything. However, the commit [2] brings the method back with a brand-new name: `_create_analytic_move`. We therefore need to connect it again where it is needed. --- Change in `/stock_account:StockMoveLine.write` Tested by `/project_mrp_account.test_update_components_qty_to_0` Quite the same as above. Commit [1] removes this while it's actually needed. One difference, a `sudo` call, because a stock user doesn't have any access to analytic world. --- Change in `/stock_account:StockMoveLine.unlink` Tested by `/project_mrp_account.test_mo_qty_analytics` Same as above, also with a new `sudo`. --- [1] https://github.com/odoo/odoo/commit/08b62a4bbcc6f9a391b2cc00a621ef4c76100229 [2] 35db55618fa70146afc89e662410aca95947e17b Forward-Port-Of: odoo/odoo#245864
This update fixes a problem that was preventing new PEPPOL registrations from working correctly. The issue stemmed from a previous update causing conflicts with existing user accounts, leading to a failure for all new registrations. This ensures seamless registration processes for our PEPPOL users.
Original PR description
Fix regression of participant fetch cron introduced in forward port odoo/odoo#245038 Indeed self might be a record set in lots of different cases, which leads to users at least 1 existing edi proxy user in their company, all future registrations will fail
This update resolves a bug that caused invoice generation errors when dealing with multiple tax lines, particularly during Peppol integration. The fix ensures accurate tax calculations by grouping tax lines before aggregation, preventing division-by-zero errors. This improves invoice accuracy and reliability for Belgian localization.
Original PR description
Steps: - Belgian localisation - Activate peppol - Have two fixed sales taxes (T1 3.5 and T2 4.5) - Have 4 product: - P1: Any sale price, taxes 21% and T1 - P2: Any sale price, taxes 21% and T2 - P3: sale price 0, taxes 0% and T1 - Create an invoice, with following invoice lines: - P1, quantity 2 - P2, quantity 2 - P3, quantity -4 - Confirm and send it to peppol -> Traceback (ZeroDivisionError) The reason is that we try to extract emptying taxes like "Vidanges" and aggregate them into new base lines, but we treat all these taxes as they are the same but they are not always the same. Therefore we aggregate both price unit and quantity and we try to divide the aggregated price by the aggregated quantity. In our case we end up with a price unit of 2 (9 + 7 - 14) and a quantity of 0 (2 + 2 + -4) which leads to a zero division error. The fix adds a grouping function in order to group the extra lines by taxes before aggregating them. opw-5384928 Forward-Port-Of: odoo/odoo#244314
This update fixes an issue where decimal quantities were incorrectly rounded during packaging transfers when 'Reserve Only Full Packagings' was enabled. The change ensures accurate quantity calculations, preventing delays and errors in order fulfillment. It impacts products within specific packaging categories.
Original PR description
When a product is part of a group with Reserve Only Full Packagings enabled, another check occurs in _check_qty. This rounds with a precision of 1.0 the down rounding method. In the case that the…
When a product is part of a group with Reserve Only Full Packagings
enabled, another check occurs in _check_qty. This rounds with a precision
of 1.0 the down rounding method. In the case that the quantity was a
decimal, such as 22.4, this would be rounded to 22. In the next transfer
the quantity would then only be 22 instead of the expected 22.4. This
would also cause any packages to not be added as the quantity and demand
are not equal.
If the uom of the product and package are the same we dont need this
package check. Which also prevents the rounding issue.
This fix insures the _check_qty method does not round in cases it does
not need to. (self == uom_id)
How to reproduce:
In Settings:
Enable Units of Measure & Packagings
Enable Multi-Step Routes
In Warehouses
Set Outgoing Shipments to Pick then Deliver (2 steps)
In Inventory
Create a new product
Give the product a category
Set category Reserve Packagings to Reserve Only Full Packagings
Set on-hand amount
Workflow:
Create a sales order
Create a new Company
Add product with decimal quantity (1.3)
Confirm SO
Go to the sale order delivery
Validate
Go to the next transfer
Quantity will now be rounded (1.0)
opw-5486932
Forward-Port-Of: odoo/odoo#246208A recent issue causing errors on the payment page when using Avatax with Point of Sale has been resolved. This was due to an outdated method that no longer existed, and the code has been updated to remove its usage. This ensures a smoother payment experience for users.
Original PR description
Step to reproduce: - configure pos for Avatax from settings - open pos and settle a order - notice a error message on payment page Cause: - error is due to usage of `replaceDataByKey` which is removed in [1] [1] https://github.com/odoo/odoo/commit/3e94fe90ded58d498f0098cd9ed8679cbe500b8f Fix: - we removed the method as now we do not rely on it. opw-5089351 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#106135 Forward-Port-Of: odoo/enterprise#102101
A client reported issues processing payments via Bankgiro accounts. This update corrects a typo and adjusts the order of data fields in the payment processing, ensuring Bankgiro payments now function correctly. This resolves a critical payment processing error.
Original PR description
After PR: https://github.com/odoo/enterprise/pull/104777 The client reported that payment with bankgiro account doesn't works. Here are the problems found: - Typo : Should be `RfrdDocAmt` instead of `RfdDocAmt` - RfrdDocAmt should be inserted before CdtrRefInf - CdtNoteAmt should be before RmtdAmt opw-5427505 Forward-Port-Of: odoo/enterprise#106272
This update fixes an issue where subscription invoices were being generated prematurely when a note or section was added to the subscription. The fix ensures that invoices are now correctly tied to the end of the subscription period, regardless of whether a note is present. This improves invoice accuracy and prevents potential billing discrepancies.
Original PR description
**Steps to reproduce** - Have a subscription service product with invoicing policy set to "Based on delivered quantity (manual)". - Create a new monhtly subscription with this product and add a section or a note. - Confirm the subscription. Actual: next invoice date is today. Expected: same as without section/note, next invoice date should be at end of the period. **Cause** `_is_postpaid_line` should only be called on actual product lines. Related: https://github.com/odoo/enterprise/commit/d8a7f7cc2d9d11e42ed24db1b0f7a3c08c7fac1c opw-5478394 Forward-Port-Of: odoo/enterprise#104892