Daily updates from Odoo
Thursday, June 12, 2025
35 changes · 18.0
Enhancements to existing features
This update adds more automated checks to ensure electronic invoice XML files are generated correctly for several country and regional formats. It helps reduce the risk of future changes breaking compliant e-invoicing outputs, especially for Turkey, Malaysia, ANZ, Japan, and Singapore formats.
Original PR description
This adds XML generation tests for the following UBL formats: - Turkey (Nilvera) - Malaysia - ANZ, JP, MY and SG PINT formats. Additionally, we improve error reporting in the `assertXmlTreeEqual` method. Enterprise PR: https://github.com/odoo/enterprise/pull/87222 task-4242065
Argentine sales and purchase journals can now offer the Secondary Grain Liquidation document type when it has been activated. This lets businesses correctly register grain-related sale or purchase invoices using the official LSG document instead of being blocked by a missing option.
Original PR description
The grain secondary settlement ("Liquidación Secundaria de Granos" - LSG) is an electronic document that supports grain purchase and sale and consignment transactions between intermediaries,…
The grain secondary settlement ("Liquidación Secundaria de Granos" - LSG) is an electronic document that supports grain purchase and sale and consignment transactions between intermediaries, cooperatives, consignees, exporters, brokers and future market operators. This document is emitted by the intermediary of the operation so, in Odoo, if the user is the seller or purchaser of the operation, it will need to register that document in a sale or purchase journal accordingly.
This PR aims to include this document in the list of the available ones to allow the user to select it when registering either a sale or a purchase.

**Behaviour before this PR:**
When the user creates an invoice in a sale or purchase journal, the document type "331 - SECONDARY GRAIN LIQUIDATION" is not available to select, although it is activated.
**Behaviour after this PR:**
When the user creates an invoice in a sale or purchase journal, the document type "331 -SECONDARY GRAIN LIQUIDATION" is appears in the list of documents (the document type should be activated before)
**Steps to reproduce:**
1. Install l10n_ar
2. Go to "Document Types" menu and activate "331 - SECONDARY GRAIN LIQUIDATION"
3. Create or use a sale or purchase journal that has "Is AFIP POS?" as False.
4. Create an invoice in that journal and check that the document type with code 331 is not available to select.

