Daily updates from Odoo
Navigate
Branch
Wednesday, March 4, 2026
306 changes
42 changes
Enhancements to existing features
This update enhances how Odoo identifies partners in Saudi Arabia. Previously, partner type was solely determined by VAT. Now, it also considers the Identification Scheme and Identification Number, leading to more accurate distinctions between companies and individuals, especially when VAT information is unavailable.
Original PR description
Before this commit: - Partner identification relied only on the VAT field. After this commit: - Partner identification in Saudi Arabia also considers Identification Scheme and Identification Number. - This improves detection of companies vs individuals when VAT is missing. task-5866942 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246728
This update incorporates changes required by the Uruguayan tax authority (DGI) regarding Electronic Fiscal Document (CFE) reporting. Specifically, a new selection option is added for export transactions, and the transmission of key invoice details (date, amount, currency, exchange rate) from existing account moves is now mandatory to ensure legal compliance.
Original PR description
Purpose: The DGI introduced changes in CFE version 25. The following changes below needs to be implemented for legal compliance.
Required Changes:
- Introduce a new selection value,("91", "Export under Mandate")for field, l10n_uy_edi_cfe_sale_mode. This option is required when documenting export operation performed as a mandating entity, where the definitive export will be carried out by a third party.
- The reference document(credit note or debit note) of an existing account move will need to send:
- Amount (MntCFEref)
- Currency (TpoMonedaRef)
- Exchange Rate (TpoCambioRef) if the currency is not Uruguayan Pesos
task-5419331
task-5419331
Forward-Port-Of: odoo/enterprise#108430
Forward-Port-Of: odoo/enterprise#103881This update allows accountants to group invoice lines by tax, simplifying their workflow and reducing clutter in journal entries. The system intelligently manages PDF generation, preventing duplicate files when grouping and ungrouping tax lines. This improves efficiency and data clarity for financial reporting.
Original PR description
[IMP] account_edi_ubl_cii: (un)group lines by tax
Once an invoice is imported, a server action allows the user to group
lines by tax, and then if the same action is triggered again it will
ungroup all lines from the origin file
This feature is useful because accountants don't always need the
detail of the vendor bills, and also all the lines clutter up the
journal items
task-5047859
Forward-Port-Of: odoo/odoo#251520
Forward-Port-Of: odoo/odoo#245234Resolved issues and error corrections
This update corrects a technical issue where incoming VoIP calls weren't properly recording their creation date in the database. The fix ensures accurate tracking of all calls, improving reporting and operational efficiency. This change was implemented as a bug fix.
Original PR description
For incoming calls in VoIP, they didn't have create date written in the database becasue we were using `self.env.cr._now`. The orm `create` method uses `self.env.cr.now()`, a method, and it's working fine for outgoing calls. This commit fixes it for incoming calls and changes `_now` to `now()`. Task-5979968
This update fixes an issue where refreshing pivot tables caused unexpected errors due to outdated data. The change ensures that all related dynamic tables are properly invalidated, leading to a more stable and reliable pivot table experience. This resolves a potential disruption for users generating reports.
Original PR description
Refreshing the pivot will invalidate the datasource, which means that the dynamic table related to a pivot also needs to be invalidated. This usually occurs when we insert a new table but since [1], we create dynamic tables out of thin air. Pretty much every command that will invalidate the pivots will now need to invalidate the tables as well. [1]: https://www.odoo.com/odoo/2328/tasks/4552232 Task-5976773 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 update resolves an issue where refreshing pivot tables caused unexpected behavior in related dynamic tables. The fix ensures that all dependent tables are properly invalidated during a pivot refresh, improving overall performance and stability. This change addresses a technical detail that enhances the user experience.
Original PR description
Refreshing the pivot will invalidate the datasource,which means that t dynamic table related to a pivot also needs to be invalidated. This usually occurs when we insert a new table but since [1], we create dynamic tables out of thin air. Pretty much every command that will invalidate the pivots will now need to invalidate the tables as well. [1]: https://www.odoo.com/odoo/2328/tasks/4552232 Counter-part of https://github.com/odoo/odoo/pull/250909 Task-5976773
A recent update to the Odoo spreadsheet module caused issues with the pivot table drilldown feature, leading to crashes. This fix ensures that pivot cells can be displayed correctly, resolving a stability problem for users accessing livechart dashboards.
Original PR description
The helper `getNumberOfPivotFunctions` now requires the getters following a recent refactoring. This would cause crashes when we tried to determine if the drilldown of pivot cells could be displayed. How to reproduce: Go to the livechart dashboard and scroll a bit... Task-5969008 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 update resolves an issue where sample data continued to appear after creating new records in list views. The fix ensures that sample data is properly disabled when views are reloaded, providing a cleaner and more accurate display of data in the control panel. This improves the user experience by removing visual clutter.
Original PR description
Have a view (e.g. list) with no real records but sample data. In the control panel, have a button that, when clicked, creates new records which match the current filter, i.e. which are displayed…
Have a view (e.g. list) with no real records but sample data. In the control panel, have a button that, when clicked, creates new records which match the current filter, i.e. which are displayed directly in the UI. Before this commit, the new records were correctly displayed, but the sample data overlay (opacity) was still there. The problem came from the fact that the sample data are automatically disabled when the view is reloaded **from above** (typically from the WithSearch component, when the user interacts with the search view). However, in the faulty scenario, the `load` function of the model is called directly by the view itself, so we don't go through WithSearch, and the code of model.js that ensures that we leave the sample mode. We already faced that issue in pivot and graph, and we solved it locally. This commit fixes it globally, by creating a small override of model.load which leaves the sample mode. task~5980226 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 update streamlines the HTML editor's paste functionality by removing redundant code. Previously, the process of moving table headers (thead) into table bodies (tbody) was duplicated. This change, implemented through a refactoring, ensures a more efficient and reliable paste experience.
Original PR description
Description of the issue/feature this PR addresses: This PR removes duplicated logic in `cleanForPaste` that moves `thead` content into `tbody`. That behavior is already handled in insert (via `before_insert_processors`), so keeping it in `cleanForPaste` was redundant. --- 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 Odoo search bar on iOS devices (specifically with Korean keyboards) would incorrectly clear the input field during IME composition. The fix introduces a brief delay to account for iOS's temporary Backspace events triggered by the IME, ensuring the autocomplete remains open while Korean characters are typed.
Original PR description
Safari does not reliably set `KeyboardEvent.isComposing` during IME composition (e.g. Korean). As a result, the search value was processed too early and got cleared while composition was still in…
Safari does not reliably set `KeyboardEvent.isComposing` during IME composition (e.g. Korean). As a result, the search value was processed too early and got cleared while composition was still in progress. Interestingly, the issue could not be reproduced with the Japanese keyboard, which appeared to behave correctly. See [1]. This commit introduces a short delay before closing the autocomplete. On iOS, the IME temporarily triggers a Backspace event to remove the previously composed character before inserting the updated one. This Backspace incorrectly causes the autocomplete to close. With this change, we wait briefly (10ms) before closing it. If a new input event is received during that delay (corresponding to the newly composed character generated by the IME), the close action is cancelled. This ensures that the autocomplete remains open while the IME composition process completes. Steps to reproduce: - Configure a Korean keyboard on an iPhone - Open a Sale Order - Focus the search bar - Type a character, then type a second one to combine them - The search input value gets reset [1] #222151 opw-5448385 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#251141
This update resolves an issue where the admin user wasn't automatically creating an employee profile since version 19.1. The change streamlines the process when using workorder functions, directly creating an employee profile without a prior search, ensuring consistent functionality.
Original PR description
Since 19.1, the admin user doesn't have an employee profile automatically created. So we added a way to create one rapidly when using workorder functions. For that, we want to make direct use of the employee created by action_create_employee without needing to do a search. see https://github.com/odoo/enterprise/pull/107439 task 5932500 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update streamlines the process of adding employees to work orders. Previously, the automatic creation of employee profiles was removed, causing issues for administrators. Now, a popup allows quick employee creation with the current user's ID pre-filled, and automatically creates an employee if none exist when editing shopfloor operators.
Original PR description
In 19.1, the automatic creation of an employee profile for the admin user has been removed. This causes issues when the admin wants to start a workorder or mark it as done, so we added a popup to create a new employee profile with the user_id already filled with the id of the current user. Also, if no employee exist when editing operators in the shopfloor, the popup proposes to directly create a new employee linked to the current user if they have HR access. This new employee will be directly logged in the shopfloor operators. see https://github.com/odoo/odoo/pull/250607 to make `action_create_employee` return an employee record. task 5932500
This update addresses a potential issue in the Swiss payroll reporting process. Specifically, it now displays a warning instead of an error when the 'AVS' (Authorized Value System) is negative, providing clearer guidance to users. This ensures accurate reporting and avoids potential disruptions to payroll calculations.
Original PR description
Forward-Port-Of: odoo/enterprise#109046
This update resolves a test failure caused by demo data interfering with the lot search functionality. We've implemented changes to ensure the test environment is clean, creating new data and avoiding conflicts with existing demo data. This ensures the test consistently passes and the lot search feature continues to function correctly.
Original PR description
The `test_lot_search_partner_ids` expects a specific number of lots/SNs to exist in the database in order to ensure its custom `partner_ids` search works correctly. Because of this, the test fails if any lot demo data is installed. Therefore we create all new locations, products, lots and add extra search domain fields to avoid loading any of these demo data. Also add in extra long partner name to avoid conflicts with overlapping demo/test partner names. runbot error: 162921 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250783 Forward-Port-Of: odoo/odoo#220777
This update fixes an issue where the shipping weight for deliveries wasn't accurately calculated when products were placed into packages. The fix ensures that the total weight, including package weight, is correctly computed, improving the accuracy of shipping costs and order fulfillment. This resolves a bug related to how the system handles product weights within packages.
Original PR description
Steps to reproduce: - Enable “Packaging” in Inventory settings. - Create a storable product “P1” with: - weight: 10 kg - Create a delivery picking: - Add one unit of P1 - Mark as “To Do” - Set…
Steps to reproduce:
- Enable “Packaging” in Inventory settings.
- Create a storable product “P1” with:
- weight: 10 kg
- Create a delivery picking:
- Add one unit of P1
- Mark as “To Do”
- Set quantity to 1 → the move becomes assigned and the picking weight is correctly computed to 10
- Click “Put in Pack” → a package is created with `shipping_weight = 0`, and the picking weight incorrectly computed to 0
Problem:
- `picking.shipping_weight` is computed as: `weight_bulk` + sum(`pack.shipping_weight or pack.weight`) https://github.com/odoo/odoo/blob/17.0/addons/stock_delivery/models/stock_picking.py#L72-L79
- Once the product is placed in a package:
- `weight_bulk` becomes 0 (because Total weight of products which are not in a package). https://github.com/odoo/odoo/blob/17.0/addons/stock_delivery/models/stock_picking.py#L96
- `pack.shipping_weight` is 0 on creation.
- The fallback `pack.weight` is 0 because its compute depends on the `picking_id` in context. Without this context, the compute uses only quants https://github.com/odoo/odoo/blob/f7c033eff7b7bc83d6d18fc5e4df320f43ae5021/addons/delivery/models/stock_quant_package.py#L11-L13
opw-5357843
Forward-Port-Of: odoo/odoo#251216
Forward-Port-Of: odoo/odoo#238917This update corrects a bug that prevented inventory quantities from being properly deleted when set to zero. The fix ensures that when a quantity is reduced to zero, the corresponding inventory record is correctly removed, streamlining inventory management. This resolves a previous issue impacting accurate stock tracking.
Original PR description
Steps to reproduce: - Create a storable product "P1" - Click on Quantity On Hand - Set the quantity to 10 and save - Set the quantity to 0 - Go back to the quant list view by clicking on Quantity On Hand - The quant is deleted by: https://github.com/odoo/odoo/blob/08015c2a15704b30c7815b62612b71b8970e3ac2/addons/stock/models/stock_quant.py#L1076-L1079 - Set the quantity to 10 again and save - Select the quant - Action > Set to 0 Problem: The function `action_set_inventory_quantity_zero` sets the current user on the quant even on inventory mode. This prevents the quant from being deleted when `_unlink_zero_quants` is called. opw-5906681 Forward-Port-Of: odoo/odoo#248881
This update resolves an error that occurred when generating payslips for employees who had changed contracts within a pay period. The fix ensures that the system correctly calculates employee work history by using the start date of the employee's initial contract, preventing errors related to holiday calculations. This improves the accuracy of payroll processing.
Original PR description
An error is thrown when we try to generate a payslip for an employee that changed contract on a period before the contract change Steps to reproduce: 1. Install l10n_mx and l10n_mx_hr_payroll modules…
An error is thrown when we try to generate a payslip for an employee that changed contract on a period before the contract change
Steps to reproduce:
1. Install l10n_mx and l10n_mx_hr_payroll modules
2. Switch to INNOVACION VALOR... company
3. Go to Employees and open Cecilia Miranda Sanchez
4. Go to Payroll tab, set the end of the contract to Jan 31 and save
5. Create a new contract from Feb 1
6. Go to Payroll > Payslips > Payslips and create a new pay run
7. Select Salary Structure 'Mexico: Regular Pay', Pay Schedule 'Bi-weekly' and Period 'Jan 1 -> Jan 15'
8. Click on Continue, select Cecilia and click on Select
9. An error is thrown
Problem:
In `_compute_integration_factor` we try to compute the number of years the employee has worked by accessing the start date on the employee but this date might be earlier than the start date of the employee's current contract if the employee has changed contract. This will throw an error when we try to access the holidays count for 0 year because `payslip._rule_parameter('l10n_mx_holiday_tables')` doesn't have an entry for 0
Solution:
Use the start date of the first contract of the employee, take gaps in between the employee's contracts into consideration to correctly compute the number of years worked
opw-5931355
Forward-Port-Of: odoo/enterprise#108495This update resolves an issue where stock reporting (Inventory / Reporting / Stock) displayed incorrect values due to a flaw in how the system identified the last product value. The fix ensures that the last product value is correctly determined based on the selected company, preventing inaccurate unit costs, total values, and on-hand quantities.
Original PR description
Before this fix, when searching for the last product value, we don't check the company. We search for the last product.value among all companies, even when only one company is selected. As a result, we end up with strange values when going to Inventory / Reporting / Stock. For instance, we may end up with: unit cost 10, total value 100, on hand quantity 0. OPW-5957947 Forward-Port-Of: odoo/odoo#251413
This update corrects a technical issue where salary inputs weren't properly duplicated when creating copies of selections. Previously, this prevented accurate payslip generation. The change ensures that salary input selections are correctly copied, resolving a potential data discrepancy and improving payroll accuracy.
Original PR description
When having a salary input avaiblable for employee and payslip, and using it in an employee made it unavailable in payslips. This is unwanted behaviour and is due to the domain restricting existing_ids in employees. This was extracted from the action and is set in each separate model according to the needs. task-5909636 Forward-Port-Of: odoo/enterprise#106488
This update resolves a technical issue that caused the Point of Sale system to hang during startup. The fix ensures the indexedDB is correctly initialized and populated, preventing delays and guaranteeing a smooth POS launch. This improves the overall user experience for Point of Sale operations.
Original PR description
There were 2 issues when `serverDateTime` was lower than `lastConfigChange` which triggered a reset on the indexedDB. The first issue was that we would try to await dbInstance.deleteDatabase request.…
There were 2 issues when `serverDateTime` was lower than `lastConfigChange` which triggered a reset on the indexedDB. The first issue was that we would try to await dbInstance.deleteDatabase request. But it returns a request object and then executes the delete asynchronously. This would cause a race condition on the init where we would trigger the init of the indexedDB at the same time as we were trying to delete it and it would hang for ~10 seconds before finally launching the POS.
The second more important issue is that after the reset there is a `localData = []`. This would cause the line in `synchronizeServerDataInIndexedDB` `JSON.parse(JSON.stringify(serverData));` to return an empty array so no new models would get created in the indexedDB and the POS would launch with an empty indexedDB.
This commit changes the `indexed_db.reset()` method to return a promise and awaits it before reinitialising the indexedDB. And resets the `localData` to `{}` which fixes the `synchronizeServerDataInIndexedDB`
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#246476This update corrects a technical issue that could cause inconsistencies in payroll payslip data. The change ensures that all related data is synchronized correctly, preventing potential errors in payroll calculations and reporting. This improves the reliability of our payroll system.
Original PR description
Forward-Port-Of: odoo/enterprise#109112 Forward-Port-Of: odoo/enterprise#108729
This update fixes an issue where fiscal positions were incorrectly applied to Brazilian customers, leading to errors when creating tasks. The change ensures that each customer's fiscal position is correctly associated with the company they belong to, resolving inconsistencies and preventing errors related to valid fiscal settings.
Original PR description
Issue ===== The fiscal position defined on a partner was not properly isolated per company, leading to cross-company inconsistencies and errors. Steps to Reproduce ================== 1. Install…
Issue ===== The fiscal position defined on a partner was not properly isolated per company, leading to cross-company inconsistencies and errors. Steps to Reproduce ================== 1. Install `industry_fsm_sale` and `l10n_br`. 2. In the US company: - Create a Brazilian customer. - Set a fiscal position on the customer. 3. Switch to the Brazilian company: - Open the same customer. - Set a fiscal position on the customer. 4. Still in the Brazilian company: - Create a task for that customer in the Field Service app. - Add a product to the task. Result ====== An error is raised because the fiscal position from the US company is used, which is not valid for the Brazilian company. Root Cause ========== When reading the fiscal position from the partner, the value is fetched in the environment of the company in which the partner record was originally created (US company). If no company is explicitly specified, the fiscal position is read in that original environment, even when the user is operating under the Brazilian company. Solution ======== Explicitly enforce the current company context when reading the fiscal position from the partner to ensure the correct company-specific value is used. opw-5270522 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250115 Forward-Port-Of: odoo/odoo#249482
This update ensures that timesheet updates accurately reflect the cost of tasks associated with sales orders, regardless of the sales order's invoice policy (ordered_prepaid, delivered_manual, delivered_milestones). Previously, this calculation was inconsistent, leading to inaccurate cost reporting. This fix improves the reliability of sales order costing and timesheet tracking.
Original PR description
Originally, timesheet updates for tasks associated with sale order lines would cause the cost (purchase_price) to be recomputed. However, this was prevented if the invoice policy was 'ordered_prepaid.' This should also apply to 'delivered_manual' and 'delivered_milestones.' Otherwise, any timesheet updates will recompute the sales.order.line purchase_price field. Steps to reproduce: 1. Create a service product that creates a project/tasks 2. Create a sales order with the product and manually set the cost 3. Assign the timesheets of the task to an employee 4. Have the employee update their timesheet for the task 5. The cost on the sales order line gets recomputed to the default product price task-5902688 related-pr-205415 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250495
This update corrects a bug that prevented physical gift cards from being created in the backend when multiple were added to a single Point of Sale (PoS) order. The fix addressed a misinterpretation of data keys, ensuring accurate gift card creation and tracking. This resolves a potential issue impacting order processing and gift card management.
Original PR description
When selling mutliple physical gift cards in the same PoS order, no gift cards were created. Steps to reproduce: ------------------- * Open PoS * Add a gift card to the order * Click on the gift card line and set a physical gift card with a value of 100€ * Add another gift card to the order * Click on the gift card line and set a physical gift card with a value of 50€ * Validate the order > Observation: No gift card is created in the backend Why the fix: ------------ When looking for the `oldChanges` we tried to retrieve the gift card code as `gift_code` but the key name is `code`. Because of this the `pointsCount` was wrong. opw-5928320 Forward-Port-Of: odoo/odoo#251339 Forward-Port-Of: odoo/odoo#249066
This update fixes an issue where dropshipped components to subcontractors were incorrectly categorized as expenses instead of stock valuation items. The change ensures these components are properly valued in the stock account, aligning with the 'ordered quantity' invoice policy. This improves accuracy in inventory tracking and reporting for subcontracting operations.
Original PR description
A component bought from a vendor and dropshipped to a subcontractor should the valued into the stock valuation account and not the expense one. In case this component have its "Invoice Policy" set to…
A component bought from a vendor and dropshipped to a subcontractor should the valued into the stock valuation account and not the expense one. In case this component have its "Invoice Policy" set to "ordered quantity", the `_eligible_for_stock_account` method will test if the related stock move are dropshipped https://github.com/odoo/odoo/blob/7436e0cfaf8d4b0c0e0390e8d6a3df404ba240f6/addons/stock_account/models/account_move_line.py#L31-L35 The value `is_dropship` is only set at the validation of the stock move. Due to the invoice policy, the receipt is not validated yet. close #243015 This commit will rather use the helper `_is_dropshipped()` that only rely on the location and not on the state. This commit also clean and reenable the related tests. 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#249134 Forward-Port-Of: odoo/odoo#245930
This update fixes an error that occurred when generating Argentinian tax reports (specifically ARBA profits reports) by ensuring the report filter correctly handles cases where no tax type is selected. The fix prevents a JavaScript error and ensures accurate report generation for these reports.
Original PR description
Task Adhoc side: 56583 Avoid js error when no tax type is selected in the argentinian report filter, when the report selected is different than vat book report, for example: ARBA profits report.…
Task Adhoc side: 56583 Avoid js error when no tax type is selected in the argentinian report filter, when the report selected is different than vat book report, for example: ARBA profits report. Video showing the error: https://drive.google.com/file/d/1ecPOqL8DSp45rCT2QIATwYb0DB0RT_YP/view The error was this one: Odoo Client Error UncaughtPromiseError > OwlError Uncaught Promise > An error occured in the owl lifecycle (see this Error's "cause" property) Occured on 19.odoo.localhost on 2025-11-25 12:03:32 GMT OwlError: An error occured in the owl lifecycle (see this Error's "cause" property) Error: An error occured in the owl lifecycle (see this Error's "cause" property) at handleError (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:762:101) at App.handleError (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:1420:29) at Fiber._render (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:787:19) at Fiber.render (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:785:6) at ComponentNode.updateAndRender (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:875:29) Caused by: TypeError: Cannot convert undefined or null to object at Object.keys (<anonymous>) at get selectedTaxType (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:23629:758) at L10nARTaxReportFilters.slot3 (eval at compile (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:1375:421), <anonymous>:36:30) at callSlot (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:956:25) at Dropdown.template (eval at compile (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:1375:421), <anonymous>:8:12) at node.renderFn (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:905:207) at Fiber._render (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:786:96) at Fiber.render (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:785:6) at ComponentNode.updateAndRender (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:875:29) Forward-Port-Of: odoo/enterprise#100457
This update resolves an issue where taxes weren't correctly calculated during Google Pay (GPay) express checkout using Stripe. The fix ensures that Avatax taxes are accurately applied, aligning payment amounts with the final order total. This improves payment accuracy and prevents discrepancies between customer payments and the displayed price.
Original PR description
## Versions 17.0+ ## Issue Avataxes are not computed during express checkout leading to discrepancies between customer payments and effective price including Avalara taxes. ## Steps to reproduce…
## Versions
17.0+
## Issue
Avataxes are not computed during express checkout leading to discrepancies between customer payments and effective price including Avalara taxes.
## Steps to reproduce
*Ensure the Stripe account has activated Google Pay* *This requires a complete Google profile on Google Chrome (with a valid payment method)*
- Setup Stripe payment method in test mode with Express Checkout;
- In the Settings, in the Accounting section:
- Setup Avatax;
- Set main Sales/Purchase taxes to 0.
- Create a new product with 0% selling taxes and any Avatax category;
- Activate fiscal position and enable automatic detection;
- Open a Chrome session with the Google profile:
- Go to the shop;
- Add the product you created to the cart;
- Enter the cart;
- Click the "Buy with GPay" button:
- The amount is equal to the sales price excluding taxes.
- Go to the Sales app and open the newly created order:
- The total amount differs from the amount paid (cf. transaction).
opw-5020793
Forward-Port-Of: odoo/enterprise#109121
Forward-Port-Of: odoo/enterprise#101579This update fixes a minor inconsistency in the Documents app by ensuring that action names (like 'Vendor Bills') are dynamically set based on the type of account move being created. Previously, the action title was fixed to 'Invoices,' which wasn't always accurate. This change improves clarity and usability within the Documents app.
Original PR description
Previously, creating account moves from the Documents app opened the account.move list view with a static `Invoices` title, which was not explicit for all move types. Steps to reproduce: 1. Select suitable PDFs in Document App. 2. Click on `Vendor Bill`. 3. See the name of action (below Breadcrumbs) should be `Vendor Bills` instead of `Invoices` This fix adds and uses a mapping based on move_type to set the correct action name (e.g., Vendor Bills) after record creation. task-5983372 Forward-Port-Of: odoo/enterprise#109307 Forward-Port-Of: odoo/enterprise#109180
This update ensures the IEPS tax breakdown is correctly displayed on Mexican CFDI invoices, aligning with SAT regulations. Specifically, it now accurately shows IEPS based on whether the invoice is a 'global invoice' or uses tax object 07, addressing previous inconsistencies. This ensures accurate tax reporting for Mexican businesses.
Original PR description
This commit targets to modify the behaviour of IEPS breakdown on CFDI to follow on what is specified on SAT cfdi Tax Object Catalog. Now the IEPS will be displayed only considering if the CFDI is a global invoice, the value of the tax object and whether the check is set. The general idea is: - Is a global invoice? -> show IEPS - Is tax object 07? -> show IEPS - Has ieps breakdown but is not tax object 08? -> show IEPS - Anything else, don't. task-5953499 target: saas-18.4 -> master Forward-Port-Of: odoo/enterprise#109318 Forward-Port-Of: odoo/enterprise#108555
This update allows managers to automatically launch appraisal campaigns for all their team members, even if they don't select individuals from a list. This simplifies the process for managers and ensures all employees are included in the appraisal cycle. The change includes new tests to verify the functionality.
Original PR description
. Allow the Leader to launch an appraisal campaign for all their employees by default when no specific employees are selected in the list. task-5347755 Forward-Port-Of: odoo/enterprise#100214
This update fixes an error in how Odoo calculates worked days for employees without contracts or when contracts don't align with pay periods. The change ensures accurate attendance and out-of-contract day tracking, particularly for employees starting or ending contracts mid-month. This improves payroll accuracy and reporting.
Original PR description
Problem: ------- In several scenarios, Worked Days are incorrectly computed when the employee has no contract or when the contract does not fully overlap with the payslip period. Case 1: - Create an…
Problem: ------- In several scenarios, Worked Days are incorrectly computed when the employee has no contract or when the contract does not fully overlap with the payslip period. Case 1: - Create an employee without a contract - Create a payslip for this employee for the current month: You'll see X days of attendance (= today until the end of the payslip period) and Y days of out of contract (= number of days from the start of the payslip period until today) - Create a payslip for this employee for the previous month: you'll see ( Z_prev + Y ) days out of contract ( Z_prev = number of working days in the previous month) - Create a payslip for this employee for the next month: you'll see Z_next days of attendance (Z_next = number of working days in the next month) Case 2: - Create a new employee with a contract starting during the current month - Create a payslip for this employee for the previous month - Out-of-Contract days are incorrectly computed as: contract_start_date - previous_month_start. Case 3: - Create an employee with a contract ending during this month - Create a payslip for this employee for the next month - Out-of-Contract days are incorrectly computed as: next_month_end - contract_end_date. Solution: -------- When generating work days lines: - Explicitly handle employees without a contract. - Use adjusted date bounds when the contract does not overlap the payslip period. Several tests were added to cover these scenarios, as well as the tests the corresponding commit in odoo/odoo (PR odoo: 241978) task-5430759 Forward-Port-Of: odoo/enterprise#109103 Forward-Port-Of: odoo/enterprise#103207
This update simplifies the salary simulator by hiding temporary offers from the user interface. These offers are automatically removed after a month by a scheduled task, so this change only improves clarity and prevents user confusion. It ensures a smoother experience when using the salary configuration tool.
Original PR description
The salary simulator creates temporary offers to compute salary configurations. These offers must still exist for backend computations, as the configurator relies on them when updating results. Simulation offers are already cleaned up by a cron job after one month, so this change simply hides them from the list view to avoid user confusion. task: 5498873 Forward-Port-Of: odoo/enterprise#109241 Forward-Port-Of: odoo/enterprise#107340
This update resolves a crash issue that occurred when viewing pay runs on mobile devices with smaller screens. The fix ensures the system correctly identifies and interacts with the pay run Kanban view, preventing unexpected errors and improving overall stability. This update is a critical fix for users accessing payroll data on mobile.
Original PR description
**Steps to Reproduce:** 1. Open Payroll->Payslips->Pay Runs 2. Click on a Pay Run in Mobile View (Width < 600px). 3. Return to the previous view using the breadcrumb. 4. The system crashes with…
**Steps to Reproduce:** 1. Open Payroll->Payslips->Pay Runs 2. Click on a Pay Run in Mobile View (Width < 600px). 3. Return to the previous view using the breadcrumb. 4. The system crashes with Traceback: TypeError: Cannot set properties of null (setting 'scrollLeft') **Bug Cause:** The custom 'hr_payroll.PayrunKanbanRenderer' template overrode the 'class' attribute of the root div. By setting it only to 'o_payrun_kanban', the standard 'o_renderer' class was removed. The Kanban controller's scroll restoration logic (introduced in recent lazy-loading updates) relies on the '.o_renderer' selector to find the scrollable container. When missing, querySelector returns null, leading to a traceback. **Solution:** Updated the XML template to explicitly include 'o_renderer' in the class list. This restores the functional hook required by the JavaScript controller for scroll restoration while maintaining the custom 'o_payrun_kanban' layout. Task: 5971861 Forward-Port-Of: odoo/enterprise#108847
This update fixes a hidden error in the Point of Sale system that prevented invoice generation when an untrusted bank account was used. Previously, users wouldn't receive any explanation of the issue. Now, a popup will clearly identify the problem, such as an untrusted bank account, guiding the user to correct the setup.
Original PR description
Steps to reproduce: - Add untrusted bank account to the database's selected company's contact - Finalize an order in point of sale through register - While in register, go to orders and click on the invoice button for the finalized order Current behavior: - There is no indication of why you can't generate an invoice Expected behavior: - There should be a popup to the user identifying the error (e.g. untrusted bank account) This addresses a side effect of: https://github.com/odoo/odoo/pull/248108 opw-5946239 Forward-Port-Of: odoo/odoo#251197 Forward-Port-Of: odoo/odoo#249558
This update ensures that B2C customers in Taiwan requesting a paper invoice during guest checkouts correctly skip the "Invoicing Info" step. Previously, a technical issue prevented the system from recognizing this preference, but this fix now accurately saves and applies the paper invoice option, improving the customer experience.
Original PR description
In Taiwan e-invoicing, B2C customers can request a paper copy of their invoice. When selected, the "Invoicing Info" step—which collects data like donation codes or carriers—should be skipped as it is…
In Taiwan e-invoicing, B2C customers can request a paper copy of their invoice. When selected, the "Invoicing Info" step—which collects data like donation codes or carriers—should be skipped as it is not applicable to physical copies. Previously, this logic failed during guest checkouts because the partner initially associated with the order is an archived public user. The persistent partner is only created/assigned after the address form is submitted. This commit: - Overrides `_create_or_update_address` instead of `_handle_extra_form_data` to ensure the paper format preference is saved on the correct, newly generated partner. - Updates `_prepare_address_form_values` to correctly load existing preferences from the partner for registered users. - Ensures the `l10n_tw_edi_is_print` flag on the Sales Order stays in sync with the partner's preference. Task-5912985 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250651 Forward-Port-Of: odoo/odoo#247961
This update fixes an issue where custom messages in website shop pages were being lost after saving. The change removes a cleanup process that incorrectly removed these messages during the website page save. Now, custom dropzone messages are correctly preserved after saving website pages.
Original PR description
Steps to reproduce: - Open the website shop page in edit mode. - Drag and drop a block in the shop header dropzone. - Save the page and re-enter edit mode. - Check the shop header dropzone message.…
Steps to reproduce: - Open the website shop page in edit mode. - Drag and drop a block in the shop header dropzone. - Save the page and re-enter edit mode. - Check the shop header dropzone message. => The custom message is replaced by the default one. Before this commit, `SetupEditorPlugin.cleanForSave()` removed `data-editor-message` and `data-editor-message-default` on the saved HTML clone, including custom messages defined in website templates. This cleanup was originally introduced in `web_editor` in [1]. Since the builder refactor in [2], website page saves now use the shared `html_builder` save cleanup flow and wrongly inherited that behavior, which introduced this regression in website. This commit removes that cleanup from `html_builder`, as it does not provide useful value in this save flow and drops custom dropzone messages. After this commit, custom dropzone messages are preserved after saving website pages. [1]: bab673488e185ddd7792aedecc3870663290fed3 [2]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-5921283 Forward-Port-Of: odoo/odoo#251579 Forward-Port-Of: odoo/odoo#250874
This update fixes a data issue in the Danish (DK) demo company data within Odoo. Specifically, the street number was missing, which was preventing proper functionality with Nemhandel (the Danish e-commerce payment system). This ensures accurate data for testing and demonstration purposes.
Original PR description
This commit adds the street number to the DK demo company, because we need it for nemhandel. no-task Forward-Port-Of: odoo/odoo#250970
This update fixes an issue where tip and discount amounts in the Point of Sale system were not correctly formatted when using a different decimal separator. This ensures users see accurate tip and discount calculations, reducing potential confusion and improving the user experience. The change was made to align with standard decimal formatting practices.
Original PR description
Before this commit, when the decimal separator was not a dot, the amount in the tip and the discount number popup was not correctly formatted, which could lead to confusion for the user. opw-5921256 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248232
This update fixes inaccuracies in the Bulgarian tax settings within the Odoo accounting system. Specifically, it corrects incorrect tax names and changes the default purchase tax rate to 20% FTC, aligning with current Bulgarian regulations. This ensures accurate tax calculations and reporting for Bulgarian businesses using the Odoo system.
Original PR description
Fixing incorrect tax names and changing the default purchase tax to 20% FTC instead of 20% PTC. task-5935754 Forward-Port-Of: odoo/odoo#251593 Forward-Port-Of: odoo/odoo#249269
This update resolves an issue where related fields within many2one chains were incorrectly displaying the wrong related model. Specifically, when two fields with the same name were used in a chain, the popover would show incorrect field options. This change ensures accurate field selection during related field creation.
Original PR description
You cannot create a related field with a related field chain that has two or more fields with the same name in a row. When you click the relation icon for a field the wrong model will be displayed if…
You cannot create a related field with a related field chain that has two or more fields with the same name in a row. When you click the relation icon for a field the wrong model will be displayed if the related model you are trying to show has a many2one with the same name as the field that was selected. Steps to reproduce 1. Create two many2one fields with studio that have the same name, one of the fields must link to the model the other field is on. i.e. `model_a.x_studio_test(relation=model_b), model_b.x_studio_test(relation=other_model)`. 2. Create a related field on model_a and click the related icon for the test field. 3. The popover will now be displaying the fields for other_model instead of model_b. Cause: This behavior was introduced by adding support for properties in this [pr](https://github.com/odoo/odoo/pull/189841). Solution: Check if `fieldDef` is a property or not in order to decide what to pass to `loadPath`. opw-ticket 5459944 Forward-Port-Of: odoo/odoo#249185
Code cleanup and technical improvements
This update reorganizes how Odoo handles website requests, moving the core serving logic to the `router.py` module. This change improves the system's architecture and efficiency, streamlining the process of delivering website content. It’s part of an ongoing effort to optimize Odoo's performance.
Original PR description
Now that the http module has been split, it makes sense to move the serving logic to the `router.py` module. These functions do not need to be exposed from a `Request` instance. Task-5926433
This update refactors how Odoo serves requests, moving key logic to the `router.py` module. This change improves the system's architecture and efficiency, streamlining the process of delivering Odoo's SaaS functionality. It doesn't directly impact users but supports ongoing improvements.
Original PR description
Now that the http module has been split, it makes sense to move the serving logic to the `router.py` module. These functions do not need to be exposed from a `Request` instance. Task-5926433
16 changes
Enhancements to existing features
This update ensures Odoo Enterprise complies with recent changes mandated by the Uruguayan tax authority (DGI) regarding Electronic Fiscal Documents (CFE). Specifically, a new selection option is added for export documentation and required data fields are updated to match the latest CFE version 25 requirements, maintaining legal compliance.
Original PR description
Purpose: The DGI introduced changes in CFE version 25. The following changes below needs to be implemented for legal compliance.
Required Changes:
- Introduce a new selection value,("91", "Export under Mandate")for field, l10n_uy_edi_cfe_sale_mode. This option is required when documenting export operation performed as a mandating entity, where the definitive export will be carried out by a third party.
- The reference document(credit note or debit note) of an existing account move will need to send:
- Amount (MntCFEref)
- Currency (TpoMonedaRef)
- Exchange Rate (TpoCambioRef) if the currency is not Uruguayan Pesos
task-5419331
task-5419331
Forward-Port-Of: odoo/enterprise#108430
Forward-Port-Of: odoo/enterprise#103881This update allows accountants to group invoice lines by tax, reducing clutter in journal entries and simplifying invoice review. The system automatically ungroups the lines when needed, streamlining the process and improving data clarity. This improves efficiency for accountants working with vendor bills.
Original PR description
[IMP] account_edi_ubl_cii: (un)group lines by tax
Once an invoice is imported, a server action allows the user to group
lines by tax, and then if the same action is triggered again it will
ungroup all lines from the origin file
This feature is useful because accountants don't always need the
detail of the vendor bills, and also all the lines clutter up the
journal items
task-5047859
Forward-Port-Of: odoo/odoo#251520
Forward-Port-Of: odoo/odoo#245234Resolved issues and error corrections
This update resolves an issue where incorrect partner IDs were being assigned to stock dropshipping orders due to a validation error in the Odoo code. The fix automatically filters out invalid 'False' values, ensuring accurate partner assignments and preventing the system from crashing.
Original PR description
**Issue:** The error is produced due the changes introduced in this https://github.com/odoo/odoo/commit/4290724a4c8c57fba4f4d3d688d38f65dadcc38f commit. Particularly because of this assertion…
**Issue:**
The error is produced due the changes introduced in this https://github.com/odoo/odoo/commit/4290724a4c8c57fba4f4d3d688d38f65dadcc38f commit. Particularly because of this assertion checking :
https://github.com/odoo/odoo/blob/b5d3970e6b05e2c35ce16e972e659d152c4de70e/odoo/orm/models.py#L5207
This assertion is failing because of the condition related to `is_dropship`. When `is_dropship` is `True`, the `partner_id` is expected to be `p.sale_id.partner_shipping_id.id`
https://github.com/odoo/odoo/blob/b5d3970e6b05e2c35ce16e972e659d152c4de70e/addons/stock_dropshipping/models/stock.py#L95
However, for the specific picking record in some cases, `sale_id` is not set
https://github.com/odoo/odoo/blob/b5d3970e6b05e2c35ce16e972e659d152c4de70e/addons/sale_stock/models/stock.py#L190
As a result of the current implementation, the [expression](https://github.com/odoo/odoo/blob/b5d3970e6b05e2c35ce16e972e659d152c4de70e/addons/stock_dropshipping/models/stock.py#L95) evaluates to **False**. That False value is then included in the generated list.
**For example** : lot.partner_ids = [2, False, 5, 6]
With the recent changes, when this assignment happens, it **no longer ignores False values**. Instead, during the write process, the ORM internally calls **browse()** on the provided IDs. Since False is not a valid ID, the assertion inside browse() **fails**, this can be seen in the **traceback**.
This shows that when the field is being written, the ORM validates the IDs by calling browse(), and since False is included in the list, the assertion fails.
**Solution:**
To resolve this issue, I have use `mapped. As 'mapped()' will filter out all the empty(False) values from the recordset.
By switching to **mapped()** and returning a recordset instead of a list of IDs, False values are automatically excluded. As a result, no invalid IDs are passed to browse(), and the assertion error is avoided.
I have also added the if `p.is_dropship and p.sale_id.partner_shipping_id` condition because it fallback to the picking partner if there is no sale order partner to use
**Other Optimization:**
I have used `with_prefetch` to fetching `picking_ids`, it is just the purely ORM friendly optimization.
It ensures that all related records are prefetched efficiently across lots. It is not related to the bug above mentioned.
**Traceback:**
```python
File "/home/odoo/src/odoo/saas-19.1/addons/stock_dropshipping/models/stock.py", line 95, in _compute_partner_ids
lot.partner_ids = list(p.sale_id.partner_shipping_id.id if p.is_dropship else p.partner_id.id for p in picking_ids)
^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/fields.py", line 1866, in __set__
self.write(protected_records, value)
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/fields_relational.py", line 765, in write
self.write_batch([(records, value)])
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/fields_relational.py", line 786, in write_batch
self.write_real(records_commands_list, create)
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/fields_relational.py", line 1553, in write_real
comodel.browse(
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/models.py", line 5202, in browse
assert all(ids) or all(isinstance(x, NewId) or x for x in ids), "Invalid falsy real id"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Invalid falsy real id
```
opw: 5922525
upg: 3889582
tgb: 2449
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update fixes an error that occurred when generating Argentinian tax reports (specifically ARBA profits reports) by ensuring the report filter correctly handles cases where no tax type is selected. This prevents a JavaScript error and ensures accurate report generation for these reports.
Original PR description
Task Adhoc side: 56583 Avoid js error when no tax type is selected in the argentinian report filter, when the report selected is different than vat book report, for example: ARBA profits report.…
Task Adhoc side: 56583 Avoid js error when no tax type is selected in the argentinian report filter, when the report selected is different than vat book report, for example: ARBA profits report. Video showing the error: https://drive.google.com/file/d/1ecPOqL8DSp45rCT2QIATwYb0DB0RT_YP/view The error was this one: Odoo Client Error UncaughtPromiseError > OwlError Uncaught Promise > An error occured in the owl lifecycle (see this Error's "cause" property) Occured on 19.odoo.localhost on 2025-11-25 12:03:32 GMT OwlError: An error occured in the owl lifecycle (see this Error's "cause" property) Error: An error occured in the owl lifecycle (see this Error's "cause" property) at handleError (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:762:101) at App.handleError (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:1420:29) at Fiber._render (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:787:19) at Fiber.render (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:785:6) at ComponentNode.updateAndRender (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:875:29) Caused by: TypeError: Cannot convert undefined or null to object at Object.keys (<anonymous>) at get selectedTaxType (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:23629:758) at L10nARTaxReportFilters.slot3 (eval at compile (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:1375:421), <anonymous>:36:30) at callSlot (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:956:25) at Dropdown.template (eval at compile (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:1375:421), <anonymous>:8:12) at node.renderFn (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:905:207) at Fiber._render (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:786:96) at Fiber.render (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:785:6) at ComponentNode.updateAndRender (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:875:29) Forward-Port-Of: odoo/enterprise#100457
A slow process for adding attribute values to products was identified due to inefficient database queries. This change replaces iterative database searches with faster filtering methods, significantly reducing the loading time from 8 minutes to 2-3 minutes. This improves the user experience for customers with many product attribute values.
Original PR description
opw-4876370 Issue: A customer who uses many attribute values complained that the "add to products" button on product attribute values in their database was really slow (8 minutes or so). Upon investigation I found parts of the involved functions used iteration over a set of records, which proved notably slower to psql searches. Fix: Replacing the code with what I believe is equivalent operations making use of the `search` method to filter through the sets much quicker. Behaviour after fix: The process takes 2-3 minutes when running this commit on the aforementioned database, but it's still a major improvement compared to the previous time. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251021 Forward-Port-Of: odoo/odoo#232149
This update fixes inconsistencies in how rental dates and planning slots are synchronized, ensuring accurate scheduling and order management. Previously, changes to either rental orders or planning slots could lead to mismatched dates. Now, all dates are automatically updated, improving data reliability and reducing potential scheduling errors. This also corrects issues with quantity syncing and resource allocation, preventing conflicts and ensuring accurate planning.
Original PR description
## [FIX] sale_renting_planning: fix sync between rental dates and planning slots dates Before this commit, it was possible to have `Planning Slots` with `Sync Shifts and Rental Orders` whose dates…
## [FIX] sale_renting_planning: fix sync between rental dates and planning slots dates Before this commit, it was possible to have `Planning Slots` with `Sync Shifts and Rental Orders` whose dates were different from the `Rental order`. This commit makes sure that all dates are always synced: - If the `Rental Order` dates are changed then all `Planning Slots`' dates changed to the new dates. - If a `Planning Slot` dates have changed then all other `Planning Slots` and the `Rental Order` Dates are changed to the new dates. ## [FIX] sale_renting_planning: fix sync between order line quantity and planning slots Before this commit, adding/removing a `Planning Slot` would not change the `SOL quantity` and changing the `SOL quantity` would not add/remove `Planning Slots` unless all slots are being deleted. This commit makes sure that when the `SOL quantity` is changed, the number of `Planning Slots` is changed accordingly, and if a Planning Slot` was added/removed, the `SOL quantity` would update accordingly. Note: The new sync behaviour from `SOL quantity` is ignored for `Products` with `hour UOM` because it is not clear yet how to update the `Planning Slots` if the new quantity of hours doesn't span a full rental interval. ## [FIX] sale_renting_planning: fix set multiple slots to resources Before this commit, adding multiple `Planning Slots` at the same time with the same `Role` can assign them to the same `Resource` even if they conflict with each other. This commit makes sure that when adding multiple `Planning Slots` none of them would conflict with each other after being added. task-5187356 Forward-Port-Of: odoo/enterprise#104771
This update corrects a minor issue in the Documents app where the action title wasn't consistently accurate for different types of account moves. Now, when creating account moves from the Documents app, the action name (like 'Vendor Bills') correctly reflects the move type, improving clarity and usability for users.
Original PR description
Previously, creating account moves from the Documents app opened the account.move list view with a static `Invoices` title, which was not explicit for all move types. Steps to reproduce: 1. Select suitable PDFs in Document App. 2. Click on `Vendor Bill`. 3. See the name of action (below Breadcrumbs) should be `Vendor Bills` instead of `Invoices` This fix adds and uses a mapping based on move_type to set the correct action name (e.g., Vendor Bills) after record creation. task-5983372 Forward-Port-Of: odoo/enterprise#109307 Forward-Port-Of: odoo/enterprise#109180
This update allows managers to automatically launch appraisal campaigns for all their team members, even if they don't select individuals from a list. This simplifies the process for managers and ensures all employees are included in the appraisal cycle. The change includes new tests to verify the functionality.
Original PR description
. Allow the Leader to launch an appraisal campaign for all their employees by default when no specific employees are selected in the list. task-5347755 Forward-Port-Of: odoo/enterprise#100214
This update fixes a critical issue in the invoice processing cron job for Brazil's electronic invoicing system. Previously, a single error would halt the entire process, wasting IAP credits. Now, the cron job processes invoices in smaller batches, committing changes after each, ensuring progress is preserved and preventing disruptions.
Original PR description
The cron searched with limit=batch_size and only retriggered when >batch_size records were found which never happens. It also ran all invoices in a single transaction so one failure rolled back all progress while IAP credits were already consumed. Search batch_size + 1 so remaining invoices are detected, and commit after each invoice to preserve progress. opw-5954211 Forward-Port-Of: odoo/enterprise#108468 Forward-Port-Of: odoo/enterprise#108191
This update fixes an issue where flexible resources were incorrectly displaying a total of 40 hours per week. The fix ensures that the system now accurately reflects the employee's scheduled hours (38 hours) when calculating available time. This improves the accuracy of scheduling and resource allocation.
Original PR description
### Steps to reproduce: - Download Planning app - From the employees app, create an employee - Assign that employee a new schedule that is 'Flexible', has 07:36 hours/day 'Avg', and has 'Total' 38 hours/week - Search for that employee in the planning app and hover over their name ### Cause of Issue: The total available hours for that employee show as 40h. This is because when calculating the hours per week for the resource, the resource's schedule is not taken into account but the company's. ### Fix: Add the hours per week for the resource's calendar (if available) in the calculation opw-5954982 Forward-Port-Of: odoo/odoo#250185
This update fixes an issue where resource scheduling wasn't accurately calculating working hours when using full-day periods. The system now calculates the midpoint between start and end times, ensuring correct representation of half-day schedules. This improves the accuracy of resource availability and time tracking.
Original PR description
### Steps to reproduce: - Go to any working schedule of an employee. - Add a working hour line for any day and choose day period as full day. - Change work from 10:00, and work to 18:00. ### Issue: - Resource was explicitly setting 12 if any hour_from/hour_to was missing. - Resource always consider that the working time is 8AM-5PM. ### Fix: - We will calculate the avg of working hours( hour_from + hour_to)/2 - Doing this we will always get the middle of day. task: 5912748 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247756
This update resolves a crash issue that occurred when viewing pay runs on mobile devices. The fix ensures the system correctly identifies and interacts with the Kanban view, preventing unexpected errors and maintaining a stable user experience. This improves the reliability of the payroll module for all users.
Original PR description
**Steps to Reproduce:** 1. Open Payroll->Payslips->Pay Runs 2. Click on a Pay Run in Mobile View (Width < 600px). 3. Return to the previous view using the breadcrumb. 4. The system crashes with…
**Steps to Reproduce:** 1. Open Payroll->Payslips->Pay Runs 2. Click on a Pay Run in Mobile View (Width < 600px). 3. Return to the previous view using the breadcrumb. 4. The system crashes with Traceback: TypeError: Cannot set properties of null (setting 'scrollLeft') **Bug Cause:** The custom 'hr_payroll.PayrunKanbanRenderer' template overrode the 'class' attribute of the root div. By setting it only to 'o_payrun_kanban', the standard 'o_renderer' class was removed. The Kanban controller's scroll restoration logic (introduced in recent lazy-loading updates) relies on the '.o_renderer' selector to find the scrollable container. When missing, querySelector returns null, leading to a traceback. **Solution:** Updated the XML template to explicitly include 'o_renderer' in the class list. This restores the functional hook required by the JavaScript controller for scroll restoration while maintaining the custom 'o_payrun_kanban' layout. Task: 5971861 Forward-Port-Of: odoo/enterprise#108847
This update fixes a hidden error in the Point of Sale system that prevented invoice generation when an untrusted bank account was used. Now, users will receive a clear notification explaining the issue, ensuring invoices can be created correctly. This improves the user experience and prevents potential invoicing problems.
Original PR description
Steps to reproduce: - Add untrusted bank account to the database's selected company's contact - Finalize an order in point of sale through register - While in register, go to orders and click on the invoice button for the finalized order Current behavior: - There is no indication of why you can't generate an invoice Expected behavior: - There should be a popup to the user identifying the error (e.g. untrusted bank account) This addresses a side effect of: https://github.com/odoo/odoo/pull/248108 opw-5946239 Forward-Port-Of: odoo/odoo#251197 Forward-Port-Of: odoo/odoo#249558
This update corrects an issue where the standard price of dropshipped products wasn't updated when the bill price differed from the original purchase order price. The fix ensures that the product's standard price accurately reflects the final billed amount, improving inventory accuracy for dropshipping transactions.
Original PR description
**Problem:** When Billing a dropshipped PO, if the price of the bill is changed from the price of the Purchase Order, the standard price of the product is not updated **Steps to reproduce:** - enable…
**Problem:** When Billing a dropshipped PO, if the price of the bill is changed from the price of the Purchase Order, the standard price of the product is not updated **Steps to reproduce:** - enable the dropshipping settings - create a storable product with avco perpetual category - in the inventory tab, select the dropship route - in the purchase tab, set a vendor - create and a confirm a quotation for this product - on the linked purchase order, set a unit price of 100$ and confirm - validate the dropship move (- you can check on the product form that the standard price is now 100$) - create a bill for the purchase order - set the price to 90$ and confirm - navigate to the product form **Current behavior:** The standard price is still 100$ **Expected behavior:** It should be 90$ **Cause of the issue:** When we validate the picking, action_done() is called on the moves . Inside the action_done() override of stock_account, after the call to super, set_value is called on is_in and is_dropship moves https://github.com/odoo/odoo/blob/3670c83f1e59d79df439be7c23a679d4d988ec20/addons/stock_account/models/stock_move.py#L168-L169 Inside _set_value(), because the move is dropship, it's going to be added to products_to_recompute https://github.com/odoo/odoo/blob/3670c83f1e59d79df439be7c23a679d4d988ec20/addons/stock_account/models/stock_move.py#L277-L278 and then we're going to exit this iteration of the for loop. https://github.com/odoo/odoo/blob/3670c83f1e59d79df439be7c23a679d4d988ec20/addons/stock_account/models/stock_move.py#L285-L286 so basically we simply call the _update_standard_price() on the product. https://github.com/odoo/odoo/blob/b3559145febc16271c78ca516af9d7e99bf3452f/addons/stock_account/models/stock_move.py#L310 Because the product is avco, _update_standard_price is going to call _run_average_batch https://github.com/odoo/odoo/blob/3670c83f1e59d79df439be7c23a679d4d988ec20/addons/stock_account/models/product.py#L541 The value is not set on the dropship move but it's still used in the computation because for dropship move, we use _get_value() https://github.com/odoo/odoo/blob/b3559145febc16271c78ca516af9d7e99bf3452f/addons/stock_account/models/product.py#L382-L383 which will take into account the bills and POs if there are some. But the problem is that, when we post the invoice we only call set_value on is_in moves https://github.com/odoo/odoo/blob/3670c83f1e59d79df439be7c23a679d4d988ec20/addons/stock_account/models/account_move.py#L42 So the standard price of our dropshipped product is not updated. opw-5498878 Forward-Port-Of: odoo/odoo#250067
This update fixes a data issue in the Danish (DK) demo company data within Odoo. Specifically, the street number was missing, which was required for proper integration with Nemhandel (the Danish e-commerce platform). This ensures accurate reporting and functionality for users working with the DK demo environment.
Original PR description
This commit adds the street number to the DK demo company, because we need it for nemhandel. no-task Forward-Port-Of: odoo/odoo#250970
This update fixes inaccuracies in the Bulgarian tax settings within the Odoo accounting system. Specifically, it corrects incorrect tax names and changes the default purchase tax rate to 20% FTC, aligning with current Bulgarian regulations. This ensures accurate tax calculations and compliance for Bulgarian businesses using Odoo.
Original PR description
Fixing incorrect tax names and changing the default purchase tax to 20% FTC instead of 20% PTC. task-5935754 Forward-Port-Of: odoo/odoo#251593 Forward-Port-Of: odoo/odoo#249269
4 changes
Enhancements to existing features
This update simplifies the process for Italian businesses filing withholding tax returns. The system now defaults to a monthly reporting period, aligning with Italian regulations and addressing previous difficulty in configuring this setting. This change improves compliance and reduces administrative burden.
Original PR description
In Italy, withholding tax return periodicity is monthly. but it's hard to discover/configure. Default periodicity should be monthly. task-5985704 Forward-Port-Of: odoo/enterprise#109185
This update ensures Odoo complies with recent changes mandated by the Uruguayan tax authority (DGI) regarding Electronic Sales Records (CFE). Specifically, it adds a new option for documenting exports handled by third parties and updates how reference invoices are transmitted to the DGI, improving legal compliance.
Original PR description
Purpose: The DGI introduced changes in CFE version 25. The following changes below needs to be implemented for legal compliance.
Required Changes:
- Introduce a new selection value,("91", "Export under Mandate")for field, l10n_uy_edi_cfe_sale_mode. This option is required when documenting export operation performed as a mandating entity, where the definitive export will be carried out by a third party.
- The reference document(credit note or debit note) of an existing account move will need to send:
- Amount (MntCFEref)
- Currency (TpoMonedaRef)
- Exchange Rate (TpoCambioRef) if the currency is not Uruguayan Pesos
task-5419331
task-5419331
Forward-Port-Of: odoo/enterprise#108430
Forward-Port-Of: odoo/enterprise#103881Resolved issues and error corrections
This update ensures self-order transactions in the Odoo Enterprise system now adhere to the same data validation rules as standard point-of-sale orders. This enhances data accuracy and reliability, reducing potential errors and improving the overall transaction process. It addresses a previous issue related to inconsistent validation.
Original PR description
This commit improves the data validation of pos self order by using the same validation as the one used for regular pos order. Forward-Port-Of: odoo/enterprise#109167 Forward-Port-Of: odoo/enterprise#108538
This update resolves a problem with the generation of CSV reports for Peru-specific accounting modules. The issue stemmed from incompatible CSV formatting settings within the Odoo system, specifically related to Python 3.13. The fix ensures reports are generated correctly and efficiently.
Original PR description
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises ValueError: bad delimiter or lineterminator value This is due to…
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises
ValueError: bad delimiter or lineterminator value
This is due to python/cpython#113797 which added new validations to dialect definitions. For this issue, that the delimiter can not be in the line terminator. This can be fixed via a different trick, which is documented:
> The optional `restval` parameter specifies the value to be written
> if the dictionary is missing a key in `fieldnames`.
so if we add a trailing fieldname which *can not* be found in the row dicts, then `DictWriter` will always write out an empty trailing cell (the default `restval` is an empty string), which should result in the same output.
Also remove the `csv.register_dialect` calls, that's so subsequent CSV calls can easily refer to a common configuration but here two different dialects are being registered under the same name, and each one is only used for the following `DictWriter` call, so at best this is a complete waste of time and at worst this is a race condition in threaded configurations. Just pass the formatting parameters directly to the `DictWriter`.
https://runbot.odoo.com/odoo/error/240950
Forward-Port-Of: odoo/enterprise#10908110 changes
Enhancements to existing features
This update addresses changes mandated by the Uruguayan tax authority (DGI) regarding the Electronic Fiscal Document (CFE). Specifically, a new selection option is added for export documentation, and changes are made to how reference invoices are transmitted to ensure legal compliance. This ensures Odoo continues to meet regulatory requirements in Uruguay.
Original PR description
Purpose: The DGI introduced changes in CFE version 25. The following changes below needs to be implemented for legal compliance.
Required Changes:
- Introduce a new selection value,("91", "Export under Mandate")for field, l10n_uy_edi_cfe_sale_mode. This option is required when documenting export operation performed as a mandating entity, where the definitive export will be carried out by a third party.
- The reference document(credit note or debit note) of an existing account move will need to send:
- Amount (MntCFEref)
- Currency (TpoMonedaRef)
- Exchange Rate (TpoCambioRef) if the currency is not Uruguayan Pesos
task-5419331
task-5419331
Forward-Port-Of: odoo/enterprise#108430
Forward-Port-Of: odoo/enterprise#103881This update streamlines test execution by consolidating repetitive setup steps into a single location, reducing the time and resources needed to run tests. By avoiding redundant object creation, the changes improve test performance and overall system stability. This primarily impacts the Google Calendar and Microsoft Calendar modules.
Original PR description
- move a bunch of expensive setUp to setUpClass - backport #152378 to avoid password keying in 17.0 also Forward-Port-Of: odoo/odoo#251045 Forward-Port-Of: odoo/odoo#250667
This update streamlines the process of setting up tests for several core Odoo modules, specifically within the timesheet and payroll areas. By centralizing test setup, the team has improved the efficiency and reliability of our automated testing, leading to faster identification and resolution of potential issues.
Original PR description
Forward-Port-Of: odoo/enterprise#108971 Forward-Port-Of: odoo/enterprise#108739
Resolved issues and error corrections
This update ensures that One Stop Shop (OSS) invoices for intra-EU B2C sales in Italy are correctly formatted for the Italian Revenue Agency (Agenzia delle Entrate). Previously, the system rejected these invoices due to incorrect VAT formatting. Now, the system generates invoices with the necessary line items and tax summaries to meet FatturaPA compliance standards.
Original PR description
This commit aligns the Italian e-invoicing (FatturaPA) generation for One Stop Shop (OSS) transactions with the requirements of the Italian Revenue Agency ( Agenzia delle Entrate). Current behavior:…
This commit aligns the Italian e-invoicing (FatturaPA) generation for One Stop Shop (OSS) transactions with the requirements of the Italian Revenue Agency ( Agenzia delle Entrate). Current behavior: Invoices for intra-EU B2C sales (OSS) are generated with a single line containing the foreign VAT rate. This is rejected or considered non-compliant by the SDI because foreign VAT cannot be typically exposed in the standard way for Italian electronic invoices. New behavior: The XML generation logic has been updated to follow the specific codification required for OSS operations: 1. Invoice Lines (`DettaglioLinee`): - The product line is reported with 0% VAT and Nature 'N7' (VAT paid in another EU member state). - A new, separate line is injected to represent the VAT amount, classified with Nature 'N2.2' (Non-taxable/Other). 2. Tax Summary (`DatiRiepilogo`): - The original foreign tax lines are excluded from the summary. - Synthetic summary lines are added for the 'N7' (Taxable Base) and 'N2.2' (VAT Amount) categories. Implementation details: - Added `_l10n_it_is_oss_tax` helper to identify OSS taxes. - Modified `_l10n_it_edi_get_line_values` to split OSS lines. - Modified `_l10n_it_edi_get_tax_values` to adjust the tax summary. task-4711509 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#249243 Forward-Port-Of: odoo/odoo#243740
This update fixes an issue where down payment invoices generated from sales orders or Point of Sale weren't automatically including tax. The fix adds a 0% tax line to down payment invoices to ensure compliance with tax regulations. This ensures accurate invoicing and avoids potential discrepancies.
Original PR description
In certain conditions all lines in invoice require a tax. When making a down payment from an order containing products using fixed price tax, the corresponding invoice line was created without tax.…
In certain conditions all lines in invoice require a tax. When making a down payment from an order containing products using fixed price tax, the corresponding invoice line was created without tax. The issue appear both when making the down payment from the sale order and from the PoS. Steps to reproduce: ------------------- * Create a fixed price tax of 10€ * Create a product with this tax * Create a sale order with this product and make a downpayment of 10% > Observation: The down payment line has no tax set. * Open PoS and make a down payment of 10% for the same order * Pay and invoice the order > Observation: The down payment line has no tax set. Why the fix: ------------ If the tax is required on every invoice line we manually add a 0% tax to the down payment line to ensure that the invoice is compliant. At the moment we only add the tax when peppol is activated on the current company. But the `_require_tax_ids_on_invoice_lines` method can be overriden by other modules if downpayment lines also require tax. opw-5853070 Forward-Port-Of: odoo/odoo#251459 Forward-Port-Of: odoo/odoo#247748
This update resolves an issue where product variant pricelists were not correctly updating when a product was removed from the list. Specifically, the system was failing to reset the data associated with the pricelist rule after a product was deleted. This fix ensures accurate pricing information is displayed for product variants, preventing potential revenue discrepancies.
Original PR description
Steps: - Create a price list (or existing one) - Create (or find) a product with only one variant - Add price list rule for that variant (Should show as Variant:... in Pricelist listing) - Go to…
Steps: - Create a price list (or existing one) - Create (or find) a product with only one variant - Add price list rule for that variant (Should show as Variant:... in Pricelist listing) - Go to pricelist listing, select the pricelist - Edit price list rule - Remove the product - Save and check the data (applied_on, product_id, product_tmpl_id) (applied_on still 0_product_variant, product_id, and NO product_tmpl_id) Related ticket: opw-5411034 (Video: https://drive.google.com/file/d/1xmg9A9NgavFQkIFkUZrzuAxVF-PNqdnL/view) Description of the issue/feature this PR addresses: Fix corrupted data <img width="583" height="108" alt="image" src="https://github.com/user-attachments/assets/961e75f8-b2a6-4812-a0b4-d73e02d52b08" /> Current behavior before PR: product_tmpl_id set to None product_id / applied_on data stays the same Desired behavior after PR is merged: When product_tmpl_id is removed, reset the applied_on type back to 3_global --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250531 Forward-Port-Of: odoo/odoo#249417
This update fixes a minor issue where a warning about leaving a chatbot conversation was displayed even after the conversation had already ended. Now, the warning only appears when a chatbot conversation is actively in progress, creating a smoother and less disruptive user experience for customers interacting with the chatbot.
Original PR description
Before this commit: When a user finishes a chatbot script and the conversation is already ended, clicking on close / continue still triggers the leave conversation warning. After this commit: The leave conversation warning is no longer shown when the chatbot conversation is already closed or ended. The warning is only shown for active conversations. [Task-5882084](https://www.odoo.com/odoo/project/1519/tasks/5882084) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251335 Forward-Port-Of: odoo/odoo#247918
This update resolves a bug where the selected time slot for self-order pickup was incorrect due to timing considerations. The fix now explicitly specifies the desired time slot and verifies its availability after execution, ensuring accurate scheduling and order fulfillment. This improves the reliability of the self-order process.
Original PR description
The selected time slot was not the right one as the time of the execution influed on the first choice available. We now specify which time slot to take, and check that this specific timeslot is not available anymore afterwards. runbot-233381
This update fixes a minor issue where the dynamic snippet carousel wasn't displaying correctly when showing a small number of items. The fix ensures a smoother, more consistent scrolling experience, especially with limited product data. It optimizes how the carousel handles data presentation for better performance.
Original PR description
Steps to reproduce: 1. Add a Dynamic Snippet Carousel(Products). 2. Set the number of records to 4. 3. Enable Single Scroll mode. Issue: When a dynamic snippet carousel is in single scroll mode (`o_carousel_multi_items`) and the number of fetched items is less than or equal to the visible slots per slide (`chunkSize`, typically 4 on desktop), the carousel still slides one item at a time. Cause: When `scrollMode` is single, the QWeb template generates each data item in its own `carousel-item` div. So with 3 products and 4 visible slots, we got 3 separate slides(this is the usual behavior of single scroll mode). But due to this bootstrap would slide between them one by one. Fix: If the number of fetched records is less than or equal to the number of elements per slide (chunkSize), use "all" scroll mode so that all items are grouped in a single slide instead of being split into individual carousel-items (which would cause unwanted sliding).
This update fixes a potential issue where VIES validation errors caused errors in Odoo, specifically impacting OCR invoice processing. By catching a broader range of exceptions from the VIES service, the system is now more resilient to invalid XML responses and prevents errors from propagating.
Original PR description
Catch all `zeep` exceptions instead of only `zeep.Fault`. On 14th of February 2026, the VIES service wasn't working properly, they were returning invalid XML in their response. This caused the `check_vies` call to raise a `zeep.XMLSyntaxError` which wasn't caught, causing a traceback every time VIES was used to validate a VAT number. opw-5938723 (OCR couldn't be refreshed on an invoice because it tried to create a partner from its VAT number and it couldn't be checked with VIES). Forward-Port-Of: odoo/odoo#249853
3 changes
Enhancements to existing features
This update addresses changes mandated by the Uruguayan tax authority (DGI) regarding the Electronic Fiscal Document (CFE). Specifically, a new selection option is added for export transactions, and changes are made to the data sent with credit and debit notes to ensure compliance with current regulations. This ensures accurate reporting for Uruguay.
Original PR description
Purpose: The DGI introduced changes in CFE version 25. The following changes below needs to be implemented for legal compliance.
Required Changes:
- Introduce a new selection value,("91", "Export under Mandate")for field, l10n_uy_edi_cfe_sale_mode. This option is required when documenting export operation performed as a mandating entity, where the definitive export will be carried out by a third party.
- The reference document(credit note or debit note) of an existing account move will need to send:
- Amount (MntCFEref)
- Currency (TpoMonedaRef)
- Exchange Rate (TpoCambioRef) if the currency is not Uruguayan Pesos
task-5419331
task-5419331
Forward-Port-Of: odoo/enterprise#108430
Forward-Port-Of: odoo/enterprise#103881Resolved issues and error corrections
This update corrects a problem with how Odoo generates CSV reports for Peruvian accounting modules. The fix addresses an incompatibility with a recent Python update, ensuring reports are created correctly. Removing redundant configuration steps improves efficiency and stability.
Original PR description
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises ValueError: bad delimiter or lineterminator value This is due to…
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises
ValueError: bad delimiter or lineterminator value
This is due to python/cpython#113797 which added new validations to dialect definitions. For this issue, that the delimiter can not be in the line terminator. This can be fixed via a different trick, which is documented:
> The optional `restval` parameter specifies the value to be written
> if the dictionary is missing a key in `fieldnames`.
so if we add a trailing fieldname which *can not* be found in the row dicts, then `DictWriter` will always write out an empty trailing cell (the default `restval` is an empty string), which should result in the same output.
Also remove the `csv.register_dialect` calls, that's so subsequent CSV calls can easily refer to a common configuration but here two different dialects are being registered under the same name, and each one is only used for the following `DictWriter` call, so at best this is a complete waste of time and at worst this is a race condition in threaded configurations. Just pass the formatting parameters directly to the `DictWriter`.
https://runbot.odoo.com/odoo/error/240950
Forward-Port-Of: odoo/enterprise#109081Features or functions removed from Odoo
This update removes a display field ('Visible Internally Only') from the customer rating form in the Helpdesk module. This field was no longer needed as customer ratings are no longer visible on the website. This change improves the user experience and simplifies the Helpdesk interface.
Original PR description
**Steps to reproduce:** - Open a Helpdesk ticket with a customer rating. - View the rating form. - Observe the field ‘Visible Internally Only’ still showing. **Issue:** - The field is displayed even though ratings are no longer shown on the website. **Reason:** - The field is now irrelevant but still present in the view. **Fix:** - Invisible the ‘Visible Internally Only’ field from the customer rating form in the affected version. **Task id - 5359052** Forward-Port-Of: odoo/enterprise#100686
11 changes
New functionality added to Odoo
This update allows you to share documents with external websites through the Documents and Website module. Users can now specify a website domain when sharing, ensuring the shared link directs to the intended external site instead of the main Odoo platform. This enhances flexibility and control over document distribution.
Original PR description
PURPOSE When use Documents and Website, manage various websites not main odoo site. SPECIFICATIONS If Documents and Website are installed: - Add a new field "Website domain" on the share wizard. - When selecting a website in the list, the URL to share will be the URL of the website and not of the main odoo site. Task-2658985
This update introduces support for group insurance contributions at the employee level, aligning with Belgian tax regulations (CP200). It also adds functionality to accurately report employee contributions for zone 2257 (281.10), ensuring correct tax filings and improved reporting accuracy.
Original PR description
Add employee-level group insurance contribution fields (company/employee/voluntary) with configurable unit selection (% or €) in hr.version and hr.employee models. Introduce CP200 salary rules for group insurance (GI.COMP.CONT, GI.EMP.CONT, GI.EMP.VOL) with a dedicated section (seq 300/305). Calculate employer ONSS at 8.86% on company contributions and include it in the ONSS aggregation. Expose group insurance fields in the employee form under the Insurances group with tracking enabled for "To Review" workflow. Add 281.10 support for employee contribution (zone 2257): compute total GI.EMP.CONT across payslips and expose it in both XML and PDF outputs. Update Belcotax-2024.xsd schema with the new f10_2257_employeecontribution field. Fix minor XML indentation inconsistencies in CP200 salary rules. Task Id: 5470141
Enhancements to existing features
This update simplifies the user experience for Belgian employees managing their spouse's tax status within the HR payroll module. The previous clickable link has been replaced with a dynamic tooltip, providing instant access to relevant income and pension information on hover. This change improves usability and clarity for employees.
Original PR description
Normally, when you select employee from belgium and go to Employee->personal->FAMILY->Married-> there was toggle explanation clickable link and it was opening the description section about incomes and pensions. I removed clickable link and put a icon (tooltip), when you hover it, the description's content is seen in tooltip. The UX is simplified in this way. I opened a new field in l10n_be_hr_payroll/hr_employee, spouse_fiscal_status_explanation_tooltip that is a HTML field and creates the tooltip dynamically with the changing content. (The content is spouse_fiscal_status_explanation field and it is computed dynamically in the code) In the view, I used new tooltip field directly. task - 5870664
Resolved issues and error corrections
This update resolves an issue where taxes weren't correctly calculated during Google Pay (GPay) express checkout using Stripe. Specifically, Avatax calculations were missing, leading to discrepancies between the displayed price and the actual payment amount. This ensures accurate tax reporting and customer pricing.
Original PR description
## Versions 17.0+ ## Issue Avataxes are not computed during express checkout leading to discrepancies between customer payments and effective price including Avalara taxes. ## Steps to reproduce…
## Versions
17.0+
## Issue
Avataxes are not computed during express checkout leading to discrepancies between customer payments and effective price including Avalara taxes.
## Steps to reproduce
*Ensure the Stripe account has activated Google Pay* *This requires a complete Google profile on Google Chrome (with a valid payment method)*
- Setup Stripe payment method in test mode with Express Checkout;
- In the Settings, in the Accounting section:
- Setup Avatax;
- Set main Sales/Purchase taxes to 0.
- Create a new product with 0% selling taxes and any Avatax category;
- Activate fiscal position and enable automatic detection;
- Open a Chrome session with the Google profile:
- Go to the shop;
- Add the product you created to the cart;
- Enter the cart;
- Click the "Buy with GPay" button:
- The amount is equal to the sales price excluding taxes.
- Go to the Sales app and open the newly created order:
- The total amount differs from the amount paid (cf. transaction).
opw-5020793
Forward-Port-Of: odoo/enterprise#109121
Forward-Port-Of: odoo/enterprise#101579This fix resolves an error that occurred when no tax type was selected in Argentinian reports (like ARBA profits). Previously, the system would crash. Now, the report functions correctly even without a tax type selection, ensuring accurate reporting for Argentinian businesses.
Original PR description
Task Adhoc side: 56583 Avoid js error when no tax type is selected in the argentinian report filter, when the report selected is different than vat book report, for example: ARBA profits report.…
Task Adhoc side: 56583 Avoid js error when no tax type is selected in the argentinian report filter, when the report selected is different than vat book report, for example: ARBA profits report. Video showing the error: https://drive.google.com/file/d/1ecPOqL8DSp45rCT2QIATwYb0DB0RT_YP/view The error was this one: Odoo Client Error UncaughtPromiseError > OwlError Uncaught Promise > An error occured in the owl lifecycle (see this Error's "cause" property) Occured on 19.odoo.localhost on 2025-11-25 12:03:32 GMT OwlError: An error occured in the owl lifecycle (see this Error's "cause" property) Error: An error occured in the owl lifecycle (see this Error's "cause" property) at handleError (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:762:101) at App.handleError (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:1420:29) at Fiber._render (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:787:19) at Fiber.render (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:785:6) at ComponentNode.updateAndRender (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:875:29) Caused by: TypeError: Cannot convert undefined or null to object at Object.keys (<anonymous>) at get selectedTaxType (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:23629:758) at L10nARTaxReportFilters.slot3 (eval at compile (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:1375:421), <anonymous>:36:30) at callSlot (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:956:25) at Dropdown.template (eval at compile (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:1375:421), <anonymous>:8:12) at node.renderFn (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:905:207) at Fiber._render (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:786:96) at Fiber.render (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:785:6) at ComponentNode.updateAndRender (http://19.odoo.localhost/web/assets/d2fb943/web.assets_web.min.js:875:29) Forward-Port-Of: odoo/enterprise#100457
This update corrects a minor issue in the Documents app where action names weren't consistently reflecting the type of account move being created. Specifically, 'Invoices' was used regardless of the document type. The fix now uses the account move type to display the correct action name (e.g., 'Vendor Bills'), improving clarity and usability.
Original PR description
Previously, creating account moves from the Documents app opened the account.move list view with a static `Invoices` title, which was not explicit for all move types. Steps to reproduce: 1. Select suitable PDFs in Document App. 2. Click on `Vendor Bill`. 3. See the name of action (below Breadcrumbs) should be `Vendor Bills` instead of `Invoices` This fix adds and uses a mapping based on move_type to set the correct action name (e.g., Vendor Bills) after record creation. task-5983372 Forward-Port-Of: odoo/enterprise#109307 Forward-Port-Of: odoo/enterprise#109180
This update resolves an issue where the call method selection dialog wasn't appearing on mobile devices after adding a new call. The fix ensures the dialog is displayed correctly above the softphone, preventing errors and improving the user experience. It also includes a safety check to prevent errors when the dialog isn't immediately available.
Original PR description
After add-call PR: https://github.com/odoo/enterprise/pull/92835 when the user tries to add another call on mobile, they don't get the dialog that asks for the call method. This is because it was showing behind the softphone which also led to traceback when you click on it after ending the current call/s. This commit fixes that by making sure it's showing above the softphone in the calling state. Also, it adds a null check in the querySelector result before destructuring so that it returns instead of thrwoing an error if it was null (what happens when you click on it after you end the call). Task-5999040
This update ensures the IEPS (tax) breakdown is correctly displayed on Mexican CFDI invoices, aligning with SAT regulations. Specifically, it now only shows the IEPS if the invoice is a 'global invoice' or uses tax object 07, addressing previous inconsistencies. This ensures accurate tax reporting for Mexican businesses using Odoo.
Original PR description
This commit targets to modify the behaviour of IEPS breakdown on CFDI to follow on what is specified on SAT cfdi Tax Object Catalog. Now the IEPS will be displayed only considering if the CFDI is a global invoice, the value of the tax object and whether the check is set. The general idea is: - Is a global invoice? -> show IEPS - Is tax object 07? -> show IEPS - Has ieps breakdown but is not tax object 08? -> show IEPS - Anything else, don't. task-5953499 target: saas-18.4 -> master Forward-Port-Of: odoo/enterprise#109318 Forward-Port-Of: odoo/enterprise#108555
This update corrects a technical issue where incoming VoIP calls weren't properly recording their creation date in the database. The fix ensures accurate tracking of call start times, improving reporting and analysis of VoIP activity. This change impacts the VoIP module.
Original PR description
For incoming calls in VoIP, they didn't have create date written in the database becasue we were using `self.env.cr._now`. The orm `create` method uses `self.env.cr.now()`, a method, and it's working fine for outgoing calls. This commit fixes it for incoming calls and changes `_now` to `now()`. Task-5979968 Forward-Port-Of: odoo/enterprise#109041
A recent issue causing a crash when clearing booking dates in the restaurant appointment booking flow has been fixed. This update ensures the system correctly handles empty date values, preventing disruptions to the user experience. The fix improves stability and reliability for restaurant bookings.
Original PR description
Clicking the 'Clear' button in the booking date picker caused a crash because the system didn't expect the date fields to be emptied. This fix allows the booking popup to handle empty date values correctly without crashing. task-id: 5964417
This update simplifies the salary simulator by hiding temporary offers from the user interface. These offers are automatically deleted after a month by a scheduled process, so this change prevents confusion for users while ensuring the underlying salary calculations remain accurate.
Original PR description
The salary simulator creates temporary offers to compute salary configurations. These offers must still exist for backend computations, as the configurator relies on them when updating results. Simulation offers are already cleaned up by a cron job after one month, so this change simply hides them from the list view to avoid user confusion. task: 5498873 Forward-Port-Of: odoo/enterprise#109329 Forward-Port-Of: odoo/enterprise#107340
6 changes
Resolved issues and error corrections
This update fixes a critical error that occurred when calculating time off for employees on hour-based schedules (like contractors with 0 hours). Previously, a division by zero caused server errors. Now, the system validates these cases, preventing crashes and ensuring accurate time off calculations. This resolves issues impacting client experience and avoids potential Odoo system instability.
Original PR description
Description of the issue/feature this PR addresses: Hour-based Time Off allocations use employee working hours for calculation. Contractors may have 0 hours/week as their working schedule. This caused ZeroDivisionError during time off allocation. Clients faced server errors, assuming Odoo was at fault. 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 update corrects a bug where manually adjusted tax amounts on vendor bills were incorrectly reset to the original value when a price difference was created. The fix ensures that manually set tax values remain accurate, preventing unnecessary recalculations and maintaining correct tax accounting for price differences. This improves the reliability of vendor bill tax settings.
Original PR description
When manually changing the tax amount of a vendor bill in the html input field (input above total price), if there is a price difference account move line created, the manual tax inputted will be…
When manually changing the tax amount of a vendor bill in the html input field (input above total price), if there is a price difference account move line created, the manual tax inputted will be ignored. This is due to the price difference and associated correcting account move lines having tax_ids. As such, both lines are considered taxable when they should not be and every time we create a price difference line, all taxes are recomputed and manually set tax lines are ignored. This is not the intended behavior because tax for price difference is already accounted for in the tax lines (computed before confirmation of bill) and the price difference lines themselves are just for account balancing and should not be considered taxable. Steps to reproduce bug on empty DB: 1) Install account and purchase_stock 2) Turn on automatic accounting in settings 3) Create a product category. Set inventory valuation to automated and create and set a price difference account. 4) Create a product. Set the price, set to product category to the created one, and enable track inventory. 5) Create a vendor bill with the product and set a bill date. 6) Change the price of the product in the bill lines to anything but the original price. 7) Change the tax by clicking on the input field with the pencil icon above amount total to anything but the original tax. 8) Confirm the vendor bill and notice the manually changed tax value revert back to the original value. Behavior after bug fix: Upon completing step 8, the manually changed tax value should stay and not be recomputed. opw-4854669 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update prevents mail templates from automatically deleting attachments when they are removed from the mail composer. Previously, deleting an attachment in the composer also removed it from the template, causing confusion. The fix simplifies the process by only removing attachments from the template when explicitly deleted in the composer.
Original PR description
Removing an attachment (coming from a mail template) in the mail composer wrongly removes it from the template. - Edit the "Sales: Send Quotation" mail template, add it an attachment - Go to a draft…
Removing an attachment (coming from a mail template) in the mail composer wrongly removes it from the template. - Edit the "Sales: Send Quotation" mail template, add it an attachment - Go to a draft quotation - Click on "Send", it will open the mail composer which will use the template. You should see the file you added on the template. - Now, remove that file from the composer. For instance, for this client you don't want to send it, or you want to replace it or whatever. - The mail attachment has also been deleted from the template, not only from the current mail. - Note that you don't need to send it, just deleting it in the composer is enough to have it removed on the template. Many refactoring were made in `mail` between Odoo 17 and 18, breaking this flow. Another solution would be to change that in JS side, somehow managing to call `delete()` and not `remove()` in `/mail/[..]/attachment_model.js`. The caller is in `unlink()` in `/mail/[..]/attachment_upload_service.js` which is itself called by `onFileRemove()` from `/mail/[..]/mail_composer_attachment_list.js`. That would've kept using the same attachment record as the one in the template without removing it from the template when it's removed from the composer. The python solution seems more straightforward and since it's creating new attachment no other bugs should arise. Finally, note that "ghost" attachment are garbage collected through the `_gc_lost_attachments()` autovacuum method, looking for attachment having `res_id=0` and `mail.compose.message` as model. task-4748058
This update fixes an issue where manually set prices in Point of Sale (PoS) quotations weren't correctly applied during settlement, leading to incorrect final prices. Now, PoS settlements accurately reflect user-defined prices for products, ensuring accurate revenue calculations. This improves the reliability of PoS transactions.
Original PR description
**Steps to reproduce:** - Create a product tracked by lot, set it's price to 1000 - Create a quotation add a line with the created product and change the price to 1200 - Add another line with the same product and change it's price to 600 - Go to PoS and settle this quotation - The lines' prices will be 1000 and 600 instead of 1200 and 600 **Why the fix:** In the event of a settle with a product tracked by lots, we are setting the price of all *related_lines* (lines with the same product in this case) to it's base price, not taking into account the fact that this price has been modified by the user when making the quotation. This only happens for related lines, which explains why one line's price is still 600 while the other was reverted to the base price of 1000 instead of being 1200 as it was previously set. To avoid this, we now set the price_unit back to the base one only if the price hasn't been changed manually. opw-5223463
This update fixes a performance issue in the POS self-order module that was causing delays when loading pricelists. By optimizing the database queries, the system now loads pricelists significantly faster, especially with a large number of products. This results in a smoother and more responsive POS experience for users.
Original PR description
Currently when a pricelist is set on a POS session, N+1 queries are generated when loading the data by calling `_get_product_price()` in a loop. This commit avoids the extra queries by performing the computation on the recordset using `_get_products_price()` and looping through the result instead. This commit also generally cleans up the function by removing unnecessary intermediate variables, and removing the redundant product_obj check. Benchmark opening /pos-self/data | product.product count | Before | After | Queries Before | Queries After | | --------------------- | ------ | ----- | -------------- | ------------- | | 1,500 | 2.16s | 0.72s | 1,711 | 185 | | 15,000 | 24.91s | 6.52s | 17,175 | 397 | opw-5477715
This update resolves a problem where CSV reports generated by the l10n_pe_reports module were failing due to incompatible CSV formatting settings. The fix ensures the reports generate correctly with Python 3.13 and removes unnecessary configuration steps, improving stability and efficiency. This prevents errors during report generation, particularly on automated builds.
Original PR description
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises ValueError: bad delimiter or lineterminator value This is due to…
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises
ValueError: bad delimiter or lineterminator value
This is due to python/cpython#113797 which added new validations to dialect definitions. For this issue, that the delimiter can not be in the line terminator. This can be fixed via a different trick, which is documented:
> The optional `restval` parameter specifies the value to be written
> if the dictionary is missing a key in `fieldnames`.
so if we add a trailing fieldname which *can not* be found in the row dicts, then `DictWriter` will always write out an empty trailing cell (the default `restval` is an empty string), which should result in the same output.
Also remove the `csv.register_dialect` calls, that's so subsequent CSV calls can easily refer to a common configuration but here two different dialects are being registered under the same name, and each one is only used for the following `DictWriter` call, so at best this is a complete waste of time and at worst this is a race condition in threaded configurations. Just pass the formatting parameters directly to the `DictWriter`.
https://runbot.odoo.com/odoo/error/240950
Forward-Port-Of: odoo/enterprise#1090818 changes
Enhancements to existing features
This update adjusts the salary scale parameters used in Odoo's Belgian payroll module (l10n_be_hr_payroll) to reflect changes in Belgian labor laws as of January 1, 2026. These updated values ensure accurate payroll calculations for employees in Belgium, maintaining compliance with current regulations.
Original PR description
. Update cp200_salary_scale_first_year values for 01/01/2026 . Update cp200_salary_scale values for 01/01/2026 task-5485636
Resolved issues and error corrections
This update prevents installable snippets from being dragged within website page editors. The previous system incorrectly allowed dragging of installable modules, which has now been corrected. This ensures a smoother and more reliable editing experience for users.
Original PR description
In [commit 1], jQueryUI was replaced by in house drag and drop and while doing so, replaced a jQuery array of snippets as the draggable elements by a selector `oe_snippet` on the `SnippetsMenu` HTML element. This lead to installable snippets being draggable even though they should not. More so, it seems like the "cancel" option of jQueryUI was not adapted to "ignore" of the new API. This commit fixes both and uses ignore to ignore installable snippets. Steps to reproduce: - Have a DB with installable modules - Start a website page edition - Drag an installable Snippet => It should not be draggable [commit 1]: https://github.com/odoo/odoo/commit/7594d71ca8610d5947e80f325ccb57abc23c2c76 task-3600773
This update fixes a critical error that occurred during Odoo database upgrades when certain modules (like 'theme_common') were present. The issue stemmed from an empty configuration file, leading to a 'KeyError'. This change ensures smoother and more reliable database upgrades, preventing potential disruptions.
Original PR description
when there is module like `theme_common`
got manifest with {} value. so we got error
on this line:
configurator_snippets = manifest['configurator_snippets']
so got traceback KeyError: 'configurator_snippets'
this error reproduced during upgrading database.
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-prThis update fixes an issue where ticket prices in multi-company events were not correctly converted to the website's currency. Previously, prices were displayed at face value regardless of the ticket's currency. Now, prices are automatically converted, ensuring users see accurate prices in the website's currency when adding tickets from different companies to a single event.
Original PR description
Description of the issue/feature this PR addresses: Related to this task: [4720354](https://www.odoo.com/odoo/project.task/project.task/4720354) This issue considers a multi company environment,…
Description of the issue/feature this PR addresses: Related to this task: [4720354](https://www.odoo.com/odoo/project.task/project.task/4720354) This issue considers a multi company environment, where two companies are set to have different currencies. If an event is created, it belongs to one of these companies. Tickets from either companies can be added to the event's registration, and the end user will see the price for these tickets in the currency of the website, despite some tickets having a different currency set. Current behavior before PR: The registration wizard displays the prices of tickets at face value, i.e. without any conversion. A ticket with its price being 100 euros will be displayed as 100 dollars. Desired behavior after PR is merged: The wizard would display the converted amount of the euros tickets in dollars. The 100 euros will be $77.92 Steps to reproduce the issue: - Create a second company with a currency different than the current company (ex: current company uses dollars, new company uses euros) - Make two products of type 'event', one for the dollar company and one for the euro company - Create an event, add two tickets (related to the products) - Click the register button on the website, see the prices of both tickets, with the modified view, the euro ticket should have its amount converted to the website's currency. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where product availability and forecasted delivery dates were incorrect when handling multi-warehouse, multi-step deliveries, particularly for manufactured and purchased products. The changes ensure accurate reporting of stock availability and delivery dates, resolving discrepancies in the forecast report.
Original PR description
*: sale_mrp, sale_purchase_stock Issue: Product availability and forecasted lines are not correct when handling multi-warehouse, multi-step deliveries; specifically for manufactured and purchased…
*: sale_mrp, sale_purchase_stock
Issue:
Product availability and forecasted lines are not correct when handling multi-warehouse, multi-step deliveries; specifically for manufactured and purchased products with future delivery dates. Product availability for final delivery is "Available" when it should be "Exp."
The forecasted lines show the reserved move as the MO, when it should be the interwarehouse transfer.
This behavior occurs from 17.0 onward, due to [this](https://github.com/odoo/odoo/commit/57d8590) refactor of `_get_forecast_availability_outgoing()` and [this](https://github.com/odoo/odoo/commit/2dad4a5) refactor of StockForecasted.
Assuming we have two warehouses, WH1 and WH2, where WH2 is supplied from WH1, `_get_out_move_reserved_data()` calculates the reserved out quantity, reserved move, and move state. For manufactured/purchased products:
* The products will be reserved from the WH1 MO. WH2 delivery will not recognize the interwarehouse transfer as its in move.
* The forecasted date for the WH2 delivery becomes "Available" when it should match the WH1 transfer date.
* The finished products should be reserved from WH2, which will be transfered from WH1.
This commit refactors `_get_report_lines()` in StockForecasted to encapsulate the reserved stock logic for easier inheriting. It also adjusts the forecast report view to account for case where both reserved move and in move are set.
* We add a check to see if the reserved move has a `production_id` (MRP) or `purchase_line_id` (purchase)
* If true, append the correct in move and reserved move to the forecast line.
Before this commit:
Product Availability is not consistent (WH2/OUT is "Available" when should match WH1/OUT).
<img width="1915" height="356" alt="image" src="https://github.com/user-attachments/assets/bef9cc3c-b98c-4385-a1bb-aaa4b1e00d71" />
Forecasted report shows the "MO" move as the reserved move.
<img width="1899" height="326" alt="image" src="https://github.com/user-attachments/assets/05a75426-9811-435c-8dad-25a405e8ef2d" />
After this commit:
Multi-warehouse deliveries will have the correct in moves and reserved moves and will reflect correctly in the forecast report.
The products availability will also be consistent, showing "Exp mm/dd/yyyy" for each delivery.
<img width="1910" height="388" alt="image" src="https://github.com/user-attachments/assets/3ee9059e-3202-4409-8dc7-b25222b8f817" />
Forecasted report shows the "IN" move as the reserved move.
<img width="1912" height="294" alt="image" src="https://github.com/user-attachments/assets/e4e4418d-0de7-43fa-8b5a-9267e6a91b15" />
Steps to Reproduce:
* Enable multi-step routes
* Create two warehouses (WH1 and WH2)
* Both 3-step delivery only
* WH2 -> resupply from WH1
* WH2 routes:
* MTO unarchived
* WH2: Supply product from WH1 -> check "Sales Order Line"
* Create product with routes "Manufacture" and "MTO" + BOM
* "Buy" and "MTO" for purchases
* Create SO with product
* show "Route" on SO line
* set "Route" to "WH2: Supply product from WH1"
* On "Other Info" tab, set:
* Warehouse -> WH2
* Shipping Policy -> As Soon as Possible
* Delivery Date -> +10 days from current date
* Confirm SO
* 7 delivery orders and 1 MO (or 1 PO) should be made
* For Purchase Only: Confirm the PO
* Go to Delivery Orders
* show "Product Availability" on the lines
* Products availability for WH2 delivery will be "Available", WH1 delivery will be "Exp mm/dd/yyyy"
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update fixes an issue where bank statement imports from the dashboard only imported the first batch of data. The root cause was an outdated message being treated as an error, preventing the import of the entire file. The fix removes this problematic message, restoring the expected behavior of importing the full statement.
Original PR description
**This is a backport of** https://github.com/odoo/enterprise/commit/f0e2cd2bd9ed89ab2cb961106869088a771d212a **PROBLEM** When importing bank statements from the dashboard, it only imports the first…
**This is a backport of** https://github.com/odoo/enterprise/commit/f0e2cd2bd9ed89ab2cb961106869088a771d212a **PROBLEM** When importing bank statements from the dashboard, it only imports the first batch (by default the first 2000 lines) instead of importing the whole file. This is inconsistent with the behavior of the import done from the reconcilation page. Also, on the import page, the file name is incorrect (it's always `bank_statement_import.csv`) **STEP TO REPRODUCE** 1. install the accounting module 2. goes on the dashboard, click on the 3-dot button on the kanban for the bank account, and import a file. 3. make sure the file will be imported in multiple batches (reduced the batch size if necessary) and click on import. 4. notice how only the first batch was imported. **CAUSE** In python, The `AccountBankStmtImportCSV` class override the execute_import method of the `base_import.import`. In this override, we add a entry in the `messages` list. (see `enterprise/account_bank_statement_import_csv/models/account_bank_statement_import_csv.py`) In JS, all entry in messages are treated as errors, and the import is interrupted. (see `odoo/addons/base_import/static/src/import_model.js`) The message entry added in the python was used in the past to automatically open the reconcillation page with the statement lines added. This feature was removed, but not the message. **FIX** Remove the problematic message entry. opw-4823808 opw-5441739
A recent change in how the two-factor authentication copy button is created caused it to stop working. This update corrects the button's functionality, ensuring users can reliably copy their secret key. The fix removes a dependency and adds a necessary listener to the button.
Original PR description
__Problem__ Since odoo/odoo@e3da5f1 the onclick listener set on `copyButton` is lost because we give the HTML of the body as argument at the dialog creation. __Steps to reproduce__ 1. Go to `/my/security` 2. Click on "Enable two-factor authentication" 3. Confirm password 4. Click on "Cannot scan it?" 5. The "Copy" button doesn't work __Fix__ - Inherit from `InputConfirmationDialog` to add a listener to the button. - At the same time, remove the remaining jQuery dependency in this part of the code
This pull request reverts a recent change that introduced a proforma bill report on the customer portal. This change was causing confusion and unnecessary complexity for users. The reversion restores the previous functionality, ensuring a simpler and more straightforward experience for customers.
Original PR description
This reverts commit e4e3bf63d413a6e41e28eab37c4ef51a94f9fc1e.