Daily updates from Odoo
Monday, June 22, 2026
376 changes
24 changes
New functionality added to Odoo
This update expands Odoo's capabilities by integrating new food delivery providers – including Talabna, Mandoob, and DiDi Food – for use in various countries. It also backports existing delivery provider integrations, broadening the system's reach and offering more options for restaurants and delivery services.
Original PR description
In this commit: - We are introducing new delivery providers like Talabna, Mandoob, Snoonu, DiDi Food and Zyada for different countries and backporting Radyes, ToYou, The Chefz, InstaShop and Smiles. Task-6263289,6263272,6263203,6263165,6310690 Forward-Port-Of: odoo/enterprise#121051 Forward-Port-Of: odoo/enterprise#119537
Enhancements to existing features
This update expands the data sent to payment processing systems (Powens and Saltedge) by including debtor and creditor information. This change is necessary to correctly initiate payments and improve integration with these external payment gateways.
Original PR description
In order to be able to initiate payments using Powens and Saltedge, we need to include debtor information in the payload sent to Odoofin. This commit adds the necessary fields and updates the tests accordingly. Task ID: 5977148, 6095729 Forward-Port-Of: odoo/enterprise#119843
This update enhances the visual appearance of receipts and preparation tickets within the Point of Sale and Stock modules. Specifically, font styling has been improved, and table numbers on preparation tickets now include floor information, making them easier to read and understand for staff.
Original PR description
In this commit - --------------- Enhanced font styling for receipt and preparation ticket Added floor information next to table number on preparation ticket Task - 6125322 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270068 Forward-Port-Of: odoo/odoo#260559
Resolved issues and error corrections
This update resolves an issue where users couldn't complete delivery preset orders in self-ordering mode if the Google Places API key wasn't set up. Now, the system automatically fills in addresses via the API if the key is present, or accepts manual address entry if it's not. This ensures a smoother ordering experience for all users.
Original PR description
Before this commit: =================== If the Google Places Autocomplete API key was not configured for the company, users could not proceed with delivery preset orders in self-ordering mode because the complete address could not be retrieved from the API. After this commit: ================== - If the API key is configured: The address is fetched using the Google Places Autocomplete API. - If the API key is not configured: The system accepts the address entered manually by the user. task-6213436 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an error in the Luxembourg eCDF XML export that was causing incorrect financial year data. Specifically, an issue with account 142 was resolved by removing it from the export mapping, ensuring accurate reporting on the Odoo Profit and Loss visualization. A new test has been added to verify the fix.
Original PR description
Issue: Users reported that the financial year result in the XML export for the Luxembourg eCDF platform is incorrect, despite being correct in the Odoo Profit and Loss visualization. The exported XML populated incorrect amounts in cell 0161 under certain circumstances (namely, in the case of an explicit entry from account 999999 to account 142000). Solution: * Removed account 142 entirely from both the `ACCOUNTS_2019` and `ACCOUNTS_2020` dictionaries so it no longer auto-populates cells 0161/0162 (up to 2019 included) and 2955/2956 (from 2020 onward). * Removed the 2019 threshold condition in the loop bypass for account 142. * Removed the hard-coded manual pop for cell 2955 since it has been removed from the mapping. * Deleted the redundant reassignment of `net142` in the loss calculation block. Ticket [link](https://www.odoo.com/odoo/project.task/6059571) opw-6059571 Forward-Port-Of: odoo/enterprise#121010
This update resolves an issue where the inventory valuation closing entry incorrectly calculated accounting balances for companies with multiple stock locations. The fix ensures the closing entry accurately reflects the stock valuation for each company, preventing discrepancies in accounting balances. This ensures accurate financial reporting across all company setups.
Original PR description
**Steps to reproduce on a new db:** (bug also reproducable on runbot but the impact is less easy to compute because of influence of other existing companies) - create a new company as company 2 and…
**Steps to reproduce on a new db:** (bug also reproducable on runbot but the impact is less easy to compute because of influence of other existing companies) - create a new company as company 2 and use the existing default company as company 1. - create a warehouse for both company - for both comp, in settings for the 'fiscal localization' set Package : Generic Chart of account, if not already set (to have account journals). - for both comp, in settings for inventory valuation set 'periodic' and for periodic valuation set 'daily' From company 1 : - create a storable product with standard price method and set a cost of 30 - set an onhand quantity of 1 if you navigate to 'inventory valuation' you'll see that : - initial balance is 0 - ending stock is 30 - the variation lines have a balance of 30 - all of this is expected From company 2 : - change the cost of the product to 10 - set an onhand quantity of 1 if you navigate to 'inventory valuation' you'll see that : - initial balance is 0 - ending stock is 10 - the variation lines have a balance of 10 - all of this is expected From any company : - navigate to 'scheduled actions' and select the action 'Stock Account: Inventory Valuation Closing' - click on 'Run Manually' - navigate to 'inventory valuation' **Current behavior:** with company 1 selected : - the initial balance is now 30 - ending stock still 30 - no variation lines - the initial balance was correctly increased by the closing entry with company 2 selected: - the initial balance is now 40 - the ending stock is still 10 - the variation lines credit 30 in stock valuation In company 2 the closing entry debitted 40 in stock valuation instead of 10 which increased the initial balance to 40 instead of 10 If you open the journal items you'll find the closing amls have a balance of 40 instead of 10 **Cause of the issue:** The _cron_post_stock_valuation() method calls action_close_stock_valuation() on both companies https://github.com/odoo/odoo/blob/bfa39854e56da4bf23295d62f63d66973ad0d78e/addons/stock_account/models/res_company.py#L143-L144 This methods calls _action_close_stock_valuation with a context modified with only self.env.company.ids in 'allowed_company_ids' https://github.com/odoo/odoo/blob/bfa39854e56da4bf23295d62f63d66973ad0d78e/addons/stock_account/models/res_company.py#L56 This is needed because inside stock_value() we use the total value of the product https://github.com/odoo/odoo/blob/bfa39854e56da4bf23295d62f63d66973ad0d78e/addons/stock_account/models/res_company.py#L92 which will be the sum of the values of the product for each company inside allowed_company_id https://github.com/odoo/odoo/blob/bfa39854e56da4bf23295d62f63d66973ad0d78e/addons/stock_account/models/product.py#L274 So in case action_close_stock_valuation() was called from the 'generate entry' button from the inventory valuation view we need only the main company selected to be in the 'allowed_company_ids' so that the inventory value is computed based only on this company (as is the accounting value). The problem is that this does not work when calling the method from _cron_post_stock_valuation because then there is no 'allowed_company_ids' in the context (because it was called from _process_job() with a new env). so self.env.company will be the company of the user which will be company 1. https://github.com/odoo/odoo/blob/bfa39854e56da4bf23295d62f63d66973ad0d78e/odoo/orm/environments.py#L243 Therefore when _action_close_stock_valuation will be called on company 2, in the context, allowed_company_ids will be company 1. Then, when computing 'products', with_company() will add self (company 2) to the context. https://github.com/odoo/odoo/blob/616e82d7b3a53b1facf481e783baed3e99393d3c/addons/stock_account/models/res_company.py#L151-L152 So stock_value will return the sum of the total_value of each product for company 1 and company 2 which is 40 (instead of 10 for just company 2) https://github.com/odoo/odoo/blob/616e82d7b3a53b1facf481e783baed3e99393d3c/addons/stock_account/models/res_company.py#L242 We then create the closing accounting entry to match the accounting value with the stock value, which explains why the new initial accounting balance of company 2 is 40. **fix:** We set the context using self instead of self.env.companies This makes more sense as both in the cron use case and the generate entry use case the stock value we want is the one of the company in self. - In cron use case, it's obvious as the method is called in a for loop on each company - In the generate entry use case, self will also be the main company, because it's called, in actionGenerateEntry, on this.companyId https://github.com/odoo/odoo/blob/616e82d7b3a53b1facf481e783baed3e99393d3c/addons/stock_account/static/src/stock_valuation/controller.js#L75 which is computed based on the get_report_values https://github.com/odoo/odoo/blob/616e82d7b3a53b1facf481e783baed3e99393d3c/addons/stock_account/static/src/stock_valuation/controller.js#L21 https://github.com/odoo/odoo/blob/616e82d7b3a53b1facf481e783baed3e99393d3c/addons/stock_account/static/src/stock_valuation/controller.js#L28-L30 Which returns the main company https://github.com/odoo/odoo/blob/616e82d7b3a53b1facf481e783baed3e99393d3c/addons/stock_account/report/stock_valuation_report.py#L29 Most importantly, this is also aligned with how the accounting values are computed. https://github.com/odoo/odoo/blob/616e82d7b3a53b1facf481e783baed3e99393d3c/addons/stock_account/models/res_company.py#L103-L105 opw-6237402 Forward-Port-Of: odoo/odoo#269152 Forward-Port-Of: odoo/odoo#266932
A bug preventing users from adding cover images to Knowledge articles has been resolved. The issue stemmed from a missing callback function during the upload process, causing the upload to fail. This update ensures cover images can now be successfully added, improving the article creation workflow.
Original PR description
Steps to reproduce: 1. Install Knowledge. 2. Create an article. 3. Open the more actions menu. 4. Click "Add Cover". 5. Upload a cover image. Issue: - The upload crashes with the following traceback:…
Steps to reproduce: 1. Install Knowledge. 2. Create an article. 3. Open the more actions menu. 4. Click "Add Cover". 5. Upload a cover image. Issue: - The upload crashes with the following traceback: `Uncaught Promise > this.props.setAbortUploadsCallback is not a function` Cause: - `KnowledgeCoverSelector` extends the html_editor `ImageSelector`, whose upload flow registers an abort callback through setAbortUploadsCallback. The generic MediaDialog provides this callback, but KnowledgeCoverDialog renders KnowledgeCoverSelector directly and did not pass it. As a result, the inherited upload flow called a missing prop. Solution: - Pass setAbortUploadsCallback from KnowledgeCoverDialog to KnowledgeCoverSelector and abort pending uploads when the cover dialog is discarded. Alternative approach: - Make ImageSelector tolerate callers that do not provide setAbortUploadsCallback by calling it with optional chaining. opw-6176716 Forward-Port-Of: odoo/enterprise#120467 Forward-Port-Of: odoo/enterprise#116906
This update resolves an issue preventing correct XML export of balance sheets for Luxembourg companies (l10n_lu_reports) in version 19.3. The system now automatically includes a 'date_from' field, aligning with the updated balance sheet format introduced in 19.2, ensuring accurate financial reporting.
Original PR description
Steps to reproduce: - setup a LU company - go to balance sheet - export the xml file - validate the wizard -> Traceback, because the code expects the options to contain the date_from, which is no longer the case since 19.2 as the balance sheet has by default only a date_to. The solution is therefore to define it for the export to the beginning of the fiscal year. Forward-Port-Of: odoo/enterprise#120843
This update optimizes how Odoo searches for documents, specifically addressing a slow and complex query when filtering by 'SHARED'. The change aligns with the production database's approach, resulting in faster search speeds and a more efficient system. This improves the overall user experience when searching for documents.
Original PR description
Searching for "not 'SHARED'" results in a very complex query. Our own production DB prefers this implementation, also easier to read. credit: https://github.com/odoo/enterprise/pull/105915#discussion_r2745148099 Task-5893183 Forward-Port-Of: odoo/enterprise#120870
This update ensures the 'pdp_identifier' field is correctly populated during company partner registration, particularly when using the PEPPOL EAS standard. Previously, the field would be left blank, causing issues with registration. Now, a user error message will appear if an invalid identifier is entered, preventing incorrect data and improving the registration process.
Original PR description
Currently when the company partner uses non 0225 peppol EAS the `pdp_identifier` field is `False`. Thus the (related) identifier field on the registration wizard is left empty. Also add a UserError when writing an invalid identifier to the `pdp_identifier` field instead of just silently failing. That way an error ill pop up in the registration wizard when trying to register with an invalid identifier. task-6307489 Forward-Port-Of: odoo/odoo#270915 Forward-Port-Of: odoo/odoo#270330
This update fixes an issue where marking a work order as 'done' multiple times caused an error. Previously, users could repeatedly set work orders to 'done' status, now the system correctly handles this scenario, ensuring data integrity and preventing unexpected errors. This improves the reliability of the manufacturing workflow.
Original PR description
When setting the done state on an already done WO, a traceback is raised. Steps to reproduce the error: - Install ``mrp_workorder`` module with demo data - Go to Manufacturing > Open any confirmed MO…
When setting the done state on an already done WO, a traceback is raised. Steps to reproduce the error: - Install ``mrp_workorder`` module with demo data - Go to Manufacturing > Open any confirmed MO > In Work Orders Tab, Set the status to Done, again set the status to Done Traceback: ```py UnboundLocalError: cannot access local variable 'wo' where it is not associated with a value ``` As long as the MO is not in the done state, the dropdown for the workorder status remains visible, allowing users to mark an already done WO as done again. In this case, the WO is not added to "ids_to_update" list at [1], so ``action_mark_as_done`` is called on an empty workorder recordset at [2], For ``self`` containing no records, ``wo`` is never defined, leading to the above traceback from the following line. https://github.com/odoo/enterprise/blob/3c4f44f316625f3315d176adfad5e1f1a6bea00a/mrp_workorder/models/mrp_workorder.py#L842 [1]: https://github.com/odoo/odoo/blob/afca863b750ec58f5414a5d47e2e2a64e3eba598/addons/mrp/models/mrp_workorder.py#L168-L176 [2]: https://github.com/odoo/odoo/blob/afca863b750ec58f5414a5d47e2e2a64e3eba598/addons/mrp/models/mrp_workorder.py#L184-L185 sentry-7477198216
This update clarifies timesheet reporting by changing how the automated rule for GitHub Pull Requests is displayed. Previously, the rule showed the Pull Request ID, which was confusing for users. Now, the rule displays the Pull Request name, making it easier to connect the event to the relevant project or task.
Original PR description
Before this commit, the AW Rule used in Timesheets Assistant will display the id of the Github Pull request and the repository but that information is not always clear for the user to know which project/task is related to that PR. This commit changes the AW rule for Github to display the name of the pull request instead to have more context to easily match the project/task to the event created by that rule. task-6306166 Forward-Port-Of: odoo/enterprise#120676
This change fixes a bug that prevented users from correctly marking work orders as 'done' when they were already marked as done. The fix updates a key condition to accurately reflect the state of the manufacturing order, preventing an error and ensuring accurate status tracking. This improves the reliability of the MRP process.
Original PR description
When setting the done state on an already done WO, a traceback is raised. Steps to reproduce the error: - Install ``mrp_workorder`` module with demo data - Go to Manufacturing > Open any confirmed MO…
When setting the done state on an already done WO, a traceback is raised. Steps to reproduce the error: - Install ``mrp_workorder`` module with demo data - Go to Manufacturing > Open any confirmed MO > In Work Orders Tab, Set the status to Done, again set the status to Done Traceback: ```py UnboundLocalError: cannot access local variable 'wo' where it is not associated with a value ``` https://github.com/odoo/odoo/blob/afca863b750ec58f5414a5d47e2e2a64e3eba598/addons/mrp/static/src/components/wo_list_view_dropdown/wo_list_view_dropdown.xml#L4-L5 In the commit [1], condition was changed from ``state`` to ``production_state``. ``production_state`` is the related to the state of MO, So, as long as the MO is not in the ``done`` state, the dropdown remains visible, allowing users to mark an already done WO as done again. In this case, the WO is not added to ``ids_to_update`` list at [2]. so ``action_mark_as_done`` is called on an empty workorder recordset at [3], leading to the above traceback from following line https://github.com/odoo/enterprise/blob/3c4f44f316625f3315d176adfad5e1f1a6bea00a/mrp_workorder/models/mrp_workorder.py#L842 [1]: https://github.com/odoo/odoo/commit/5b1197647b558eacd501fdd816056cfd56f45ced [2]: https://github.com/odoo/odoo/blob/afca863b750ec58f5414a5d47e2e2a64e3eba598/addons/mrp/models/mrp_workorder.py#L168-L176 [3]: https://github.com/odoo/odoo/blob/afca863b750ec58f5414a5d47e2e2a64e3eba598/addons/mrp/models/mrp_workorder.py#L184-L185 sentry-7477198216 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a requirement in the Danish Nemhandel invoicing format, specifically within the AllowanceCharge node. The change adds a necessary TaxCategory node to ensure compliance with UBL standards. This resolves an issue identified during Nemhandel testing, improving invoice compatibility.
Original PR description
Add the TaxCategory node in AllowanceCharge node as it's a requirement for some UBL format. It has been spoted with Nemhandel, as it requires a single tax category in the AllowanceCharge. no-task Forward-Port-Of: odoo/odoo#270351
This update prevents errors in e-Waybill requests when the dispatch and delivery locations share the same pin code. Previously, the system couldn't automatically calculate distance in these cases, leading to incomplete requests. Now, a distance must be provided, ensuring accurate e-Waybill generation and avoiding server issues.
Original PR description
Prevent sending incomplete e-Waybill requests to the GSP server when the dispatch and delivery pincodes are identical. In such cases, the distance cannot be automatically determined and must be provided explicitly. This commit adds a validation to ensure a distance is set before generating the e-Waybill, avoiding incomplete requests and subsequent server-side errors. task-6234343 Forward-Port-Of: odoo/odoo#270495 Forward-Port-Of: odoo/odoo#268497
This update prevents logged-in users from attempting to sign up or log in through the website's signup page. Previously, submitting the form would result in an error. Now, a warning message appears, and the button is disabled, ensuring users can only access these features when not already authenticated.
Original PR description
Steps to reproduce: 1.Log in to the backend as an Admin (or any authenticated user). 2.Navigate to Website -> Configuration -> System Pages and open the Signup page. 3.Fill in the signup form and submit it. 4.After successfully signing up, click the Logout button. 5.Observe that a "405 Method Not Allowed" error is displayed. Before this commit: When an already logged-in user accessed the signup page through the System Pages menu and submitted the signup form, clicking the Logout button afterward resulted in a 405 Method Not Allowed error. After this commit: When an already logged-in user accesses the signup or login page, a warning message is displayed and the Sign Up or Log In button is disabled, preventing the form from being submitted. task-6023075 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270911 Forward-Port-Of: odoo/odoo#263791
This update resolves an issue where tasks created through Timesheets Assistant Rules were incorrectly set as private. The fix ensures that a project is automatically associated with new tasks, preventing them from being created without a designated project. This improves task organization and reporting within the Timesheets module.
Original PR description
Steps to reproduce: - Install Timesheets and enable Timesheets Assistant. - Go to Timesheets -> Configuration -> Assistant Rules. - Open an existing rule or create a new one. - Select a Project and enter a new Task name. Issue 1: - Click Create. - The task is created as a private task, and the project is cleared. Issue 2: - Click Create and Edit. - Remove the project and save. - The task is saved as a private task. Cause: - When using Create, the `default_project_id` from the context is not applied, so the task is created as a private task. - When using Create and Edit, users can remove the prefilled project before saving, which also results in a private task. Fix: - Pass `default_project_id` and `form_view_ref='project.view_task_form_res_partner'` in the context. This prefills the project and makes it required when creating a task. task-6293306 Forward-Port-Of: odoo/enterprise#120862
This update resolves an issue where DIAN XML files for Point of Sale (PoS) payments were being rejected due to incorrect calculations of prepaid amounts. The fix combines payment amounts into a single tag, ensuring accurate data transmission to the DIAN and preventing errors related to negative payment lines.
Original PR description
**Steps to reproduce:** To test this, you will need an official DIAN setup, because this error comes from the response to our API call to the DIAN. - Setup the DIAN in a colombian company - Open the…
**Steps to reproduce:** To test this, you will need an official DIAN setup, because this error comes from the response to our API call to the DIAN. - Setup the DIAN in a colombian company - Open the PoS - Order a product - Before paying, make the amount we are paying bigger than the amount due - We get an error response from the API, the error is saying that the total due does not match what we paid **Why the fix:** Currently, the xml is rejected because the sum of the **PaidAmount** in the **PrepaidPayment** tag is not equal to what we are trying to pay for. This is happening because to avoid the fact that we can not send a line with negative amount, we used the **abs()** function on the line amount to make it positive. The negative line comes from the fact that when we have a total due that is below the amount paid, we create a new payment line with a negative amount to balance it out. But as we can't send lines with negative amount, we needed to make it positive. This does not work, as the sum of the lines' amount will then be too much compared to what we are paying for, because instead of substracting it we will be adding it. To avoid this, we now group the amount in one single tag and send it this way. This ensures that the sent amount is correct and equals the amount due, and does not send a negative line. opw-6232575 Forward-Port-Of: odoo/enterprise#121075 Forward-Port-Of: odoo/enterprise#119255
This update fixes an issue where product images didn't display in the correct order when using the grid layout in the product image viewer. The change ensures images are navigated in their intended visual order, providing a better user experience for browsing products. This was caused by a recent layout update and has been corrected to align with the user's visual expectations.
Original PR description
This commit ensures product images follow their visual order in the product image viewer when using the grid layout. Steps to reproduce: - Open a product page with multiple images (or add Extra Media…
This commit ensures product images follow their visual order in the product image viewer when using the grid layout. Steps to reproduce: - Open a product page with multiple images (or add Extra Media to the product) - Change layout mode to "Grid" and click save - Click any image to open the product image viewer - Navigate between images Images do not follow the visual left-to-right order. This regression was introduced by [commit], which replaced the row-based grid with a column-first layout. As a result, `querySelectorAll` returns images in DOM order, which no longer matches the visual order. To fix this, images are now reordered based on their visual placement in the grid so navigation matches the order seen by the user. Images are traversed in visual left-to-right order while also accounting for varying image heights and multi-column alignment. [commit]: https://github.com/odoo/odoo/commit/9a3628b9735550bf8ecc2252ea1b7338f68ab966 task-[4364143](https://www.odoo.com/odoo/project/974/tasks/4364143) Forward-Port-Of: odoo/odoo#270732 Forward-Port-Of: odoo/odoo#254077
This update fixes a visual issue in the spreadsheet dashboard where focused buttons were obscured by the surrounding container. The change ensures that buttons have their expected focus shadows, providing a cleaner and more professional user experience. This improves the overall usability of the dashboard.
Original PR description
the searchbar container cropped the shadow of its button when they were focused. Task-6303342 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#270812
This update resolves an issue where invoices with reverse charge VAT in Poland (fa3) were generating incorrect XML files for transmission to the tax authorities (KSEF). Specifically, the XML lacked the necessary information to accurately reflect the reverse charge amount and total sale value. This ensures proper tax reporting and compliance.
Original PR description
**STEP TO REPRODUCE** 1. Create an invoice with a tax with reverse charge (0% EU G for example). 2. Send the invoice to ksef. 3. Open the generated xml, and notice field P_18 is 2 while it should be 1 (because there is reverse charge). Also, there is not P13_10 indicated the total value of sale to which the reverse charge applies. opw-6041836 Forward-Port-Of: odoo/odoo#263764
This update fixes an issue preventing the 'Send to SII' option from appearing on newly generated vendor bills in Chile. The fix adjusts internal code to correctly display this option when a document is generated and awaiting electronic filing, ensuring compliance with Chilean tax regulations. This ensures users can properly submit their electronic invoices.
Original PR description
**Steps to reproduce:** * Install the **l10n_cl_edi** module. * Go to **Accounting → Configuration → CAFs**, create a new CAF, and upload a valid CAF…
**Steps to reproduce:** * Install the **l10n_cl_edi** module. * Go to **Accounting → Configuration → CAFs**, create a new CAF, and upload a valid CAF [XML](https://www.odoo.com/mail/message/1097235975) file. * Create a new **Purchase Journal** with **Use Documents** enabled. * Create a vendor bill using this journal. * Set the **Document Type** to **46 - Liquidación-Factura Electrónica**. * Confirm the vendor bill. **Observed behavior:** * The Send button is not visible on the confirmed vendor bill despite the DTE being generated and `l10n_cl_dte_status` being set to `not_sent`. **Cause:** * `_compute_display_send_button` in `account` only returns `True` for sale documents (`is_sale_document()`), so the "Send" button — which opens the Send & Print dialog containing the "Send to SII" option — was never shown on vendor bills. * `_get_move_constraints` in `account.move.send` unconditionally adds a `not_sale_document` constraint for non-sale documents, blocking the Send & Print dialog from processing vendor bills even if the button were visible. * The cron's `cron_run_sii_workflow` only processes moves with `l10n_cl_dte_status = 'ask_for_status'`, skipping moves still in `not_sent` state. **Fix:** * Override `_compute_display_send_button` in `l10n_cl_edi` to also show the "Send" button on posted moves with `l10n_cl_dte_status == 'not_sent'`, matching the pattern used by `l10n_br_edi`. * Override `_get_move_constraints` in `l10n_cl_edi` to remove the `not_sale_document` constraint for Chilean purchase documents with `not_sent` status, matching the pattern used by `l10n_br_edi`. **REF** During this [refactor](https://github.com/odoo/enterprise/pull/103427/changes/f5617ecf7584cf019897408df94b002622f48d9d), these two methods were inadvertently missed and were not overridden opw-6300571 Forward-Port-Of: odoo/enterprise#120818
This update fixes a potential instability issue with dynamic website content snippets. The change ensures callbacks are properly 'protected' during rendering, preventing unexpected behavior and test failures. This improves the reliability of the website experience.
Original PR description
Commit dcb070244dbcef59cae1e3b1e87ce9030608ce0d changed the registration of callback for re-render of dynamic snippet on window resize. But did not ensure the callback is "protected", like it was implicitely done with `t-on-` in `dynamicContent`. This commit uses `protectSyncAfterAsync` to register the callback, so that is it protected when called again. This lack of "protection" is suspected to cause a non-deterministic failure in `test_shop_editor_no_alternative_products_visibility` where mutations of dom are observed at unexpected times. runbot-939193 Forward-Port-Of: odoo/odoo#271011
This update fixes an error in the delivery note pricing calculation for products tracked by multiple lots. Previously, the price was incorrectly based on only the first lot, leading to inaccurate DDT costs. This change ensures that the total sale price across all lots is correctly reflected on the delivery note, improving financial accuracy.
Original PR description
Steps to reproduce: 1. Install Italian localization and l10n_it_stock_ddt 2. Create a product tracked by lots with a price of 100 3. Create two lots for that product, each with 5 in stock 4. Create a sale order for a quantity of 8 5. Confirm the sale order and validate the delivery 6. Print the delivery note Issue: Only the first lot's sale price is used in the DDT cost calculation (price = 500 instead of 800) Why this happens: The QWeb template used `move.move_line_ids[0].sale_price`, which only reads the sale_price of the first move line. When a delivery is split across multiple lots, each lot produces its own move line, so only the first is considered in the price calculation. opw-6244076 Forward-Port-Of: odoo/odoo#270743 Forward-Port-Of: odoo/odoo#267757
15 changes
New functionality added to Odoo
This update introduces support for several new food delivery providers – including Talabna, Mandoob, and DiDi Food – expanding Odoo's capabilities for restaurants and delivery services. The addition of these providers, along with backports of existing ones, broadens Odoo's reach to support diverse regional markets and customer needs.
Original PR description
In this commit: - We are introducing new delivery providers like Talabna, Mandoob, Snoonu, DiDi Food and Zyada for different countries and backporting Radyes, ToYou, The Chefz, InstaShop and Smiles. Task-6263289,6263272,6263203,6263165,6310690 Forward-Port-Of: odoo/enterprise#121051 Forward-Port-Of: odoo/enterprise#119537
Enhancements to existing features
This update improves the payment process by adding debtor and creditor information to the data sent to Odoofin, which is required for initiating payments through Powens and Saltedge. This change ensures smoother and more complete payment initiation workflows. It's a necessary improvement for supporting key payment integrations.
Original PR description
In order to be able to initiate payments using Powens and Saltedge, we need to include debtor information in the payload sent to Odoofin. This commit adds the necessary fields and updates the tests accordingly. Task ID: 5977148, 6095729 Forward-Port-Of: odoo/enterprise#119843
Resolved issues and error corrections
This update prevents a popover error that occurred when users clicked on notification envelopes in the chatter. The issue stemmed from a missing `res_partner_id` field, which caused a comparison error. This fix ensures notifications display correctly for all users, regardless of whether a partner ID is available.
Original PR description
# How to reproduce - Create an Event registration - Add a follower - Click on the enveloppe icon next to the sender's name in the chatter # The problem A traceback appears # Cause of the issue When…
# How to reproduce - Create an Event registration - Add a follower - Click on the enveloppe icon next to the sender's name in the chatter # The problem A traceback appears # Cause of the issue When clicking on the enveloppe, we display the `message_notification_popover` that calls `isFollowerNotification` to filter follower notifications from other ones. This function compares the ids of the followers of the notification to it's res_partner_id : https://github.com/odoo/odoo/blob/ee12a62407fa1c2dbca00d77dc6d5bd16eac1e43/addons/mail/static/src/core/common/notification_model.js#L101-L105 But in our case res_partner_id is undefined because it is not a required field and it will not be set in the case of mass_mailing : https://github.com/odoo/odoo/blob/ee12a62407fa1c2dbca00d77dc6d5bd16eac1e43/addons/mail/models/mail_notification.py#L23-L27 opw-6178443 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265263
This update fixes an issue where preparation prints weren't showing all items after transferring an order to a shared table. Previously, only the items on the destination table were printed. Now, when orders are merged, the preparation prints accurately reflect all items from both orders, ensuring accurate kitchen workflows.
Original PR description
When moving an order (Order A) to a table that already has an order (Order B), the merged order only reprints Order B's products. The products from Order A are missing from the preparation reprint.…
When moving an order (Order A) to a table that already has an order (Order B), the merged order only reprints Order B's products. The products from Order A are missing from the preparation reprint. Steps to reproduce: ------------------- * Open a POS session on a Restaurant POS * Create an order (Order A) for Table 1 * Create a second order (Order B) for Table 2 * Transfer/Merge Order A to Table 2 * Reprint the preparation order > Observation: Only the products that were already on Table 2 (Order B) appear on the reprint. Products from Order A are missing. Why the fix: ------------ mergeOrders correctly transfers kitchen history (last_order_preparation_change.lines) via handlePreparationHistory, but does not update uiState.lastPrints on the destination order. The reprint button uses lastPrints.at(-1) when there are no pending changes, so it only shows the destination order's last print batch — ignoring the merged lines entirely. Implementation: After the merge loop, build a consolidated lastPrints entry from the destination order's last_order_preparation_change.lines (which now contains lines from both orders) and push it onto destOrder.uiState.lastPrints so that reprint reflects the full merged state. opw-6060684 Forward-Port-Of: odoo/odoo#270311 Forward-Port-Of: odoo/odoo#256309
This update optimizes how Odoo searches for documents, specifically addressing a complex query that slowed down searches for documents not marked as 'SHARED'. This change aligns with the performance practices used in our production database, resulting in faster and more efficient document searches for users. It’s a performance improvement focused on the Documents module.
Original PR description
Searching for "not 'SHARED'" results in a very complex query. Our own production DB prefers this implementation, also easier to read. credit: https://github.com/odoo/enterprise/pull/105915#discussion_r2745148099 Task-5893183 Forward-Port-Of: odoo/enterprise#120870
This update fixes an issue where the Luxembourg eCDF XML export incorrectly reported financial year data. The change removes a problematic account mapping, ensuring the exported data aligns with the Odoo Profit & Loss view. This improves data accuracy for reporting to the Luxembourg tax authority.
Original PR description
Issue: Users reported that the financial year result in the XML export for the Luxembourg eCDF platform is incorrect, despite being correct in the Odoo Profit and Loss visualization. The exported XML populated incorrect amounts in cell 0161 under certain circumstances (namely, in the case of an explicit entry from account 999999 to account 142000). Solution: * Removed account 142 entirely from both the `ACCOUNTS_2019` and `ACCOUNTS_2020` dictionaries so it no longer auto-populates cells 0161/0162 (up to 2019 included) and 2955/2956 (from 2020 onward). * Removed the 2019 threshold condition in the loop bypass for account 142. * Removed the hard-coded manual pop for cell 2955 since it has been removed from the mapping. * Deleted the redundant reassignment of `net142` in the loss calculation block. Ticket [link](https://www.odoo.com/odoo/project.task/6059571) opw-6059571 Forward-Port-Of: odoo/enterprise#121010
This update resolves a problem where the PDP identifier field in the company registration process was left blank when using non-0225 PEPPOL EAS. It now displays a user error if an invalid identifier is entered, preventing incorrect registrations. This ensures accurate PDP registration and compliance.
Original PR description
Currently when the company partner uses non 0225 peppol EAS the `pdp_identifier` field is `False`. Thus the (related) identifier field on the registration wizard is left empty. Also add a UserError when writing an invalid identifier to the `pdp_identifier` field instead of just silently failing. That way an error ill pop up in the registration wizard when trying to register with an invalid identifier. task-6307489 Forward-Port-Of: odoo/odoo#270915 Forward-Port-Of: odoo/odoo#270330
This update strengthens Odoo's security by ensuring users only have read access to data. This prevents potential issues and unexpected behavior within the system, contributing to a more stable and reliable platform. The change was implemented as a fix to a vulnerability.
Original PR description
Ensure that the user has read access to prevent any unexpected behavior. Task-6226863 Forward-Port-Of: odoo/odoo#267709
A recent upgrade to Odoo 19.2 caused an error when accessing the partner website page. This was due to a change in how website templates are structured. This fix updates the system to align with the new template structure, resolving the error and restoring normal website functionality.
Original PR description
*= website_partnership, website_crm_partner_assign Currently, an error occurs when users try to access the `/partners` website page after upgrading database to saas-19.2. This issue occurs because…
*= website_partnership, website_crm_partner_assign Currently, an error occurs when users try to access the `/partners` website page after upgrading database to saas-19.2. This issue occurs because recent changes introduced in PR [1] added a new template as id `index_layout`. Inside this template, a `t-call` element was using a nested `t-set` element to define `additional_title`. We were referencing this `t-set` element in the XPath of the `index` template to override the value of `additional_title`. However, recent changes removed the `t-set` from the `t-call` and replaced it with a direct variable assignment inside the `t-call`. During the upgrade, the migration script automatically moves the `additional_title` attribute into `t-call` and removes the `t-set` from the `t-call` (see the script and related changes in [2]). As a result, the XPath expression that targets the `t-set` element fails because the referenced element no longer exists, which causes the error. This commit fixes the above issue by adapting the `t-call` element to match the recent changes introduced in [2]. Instead of relying on a nested `t-set` element, it now uses the variable directly as an attribute within the `t-call`, and updates the corresponding attribute child accordingly. [1]: https://github.com/odoo/odoo/commit/711c3baad58f3e0f1dc39cb90eb8176aba91e9dd [2]: https://github.com/odoo/odoo/pull/235469/changes#diff-29ae6f0bcf846a2fcaffc38fdd0d3b19ea328c133ff4dfe18cc9725715f34dd9 sentry-7400315548
This update corrects a formatting issue in the Danish UBL invoice export, specifically related to the Nemhandel system. Adding a required 'TaxCategory' node ensures compliance with UBL standards, preventing export errors and facilitating accurate invoice processing. This ensures invoices are correctly formatted for electronic delivery.
Original PR description
Add the TaxCategory node in AllowanceCharge node as it's a requirement for some UBL format. It has been spoted with Nemhandel, as it requires a single tax category in the AllowanceCharge. no-task Forward-Port-Of: odoo/odoo#270351
This update prevents errors in e-Waybill requests when the dispatch and delivery locations share the same pincode. The system now requires a distance to be specified in these cases, ensuring complete requests are sent to the GSP server and avoiding potential issues.
Original PR description
Prevent sending incomplete e-Waybill requests to the GSP server when the dispatch and delivery pincodes are identical. In such cases, the distance cannot be automatically determined and must be provided explicitly. This commit adds a validation to ensure a distance is set before generating the e-Waybill, avoiding incomplete requests and subsequent server-side errors. task-6234343 Forward-Port-Of: odoo/odoo#270495 Forward-Port-Of: odoo/odoo#268497
This update fixes an issue where self-orders created through kiosks or mobile ordering didn't show the correct table information on the payment screen. The fix ensures that table details are accurately displayed for all self-order transactions, improving the customer experience and order accuracy.
Original PR description
### **Issue** Self-orders created through the mobile QR menu or kiosk were not displaying table information in the Order Info section of the payment screen. ### **Root Cause** The Order Details…
### **Issue** Self-orders created through the mobile QR menu or kiosk were not displaying table information in the Order Info section of the payment screen. ### **Root Cause** The Order Details dialog relied on `order.getTable()` to retrieve table information. However, self-orders only store the table reference through `table_id`, which was not properly handled when rendering the dialog, resulting in missing table information. ### **Solution** This PR introduces the following changes: * Add a dedicated `getTableInfo()` helper in `pos_restaurant` to retrieve table information from the order. * Use `getTableInfo()` when building the Order Details dialog fields. * Allow self-order flows to provide table information through `table_id`, ensuring table details are displayed correctly. ### **Steps to Reproduce** 1. Enable the following options in POS Configuration: * QR Menu & Ordering * Service at Table * Online Payment 2. Open a self-order from the mobile QR menu 3. Select a table and complete the payment 4. Open the POS session 5. Open the paid self-order 6. Click the **Details** button on the right side ### **Video Reproduction** https://drive.google.com/file/d/138AoJCTF1HNlCGFgk9BRTb0UTai-uXX7/view?usp=sharing ### **Before** Table information was not displayed in the **Order Info** section for self-orders. ### **After** Table information is now correctly displayed for self-orders. opw-6179516 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where new tasks created through Timesheets Assistant Rules were incorrectly set as private. The fix ensures that tasks are always associated with a project, preventing this unwanted behavior and improving task management consistency. This change enhances user experience and data accuracy within the Timesheets module.
Original PR description
Steps to reproduce: - Install Timesheets and enable Timesheets Assistant. - Go to Timesheets -> Configuration -> Assistant Rules. - Open an existing rule or create a new one. - Select a Project and enter a new Task name. Issue 1: - Click Create. - The task is created as a private task, and the project is cleared. Issue 2: - Click Create and Edit. - Remove the project and save. - The task is saved as a private task. Cause: - When using Create, the `default_project_id` from the context is not applied, so the task is created as a private task. - When using Create and Edit, users can remove the prefilled project before saving, which also results in a private task. Fix: - Pass `default_project_id` and `form_view_ref='project.view_task_form_res_partner'` in the context. This prefills the project and makes it required when creating a task. task-6293306 Forward-Port-Of: odoo/enterprise#120862
This update resolves an issue where DIAN XML files were being rejected due to incorrect payment calculations. The fix combines payment amounts into a single tag, ensuring accurate data transmission to the DIAN and preventing errors related to negative payment amounts.
Original PR description
**Steps to reproduce:** To test this, you will need an official DIAN setup, because this error comes from the response to our API call to the DIAN. - Setup the DIAN in a colombian company - Open the…
**Steps to reproduce:** To test this, you will need an official DIAN setup, because this error comes from the response to our API call to the DIAN. - Setup the DIAN in a colombian company - Open the PoS - Order a product - Before paying, make the amount we are paying bigger than the amount due - We get an error response from the API, the error is saying that the total due does not match what we paid **Why the fix:** Currently, the xml is rejected because the sum of the **PaidAmount** in the **PrepaidPayment** tag is not equal to what we are trying to pay for. This is happening because to avoid the fact that we can not send a line with negative amount, we used the **abs()** function on the line amount to make it positive. The negative line comes from the fact that when we have a total due that is below the amount paid, we create a new payment line with a negative amount to balance it out. But as we can't send lines with negative amount, we needed to make it positive. This does not work, as the sum of the lines' amount will then be too much compared to what we are paying for, because instead of substracting it we will be adding it. To avoid this, we now group the amount in one single tag and send it this way. This ensures that the sent amount is correct and equals the amount due, and does not send a negative line. opw-6232575 Forward-Port-Of: odoo/enterprise#121075 Forward-Port-Of: odoo/enterprise#119255
This update resolves an issue where sign templates with auto-filled fields would incorrectly display placeholders instead of the actual values, or fail to generate documents. The fix ensures falsy auto-filled values are properly handled, preventing errors and guaranteeing accurate sign document generation.
Original PR description
Version: - 19.0 Steps to reproduce: - Create a sign template with a readonly sign item linked to an auto field. - Use a reference record where the linked field value is empty or False. - Send the…
Version: - 19.0 Steps to reproduce: - Create a sign template with a readonly sign item linked to an auto field. - Use a reference record where the linked field value is empty or False. - Send the document for signing. - Complete the signing flow. Issue: - Readonly sign items linked to auto-filled values could not properly handle falsy values. Empty values could trigger the error "Some required items are not filled" and completed sign requests displayed the sign item placeholder instead of the actual auto-filled value. - completed document generation could fail when rendering falsy values for textarea sign items. Cause: - Falsy auto-filled values were ignored during constant item population and replaced by the sign item placeholder. Additionally, readonly constant items were included in required field validation and completed sign requests continued to display placeholders when the stored value was empty. - document rendering assumed sign item values were always strings for textarea sign items but when auto field is empty it value can be False. Fix: - Preserve falsy values when populating readonly constant items, exclude constant items from signer validation, and hide placeholders for empty auto-filled constant items when displaying completed sign requests. - Normalize falsy values to prevent crashes and allow completed documents to be generated correctly. Forward-Port-Of: odoo/enterprise#121009
9 changes
Enhancements to existing features
This update enhances the timesheet assistant by providing clearer guidance when the Odoo Timesheet Assistant (AW) isn't properly set up, offering helpful warnings if the extension is missing, and displaying more relevant suggestions for time tracking. It also improves the accuracy of time entries by resolving record names and prioritizing recent timesheeted projects.
This update improves the payment process by adding debtor and creditor information to the data sent to Odoofin, which is required for using Powens and Saltedge payment gateways. This change ensures smoother and more complete payment initiation workflows.
Original PR description
In order to be able to initiate payments using Powens and Saltedge, we need to include debtor information in the payload sent to Odoofin. This commit adds the necessary fields and updates the tests accordingly. Task ID: 5977148, 6095729 Forward-Port-Of: odoo/enterprise#119843
Resolved issues and error corrections
This update corrects a recent change that was incorrectly returning all active documents during searches. The fix ensures that searches for user root documents only return valid results, excluding those marked as 'trash'. This improves search accuracy and data integrity.
Original PR description
We went a bit too fast with df353d76 and transformed search `'in', '[]'` from Domain.FALSE to all active documents. All active documents should only be returned when searching for all valid user roots (i.e., not TRASH). We're here partially reverting referenced commit and applying the closest code minimizing diff for foward ports. Task-5893183
This update fixes an issue where the Luxembourg eCDF XML export incorrectly reported financial year data. The change removes a problematic account mapping, ensuring the data aligns with the Odoo Profit & Loss view. This ensures accurate reporting for Luxembourg tax compliance.
Original PR description
Issue: Users reported that the financial year result in the XML export for the Luxembourg eCDF platform is incorrect, despite being correct in the Odoo Profit and Loss visualization. The exported XML populated incorrect amounts in cell 0161 under certain circumstances (namely, in the case of an explicit entry from account 999999 to account 142000). Solution: * Removed account 142 entirely from both the `ACCOUNTS_2019` and `ACCOUNTS_2020` dictionaries so it no longer auto-populates cells 0161/0162 (up to 2019 included) and 2955/2956 (from 2020 onward). * Removed the 2019 threshold condition in the loop bypass for account 142. * Removed the hard-coded manual pop for cell 2955 since it has been removed from the mapping. * Deleted the redundant reassignment of `net142` in the loss calculation block. Ticket [link](https://www.odoo.com/odoo/project.task/6059571) opw-6059571 Forward-Port-Of: odoo/enterprise#121010
This update resolves a problem where the PDP identifier field in the company registration process was left blank when using non-0225 PEPPOL EAS. A new error message is now displayed to guide users to enter a valid identifier, preventing silent failures and ensuring accurate registration. This improves the reliability of the PDP proxy setup.
Original PR description
Currently when the company partner uses non 0225 peppol EAS the `pdp_identifier` field is `False`. Thus the (related) identifier field on the registration wizard is left empty. Also add a UserError when writing an invalid identifier to the `pdp_identifier` field instead of just silently failing. That way an error ill pop up in the registration wizard when trying to register with an invalid identifier. task-6307489 Forward-Port-Of: odoo/odoo#270915 Forward-Port-Of: odoo/odoo#270330
This update ensures that attachments related to incoming invoices from EDI imports (specifically for Italian businesses) are correctly handled. Previously, detaching these attachments caused issues with bulk XML exports. Now, attachments for Italian invoices are preserved to ensure accurate data transfer and compliance with tax regulations.
Original PR description
The feature introduced in odoo/enterprise#78429 allows users to detach attachments from moves, primarily to facilitate the regeneration and re-sending of outgoing XMLs (e.g., sales invoices) without needing to delete the original attachment. However, detaching should not apply to incoming XML attachments on bills that originate from EDI import, as these attachments are the received source document and are never regenerated by the system. Detaching them inadvertently prevents their inclusion in bulk XML exports. An exception exists for Italy: businesses need to send Tax Integration XMLs back to the SdI. In this specific case, detaching the Tax Integration XML is appropriate and ensures the bulk export finds the latest, correct attachment. Ticket [link](https://www.odoo.com/odoo/project.task/5062132) opw-5062132 Forward-Port-Of: odoo/odoo#267892 Forward-Port-Of: odoo/odoo#239701
This update corrects a requirement in the Danish Nemhandel invoicing format, specifically within the AllowanceCharge node. The change adds a necessary TaxCategory node to ensure compliance with UBL standards, resolving a previously identified issue. This ensures accurate invoice processing for Nemhandel customers.
Original PR description
Add the TaxCategory node in AllowanceCharge node as it's a requirement for some UBL format. It has been spoted with Nemhandel, as it requires a single tax category in the AllowanceCharge. no-task Forward-Port-Of: odoo/odoo#270351
This update prevents errors in e-Waybill requests when the dispatch and delivery locations share the same pin code. Previously, the system couldn't automatically calculate the distance in these cases, leading to incomplete requests. Now, a distance must be provided, ensuring accurate e-Waybill generation and avoiding server issues.
Original PR description
Prevent sending incomplete e-Waybill requests to the GSP server when the dispatch and delivery pincodes are identical. In such cases, the distance cannot be automatically determined and must be provided explicitly. This commit adds a validation to ensure a distance is set before generating the e-Waybill, avoiding incomplete requests and subsequent server-side errors. task-6234343 Forward-Port-Of: odoo/odoo#270495 Forward-Port-Of: odoo/odoo#268497
This update fixes a potential issue where the standard price for products could be incorrectly calculated due to how user access restrictions were handled. The change ensures that standard price updates account for all available inventory, regardless of user permissions, preventing inaccurate pricing. This improves the reliability of product valuation.
Original PR description
`qty_available` is by default not computed with sudo, while the `total_value` is. This means that in `_update_standard_price`, the customer configuration can have a negative impact on the…
`qty_available` is by default not computed with sudo, while the `total_value` is. This means that in `_update_standard_price`, the customer configuration can have a negative impact on the standard_price compute.
For example, if a user create a custom rule so that specific users have access to specific warehouses only, compute `total_value / qty_available` can actually mean `global_total_value / partial_qty_available`, which creates an aberrant standard price.
To fix this issue, the _update_standard_price must be done in sudo.
OPW-6243363
---
## Test result without fix
```
2026-06-17 12:24:50,810 47572 ERROR oes_test_19 odoo.addons.stock_account.tests.test_stockvaluation: FAIL: TestStockValuation.test_update_standard_price_with_limited_access_users
Traceback (most recent call last):
File "/home/odoo/Odoo/src/19.0/odoo/addons/stock_account/tests/test_stockvaluation.py", line 3624, in test_update_standard_price_with_limited_access_users
self.assertEqual(product.standard_price, 1.0)
AssertionError: 12.11111111111111 != 1.0
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#2705594 changes
Enhancements to existing features
This update improves the Odoo payment process by adding debtor and creditor information to the data sent to Odoofin, a payment processing partner. This change is necessary to successfully initiate payments using Powens and Saltedge, ensuring smoother and more reliable payment transactions.
Original PR description
In order to be able to initiate payments using Powens and Saltedge, we need to include debtor information in the payload sent to Odoofin. This commit adds the necessary fields and updates the tests accordingly. Task ID: 5977148, 6095729 Forward-Port-Of: odoo/enterprise#119843
Resolved issues and error corrections
This update resolves an issue where the system wasn't properly validating partner banks when processing SEPA direct debit mandates. The change adds a constraint to ensure that mandates are only created for valid partner bank accounts, improving data accuracy and reducing potential errors in payment processing. This enhances the reliability of our SEPA direct debit functionality.
Original PR description
Forward-Port-Of: odoo/enterprise#121023 Forward-Port-Of: odoo/enterprise#120901
This update fixes an issue where the Luxembourg eCDF XML export incorrectly reported financial year data. The change removes a problematic account mapping, ensuring the exported data aligns with the Odoo Profit & Loss view. This ensures accurate reporting for Luxembourg tax compliance.
Original PR description
Issue: Users reported that the financial year result in the XML export for the Luxembourg eCDF platform is incorrect, despite being correct in the Odoo Profit and Loss visualization. The exported XML populated incorrect amounts in cell 0161 under certain circumstances (namely, in the case of an explicit entry from account 999999 to account 142000). Solution: * Removed account 142 entirely from both the `ACCOUNTS_2019` and `ACCOUNTS_2020` dictionaries so it no longer auto-populates cells 0161/0162 (up to 2019 included) and 2955/2956 (from 2020 onward). * Removed the 2019 threshold condition in the loop bypass for account 142. * Removed the hard-coded manual pop for cell 2955 since it has been removed from the mapping. * Deleted the redundant reassignment of `net142` in the loss calculation block. Ticket [link](https://www.odoo.com/odoo/project.task/6059571) opw-6059571 Forward-Port-Of: odoo/enterprise#121010
This update resolves an issue where the DIAN XML generated for Point of Sale (PoS) payments was being rejected due to incorrect calculations of prepaid amounts. The fix combines payment amounts into a single tag, ensuring accurate data transmission to the DIAN and preventing errors related to negative payment lines.
Original PR description
**Steps to reproduce:** To test this, you will need an official DIAN setup, because this error comes from the response to our API call to the DIAN. - Setup the DIAN in a colombian company - Open the…
**Steps to reproduce:** To test this, you will need an official DIAN setup, because this error comes from the response to our API call to the DIAN. - Setup the DIAN in a colombian company - Open the PoS - Order a product - Before paying, make the amount we are paying bigger than the amount due - We get an error response from the API, the error is saying that the total due does not match what we paid **Why the fix:** Currently, the xml is rejected because the sum of the **PaidAmount** in the **PrepaidPayment** tag is not equal to what we are trying to pay for. This is happening because to avoid the fact that we can not send a line with negative amount, we used the **abs()** function on the line amount to make it positive. The negative line comes from the fact that when we have a total due that is below the amount paid, we create a new payment line with a negative amount to balance it out. But as we can't send lines with negative amount, we needed to make it positive. This does not work, as the sum of the lines' amount will then be too much compared to what we are paying for, because instead of substracting it we will be adding it. To avoid this, we now group the amount in one single tag and send it this way. This ensures that the sent amount is correct and equals the amount due, and does not send a negative line. opw-6232575 Forward-Port-Of: odoo/enterprise#121075 Forward-Port-Of: odoo/enterprise#119255
6 changes
Enhancements to existing features
This update improves the Odoo payment process by adding debtor and creditor information to the data sent to Odoofin, a payment processing partner. This change is necessary to successfully initiate payments using Powens and Saltedge, ensuring smoother and more accurate payment transactions.
Original PR description
In order to be able to initiate payments using Powens and Saltedge, we need to include debtor information in the payload sent to Odoofin. This commit adds the necessary fields and updates the tests accordingly. Task ID: 5977148, 6095729 Forward-Port-Of: odoo/enterprise#119843
Resolved issues and error corrections
This update fixes an issue where the Luxembourg eCDF XML export incorrectly reported financial year data. Specifically, it addressed an error caused by an automated entry from account 142, ensuring the data aligns with the Odoo Profit & Loss view. The fix removes unnecessary mappings and adds a test to guarantee accurate reporting.
Original PR description
Issue: Users reported that the financial year result in the XML export for the Luxembourg eCDF platform is incorrect, despite being correct in the Odoo Profit and Loss visualization. The exported XML populated incorrect amounts in cell 0161 under certain circumstances (namely, in the case of an explicit entry from account 999999 to account 142000). Solution: * Removed account 142 entirely from both the `ACCOUNTS_2019` and `ACCOUNTS_2020` dictionaries so it no longer auto-populates cells 0161/0162 (up to 2019 included) and 2955/2956 (from 2020 onward). * Removed the 2019 threshold condition in the loop bypass for account 142. * Removed the hard-coded manual pop for cell 2955 since it has been removed from the mapping. * Deleted the redundant reassignment of `net142` in the loss calculation block. Ticket [link](https://www.odoo.com/odoo/project.task/6059571) opw-6059571 Forward-Port-Of: odoo/enterprise#121010
This update resolves a problem where the PDP identifier field in the company registration process was left blank when using non-0225 PEPPOL EAS. It now displays a user error message if an invalid identifier is entered, preventing silent failures and ensuring accurate registration. This improves the reliability of the registration process.
Original PR description
Currently when the company partner uses non 0225 peppol EAS the `pdp_identifier` field is `False`. Thus the (related) identifier field on the registration wizard is left empty. Also add a UserError when writing an invalid identifier to the `pdp_identifier` field instead of just silently failing. That way an error ill pop up in the registration wizard when trying to register with an invalid identifier. task-6307489 Forward-Port-Of: odoo/odoo#270915 Forward-Port-Of: odoo/odoo#270330
This update corrects a requirement in the Danish Nemhandel system for Universal Business Language (UBL) invoices. Specifically, it adds a 'TaxCategory' node to the 'AllowanceCharge' element, resolving a previously identified issue. This ensures proper invoice formatting and compliance with Nemhandel's specifications.
Original PR description
Add the TaxCategory node in AllowanceCharge node as it's a requirement for some UBL format. It has been spoted with Nemhandel, as it requires a single tax category in the AllowanceCharge. no-task Forward-Port-Of: odoo/odoo#270351
This update prevents errors in e-Waybill requests when the dispatch and delivery locations share the same pin code. Previously, the system couldn't automatically calculate the distance in these cases, leading to incomplete requests. Now, a distance must be provided, ensuring accurate e-Waybill generation and avoiding server issues.
Original PR description
Prevent sending incomplete e-Waybill requests to the GSP server when the dispatch and delivery pincodes are identical. In such cases, the distance cannot be automatically determined and must be provided explicitly. This commit adds a validation to ensure a distance is set before generating the e-Waybill, avoiding incomplete requests and subsequent server-side errors. task-6234343 Forward-Port-Of: odoo/odoo#270495 Forward-Port-Of: odoo/odoo#268497
This update resolves an issue where payments to the DIAN (Colombian tax authority) were failing due to incorrect XML formatting. The fix combines payment amounts into a single tag, ensuring accurate calculations and preventing errors related to negative payment amounts.
Original PR description
**Steps to reproduce:** To test this, you will need an official DIAN setup, because this error comes from the response to our API call to the DIAN. - Setup the DIAN in a colombian company - Open the…
**Steps to reproduce:** To test this, you will need an official DIAN setup, because this error comes from the response to our API call to the DIAN. - Setup the DIAN in a colombian company - Open the PoS - Order a product - Before paying, make the amount we are paying bigger than the amount due - We get an error response from the API, the error is saying that the total due does not match what we paid **Why the fix:** Currently, the xml is rejected because the sum of the **PaidAmount** in the **PrepaidPayment** tag is not equal to what we are trying to pay for. This is happening because to avoid the fact that we can not send a line with negative amount, we used the **abs()** function on the line amount to make it positive. The negative line comes from the fact that when we have a total due that is below the amount paid, we create a new payment line with a negative amount to balance it out. But as we can't send lines with negative amount, we needed to make it positive. This does not work, as the sum of the lines' amount will then be too much compared to what we are paying for, because instead of substracting it we will be adding it. To avoid this, we now group the amount in one single tag and send it this way. This ensures that the sent amount is correct and equals the amount due, and does not send a negative line. opw-6232575 Forward-Port-Of: odoo/enterprise#121075 Forward-Port-Of: odoo/enterprise#119255
4 changes
Enhancements to existing features
This update enhances payment processing by adding debtor and creditor information to the data sent to Odoofin. This is necessary to support payments initiated through Powens and Saltedge, ensuring accurate and complete payment initiation.
Original PR description
In order to be able to initiate payments using Powens and Saltedge, we need to include debtor information in the payload sent to Odoofin. This commit adds the necessary fields and updates the tests accordingly. Task ID: 5977148, 6095729 Forward-Port-Of: odoo/enterprise#119843
Resolved issues and error corrections
This update resolves a technical issue that caused the restaurant order tour to fail intermittently. The fix ensures the system waits for order updates to complete before proceeding, preventing duplicate requests and improving the reliability of the tour. This enhances the overall user experience for restaurant setup.
Original PR description
The tour could fail because `sendOrderInPreparationUpdateLastChange` is asynchronous when sending the order to the kitchen. The test was continuing to the next steps before the request was fully resolved, which could lead to sending the order again while the previous call was still in progress. This commit updates the tour to explicitly wait for the async call to complete before continuing, by adding a delay step after clicking the order button. This prevents race conditions during the test. --- Runbot Error: https://runbot.odoo.com/odoo/runbot.build.error/181846 Forward-Port-Of: odoo/enterprise#119861 Forward-Port-Of: odoo/enterprise#110909
This update fixes an issue where the Luxembourg eCDF XML export incorrectly reported financial year data. Specifically, an error was present when certain transactions involved account 142. The fix removes this account from the export mapping and adds a test to ensure the accuracy of future exports.
Original PR description
Issue: Users reported that the financial year result in the XML export for the Luxembourg eCDF platform is incorrect, despite being correct in the Odoo Profit and Loss visualization. The exported XML populated incorrect amounts in cell 0161 under certain circumstances (namely, in the case of an explicit entry from account 999999 to account 142000). Solution: * Removed account 142 entirely from both the `ACCOUNTS_2019` and `ACCOUNTS_2020` dictionaries so it no longer auto-populates cells 0161/0162 (up to 2019 included) and 2955/2956 (from 2020 onward). * Removed the 2019 threshold condition in the loop bypass for account 142. * Removed the hard-coded manual pop for cell 2955 since it has been removed from the mapping. * Deleted the redundant reassignment of `net142` in the loss calculation block. Ticket [link](https://www.odoo.com/odoo/project.task/6059571) opw-6059571 Forward-Port-Of: odoo/enterprise#121010
This update fixes an issue where payments to Mexican CFDI invoices could be sent multiple times, leading to inaccurate payment records. The fix ensures the 'Update Payments' button only appears after the invoice payment is fully reconciled, preventing over-reporting of payments and maintaining accurate financial data. This improves the reliability of CFDI reporting.
Original PR description
Issue: Sending payments to CFDI before its full amount is reconciled allow sending the same invoice payment several times to CFDI. So some invoices are declared as paid several times and the total…
Issue: Sending payments to CFDI before its full amount is reconciled allow sending the same invoice payment several times to CFDI. So some invoices are declared as paid several times and the total amount of the payment is seen as exceeding the real total. This fix is a back port of odoo/enterprise#108355 and aim to prevent some things the backend allow, but the front end prevents. Following steps could be used to reproduce from 18.3. Steps to reproduce: - In a Mexican company - Create an invoice A of $40 to Inmobiliaria CVA - Confirm and send to CFDI - Go to bank, create a new Bank transaction of $80 - reconcile with Invoice A - Go to invoice A => click on button "Update payments" (it doesn't appear before version 18.3) - Then sheet CFDI and Download There is the first XML sent to CFDI with payment for invoice A - Create an invoice B of $40 to Inmobiliaria CVA - Confirm and send to CFDI - reconcile the transaction with Invoice B - Go to invoice B - Click on button "Update payments" - Then sheet CFDI and Download There is the second XML sent to CFDI with payment for invoices A and B Invoice A payment was sent twice to CFDI Expected behavior: - The "Update payment" button should appear only once the invoice payment is fully reconciled. Current behavior: - The update payment button appear once the invoice is reconciled with a payment. opw-5432421 Forward-Port-Of: odoo/enterprise#119357
28 changes
New functionality added to Odoo
This update introduces the ability for customers to set up recurring donations directly within the website's shopping cart. Users can now choose the frequency of their donations, streamlining the donation process and increasing donation flexibility. This enhancement improves the user experience and expands donation options for our supporters.
Original PR description
Add recurring donation product and plans. Expose them to the website_sale donation snippet via the donation info API. Enable selection of recurrence in the snippet, allowing subscription based donations to be added directly to the cart and processed in checkout. Community PR: https://github.com/odoo/odoo/pull/265981
This update introduces dynamic mailing lists, allowing marketers to create targeted lists based on specific criteria within Odoo. Users can now save and manage these dynamic lists, improving campaign efficiency and segmentation. This change simplifies the process of reaching specific customer groups.
Original PR description
The purpose of this commit is to add **dynamic** mailing lists alongside the existing manual/static lists. Dynamic lists are list defined by a target mailing model and a domain. This PR is linked to a community PR. task-5358279
This update allows businesses to automatically add travel charges to field service task invoices. A new setting lets you link a product to cover travel expenses, ensuring accurate invoicing. To ensure the setting works correctly during initial module setup, a technical adjustment was made to explicitly define the default product.
Original PR description
## Expected Behavior of this PR Add support for applying an additional travel charge when a field service task is completed. This feature currently supports only fixed travel fees. ## Additional A new product field, `travel_time_invoicing_product_id`, is added to the Field Service's settings to define the product used for adding travel fees to field service. The default value for this field is provided in a `data.xml` file. However, because this file is loaded after default field values are initialized, the default product is not available during the module’s initial installation. To ensure proper initialization, the default value is also explicitly set in the `post_init` hook of the `planning_field_service_sale_timesheet` module. task-[5871604](https://www.odoo.com/odoo/project/4105/tasks/5871604)
Enhancements to existing features
This update introduces a variable resource calendar, allowing users to precisely define attendance dates instead of relying on fixed schedules like weekly recurring options. This provides greater flexibility in managing employee working schedules and accommodates diverse attendance patterns, replacing the previous two-week calendar.
This update adjusts the Peru withholding module's test cases to align with current business practices. Previously, tests incorrectly generated withholding payments without associated bill taxes. Now, tests accurately reflect the real-world workflow of creating withholding amounts from bill taxes, streamlining the payment process.
Original PR description
As the should_withhold_tax field is being replaced by withhold, the Peru withholding module must be updated accordingly. In Peru, withholding can only be deducted when withholding taxes are applied on bills. However, the existing tests were creating withholding payments without adding withholding taxes on the bill and were manually providing withholding line values when creating the payment wizard. This no longer reflects the actual business flow. This commit updates the test cases to follow the real-world workflow by creating withholding amounts from bill taxes and letting the payment wizard generate the withholding lines accordingly. task-5438849 com:https://github.com/odoo/odoo/pull/266946 upg:https://github.com/odoo/upgrade/pull/10436
A new 'Cancelled' filter has been added to the ticket screen, allowing cashiers to easily view and manage all cancelled orders, regardless of their origin. This change improves order management and provides greater control for cashiers, aligning with a streamlined workflow. The cancellation process is now logged for transparency.
Original PR description
..., pos_hr, pos_self_order, pos_platform_order --- In order to give the cashier more control over orders, a new "Cancelled" filter has been added to the ticket screen. This filter already existed in `pos_platform_order`, but it was limited to orders cancelled from platform orders only. It now shows all cancelled orders, regardless of their origin. Previously, cancelling an order would delete it locally — it remained in the backend but was absent from the frontend, making it impossible to display in the cancelled filter. This behaviour has been removed. We also no longer load only draft orders for the current POS config, but all orders for the current session, whatever their state. Additionally, the cancellation is now logged in the chatter under the current cashier's name. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6112014
This update enhances payment processing by adding debtor and creditor information to the data sent to our payment processors (Powens and Saltedge). This ensures accurate payment initiation and improves integration with financial systems.
Original PR description
In order to be able to initiate payments using Powens and Saltedge, we need to include debtor information in the payload sent to Odoofin. This commit adds the necessary fields and updates the tests accordingly. Task ID: 5977148, 6095729 Forward-Port-Of: odoo/enterprise#119843
This update improves the marketing automation form by aligning its settings with a recent design change. The Autofocus plugin has been moved to a more accessible location, allowing it to be used in mass email campaigns. This ensures a smoother user experience for creating and managing marketing emails.
Original PR description
This PR updates marketing_automation overrides for the mailing form view to match the new structure of the view, and moves the Autofocus plugin from knowledge to html_editor to make it available in mass_mailing. task-5976317
This update adds travel time calculations and display to the Field Service Gantt view, specifically designed for resource-based scheduling. It introduces travel time buffers, automatically tracking distances and times, and provides a popover for detailed travel information when hovering over a shift. This improves scheduling accuracy and efficiency for field service teams.
Original PR description
## [IMP] web_gantt: allow setting conditions to display buffer times This commit allows children to conditionally display buffer times in the Gantt view. This is particularly important for Field…
## [IMP] web_gantt: allow setting conditions to display buffer times This commit allows children to conditionally display buffer times in the Gantt view. This is particularly important for Field Service, where buffers do not make sense if the view is not grouped by resource. ## [IMP] web_gantt: editable specification for get_gantt_data rpc This commit allows views inheriting from `GanttModel` to modify the specification passed to the `get_gantt_data` rpc call. This will become handy for Field Service, where we want to read extra fields (other than `display_name`) for partners. ## [IMP] planning: check user group before loading data This commit ensures that the `isManager` boolean value is always fetched before loading the Gantt view. ## [IMP] planning_field_service: travel time computation in the Gantt view This commit introduces travel time and distance tracking for field service shifts. Travel times displayed as buffers on the day-scale gantt view when grouped by resource. - Add `travel_time_in/out` and `travel_distance_in/out` fields on planning slots - Travel data is reset automatically when the partner, resource, or datetime changes, and preserved when splitting/undoing splits or undoing drag-and-drop - Compute routes using MapBox on gantt load (when all records are stale) or on demand via a toolbar button (when some are stale)` - The travel data are computed starting and ending at the resource's work location (i.e., work, daily interventions, work) - Hide the buffer-end visually when a subsequent shift exists for the same resource ## [IMP] planning_field_service: add travel time and distance popover in gantt This commit adds a popover containing the travel time information for the intervention, when hovering its buffer time. It contains the departure time, travel time, and distance. If there is no previous intervention, the information is relative to the resource's work location. task-6200248
Resolved issues and error corrections
This update resolves an issue where the search input in a SelectMenu was unintentionally clearing typed characters due to timing conflicts. The fix ensures the input value is controlled directly, resulting in a more reliable and consistent search experience. This improves usability for users searching within the system.
Original PR description
Before this commit, some very specific timing could cause re-renders after debounced was called but before it was finished, causing a re-render of the input and setting its value to a previous state, removing typed characters. This commit fixes that by making the input value controlled manually, not via the reactivity. Community: https://github.com/odoo/odoo/pull/266912
This update resolves an issue causing instability in the systray highlight test. The team replaced a complex, temporary workaround with a more reliable implementation of the `useEffect` hook. This ensures the test consistently passes, improving the overall stability of the timesheet grid functionality.
Original PR description
This PR fixes the systray highlight test by using a simplified version of the old implementation of the `useEffect` hook instead of the setTimeout hack
This update resolves an issue where an incorrect amount was being duplicated in the Balance Sheet report for French financial statements. The fix involves adjusting a journal entry to accurately reflect partner accounts and eliminate the double-counting of 45 accounts under 'Borrowings and Similar Liabilities'.
Original PR description
1. Create a journal entry with: -> 455100 Partners/Associates - Current Accounts - Principal → Credit -> 512001 Bank → Debit 2. Navigate to Accounting → Reporting → Balance Sheet. -> Observe that the amount of the journal entry appears twice in the Balance Sheet: 1. Under Borrowings and Similar Liabilities 2. Under Partners' Current Accounts 45 accounts should not be included under borrowings and similar liabilities opw-6271305 Forward-Port-Of: odoo/enterprise#120282
This update corrects a previous issue where fully settled customers with past pay-later payments were incorrectly prevented from seeing their customer statements. The fix now checks for any past pay-later payment lines, ensuring the statement button remains visible even after the customer's total balance is paid off. This improves the user experience for all customers.
Original PR description
The override of _compute_has_moves was checking `total_due != 0` to set `has_moves` on for PoS pay_later customers. Once the customer is fully settled however, `total_due` is 0 and the check does not pass anymore, so `has_moves` goes back to `False` and the Customer Statement button hides for them, even though they had past pay_later payment lines. The fix is to check directly for any past pay_later `pos.payment` instead, which covers the cases where partner had used pay_later payment methods before, regardless if they have settled their total due or not. opw-6173760 Forward-Port-Of: odoo/enterprise#120911 Forward-Port-Of: odoo/enterprise#116536
This update adds a required field for UNECE code to UoM units, resolving previous issues with UBL/CII validation. This ensures Odoo correctly handles international trade documents and improves compliance with industry standards. It addresses a limitation in the previous static mapping approach.
Original PR description
Before this PR, we mapped UoMs with UNECE codes using a static dictionary. However, due to this static nature, some UoMs were missing the UNECE code, which created validation issues for UBL/CII. To address this issue, we introduce a new UNECE code field on UoM, which will be utilised by the UBL/CII for setting unitCode on Quantity nodes. task-6171459 Community PR - https://github.com/odoo/odoo/pull/261975 Upgrade PR - https://github.com/odoo/upgrade/pull/10091
This update fixes an error in the l10n_ph withholding tax report that was incorrectly adding a negative sign. The change has been reverted to use balances directly, ensuring accurate reporting of withholding taxes and aligning with how the system handles signed amounts. This improves the reliability of tax reporting.
Original PR description
A negative sign was added in the tax report of l10n_ph. This should not have been changed. The reason for the change was to set the balance negate of the tag, but this is incorrect. We therefore revert this change and remove the absolute value and balance negate from the query in the withholding tax report. Relying on these to force sign changes is incorrect. We can instead use balances directly: - `tax_base_amount` is used natively (signed). - `balance` is negated for the report presentation (to show credit-side withholding as positive).
This update resolves an issue where the rental and subscription status badges were overlapping in the sales order view. The fix replaces a positioning method with a simpler float-end approach, ensuring both badges are correctly displayed without interference. This improves the visual clarity of sales orders.
Original PR description
Steps to produce: --- - Install the `Rental` and `Subscription` modules. - Create a rental product and a subscription product. - Create a sales order containing both products and set a rental period.…
Steps to produce: --- - Install the `Rental` and `Subscription` modules. - Create a rental product and a subscription product. - Create a sales order containing both products and set a rental period. - Confirm the sales order. Issue: --- - The rental status badge overlaps the subscription status badge. Root cause: --- - The rental status badge uses the position-absolute CSS class to place it at the end of the header. When the subscription status badge is also displayed in the same area, both badges are positioned at the same location, causing them to overlap. - After [commit], this issue is introduced. Solution: --- - Replace position-absolute with float-end so the badges remain right-aligned without overlapping. [commit]: https://github.com/odoo/enterprise/commit/32ab15dc1f26af0e3d510ec859b1ec428068e9b5 Before: --- <img width="122" height="64" alt="image" src="https://github.com/user-attachments/assets/e6b47c9e-ed59-4a4b-a95c-0318cc43660e" /> After: --- <img width="175" height="57" alt="image" src="https://github.com/user-attachments/assets/ea98f7a1-67f6-4b2b-b699-1f2cd3376d8f" /> opw-6295212 --- Forward-Port-Of: odoo/enterprise#120660
This update fixes alignment issues within the Timesheet Assistant, specifically in the 'By Project' and 'Chronological' views. The changes ensure that descriptions and times are displayed correctly, even with lengthy project details, and adds a necessary margin to the 'No time recorded' section for better visual clarity.
Original PR description
# [FIX] timesheet_grid: alignment issues in assistant This commit resolves the following alignment issues in the Timesheet Assistant: - View "By Project", the time wraps if description too long - View "Chronological", the time wraps if descriptions too long and project / task is not truncated - No timesheet recorded does not have a margin start # [FIX] sale_timesheet_enterprise: alignment issues in assistant This commit adds margin start on the "No (non-)billable time recorded" information. task-6264756 Forward-Port-Of: odoo/enterprise#121054 Forward-Port-Of: odoo/enterprise#120608
This update ensures the Documents smart button now displays *all* linked documents for records connected through bridge modules (like approvals, fleet, HR, and projects), regardless of their location. Previously, it only showed documents within a configured folder. The change also includes improvements to document counting across various modules, enhancing the overall document management experience.
Original PR description
* = approvals, fleet, hr_recruitment, project Before this commit, clicking on the Documents smart button, it only displayed the documents contained in the configured folder. But it happens that a document is linked to a record from a bridge module but is not in that configured folder. This commit fix that by displaying all the linked documents for a record from a bridge module. So we toook the opportunity to move the document_count field to the 'documents.mixin' model with its compute method and the 'action_open_documents' method. Task-5948278
This update fixes an issue where timesheet settings (specifically, whether a project is billable) would reset after the timesheet systray was closed and reopened. Now, the selected billable status is correctly saved and retained, ensuring accurate tracking of billable hours. This improves the reliability of timesheet data.
Original PR description
## Behavior before PR 1. Open the timesheet systray. 2. Select a billable project. 3. Toggle the is_billable field. 4. Close and reopen the systray. 5. The is_billable value resets to its default instead of keeping the updated value. ## Expected Behavior After this PR The systray now correctly retains the is_billable value after being closed and reopened. ### Technical Notes The issue occurred because the systray view loads a sudo record that triggers compute methods, which overwrite the stored is_billable value. The fix ensures that after compute methods run, the saved is_billable value is preserved. Forward-Port-Of: odoo/enterprise#121087 Forward-Port-Of: odoo/enterprise#119681
This update resolves an issue in the Data Cleaning app where record IDs were incorrectly summed and displayed alongside group names, leading to truncated names and inaccurate counts. The fix removes the automatic summation of IDs in grouped list views, ensuring correct group names and counts are shown.
Original PR description
## Issue In the *Data Cleaning* app, when grouping records, the record IDs are summed up and appear right next to the name of each group, which: 1. truncates the name and count of the groups 2. does…
## Issue
In the *Data Cleaning* app, when grouping records, the record IDs are summed up and appear right next to the name of each group, which:
1. truncates the name and count of the groups
2. does not make sense (summing up IDs is pointless)
<img width="709" height="374" alt="6166623-before" src="https://github.com/user-attachments/assets/9d80b1ec-49c0-4b7f-8c6e-53846f9e433e" />
## Steps to reproduce
1. Install *Data Cleaning* (`data_cleaning`)
2. In Data Cleaning > Configuration > Field Cleaning, create a new rule (or edit an existing one):
- Any name
- Model: *Contact*
- Rule:
- Field to Clean: *Name (Contact)*
- Action: *Set Type Case* - Case: *All Uppercase*
4. Click the *Clean* button in the upper left corner
5. In Data Cleaning > Field Cleaning, group the records by any field (e.g., *Field*)
6. **The name of the group (_Name (Contact)_) is truncated, making it and the record count unreadable. This is due to the sum of _Record ID_ being displayed in the same row, even though that information is irrelevant.**
## Cause
The *Record ID* (`res_id`) field is an Integer field defined [here](https://github.com/odoo/enterprise/blob/3603afdd5c0d19c9276f3855156be4040ab5717d/data_cleaning/models/data_cleaning_record.py#L20). By default, Integer fields have the `sum` aggregator:
https://github.com/odoo/odoo/blob/681610c002a310f1c73fc2e5bec8d3dae27bc4a7/odoo/orm/fields_numeric.py#L17-L23
This causes the IDs to be summed up and appear in the group headers.
## After
<img width="740" height="370" alt="6166623-after" src="https://github.com/user-attachments/assets/a42d8f58-06dc-4308-8b6f-1ab09e8034f8" />
related: https://github.com/odoo/odoo/pull/265163
opw-6166623
Forward-Port-Of: odoo/enterprise#115492This update resolves a problem where order signing with Fiskaly failed after a change to the Fiskaly API key. The system now correctly resets the associated SCU and cash registers, ensuring seamless integration with the Fiskaly system. This prevents order processing errors and maintains accurate financial data.
Original PR description
When the Fiskaly API key/secret is changed, the company is bound to a new Fiskaly organization (owner). The SCU and cash registers stored on the company and POS configs were created under the previous owner and no longer exist for the new one, so signing orders fails with E_CASH_REGISTER_NOT_FOUND. Clear l10n_at_pos_company_scuid and each config's l10n_at_cash_regid together with the access token so they are recreated under the new organization on the next authentication. opw-6297695 Forward-Port-Of: odoo/enterprise#120839
This update fixes an issue where created packages weren't displayed within the barcode picking app when putting items into packs. The fix ensures that users can clearly see the source and destination packages during the packing process, improving workflow and reducing errors. This enhancement simplifies the process of managing packaged goods within Odoo.
Original PR description
### Steps to reproduce: - Enable `Lots & Serial Numbers` and `Packages` in the settings - Create a product tracked by SN and add SN001 and SN002 to stock - Create and confirm a delivery for 2 units -…
### Steps to reproduce: - Enable `Lots & Serial Numbers` and `Packages` in the settings - Create a product tracked by SN and add SN001 and SN002 to stock - Create and confirm a delivery for 2 units - Open the Barcode app and open the delivery - Scan the product > Scan SN001 - Click `Put in Pack` ### Current behavior: The created package is not displayed anywhere. Clicking Put in Pack again nests the package into another package without any visible indication to the user. ### Cause of the Issue: The GroupedLineComponent cannot display neither the source or destination package: https://github.com/odoo/enterprise/blob/c5bbcaeed513817fdda1f3f42f4c9b2440264174/stock_barcode/static/src/components/grouped_line.xml#L4-L21 However, our case the grouped line contains only a single line and prevents the users from viewing the sublines since the `Show Reserved Lots` is disabled on the operation type and only one lot (with additional demand) was scanned: https://github.com/odoo/enterprise/blob/c5bbcaeed513817fdda1f3f42f4c9b2440264174/stock_barcode/static/src/components/grouped_line.js#L75-L77 https://github.com/odoo/enterprise/blob/c5bbcaeed513817fdda1f3f42f4c9b2440264174/stock_barcode/static/src/components/grouped_line.js#L44-L55 opw-6237834 Forward-Port-Of: odoo/enterprise#119114
This update fixes an error in the XML export for the Luxembourg eCDF platform. Incorrect financial year data was being generated due to a specific account entry. The fix removes problematic account mappings and adds a test to ensure accurate reporting going forward.
Original PR description
Issue: Users reported that the financial year result in the XML export for the Luxembourg eCDF platform is incorrect, despite being correct in the Odoo Profit and Loss visualization. The exported XML populated incorrect amounts in cell 0161 under certain circumstances (namely, in the case of an explicit entry from account 999999 to account 142000). Solution: * Removed account 142 entirely from both the `ACCOUNTS_2019` and `ACCOUNTS_2020` dictionaries so it no longer auto-populates cells 0161/0162 (up to 2019 included) and 2955/2956 (from 2020 onward). * Removed the 2019 threshold condition in the loop bypass for account 142. * Removed the hard-coded manual pop for cell 2955 since it has been removed from the mapping. * Deleted the redundant reassignment of `net142` in the loss calculation block. Ticket [link](https://www.odoo.com/odoo/project.task/6059571) opw-6059571 Forward-Port-Of: odoo/enterprise#121010
This update resolves an issue preventing the correct export of balance sheet data in XML format for Luxembourg companies. The system now automatically includes a 'date_from' field, aligning with changes in the Odoo 19.2 version, ensuring accurate financial reporting.
Original PR description
Steps to reproduce: - setup a LU company - go to balance sheet - export the xml file - validate the wizard -> Traceback, because the code expects the options to contain the date_from, which is no longer the case since 19.2 as the balance sheet has by default only a date_to. The solution is therefore to define it for the export to the beginning of the fiscal year. Forward-Port-Of: odoo/enterprise#120843
This update resolves an issue where focusing on the end date within a daterange widget incorrectly modified the start date. The fix ensures that the correct date field is updated when a user interacts with the input fields, improving data accuracy and preventing unintended changes.
Original PR description
When a daterange widget is used (e.g., `deferred_start_date` coupled with `deferred_end_date`), focusing on the end date input was incorrectly modifying the start date field. This occurred because the `focusin` event was resolving the field name from the parent widget rather than the specific input focused. This commit updates `onFocusFieldWidget` and `getFullFieldName` to accept and evaluate the specific `event.target`. For `o_field_daterange` widgets, it now extracts the correct field name from the target's `data-field` attribute, ensuring the correct date field is updated. opw-6250048 Forward-Port-Of: odoo/enterprise#121099 Forward-Port-Of: odoo/enterprise#120684
This update clarifies timesheet tracking by changing the AW rule to display the name of the GitHub Pull Request instead of its ID. This provides better context for users, making it easier to link PRs to the relevant project or task within the Timesheets Assistant.
Original PR description
Before this commit, the AW Rule used in Timesheets Assistant will display the id of the Github Pull request and the repository but that information is not always clear for the user to know which project/task is related to that PR. This commit changes the AW rule for Github to display the name of the pull request instead to have more context to easily match the project/task to the event created by that rule. task-6306166 Forward-Port-Of: odoo/enterprise#121231 Forward-Port-Of: odoo/enterprise#120676
This update resolves an issue where DIAN XML files were being rejected due to incorrect calculations of prepaid payments. The fix combines payment amounts into a single tag, ensuring the total paid matches the due amount and eliminating the need for negative payment lines, improving compliance with DIAN requirements.
Original PR description
**Steps to reproduce:** To test this, you will need an official DIAN setup, because this error comes from the response to our API call to the DIAN. - Setup the DIAN in a colombian company - Open the…
**Steps to reproduce:** To test this, you will need an official DIAN setup, because this error comes from the response to our API call to the DIAN. - Setup the DIAN in a colombian company - Open the PoS - Order a product - Before paying, make the amount we are paying bigger than the amount due - We get an error response from the API, the error is saying that the total due does not match what we paid **Why the fix:** Currently, the xml is rejected because the sum of the **PaidAmount** in the **PrepaidPayment** tag is not equal to what we are trying to pay for. This is happening because to avoid the fact that we can not send a line with negative amount, we used the **abs()** function on the line amount to make it positive. The negative line comes from the fact that when we have a total due that is below the amount paid, we create a new payment line with a negative amount to balance it out. But as we can't send lines with negative amount, we needed to make it positive. This does not work, as the sum of the lines' amount will then be too much compared to what we are paying for, because instead of substracting it we will be adding it. To avoid this, we now group the amount in one single tag and send it this way. This ensures that the sent amount is correct and equals the amount due, and does not send a negative line. opw-6232575 Forward-Port-Of: odoo/enterprise#121075 Forward-Port-Of: odoo/enterprise#119255
Code cleanup and technical improvements
This update adjusts how SEPA payment versions are managed within Odoo. Previously, all payment method lines on a journal shared a single version, which wasn't flexible enough. Now, the SEPA pain version is moved to the payment method line itself, allowing for more accurate and adaptable payment processing, particularly for different SEPA countries.
Original PR description
Payment methods lines don't always share the same SEPA pain version. Setting that version across all payment method lines on the journal is not flexible enough, so this commit moves that field to the payment method line. Task ID: 6106974
6 changes
New functionality added to Odoo
This update adds missing translations for various user-facing messages within the Point of Sale (POS) modules. This ensures the POS system is correctly localized for different languages, improving the user experience for international customers. The changes cover UI elements, error messages, and internal system messages.
Original PR description
pos* = All POS module In this commit: -------------------------------- Add missing translations for user-visible strings across POS modules. - Translated dialogs, errors, alerts, and other UI-visible messages - Updated Python-side UserError, ValidationError, and warning messages Task-5406947 Related PR-https://github.com/odoo/enterprise/pull/102094
Resolved issues and error corrections
This update fixes an issue where purchase order receipt deadlines weren't updating correctly after quantities were reduced to zero. The fix ensures that cancelled stock moves no longer incorrectly influence the calculated deadline, leading to more accurate and reliable delivery scheduling. This improves the overall efficiency of our inventory management.
Original PR description
Steps to reproduce the bug:
- Create a Purchase Order with 2 products and confirm it
- Note the receipt's deadline (= date_planned of both lines)
- Set the quantity of one PO line to 0
- Update the scheduled date (date_planned) of the purchase order
Problem:
the receipt deadline does not update.
The receipt kept the old deadline from the cancelled move. When a PO line qty is set to 0, `_merge_moves` cancels the corresponding stock move via `_action_cancel`. Then `_update_move_date_deadline` correctly skips cancelled moves (filtered by `state not in ('done', 'cancel')`), so the cancelled move retains its original `date_deadline`. However, `_compute_date_deadline` on `stock.picking` used
`move_ids.filtered('date_deadline')`, which not checks move state, so the stale deadline of the cancelled move was included in the min/max computation.
opw-6292600This update fixes an issue where the Luxembourg eCDF XML export incorrectly reported financial year data. The change removes a problematic account mapping, ensuring the exported data aligns with the Odoo Profit & Loss view. This ensures accurate reporting for Luxembourg tax compliance.
Original PR description
Issue: Users reported that the financial year result in the XML export for the Luxembourg eCDF platform is incorrect, despite being correct in the Odoo Profit and Loss visualization. The exported XML populated incorrect amounts in cell 0161 under certain circumstances (namely, in the case of an explicit entry from account 999999 to account 142000). Solution: * Removed account 142 entirely from both the `ACCOUNTS_2019` and `ACCOUNTS_2020` dictionaries so it no longer auto-populates cells 0161/0162 (up to 2019 included) and 2955/2956 (from 2020 onward). * Removed the 2019 threshold condition in the loop bypass for account 142. * Removed the hard-coded manual pop for cell 2955 since it has been removed from the mapping. * Deleted the redundant reassignment of `net142` in the loss calculation block. Ticket [link](https://www.odoo.com/odoo/project.task/6059571) opw-6059571 Forward-Port-Of: odoo/enterprise#121010
This update resolves an issue impacting the processing of invoices related to Mexican VAT (CFDI). The system now uses a more efficient index, allowing it to handle complex cancellation scenarios with numerous linked documents without performance slowdowns. This ensures smoother invoice processing and avoids potential errors.
Original PR description
The field `l10n_mx_edi_cfdi_origin` can contain a large number of associated UUIDs, especially in complex cancellation scenarios. The default B-tree index fails when this field exceeds 2704 bytes, which occurs after approximately 20 UUIDs. By switching to a trigram index, we avoid the entry size limit of PostgreSQL's B-tree nodes. This ensures that invoices with many related documents can be processed while maintaining efficient search performance for partial matches on this field. **Video before the fix:** https://youtu.be/24u0HbxwIH8 **Video after the fix:** https://youtu.be/sUelv1HZMvI Forward-Port-Of: odoo/enterprise#118868
This update fixes an issue where the time recorded for productive work was slightly inaccurate when work orders exceeded their expected duration. The fix ensures that productive time is calculated precisely, leading to more reliable productivity reports. This improves the accuracy of time tracking for manufacturing operations.
Original PR description
Version: -------- - 18.0+ Steps to reproduce: ------------------- - Install `mrp` - Create a Manufacturing Order - In the `Work Orders` tab, add a work order with an `Expected Duration` of 15 seconds…
Version:
--------
- 18.0+
Steps to reproduce:
-------------------
- Install `mrp`
- Create a Manufacturing Order
- In the `Work Orders` tab, add a work order with an `Expected Duration` of 15 seconds (00:15)
- Confirm the Manufacturing Order
- Start the work order timer
- Let it run for 19 seconds and pause it
- Open the Productivity report through the `external link` icon
Issue:
------
The time split between productive time and reduced-speed time is off by
one second when the elapsed duration exceeds the expected duration.
Example:
Observed:
- Fully Productive Time: 14 s
- Reduced Speed: 5 s
Expected:
- Fully Productive Time: 15 s
- Reduced Speed: 4 s
Cause:
-------
When click into `Pause` button it trigger `button_pending` -> `stop_employee` -> `_close`
In `_close()` computes the boundary between productive and performance
time by subtracting the excess from the end
of the timer:
https://github.com/odoo/odoo/blob/b1a6682896a4f113799340a768ec2eb2b8bdc69d/addons/mrp/models/mrp_workcenter.py#L594
`wo.duration` is the sum of all productivity record durations, each
stored as `round((date_end - date_start).total_seconds() / 60, 2)`.
For 19 elapsed seconds: `round(19 / 60, 2) = 0.32` min, so:
excess = 0.32 - 0.25 = 0.07 min = 4.2 s
productive_date_end = T+19s - 4.2s = T+14.8s ← fractional second
`_compute_duration` then strips sub-second precision via
`.replace(microsecond=0)`, truncating T+14.8s to T+14s.
https://github.com/odoo/odoo/blob/b1a6682896a4f113799340a768ec2eb2b8bdc69d/addons/mrp/models/mrp_workcenter.py#L542
As a result:
- Record 1 (productive): T → T+14s → 14 s = 0.23 min (wrong)
- Record 2 (performance): T+14s → T+19s → 5 s = 0.08 min (wrong)
The rounding of `wo.duration` from the true value (0.3166… min) to
0.32 min shifts the computed boundary by 0.8 s, which `.replace
(microsecond=0)` then truncates, silently stealing one second from
productive time and adding it to reduced-speed time.
Fix:
---
Compute the productive/performance boundary using actual elapsed seconds
instead of rounded float durations.
For the common single-timer case `remaining_expected_seconds = 0.25 * 60
= 15.0` (exact), so `productive_date_end = T+15.000000s` — no fractional
part, nothing for `.replace(microsecond=0)` to truncate.
- Record 1 (productive): T → T+15s → 15 s = 0.25 min ✓
- Record 2 (performance): T+15s → T+19s → 4 s ≈ 0.07 min ✓
The multi-timer case (e.g. pause → resume → pause) is also handled
correctly
---
opw-6302745
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves an issue where adding COGS lines to product tax calculations caused unintended recalculations of all tax lines, leading to incorrect tax amounts. The fix ensures COGS lines aren't treated as base tax lines, preventing this recalculation and maintaining accurate manual tax adjustments. This improves the reliability of tax calculations within the system.
Original PR description
## Description of the issue/feature this PR addresses: Setup plus video 1. Go to settings, enable "Automatic Valuation" and "Storeable Locations". 2. Navigate to Product Categories. 3. Create a new…
## Description of the issue/feature this PR addresses: Setup plus video 1. Go to settings, enable "Automatic Valuation" and "Storeable Locations". 2. Navigate to Product Categories. 3. Create a new product category with the costing method Standard Price and the inventory valuation Automatic. 4. Navigate to Products, click into any product. 5. Add the new product category to this product under General Information. 6. Add any tax in the purchase tax field. 7. In the Accounting tab of the product, add any account to the Price Difference Account field. https://drive.google.com/file/d/1i2DHEt0g9G5Edad_QB3QaFkOT49cbMAZ/view?usp=sharing Instructions to reproduce error 1. Navigate to Purchase. 2. Add a customer, then add the configured product. 3. Add a tax to the line. Ensure that the tax and price_unit are nonzero. 4. Confirm the order. 5. Receive the product. 6. Create the bill. 7. Edit the tax on the vendor bill, then save the changes. Notice that the changes are kept. 8. Select Confirm. Notice that the changes to the tax line are not kept, and that the COGS lines appeared (with taxes applied to them). 9. Reset the bill to draft. 10. Click into the configured product and remove the product category. 11. Repeat steps 7-8 . No COGS lines, and the tax line is the manually set value. ## Current behavior before PR: COGS lines with taxes have no net effect on any tax lines as they cancel each other out. However, their creation triggers the recalculation of all tax lines, undoing any manual adjustments to tax lines. ## Desired behavior after PR is merged: This commit ensures that COGS lines are not considered base tax lines, so that their creation does not trigger the recalculation of other base tax lines. opw-5387248 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
4 changes
Resolved issues and error corrections
This update fixes an issue where the Luxembourg eCDF XML export incorrectly reported financial year data. The change removes a problematic account mapping, ensuring the exported data aligns with the Odoo Profit and Loss view. This improves data accuracy for Luxembourg tax reporting.
Original PR description
Issue: Users reported that the financial year result in the XML export for the Luxembourg eCDF platform is incorrect, despite being correct in the Odoo Profit and Loss visualization. The exported XML populated incorrect amounts in cell 0161 under certain circumstances (namely, in the case of an explicit entry from account 999999 to account 142000). Solution: * Removed account 142 entirely from both the `ACCOUNTS_2019` and `ACCOUNTS_2020` dictionaries so it no longer auto-populates cells 0161/0162 (up to 2019 included) and 2955/2956 (from 2020 onward). * Removed the 2019 threshold condition in the loop bypass for account 142. * Removed the hard-coded manual pop for cell 2955 since it has been removed from the mapping. * Deleted the redundant reassignment of `net142` in the loss calculation block. Ticket [link](https://www.odoo.com/odoo/project.task/6059571) opw-6059571
This update enables branch companies to register on the PEPPOL network as 'sender only' participants, mirroring their parent company's registration. This simplifies the registration process for branch offices and ensures compliance with PEPPOL requirements, streamlining international trade operations.
Original PR description
This task backports the ability to register branch companies as sender only using the same identifier as their parent company task-id-6069374
This update resolves a crash that occurred when users attempted to view Instagram videos within Odoo. The fix now displays the video link instead of the image, ensuring a stable preview experience. This improves user engagement and prevents disruptions when accessing Instagram content.
Original PR description
Purpose ======= When we have a real on Instagram, we try to show the video as an image. When clicking on the broken image, the previewer crash. To fix that issue, we know show the link of the video in the message. Task-5491124 Forward-Port-Of: odoo/enterprise#113487
This update resolves an issue where a duplicate stock move was being created in backorders after a quality check failure. The fix prevents the creation of an unnecessary move when a quality issue redirects a transfer, ensuring backorders are accurately reflected and avoids redundant inventory management.
Original PR description
Steps to reproduce: ------------------- - Install `purchase`, and `quality_control` - Enable Multi-Step Routes in Inventory settings - Create a storable product tracked by lot - Create a Quality…
Steps to reproduce:
-------------------
- Install `purchase`, and `quality_control`
- Enable Multi-Step Routes in Inventory settings
- Create a storable product tracked by lot
- Create a Quality Point:
- Operation Type: Internal Transfer
- Control Per: Quantity
- Configure a failure location
- Enable the 3-Step Incoming route for the warehouse
- Duplicate the Internal Transfer operation type and name it `Internal Transfer 2` Configure the operation types:
- Internal Transfer: <-- this is original one
- Source Location: WH/Input
- Destination Location: WH/Quality Control
- Internal Transfer 2:
- Source Location: WH/Quality Control
- Destination Location: WH/Stock
- Open the warehouse's 3-Step Incoming route
- Locate the push/pull rule whose source location is `WH/Quality Control`
- open that and Change its operation type from internal transfer -> `Internal Transfer 2`
- Create and confirm a Purchase Order for 20 units of the product
- Open the generated receipt
- Validate 12 units using Lot-1 and create a backorder
- Open the Internal Transfer (where source is that PO and there operation type
is internal transfer that original one)
- Demand: 20
- Reserved Quantity: 12
- Click into detail button on stock move and split the move line into:
- 9 units from Lot-1
- 3 units from Lot-1
- save
- Open the Quality Check
- Pass 9 units
- Fail 3 units
- Validate the transfer and create a backorder
- Open the internal transfer whose operation type `Internal Transfer 2`
Issue:
------
`Internal Transfer 2` contains two stock moves:
- Move 1:
- Demand: 20
- Quantity: 9
- This is correct.
- Move 2:
- Demand: 8
- Quantity: 0
- This move should not exist.
Expected behavior:
------------------
`Internal Transfer 2` should contain only the move corresponding to the successfully passed quantity:
- Demand: 20
- Quantity: 9
No additional move with demand 8 and quantity 0 should be generated.
Cause:
--------------------------
A 3-step route pre-creates the whole chain at confirm time: Receipt -> Internal Transfer -> Internal Transfer 2, each linked through move_dest_ids/move_orig_ids. Both fields are the two sides of a single many2many relation (stock_move_move_rel), so removing the relation from either side drops it entirely.
When the user confirms the failure on the quality check, the wizard calls quality.check._move_line_to_failure_location() (quality.py). Because the failure location differs from the next operation's source location, it runs
https://github.com/odoo/enterprise/blob/3a5e30f0bb7c1660827fd209cd74ef3bcd538213/quality_control/models/quality.py#L386
and `_break_mto_link()` then does unlink of `orig_location_id`
```py
self.move_orig_ids = [Command.unlink(parent_move.id)]
self.procure_method = 'make_to_stock'
```
**This is intentional** : it switches Internal Transfer 2 to `make_to_stock` so its `_action_assign()` reserves only what is physically present at Quality Control, instead of chain-reserving the 3 failed units that were rerouted to the failure location.
The side effect is that, because the relation is shared, unlinking parent_move from Internal Transfer 2's move_orig_ids also empties the Internal Transfer move's move_dest_ids.
- when the picking is validated and the backorder is created
When the picking is later validated, `_action_done()` splits off the remaining, never- reserved demand into a backorder move via `_split()` -> `_prepare_move_split_vals()`,
which copies `move_dest_ids` from the original move. but that's already empty,
because of the break at the time of failed quality check.
So the backorder is created with no `move_dest_ids` even though its 8 units have nothing to do with the quality failure they simply haven't
been reserved/processed yet.
https://github.com/odoo/odoo/blob/6feedc18b7873bfde62047ece1a5de882319bc21/addons/stock/models/stock_move.py#L1955
Then action_done trigger ` _action_confirm()` it calls `_push_apply()`.
https://github.com/odoo/odoo/blob/6feedc18b7873bfde62047ece1a5de882319bc21/addons/stock/models/stock_move.py#L966-L967
` _push_apply()` only skips a move if it already has `move_dest_ids` since the backorder has none, it doesn't skip — it searches for an applicable push rule from WH/Quality Control, finds the very same rule that already produced Internal Transfer 2
the first time, and creates a brand new Internal Transfer 2 move for its own demand (8)
via `rule._run_push()`. That new move has quantity 0,
Fix:
--------------------------
Before pushing a move that has no destination, `_push_apply()` now first checks whether a failed, diverted quality check (same product, same upstream chain via move_orig_ids) already exists for it. If so, this move is just a leftover backorder of a transfer that already had its link broken for quality reasons, and the existing destination move already covers it — so the push is skipped instead of creating a duplicate.
Nothing about the quality check wizard or the existing link-breaking
logic was changed; this only stops that breakage from leaking into a later, unrelated backorder.
----
opw-6298637