---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update adds automated checks to ensure Peruvian electronic invoices are generated correctly for free invoices and invoices combining ISC and IGV taxes. It also reorganizes the related test files, making future maintenance safer and easier without changing day-to-day user workflows.
Original PR description
This adds tests to check that the UBL is correctly generated in the case of free invoices (feature introduced by c8abe0a7536a0bbe703730) and invoices involving both ISC and IGV (feature introduced by d598f338537b8f55771d7a). We take the opportunity to refactor the Peruvian tests and split the expected XMLs each into its own file. Community PR: https://github.com/odoo/odoo/pull/213402 task-4242065
The GSTR OTP flow now guides users to enter a valid 6-digit OTP before validation can proceed. It also shows clearer error and delivery messages, helping prevent failed submissions and reducing confusion about where the OTP is sent.
Original PR description
**Before this PR:** - The `Validate` button was always visible, even if the OTP was empty or incorrect. - Users could attempt validation with an invalid or missing OTP. - The OTP delivery message was unclear. **After this PR:** - The `Validate` button proceed done when a valid 6-digit numeric OTP is entered. - A clear error notification is shown if users try to proceed without a valid OTP. - The OTP delivery message now clearly informs that the OTP is sent to the registered mobile number on the GST portal. These changes improve user guidance and prevent incorrect OTP submissions. Task ID: 4848729
This update improves the message shown when a Mexican payroll calculation fails because an employee's integrated daily wage is below the minimum wage threshold used by the CEAV employer contribution rule. Payroll users now get a clearer explanation of what needs attention instead of a confusing technical error, making payslip troubleshooting easier.
Original PR description
Steps to reproduce: - Install payroll, l10n_mx_hr_payroll (mexican localisation) - Install l10n_mx_hr_payroll_account - Switch to a Mexican Company - Create a payslip for a mexican employee with…
Steps to reproduce: - Install payroll, l10n_mx_hr_payroll (mexican localisation) - Install l10n_mx_hr_payroll_account - Switch to a Mexican Company - Create a payslip for a mexican employee with amount < 4000 - Compute the sheet for the payslip Error message appears, this error message is not a descriptive to the user or not telling what could have gone wrong. This happens because the mexican pay structure has some salary rules that has to be computed, one of these rules is `Retirement, assault in elderly and old age (CEAV) IMSS (Employer)` that has mode of code. This mode means calling safe_eval on the code raw text of it written in the xml file on the data folder. This rule aims to find the suitable taxation level to be applied on the salary. It reads the limits of each level and check if the `integrated_daily_wage` of the employee falls in this level and applies that taxation level. There is no upper limit on the salary, But there is a min level, hence if the integrated_daily_wage < mdw (minimum daily wage) the function returns None that used as index in the taxation table leading to an unreadable Exception from the safe_eval call. https://github.com/odoo/enterprise/blob/747482f34ca8210d89d81b3363ec5a8fc3a4ff6f/l10n_mx_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml#L1111-L1120 opw-4576482
Resolved issues and error corrections
This update brings the spreadsheet component to a newer version with fixes that make large filters and table operations faster. It also corrects several display and data-handling issues, including pie chart label overlap, text-formatted cells being treated as filled, and zero values not being handled correctly.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/c1d64fba1 [REL] 18.0.33 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/c1d64fba1 [REL] 18.0.33 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/c8a291e80 [PERF] table: faster table extend check [Task: 4864420](https://www.odoo.com/odoo/2328/tasks/4864420) https://github.com/odoo/o-spreadsheet/commit/e7b4ff760 [FIX] Table: avoid triggering an unecessary evaluation [Task: 4862862](https://www.odoo.com/odoo/2328/tasks/4862862) https://github.com/odoo/o-spreadsheet/commit/3de4362fd [FIX] filter: fix horrible performances with huge data filters [Task: 4658998](https://www.odoo.com/odoo/2328/tasks/4658998) https://github.com/odoo/o-spreadsheet/commit/d1cc0590d [FIX] Formats: text format should not mark the cell as non-empty [Task: 4856923](https://www.odoo.com/odoo/2328/tasks/4856923) https://github.com/odoo/o-spreadsheet/commit/c98a9beeb [FIX] pie chart: prevent overlapping shown values [Task: 4639810](https://www.odoo.com/odoo/2328/tasks/4639810) https://github.com/odoo/o-spreadsheet/commit/0f8b34976 [FIX] base_extractor: properly handle 0 as default value [Task: 4730308](https://www.odoo.com/odoo/2328/tasks/4730308) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Mehdi Rachico (mera) <mera@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
This fixes an Italian localization setting so subtotal labels use an English default and can be translated according to the user or partner language. Invoices, sales orders, and purchase orders will no longer show the untaxed amount label in Italian for non-Italian users.
Original PR description
The Italian localization defined 'preceding_subtotal' in tax group records using the Italian term "Imponibile" as the default value. This caused the label for untaxed amounts in invoices, sale orders, and purchase orders to always appear in Italian, regardless of the system or partner language. task-4853046 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
Using an existing signing template as a layout now keeps grouped radio buttons connected. This prevents signers from selecting multiple choices in a radio group and ensures reused document layouts behave like the original template.
Original PR description
_____________________________________________________ ## Short functional explanation of the error Using the layout of a template document, containing radio buttons, on a new document will unlink…
_____________________________________________________ ## Short functional explanation of the error Using the layout of a template document, containing radio buttons, on a new document will unlink radio buttons, making them useless. ## Reproduction Steps 1. Go to the Sign module, and click on the Templates tab. 2. Click on the "Upload PDF" purple button, and upload a PDF of your choice. 3. On the left side of the screen, there's a panel where we can drag and drop sign items. Drag and drop a Radio button. 2 buttons will automatically show, and a yellow link will appear between the buttons. This link indicates that, when a user opens the document to sign, when clicking on a radio button, the other one will automatically be unselected if previously selected. 4. Save and return to the Templates window. 5. A new row has appeared with the name of the document. On the right side of this row, hover the house next to the share button and click on the 3 dots. Then, click on Use Layout. 6. Upload a PDF of your choice. 7. When the PDF shows, there's no yellow link between the radio buttons, unlike on the template from which the layout was used. ## Causes of the problem In the file sign/models/sign_document.py, in the method _copy_sign_items_to(self, new_document), we copy every sign item from the template to the new document. However, the copy method we call doesn't take into consideration the special link between radio buttons, replicating the buttons correctly but not the link. This link is expressed by the radio set to which the radio buttons belong: indeed, after the copy of sign items, each radio button belongs to a different radio set, separating them. ## Explanation of the fix The fix consists of a rework of the _copy_sign_items_to method and a brand-new method specifically used to copy radio buttons. To keep the link between them, we assign all the buttons of the same set on the original documents to the same brand new radio set. The first button is copied normally: this creates a new radio set. Then, for the remaining buttons, we call copy_radio_item, to which we pass the button created first to use the information the next buttons will share with it. ______________________________________________________________ opw-4842590 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The automated project creation check now completes the Sales Order Item form before saving the project. This prevents intermittent failures caused by an unfinished pop-up blocking the save action, improving confidence in the sales-project workflow tests.
Original PR description
Steps to reproduce the issue: 1- install sale_project without demo data 2- as the test is not deterministic, adding step_delay may help reproducing it The project creation tour was intermittently failing at the step that attempts to save the project (.o_form_button_save:enabled). The failure occurred because this step was triggered while a modal (for creating a Sales Order Item) was still visible and overlaid on top of the main form. Add missing steps in the project tour to select a product in the Sales Order Item form and save and close the form. build_error-163102
Users assigned to subtasks in private projects can now open those subtasks from My Tasks without encountering an access error. This ensures assigned work remains accessible while preserving the project's private access rules.
Original PR description
To reproduce: ============= - Create a private project and a task in it - Create a subtask in this task and assign it to Demo - Log in as Demo and go to "My Tasks" - the subtask is listed but opening it gives an access error Problem: ======== the computation of the field `show_display_in_project` requires reading `project_id` from the parent task, which is not allowed for Demo Solution: ========= read through `sudo` opw-4850408 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Credit notes sent through the Spanish TicketBAI integration now show the total invoice amount as negative in the generated XML. This prevents incorrect tax reporting data and helps ensure credit notes are accepted with the expected values.
Original PR description
**Issue** Credit notes submitted to TicketBAI incorrectly include a positive ImporteTotalFactura in the generated XML, instead of a negative value. **Steps to Reproduce** 1. Install Accounting and TicketBAI modules. 2. Create, confirm, and send an invoice. 3. Reverse the invoice to create a credit note. 4. Confirm and send the credit note. 5. Download the generated XML and observe the total amount. **Root Cause** The _get_importe_desglose_foreign_partner method did not account for whether the move is a credit note or an invoice. As a result, the total amount (ImporteTotalFactura) is always positive **Fix** Use the existing is_refund parameter to correctly apply the sign to the total amount based on the document type. Opw-4814241 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes the online shop cart notification banner so it remains properly positioned when shoppers scroll the page. The change helps customers keep important cart feedback visible and reduces confusion during checkout-related interactions.
Original PR description
task-208961 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adjusts internal tests for the mail editor and Unsplash integration so they wait properly before counting items on screen. It helps reduce unreliable test failures, supporting smoother development and releases without changing user-facing behavior.
Original PR description
Purpose of this PR: - Update powerbox test cases to use `expectElementCount` helper, which waits for elements to appear before checking their count. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The HTML editor now places a separator before an empty block and after a block that already contains text. This makes page editing behave more intuitively and avoids separators appearing in the wrong position.
Original PR description
Description of the issue this PR addresses: Current behavior before PR: The separator was always inserted before the current block, regardless of its content. Desired behavior after PR is merged: The separator is inserted before the block if it's empty, otherwise it is inserted after the block if it contains text. task-4848276 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update makes automated command palette tests less likely to fail randomly when the test environment is slower or busier than usual. It improves confidence in build results without changing the user-facing command palette experience.
Original PR description
Before this commit, some command palette tests failed non- deterministically. The cause was that the values set on debounced functions were too short, compared to the time it took to render the component after each action, PLUS the additional animation frame awaited by each call to 'advanceTime'/'runAllTimers'. All in all, should the CPU be a bit busier than usual, these tests would fail. This commit does 2 things: - the debounce delays have been vastly increased (100 & 200ms -> 500 & 1000ms); - the awaited actions in the command palette test module have been reduced to a minimum, using Hoot helpers directly instead of the web 'contains' wrapper. runbot [223268](https://runbot.odoo.com/odoo/runbot.build.error/223268) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix removes a race condition that could stop dynamic placeholder popovers from opening after a previous one was closed or failed. Users should see more reliable behavior when using placeholder selection in the web interface.
Original PR description
Before this commit there was a race condition that prevented other DynmaicPlaceholder to be spawned because they waited a Promise that was initiated by a now dead instance of the same class This was because the cached promise was originating from a protected method (orm service, with useService) Also, the cache did not account for failures. After this commit, there is no concurrency failures of that kind. opw-4815802 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
Spreadsheet chart interactions have been corrected so trendline clicks no longer trigger errors and line chart points open the related Odoo records as expected. This prevents a confusing failure and restores a useful navigation flow for users working with chart data.
Original PR description
## Description Before this commit: - Clicking on a trendline point resulted in a RuntimeError. - Line chart points were not redirected to Odoo records. After this commit: - Clicking on trendline points is now ignored, preventing the error. - Line chart points now correctly redirect users to the relevant Odoo records. Task: [4815995](https://www.odoo.com/odoo/2328/tasks/4815995) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix removes duplicate asset entries that were introduced by an earlier change in the website and HTML editor areas. It helps keep page editor resources cleaner and reduces the risk of unnecessary loading or maintenance confusion.
Original PR description
We have duplicate assets imported from the pr: https://github.com/odoo/odoo/pull/187091 up to saas-18.2, this pr is to clean the duplicate introduced --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Invoice reports for Mexican electronic invoicing now display the same fiscal regime used in the official CFDI when an invoice is marked as issued to the public. This prevents inconsistencies between the customer-facing invoice and the legally generated document.
Original PR description
Before, if you marked the to publick check in an invoice, the generated cfdi would force the Without fiscal obligations regime at the receptor data, but this wasn't done on the invoice which caused a mismatch on what was being reflected on the invoice and what was on the cfdi. This commit targets to show the same info on the invoice if invoice is set to public target: 18.0 -> master task-4685440
A new automated test was added to help ensure follow-up reports do not crash when the journal option is disabled. This reduces the risk of the same issue returning in future updates and helps keep customer follow-up processes stable.
Original PR description
Adds a test to the fix done in the commit [814b1b2](https://github.com/odoo/enterprise/commit/814b1b21f60189715c82c96397c36da706736490) opw-4836094
Fixes an issue where an unfinished quality check could be skipped after another product in the same receipt failed inspection. Users can now reopen the pending check, helping ensure all received products are properly inspected before validation.
Original PR description
### Steps to reproduce: - Create 2 storable products: Product A, Product B - Create a control point pass/fail control by quantity on receipt and set both products on it. - Create and confirm a…
### Steps to reproduce:
- Create 2 storable products: Product A, Product B
- Create a control point pass/fail control by quantity on receipt and set both products on it.
- Create and confirm a receipt with 2 moves:
- 2 x Product A
- 2 x Product B
- Click on the "Quality Check" button and mark one unit of Product A as failed.
> This should open the QC for product B.
- Close the QC for prodcut B wihtout setting it as failed or passed.
- Click on the "Quality Check" button
#### > Nothing happends
### Expected behavior:
The QC for product B should open.
### Cause of the issue:
When the quality check is marked as failed, the related move is picked: https://github.com/odoo/enterprise/blob/679c81924e05e7544eecfdb960c9ed9611e9cdd5/quality_control/models/quality.py#L438-L451 However, the move for your second porduct is not and hence, its product is not considered to be checkable by the `check_quality` action: https://github.com/odoo/enterprise/blob/679c81924e05e7544eecfdb960c9ed9611e9cdd5/quality_control/models/stock_picking.py#L61-L69
Since these lines were added in c83728f3a7f1504b272f4ef97e4187868338adb3 to not bypass the QC of the unpicked move at validation we should probably only add that filtering condition in that case and continue to consider the unchecked moves as checkable prior to validation.
opw-4765075This fixes how SEPA Direct Debit batch payments choose eligible payments after a recent domain change. It helps ensure users see the correct payment options when preparing SEPA batches, reducing confusion and potential processing errors.
Original PR description
The dynamic payments domain for batch payments has been added in https://github.com/odoo/enterprise/pull/86217 Fix the override for domain payments in the SEPA module.
Users can no longer delete the booking product required for paid appointments. This prevents errors when opening Paid Seats or Paid Consultation after required booking fee data was removed.
Original PR description
Currently, an error occurs when a user tries to access `paid consultation` or `paid seats` if the booking fees are deleted by the user. **Steps to Reproduce:** - Install…
Currently, an error occurs when a user tries to access `paid consultation` or `paid seats` if the booking fees are deleted by the user. **Steps to Reproduce:** - Install **appointment_account_payment** module without demo data. - Delete **Booking Fees** product`from `invoicing->customer->products` - Click on `Paid Seats` or `Paid Consultation` in the Appointment App. **Error:** `ValueError: No record found for unique ID appointment_account_payment.default_booking_product. It may have been deleted.` **Root Cause:** After deleting the **Booking Fees**, if user tries to open `Paid Seats` or `Paid Consultation` the system will try to access id of `appointment_account_payment.default_booking_product` at [1] or [2] causing an error. [1]- https://github.com/odoo/enterprise/blob/a4f68967a9826fac981c1141ece1791a0baf647a/appointment_account_payment/models/templates/appointment_type.py#L43 [2]- https://github.com/odoo/enterprise/blob/a4f68967a9826fac981c1141ece1791a0baf647a/appointment_account_payment/models/templates/appointment_type.py#L56 **Solution:** This commit prevents error by restricting user from deleting the `Booking Product`. Sentry-6013528364
Brazilian point-of-sale orders for company customers will no longer be automatically marked for invoicing. This prevents orders from being incorrectly invoiced when the Brazil POS flow requires invoicing to remain disabled.
Original PR description
Since [^1] company customers are always invoiced by default. To Invoice should always be false for Brazil POS orders which is why the button on the payment screen was hidden, however, there is now no way to uncheck it. Fix: Set "To Invoice" to false always if the company's fiscal country is Brazil. [^1]: https://github.com/odoo/odoo/pull/202515 opw-4861672
The report editor no longer makes unnecessary server requests when users add a field with the slash shortcut. This improves efficiency and can make the editing experience smoother without changing user-facing functionality.
Original PR description
…t mail should do Before this commit, in the reportEditor, add a field (by typing "/") There was calls made to the server that are not necessary for the report editor. This commit removes the calls by overriding the corresponding method. opw-4815802
Belgian companies can now import WinBooks files even when company-currency and foreign-currency balances have opposite signs. The fix prevents an import crash, reducing manual troubleshooting and allowing affected accounting data to load successfully.
Original PR description
Before this commit, there was a traceback error when importing Winbooks having a different sign on the balance in company currency and foreign currency. There was a frozendict error in the import_wizard/_import_move(). Steps to reproduce: - Choose a Belgium company - Import a Winbooks file having a different sign on the balance in company currency and foreign currency - Adapt journals if needed - The traceback should be triggered What happens is that the record where added to a list, then the app tries to change 'CURRAMOUNT' value to 0. But it was a frozendict item, so it create an error. I replace the record added to the list with a copy version that can be mutated. opw-4794471
Miscellaneous changes
If the browser triggers a request just as a tour is finishing up (e.g. navigation to a new page triggering a font fetch), the harness can close the websocket connection while the request is in the `requestPaused` proxy, causing the reply to fail and trigger an error. We can just ignore the error in that case. An alternative would be to enqueue a future into `_responses` when we receive the query, but that would still have a race as depending on scheduling decisions the browser could have alre
Original PR description
If the browser triggers a request just as a tour is finishing up (e.g. navigation to a new page triggering a font fetch), the harness can close the websocket connection while the request is in the `requestPaused` proxy, causing the reply to fail and trigger an error. We can just ignore the error in that case. An alternative would be to enqueue a future into `_responses` when we receive the query, but that would still have a race as depending on scheduling decisions the browser could have already shut down by the time we reach the handler, so we'd need to enqueue a future, check if `ws` is still open, and bail if not. And even then that's still got a hole as there is some time between the `wait(_responses.values())` and the `ws.close()`. https://runbot.odoo.com/odoo/error/186309 Forward-Port-Of: odoo/odoo#213911
**Current behavior before PR:** When the user opened the Favorite category with no favorite GIFs, nothing was shown. This was caused by using `.length` on Map objects (`evenGif.gifs` and `oddGif.gifs`) , which should have been `.size`. (since #131344 ) **Desired behavior after PR is merged:** Help message is correctly displayed when no favorite GIFs are available. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo
Original PR description
**Current behavior before PR:** When the user opened the Favorite category with no favorite GIFs, nothing was shown. This was caused by using `.length` on Map objects (`evenGif.gifs` and `oddGif.gifs`) , which should have been `.size`. (since #131344 ) **Desired behavior after PR is merged:** Help message is correctly displayed when no favorite GIFs are available. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213374
If you have 2 invoices and 2 dropship picking linked to 1 Dropship Sale Order, and the two dropship have different SVL cost: The 2nd invoice will have incorrect COGS https://github.com/user-attachments/assets/79f15933-0449-4081-aff0-daa5709889bf ## To reproduce - Create Product P-DROP: * category: AVCO automated * Routes: Buy & Dropship * Purchase Vendors: Azure Interior @ $10 - Create Sale Order for 1 unit of P-Drop ⇾ Confirm - Go to Purchase Order ⇾ ensure unit price is
Original PR description
If you have 2 invoices and 2 dropship picking linked to 1 Dropship Sale Order, and the two dropship have different SVL cost: The 2nd invoice will have incorrect COGS…
If you have 2 invoices and 2 dropship picking linked to 1 Dropship Sale Order, and the two dropship have different SVL cost: The 2nd invoice will have incorrect COGS
https://github.com/user-attachments/assets/79f15933-0449-4081-aff0-daa5709889bf
## To reproduce
- Create Product P-DROP:
* category: AVCO automated
* Routes: Buy & Dropship
* Purchase Vendors: Azure Interior @ $10
- Create Sale Order for 1 unit of P-Drop ⇾ Confirm
- Go to Purchase Order ⇾ ensure unit price is $10 ⇾ Confirm
- Receive products ⇾ ensure **valuation is $10**
- Create Vendor Bill (optional) ⇾ Confirm
- Create Invoice ⇾ Confirm
* **COGS value is $10** (ok)
- In Sale Order, set ordered quantity to 2 units
* New draft PO should have been created
- Go to New Purchase Order ⇾ set price to $20 ⇾ Confirm
- Receive products ⇾ ensure **valuation is $20**
- Create Vendor Bill (optional) ⇾ Confirm
- Create Invoice ⇾ Confirm
* COGS should be $20, but they are actually **$16.67** (KO)
---
## Test result without fix
```
2025-06-11 11:25:32,230 29041 ERROR oes_test_17 odoo.addons.stock_dropshipping.tests.test_stockvaluation: FAIL: TestStockValuation.test_dropship_cogs_multiple_invoices
Traceback (most recent call last):
File "/home/odoo/projects/odoo-src/multiverse/src/17.0/odoo/addons/stock_dropshipping/tests/test_stockvaluation.py", line 382, in test_dropship_cogs_multiple_invoices
self.assertEqual(dropship2_cogs_line.balance, -16)
AssertionError: -13.33 != -16
```
OPW-4665635
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#213763## Issue description: - When 'qty_producing' is updated, the new move takes the MO date_deadline. - The MO date_deadline is the minimum date of all the finished moves date_deadline. - When the SO commitment_date is incremented (+1day), the FNS move date_deadline is updated, but not the BP move one. - The MO date_deadline stay the same (because BP move is a finished move, and BP.date_deadline < FNS.date_deadline) - The new FNS move deadline will not be equal to the existing FNS move deadline
Original PR description
## Issue description: - When 'qty_producing' is updated, the new move takes the MO date_deadline. - The MO date_deadline is the minimum date of all the finished moves date_deadline. - When the SO…
## Issue description:
- When 'qty_producing' is updated, the new move takes the MO date_deadline.
- The MO date_deadline is the minimum date of all the finished moves date_deadline.
- When the SO commitment_date is incremented (+1day), the FNS move date_deadline is updated, but not the BP move one.
- The MO date_deadline stay the same (because BP move is a finished move, and BP.date_deadline < FNS.date_deadline)
- The new FNS move deadline will not be equal to the existing FNS move deadline
- The merge is blocked
## How to reproduce:
- Enable By-Products in setting
- Unarchive MTO route
- Create storable products FNS, CMP and BP
- Set FNS route: Manufacture and MTO
- Create BoM:
- Producing: 1 of FNS
- Component: 1 of CMP
- By-Product: 1 of BP
- Create Sale Order for 1 unit of FNS ⇾ Confirm
- Set Delivery Date to 1 day in the future (date must be incremented)
- Go to MO, set quantity producing to 2
- => 2 Finished move for FNS exists; the merge was not done due to a discrepancy in 'date_deadline'
- Click "Produce All"
- !! Singleton Error
## Fix:
On date_deadline change: propagate deadline to sibling FNS moves
OPW-4671555
---
## Test result without fix:
```
2025-06-03 11:54:54,076 37053 ERROR oes_test_17 odoo.addons.sale_mrp.tests.test_sale_mrp_flow: FAIL: TestSaleMrpFlow.test_date_deadline_propagation
Traceback (most recent call last):
File "/home/odoo/projects/odoo-src/multiverse/src/17.0/odoo/addons/sale_mrp/tests/test_sale_mrp_flow.py", line 2624, in test_date_deadline_propagation
self.assertEqual(len(fns_move), 1)
AssertionError: 2 != 1
```
## Test result without fix and the asserts on finished moves removed (to reach 'button_mark_done'):
```
Traceback (most recent call last):
File "/home/odoo/projects/odoo-src/multiverse/src/17.0/odoo/addons/sale_mrp/tests/test_sale_mrp_flow.py", line 2622, in test_date_deadline_propagation
mo.button_mark_done()
File "/home/odoo/projects/odoo-src/multiverse/src/17.0/odoo/addons/mrp/models/mrp_production.py", line 2014, in button_mark_done
productions_not_to_backorder._post_inventory(cancel_backorder=True)
File "/home/odoo/projects/odoo-src/multiverse/src/17.0/odoo/addons/mrp/models/mrp_production.py", line 1723, in _post_inventory
order._cal_price(moves_to_do_by_order[order.id])
File "/home/odoo/projects/odoo-src/multiverse/src/17.0/odoo/addons/mrp_account/models/mrp_production.py", line 89, in _cal_price
finished_move.ensure_one()
File "/home/odoo/projects/odoo-src/multiverse/src/17.0/odoo/odoo/models.py", line 5899, in ensure_one
raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: stock.move(8252, 8255)
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#212718Have a model that returns a warning onchange during the first call to onchange. On another model that has a many2one to the first model, Create And Edit a record via the many2one field on the form view. Before this commit, there was an endless loop because on dialog was triggering the opening of a second one *during* its willStart lifecycle period, so none of them end up mounted, instead, the formViewDialog was constantly reinstanciated because the dialog container constantly received request
Original PR description
Have a model that returns a warning onchange during the first call to onchange. On another model that has a many2one to the first model, Create And Edit a record via the many2one field on the form view. Before this commit, there was an endless loop because on dialog was triggering the opening of a second one *during* its willStart lifecycle period, so none of them end up mounted, instead, the formViewDialog was constantly reinstanciated because the dialog container constantly received requests to re-render. After this commit, we only open those dialog onMounted of the main component, and this issue doesn't occur anymore. opw-4783459 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#213811 Forward-Port-Of: odoo/odoo#213742
Improve the error message when the response is HTTP 403. Currently, the content is empty for such errors, making it difficult to identify the source of the problem for users. Step to reproduce: - Try to send an invoice with wrong credentials. - The error message is empty, making it hard to understand what went wrong. Error message before this commit:  After:  After:  Also added the missing .pot file. opw-4823950 opw-4628908 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#212379
Steps to Reproduce : 1. Activate the developer mode 2. Create a menu from the Site ---> Menu Editor option 3. Go to Configurations ---> Redirects 3.1. Select Action as : '301 Moved Permanently' 3.2. URL From : '/<url_added_at_time_Menu_creation' 3.3. URL To : '#' 4. Go to the Home page 5. Click on the Menu created 6. Traceback Occurs Expected Behavior: The page should not crash even when the paths of 'url_from' and 'url_to' are the same. Reason: When the paths of
Original PR description
Steps to Reproduce : 1. Activate the developer mode 2. Create a menu from the Site ---> Menu Editor option 3. Go to Configurations ---> Redirects 3.1. Select Action as : '301 Moved Permanently' …
Steps to Reproduce : 1. Activate the developer mode 2. Create a menu from the Site ---> Menu Editor option 3. Go to Configurations ---> Redirects 3.1. Select Action as : '301 Moved Permanently' 3.2. URL From : '/<url_added_at_time_Menu_creation' 3.3. URL To : '#' 4. Go to the Home page 5. Click on the Menu created 6. Traceback Occurs Expected Behavior: The page should not crash even when the paths of 'url_from' and 'url_to' are the same. Reason: When the paths of 'url_to' and 'url_from' are the same and the value of 'url_to' starts with '?' or '#' , the redirection loop is created and the page is crashed. This commit is resolving page crash issue by checking the path of 'url_to' and 'url_from' in '_serve_fallback' method, where redirection is happening. If path is same, then we will not redirect; instead, we will return from this method. If 'url_to' starts with '#' or '?', In this case, we are showing validation error to the user. task-3984211 Forward-Port-Of: odoo/odoo#175992
Currently a traceback is occurring when the user tries to post a journal entry from journal dashborad. **Steps to reproduce:** 1) Install `l10n_it_xml_export` and switch to IT company 2) Create a closing entry for the tax report 3) Open the miscellaneous Operations from Accounting Dashboard 4) Open the above-created entry by removing the default filter 5) Post the closing entry, a wizard opens. 6) Validate the values. 7) A traceback appears **Error:** ``` account.journal' objec
Original PR description
Currently a traceback is occurring when the user tries to post a journal entry from journal dashborad. **Steps to reproduce:** 1) Install `l10n_it_xml_export` and switch to IT company 2) Create a…
Currently a traceback is occurring when the user tries to post a journal entry from journal dashborad. **Steps to reproduce:** 1) Install `l10n_it_xml_export` and switch to IT company 2) Create a closing entry for the tax report 3) Open the miscellaneous Operations from Accounting Dashboard 4) Open the above-created entry by removing the default filter 5) Post the closing entry, a wizard opens. 6) Validate the values. 7) A traceback appears **Error:** ``` account.journal' object has no attribute '_get_report_options_from_tax_closing_entry' ``` **Cause:** When the user tries to post the closing entry from the accounting dashboard, its active_model is `account.journal`, and the active_id should be the current id of the miscellaneous journal. This leads to the above traceback, as the method `_get_report_options_from_tax_closing_entry` is not available in account.journal. **Solution:** To resolve this issue, we can browse the current move from the `ctx['l10n_it_moves_to_post']`, since the value of the `l10n_it_moves_to_post` is also self.ids. Which is the current active id for that closing entry. https://github.com/odoo/enterprise/blob/3d89d9fe6be8e789278dee9bc706e091ee5a0ec5/l10n_it_xml_export/models/account_move.py#L19 opw-4783958 Forward-Port-Of: odoo/enterprise#86791
When importing a coda statement, in case of globalisation, Odoo doesn't take into account the different levels of details. Instead of that, we keep every lines even if one is already the sum of each detailed lines. According to https://febelfin.be/media/pages/publicaties/2023/archief-bankstandaarden/0c9e6e5026-1694763197/standard-coda-2.4-fr.pdf Chapter 3.1 Transaction type are communicate like that: - 0 -> simple amount without detailed data - 1 -> amount as totalised by the cus
Original PR description
When importing a coda statement, in case of globalisation, Odoo doesn't take into account the different levels of details. Instead of that, we keep every lines even if one is already the sum of each…
When importing a coda statement, in case of globalisation, Odoo doesn't take into account the different levels of details. Instead of that, we keep every lines even if one is already the sum of each detailed lines. According to https://febelfin.be/media/pages/publicaties/2023/archief-bankstandaarden/0c9e6e5026-1694763197/standard-coda-2.4-fr.pdf Chapter 3.1 Transaction type are communicate like that: - 0 -> simple amount without detailed data - 1 -> amount as totalised by the customer - 5 -> detail of 1 - 2 -> amount as totalised by the bank - 6 -> detail of 2, simple amount without detailed data - 7 -> detail of 2, simple amount with detailed data - 9 -> detail of 7 Let's assume this case: - 1 line with transaction type == 2, amount == 3000 - 1 line with transaction type == 7, amount == 2000 - 1 line with transaction type == 9, amount == 2000 - 1 line with transaction type == 7, amount == 1000 - 1 line with transaction type == 9, amount == 1000 Currently, Odoo will display lines 1, 2 and 4 in case of split transactions instead of lines 3 and 5. In case of not split transactions, Odoo sums up the same lines. With this commit, we keep trace of last line's transaction type to: - be able to delete it if it has detailed data, in case of split transaction - to sum up only the relevant lines opw-4619660 opw-4795349 Forward-Port-Of: odoo/enterprise#85006