Daily updates from Odoo
Wednesday, March 4, 2026
260 changes
41 changes
Resolved 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
This update resolves an issue where product variant pricelists were incorrectly storing data after a rule was removed. Specifically, the ‘product_tmpl_id’ field wasn't being reset, leading to data inconsistencies. The fix ensures that the data is properly updated when a pricelist rule is deleted, maintaining accurate product pricing information.
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
A slow process for adding attribute values to products was identified and resolved. The update utilizes more efficient database searching techniques, reducing the loading time from 8 minutes to 2-3 minutes. This improves the overall user experience for customers managing complex product configurations.
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#251571 Forward-Port-Of: odoo/odoo#232149
This update fixes an issue where landed costs weren't correctly applied to subcontracted products, resulting in inaccurate product valuations and missing journal entries. The fix ensures landed costs are properly linked to the subcontracted manufacturing order, leading to accurate valuation updates and the creation of necessary account move lines.
Original PR description
…bcontracted **Problem:** Landed cost added on the receipt of a subcontracted product do not increase the valuation of the product and do not create account move lines. **Steps to reproduce:** -…
…bcontracted **Problem:** Landed cost added on the receipt of a subcontracted product do not increase the valuation of the product and do not create account move lines. **Steps to reproduce:** - create a tracked product with avco perpetual category - create a subcontracted bom for this product with no comp - create and confirm a PO for 10 unit of this product at a unit price of 1$ with the same partner as the subcontractor of the bom - validate the receipt - navigate to inventory/operations/adjustments/landed costs - create a new landed cost - select the receipt from the PO - add a landed cost of 10$ and validate - navigate to inventory/reporting/stock - search for your product and click on the unit cost **Current behavior:** 1) the valuation of the product was not increased by the value of the landed cost 2) open journal items : no account move lines were created for the landed cost **Expected behavior:** 1) the valuation of the product should have been increased: in the unit cost view, the SBC move should have gone from a value of 10 to 20 2) account move lines should have been created with a value of 10 **Cause of the issue:** both issues come from the fact that when creating the stock valuation adjustment line, the move linked is the receipt move when it should be the move of the subcontracted MO linked to the receipt. **fix:** if we create the adjustement line with move_id as the move of the MO (instead of the move of the receipt as it is the case currently) : when button_validate is called on the landed cost : - when using the remaining quantity, it will be the correct one (in our case 10, instead of 0 for the move of the receipt because it's actually an internal move) so the account move line are going to be created https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_landed_costs/models/stock_landed_cost.py#L129-L130 https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_landed_costs/models/stock_landed_cost.py#L372-L373 which solves problem 2) - when calling _set_value on the move (which will be the move of the MO thanks to this fix), https://github.com/odoo/odoo/blob/064407d32f998ceb08601f9e0a6356c94ad10347/addons/stock_landed_costs/models/stock_landed_cost.py#L152 get_value_data will call _get_value_from_extra, https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_account/models/stock_move.py#L392 which uses _get_landed_cost to fetch the landed cost https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_landed_costs/models/stock_move.py#L18 before this fix the landed cost created from the receipt were linked to the receipt move so they were not fetched inside _get_landed_cost which caused problem 1) but now the move_id of the adjustment lines is the move of the MO so they are fetched inside _get_landed_cost https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_landed_costs/models/stock_move.py#L7-L12 So now the adjustment lines do impact the valuation of the move of the MO which solves problem 1) opw-5723126 Forward-Port-Of: odoo/odoo#248469
This update fixes an issue where modifying production quantities in a Manufacturing Order would incorrectly create duplicate work orders. The change ensures that work orders are correctly updated instead of duplicated, maintaining accurate production tracking. This improves the reliability of the MRP process.
Original PR description
Steps to reproduce: 1. Create a product and two BoMs: BoM A (with operations) and BoM B (empty). 2. Create a Manufacturing Order (MO) for the product selecting BoM A. 3. Switch BoM A to BoM B, then…
Steps to reproduce:
1. Create a product and two BoMs: BoM A (with operations) and BoM B (empty).
2. Create a Manufacturing Order (MO) for the product selecting BoM A.
3. Switch BoM A to BoM B, then switch back to BoM A.
4. Modify the production quantity field. -> New operation lines are appended every time the quantity is changed.
The issue occurred because _compute_workorder_ids used 'wo.ids' to filter existing workorders. In the "Draft" state (UI/onchange), records exist as "virtual records" (NewIds). For these records, .ids returns an empty list [], which evaluates to False in Python.
Consequently, the existing virtual workorders were filtered out of the dictionary used to map operations to existing lines. The logic assumed the lines didn't exist and used Command.create() instead of Command.update(), causing duplication. Similar issues existed where 'NewIds' were ignored during BoM swaps, leaving "phantom" records in the cache.
Solution:
Removing the '.ids' check and using '.mapped('id')' ensures the computation remains "virtual-aware" and stable across sequential onchanges.
TECHNICAL JUSTIFICATION:
In Odoo 18.0, the ORM explicitly supports using Command.update and Command.delete with virtual records (NewIds) without an origin. This is handled by the 'write_new' method in relational fields:
- Virtual browse wraps IDs in NewId: https://github.com/odoo/odoo/blob/f688c6b66310438fa3e36a207770a63d0d8fffa5/odoo/fields.py#L4826-L4855
opw-5489862
Forward-Port-Of: odoo/odoo#24699516 changes
Resolved 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
This update corrects a bug where related fields within many2one chains were displaying the wrong model data. Specifically, when creating a chain with duplicate field names, the popover would incorrectly show fields from a different model. This issue was caused by a recent update to support properties in field definitions.
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
This update resolves a minor visual issue with the select menu in Odoo, specifically addressing styling inconsistencies when scrolling. The fix ensures a consistent and polished appearance for the select menu across the base and base_import modules. This improves the overall user experience.
Original PR description
Before this commit, the select menu with its dropdown opened had a little style issue when scrolling base_import's select menu had also a style which was a bit off. After this commit, those are fixed part-of-task-5935511 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
2 changes
Resolved 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#10908111 changes
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
This update expands the color field options within the Odoo Gantt editor, allowing users to select all integer fields for color customization. Previously, the color field was limited to fields already present in the view. This change provides greater flexibility for visualizing project timelines and tasks.
Original PR description
Before this commit, only fields already present in the view were selectable for the color field in the gantt editor. After this commit, all int fields of the model are available task-5981029
This update resolves a problem with the CSV reports generated for Peru (l10n_pe_reports) that was triggered by a recent Python update. The fix ensures the reports are correctly formatted, preventing errors during export. This improves the reliability of financial reporting for our Peruvian customers.
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#109081This update adds the street number to the demo company data for Denmark (l10n_dk). This is necessary to ensure accurate reporting and integration with nemhandel, a key payment processing system, improving the demo data's realism and usefulness for testing and demonstration.
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 credit notes incorrectly rounded prices, leading to discrepancies in accounting. The change ensures that credit notes accurately reflect the original purchase price, regardless of rounding settings. This improves financial accuracy and reduces potential errors.
Original PR description
**Steps to reproduce:** - Setup a rounding of 0.05 - Add it to the PoS settings, turn on the only for cash setting - Make a purchase for 13.01, pay by card - Go to the backend, we have the correct price of 13.01 - Revert the invoice by making a credit note - The price is only 13.00 and we have a rounding of -0.01 **Why the fix:** When making a credit note, we round the price if we find a rounding method, not taking the **only_round_cash_method** setting into account. After this commit, we now check if the reversed entry (the invoice) has a rounding line. If it does not, we skip the rounding. If a rounding is found on the reversed entry, we still round the current account move. opw-5871514 Forward-Port-Of: odoo/odoo#249894 Forward-Port-Of: odoo/odoo#247617
2 changes
Resolved 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#109081This update resolves an issue where the Documents app would crash after deleting a payslip run. The fix ensures that related documents are also removed when a payslip run is deleted, preventing data inconsistencies and improving application stability. This change addresses a technical bug impacting user experience.
Original PR description
### Issue: When deleting a payslip run, the documents from the payslips of the run are not deleted. This results in a traceboack when opening the document app. ### Steps to reproduce: - Have a…
### Issue: When deleting a payslip run, the documents from the payslips of the run are not deleted. This results in a traceboack when opening the document app. ### Steps to reproduce: - Have a payslip run with payslips - Go to a payslip, validate and generate the document - Then cancel and reset to draft - Reset the Payslip Run to draft - Delete it - Open the Documents app ### Cause: The payslips are linked to the run with a `ondelete='cascade'` relation. https://github.com/odoo/enterprise/blob/03b2a7dae0e5c5ad3142ec2da8f3de5c9b1957f4/hr_payroll/models/hr_payslip.py#L110-L113 This means that deleting the run also deletes its payslips on a database level, bypassing the ORM. As the document is not directly linked by a relational field but instead by `res_model` and `res_id`, these fields are not updated and therefore are still pointing to a record that is no longer in DB. ### Solution: Extend the `unlink()` method in `hr.payslip.run` and unlink the documents there. opw-5501061 Forward-Port-Of: odoo/enterprise#105969
11 changes
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
This update corrects a minor issue preventing users from editing date input fields within the HR payroll module. The change ensures the relevant popover is displayed before the input field is cleared, restoring full functionality. This resolves a temporary disruption to payroll processing.
Original PR description
With this additionnal step in tour, we ensure the popover is opened before clear the input. If we not wait for this, the input can be no longer editable. runbot-error-id~234440 Forward-Port-Of: odoo/enterprise#109346
This update corrects a technical issue within the Odoo Enterprise payroll module that could cause inconsistencies between payslip data. The fix ensures that all payroll line codes are synchronized, preventing potential errors in payroll calculations and reporting. This improves the accuracy and reliability of payroll processing.
Original PR description
Forward-Port-Of: odoo/enterprise#109280 Forward-Port-Of: odoo/enterprise#108729
This update corrects a bug where salary inputs weren't properly copied when creating duplicate selections. Previously, this prevented certain salary calculations from working correctly. The fix ensures that all necessary selection options are now accurately reflected, improving payroll accuracy and functionality.
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#109277 Forward-Port-Of: odoo/enterprise#106488
8 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#109081A bug was causing a validation error when simultaneously updating the fiscal year's last month and last day for a company and its branches. This fix ensures that all changes are applied before the system checks for constraints, preventing the error and allowing users to correctly configure fiscal year settings. This improves the reliability of accounting configurations.
Original PR description
Having a parent company and a chid company selected, and changing both the last day and the last month of the fiscal year as the same time raises a ValidationError. This is because in this case, in the write we successively modify each changed delegated fields from root company to the branches. Then, when checking the constrains we loop through all delegated fields and check if the value of the branches are the same as the root company. This check triggers the error as all values are not set yet. By using a write on branches for all changed delegated fields instead of a simple assignation, the constrains check occurs once all the value have been updated. Steps: - Have a root company and a branch - Select both in company selector - Go to Accounting configuration - Change fiscalyear last month AND ast day at the same time - Save -> ValidationError in `_check_root_delegated_fields` opw-5431145
This update resolves a runtime error that occurred when generating the stock forecast report. Specifically, the report was failing due to an issue with how stock movements were being processed during delivery transfers. This change ensures the report generates correctly, preventing data inaccuracies.
Original PR description
This reverts commit 2b2d73df420baee4fec1c51c28250666d80b48b8. ## How to reproduce (in runbot): - Create Product P - Create Delivery transfer from 'WH/Stock/Shelf 1' - Open Forecast report: =>…
This reverts commit 2b2d73df420baee4fec1c51c28250666d80b48b8.
## How to reproduce (in runbot):
- Create Product P
- Create Delivery transfer from 'WH/Stock/Shelf 1'
- Open Forecast report:
=> RuntimeError: dictionary changed size during iteration
The original fix will be redone in another commit.
---
## Traceback:
```
File "/data/build/odoo/addons/stock/report/stock_forecasted.py", line 21, in get_report_values
'docs': self._get_report_data(product_ids=docids),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/stock/report/stock_forecasted.py", line 128, in _get_report_data
res['lines'] = self._get_report_lines(product_template_ids, product_ids, wh_location_ids, wh_stock_location)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/stock/report/stock_forecasted.py", line 359, in _get_report_lines
for product_id, location_id in currents:
RuntimeError: dictionary changed size during iteration
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#2517689 changes
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.
This update fixes a bug where settings weren't appearing in the search results when accessed from different app tabs. The change ensures all settings are searchable regardless of the currently selected tab, improving the user experience and search accuracy.
Original PR description
**Problem:** Searching for text that only exists in a setting's sub-field content (e.g., "qr" matching "Add QR-code link on PDF") fails to find the setting when searching from a different app tab in…
**Problem:** Searching for text that only exists in a setting's sub-field content (e.g., "qr" matching "Add QR-code link on PDF") fails to find the setting when searching from a different app tab in General Settings. The same search works when already on the correct app tab. **Steps to reproduce:** 1. Open Settings (General tab is selected) 2. Search for "qr" 3. "Invoice Online Payment" setting is not found 4. Navigate to Accounting settings tab 5. Search for "qr" again 6. Now the setting appears **Current behavior:** Settings from non-selected apps are not found when the search term only matches sub-field content (text inside the setting body). **Expected behavior:** Search should find settings across all apps regardless of which tab is currently selected. **Cause of the issue:** SearchableSetting collects search labels in two phases: the setting's own label and help text during setup(), and sub-field text from span[searchableText] DOM elements during onMounted(). However, visible() is evaluated during render via t-if, which runs before onMounted. When an app first renders due to a search (it was previously unrendered because its tab wasn't selected), visible() only has the incomplete label set and returns false, preventing the setting div from rendering. This creates a chicken-and-egg problem: the DOM needed for label collection never exists because visibility check fails without those labels. **Fix:** A reactive labelsReady flag defers visibility filtering until onMounted has had a chance to collect all DOM-based labels. On the initial render, visible() returns true unconditionally so the DOM exists for label collection. The state change then triggers a proper re-render with the complete label set. opw-5946625
This update automatically groups vendor bills during UBL/CII import based on the vendor's previous billing patterns. The system now checks the last posted bill to determine if lines should be grouped by tax, streamlining the import process and reducing manual effort. Additionally, this fix includes improvements for sale moves and PDF generation.
Original PR description
[FIX] account_edi_ubl_cii: automate bill line grouping
This commit automates vendor bill line grouping during import based on the vendor's most recent posted bill.
- Logic: Added `_has_lines_grouped()` to `account.move` to detect if lines follow the grouping pattern.
- Heuristic: During UBL/CII import, the system now checks the last posted bill from the same vendor; if it was grouped, the new bill is automatically grouped by tax.
task-5979667