Thursday, November 6, 2025
10 changes · 17.0
Enhancements to existing features
Product names and descriptions sent for Indian e-invoicing and e-waybill generation are now automatically shortened to meet required character limits. This helps prevent rejected documents and keeps invoicing workflows compliant without manual cleanup.
Original PR description
Product descriptions in invoice lines must comply with character limits: - E-invoicing: maximum 300 characters - E-waybill: maximum 100 characters for both product names and descriptions Descriptions exceeding these limits are automatically truncated in the generated JSON. Task [link](https://www.odoo.com/odoo/project.task/5061450) task-5061450
Resolved issues and error corrections
This change corrects how reversal documents identify the original vendor bill when sending Malaysian e-invoices. It now uses the stored invoice reference so credit notes validate properly even if the bill reference was changed later.
Original PR description
Currently, customers get an error when trying to send the vendor credit note to MyInvoise if a reference has been set on the bill. ``` The validation failed with the following errors: The reference document UUID [...] does not exist. The internal ID for DocumentUUID [...] does not match. ``` Steps to reproduce: - With an MY company setup - Create a bill and add a custom reference - Send Bill to MyInvois - Create credit note for the Bill - Send Credit note to MyInvoice Issue: Validation will fail because the reference does not match. In the reverse bill we always send the original bill name as original bill id, but also the reference could have been used. Analysis: A solution would be to send always the reference of the original vendor bill if present. However, the bill reference may be altered after submitting the e-invoice. A safer way is to retrieve the reference from the stored e-invoice. opw-5057050
This fix stops temporary loading elements and disabled states added by Cloudflare Turnstile from being saved into website forms. As a result, forms keep working normally even if the Turnstile module is later removed or turned off.
Original PR description
Steps to reproduce: 1. Install the `website_cf_turnstile` module. 2. Enter valid Cloudflare Turnstile credentials in the configuration. 3. Go to the Website Editor. 4. Add or edit a form (e.g. contact form) and save the page. 5. Notice that the form’s submit button temporarily shows a spinner and gets a 'disabled' class while Turnstile is initializing. 6. After saving the page, these temporary elements and classes (e.g. .turnstile-spinner and 'disabled') are incorrectly saved into the form’s HTML. 7. If you later remove or uninstall the website_cf_turnstile module, the submit button remains disabled and the spinner icon still appears, even though Turnstile is no longer active. After this commit: Now, when you save a website form in the editor, any temporary classes or elements added by Cloudflare Turnstile are removed. This prevents unwanted changes from being saved to forms. task-4951470
This update fixes a crash and slow loading when opening the chat tab in the messaging menu, especially on iOS and in accounts with many chats. It improves how chat threads are loaded and sorted so the menu opens more smoothly and reliably.
Original PR description
Before this commit, a maximum call stack traceback occurred when accessing the chat tab of the messaging menu on iOS when many chats were present. On chrome and firefox, no traceback occurred, but…
Before this commit, a maximum call stack traceback occurred when accessing the chat tab of the messaging menu on iOS when many chats were present. On chrome and firefox, no traceback occurred, but the menu took a long time to open. Threads shown in the messaging menu rely on the `menuThreads` store property, which had two issues: - It was a computed field done on the many side of the relation, while relying on the inverse (thread) side would be much faster. - The sort function was triggered for each thread inserted or removed from the relation. The sort function is not trivial, and accessing sort fields through the reactive proxy is very slow. This commit fixes the issue by: - Updating the `menuThreads` property to use an inverse instead of a complex compute. - Debouncing the array sort to ensure it is executed only once when the relation is properly filled. task-4794325 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a problem where repeated IoT screen actions left background requests running instead of stopping them. As a result, the IoT interface is more reliable and no longer runs into browser request limits that could cause actions to fail or time out.
Original PR description
Steps to reproduce: 1. Pair an IoT box 2. In the IoT form view, click on any device, then click back to return to the IoT form view. 3. Repeat this step multiple times. If you have devtools open, you…
Steps to reproduce: 1. Pair an IoT box 2. In the IoT form view, click on any device, then click back to return to the IoT form view. 3. Repeat this step multiple times. If you have devtools open, you can see a `/event` fetch request every time you open the device form. Expected behaviour: - When a new request is made, the previous request is cancelled. Actual behaviour: - The previous requests remain active, and eventually no further requests are possible due to browser limits, causing action calls to timeout. This behaviour was broken when the longpolling was changed to use the `fetch` method instead of jquery. This commit restores the behaviour by using an `AbortController` instance which is aborted when `stopPolling` is called. Before the fix (action times out due to many stuck event calls): <img width="545" height="249" alt="image" src="https://github.com/user-attachments/assets/f18b8a5d-c27c-47a3-ab58-428a78ef5383" /> After the fix (action succeeds): <img width="538" height="228" alt="image" src="https://github.com/user-attachments/assets/30f2863e-9df9-4a6e-b715-135ece4224ed" />
This fixes an issue in the Italian tax XML export where quarterly tax returns could be incorrectly blocked when there was no closing in the previous month. With this correction, businesses using quarterly tax periods can post their tax closing entries normally, while the monthly validation still remains in place where needed.
Original PR description
A [previous PR](https://github.com/odoo/enterprise/pull/86642) improved the XML export of tax returns with Italian localization. This introduced a bug if the tax period is set quarterly. Currently, it prevents a tax return move from being posted if it detects previous tax closings, but there are none in the previous month. This should only be the case if the tax period is set monthly. Steps to reproduce on runbot: - Install the l10n_it_xml_export module - Switch to an Italian company and set the tax period to `quarterly` - Create a closing entry for the previous quarter - Try to create a closing entry for the current quarter Related ticket: opw-5156791
This change adds a validation step before an invoice is posted to ensure its line accounts belong to the same company as the invoice. It helps prevent cross-company accounting errors that could otherwise lead to incorrect postings and inconsistent financial records.
Original PR description
**Steps to reproduce:** - Create Company A and Company B - Create an invoice on Company A with one line having an account in Company A. - On the same invoice, change the company to Company B and change the journal to a journal of Company B. - Save, then confirm the invoice. **Issue:** The invoice, now belonging to Company B, still has the same account from company A, and we are able to post it on the journal from company B. **Solution:** Adding a step to check if the companies are correct on the move lines before posting. opw-5167958 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures the Carta Porte printout uses the same shipment identification data that was already validated and sent to the government. As a result, the PDF and QR code stay consistent each time the document is printed, avoiding confusion and mismatch issues.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_mx_edi_stock_30 - Switch to a Mexican company (e.g. ESCUELA KEMPER URGATE) - In Accounting settings, select "Solucion Factible" as PAC - Create a…
**Steps to reproduce:** - Install Accounting and l10n_mx_edi_stock_30 - Switch to a Mexican company (e.g. ESCUELA KEMPER URGATE) - In Accounting settings, select "Solucion Factible" as PAC - Create a product: * Product Name: XYZ * Product Type: Storable Product * UNSPSC Category: 25101929 Mobile office van * Tariff Fraction: 0101299999 Los demás. * UMT Aduana: Units * Weight: 1.00 - Go to "Inventory / Operations / Transfers / Deliveries" - Create a delivery: * Delivery Address: [a Mexican contact] (e.g. INMOBILIARIA CVA) * Product: Product XYZ * Transport Type: Federal Transport * Vehicle Setup: [something] (e.g. [ABC123] DEMOPERMIT) * Gross Vehicle Weight: [anything] * Distance to Destination (KM): [anything] - Validate the delivery - Generate Delivery Guide => CFDI document should be created and signed by the government - Print Carta Porte **Issue:** The "CCP ID" in the PDF is different than the one in the CFDI sent to the government. Each time the Carta Porte is printed, a new "CCP ID" is generated and use in the PDF. This also leads to a different QR-code in each PDF. **Cause:** When the Carta Porte is printed, instead of fetching the data from the existing CFDI document, they are recomputed. The problem is that "l10n_mx_edi_idccp" field is a non-stored computed field and its value is a RFC 4122 identifier. Each time the compute method is called, a new identifier is generated. **Solution:** When printing the Carta Porte, retrieve "CCP ID" from the existing CFDI document. opw-5208648
This change fixes an error that could appear when scanning the packaging of a kit variant in the barcode app. It ensures the system recognizes the correct product behind the packaging, so warehouse operations continue smoothly without interruption.
Original PR description
### Steps to reproduce: - In the settings enable "Product Packagings" - Create a product KIT with 2 variants (for instance add the color attribute with the "white" and "black") - Crete a kit bom for…
### Steps to reproduce: - In the settings enable "Product Packagings" - Create a product KIT with 2 variants (for instance add the color attribute with the "white" and "black") - Crete a kit bom for this product: 1 x COMP - Go to Inventory > Configuration > Products > Product Packagings - Create a new packaging for KIT (white) with barcode XXX - Create a receipt for 1 unit of KIT (white) - Go to the barcode app > scan your receipt - Scan XXX #### > Error: Record product.product doesn't exist in the cache, it should return by the server ### Cause of the issue: Since commit c3fdc6e07fe7704340691fcc1bd7ed3cfb19abaf, the packaging related to KIT (white) is added to the barcode cache by the `_get_stock_barcode_data` (which was necessary to solve the related issue): https://github.com/odoo/enterprise/blob/2d854711239775668d01604733d546dd40fe9f5f/stock_barcode_mrp/models/stock_picking.py#L9-L18 However, the `KIT (white)` product itself is not be present in the cache as only products present in move lines are added the barcode cache when opening the operation in barcode: https://github.com/odoo/enterprise/blob/2d854711239775668d01604733d546dd40fe9f5f/stock_barcode/models/stock_picking.py#L93-L95 This causes the issue as the package scans find the packaging in the barcode cache but can not recover its related product from it aswell: https://github.com/odoo/enterprise/blob/2d854711239775668d01604733d546dd40fe9f5f/stock_barcode/static/src/models/barcode_model.js#L988-L990 https://github.com/odoo/enterprise/blob/2d854711239775668d01604733d546dd40fe9f5f/stock_barcode/static/src/models/barcode_model.js#L1251-L1252 https://github.com/odoo/enterprise/blob/2d854711239775668d01604733d546dd40fe9f5f/stock_barcode/static/src/lazy_barcode_cache.js#L75-L80 opw-4852875
Branch companies can now use the online payment providers configured on their parent company. This fixes an issue where customers could not complete portal payments from sales orders created in a branch company because no compatible provider was found.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Have a published payment provider; 2. create a branch company; 3. create a sales order in branch company; 4. enable online payment for sales order; 5. open sales order in portal view; 6. attempt to pay. Issue ----- No compatible payment providers found. Cause ----- The `payment.provider._check_company_domain` is set to the default exact match, so when it's used in `_get_compatible_payment_providers`, it's unable to find any providers for the branch company. Solution -------- Set `_check_company_domain` to `check_company_domain_parent_of`. opw-5214269