Daily updates from Odoo
Friday, November 7, 2025
18 changes · 18.0
Enhancements to existing features
Odoo now automatically shortens product names and descriptions so they meet Indian e-invoicing and e-waybill character limits. This helps prevent document generation issues and reduces the risk of rejected submissions to the authorities.
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 Forward-Port-Of: odoo/odoo#228548
This change prevents message tracking from failing when related records do not have a display name. Instead of crashing, the system now falls back to a default label, improving reliability for users working with one-to-many and many-to-many fields.
Original PR description
Description of the issue/feature this PR addresses: Addresses: https://github.com/odoo/odoo/issues/178883 Same issue is also in 18.0. Is there a separate PR necessary or will this be ported forward? Current behavior before PR: An error is displayed when tracking is activated on one2many and many2many with records without display_name. Desired behavior after PR is merged: Should not crash and use fallback like in other cases. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change speeds up stock move validation by avoiding repeated calculations of the same destination location details for every move line. It reduces processing time for large movements, which means quicker warehouse operations and less waiting during high-volume tasks.
Original PR description
Previously when validating a movement with a location that is used in a rule, move_dest_ids was set which led to it going to check the putaway strategy. The bottleneck was the computation of the computed field child_internal_location_ids which is the same across all smls. This PR utilizes the fact that the smls in the same stock_move would have the same destination location and by proxy the same child_internal_location_ids Speed up: 1000 stock move lines: Before: 2 mins After: 1 mins --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210142
Resolved issues and error corrections
Fixed the wording printed on Philippine checks when the payment amount includes cents. The amount in words now follows the expected local format, which avoids invalid check text and improves payment accuracy.
Original PR description
In phillipines, if any amount has centovas (decimal amount), the amount in words cannot contain 'ONLY' in the end. Additionally, changed 'And' -> 'and' for decimal amount. **task**-5155953
This update corrects how credit note totals are prepared for Taiwan ECPay invoicing. It prevents payment-matched invoices from sending an incorrect amount, which could cause ECPay to reject the request.
Original PR description
When invoice is reconciled and credit note is issued, amount_residual_signed is not zero. By doing sale_amount += self.amount_residual_signed, TotalAmount is not match with the original sale amount and ECPay API returns error. task-5230384 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 change fixes a crash that could happen when users opened very large XLSX files and converted them into Odoo spreadsheets. It helps ensure large workbooks can be imported more reliably without interrupting the workflow.
Original PR description
Steps to reproduce: - upload a large xlsx file (e.g. with >1000 sheets) - open it and convert it to o-spreadsheet => traceback Task: 5222481 Forward-Port-Of: odoo/enterprise#98443
This fix stops old IoT event requests from staying open when users switch between device and form views. As a result, the interface no longer hits browser request limits, which prevents actions from timing out and restores normal use of the IoT screen.
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" /> Forward-Port-Of: odoo/enterprise#98985
This change reclassifies several Romanian accounting accounts used for customer advances from assets to current liabilities. It ensures down payments on customer invoices are recorded in the proper place, improving accounting accuracy and financial reporting.
Original PR description
Before this PR: - Accounts 419000, 419100, and 419200 were set as Current Assets, even though they represent customer advances (liabilities). After this PR: - These accounts are reclassified as Current Liabilities, allowing them to be properly used as downpayment accounts on customer invoices. Task-5188142
Alert content added in the checkout’s extra information description fields is now inserted correctly inside the editable area. This fixes a bug where the text inside the alert could not be changed, improving the checkout editing experience for website managers.
Original PR description
Problem: When adding an alert inside a field description in the Extra Step page of the checkout process, the inner content of the alert cannot be modified. Cause: In…
Problem:
When adding an alert inside a field description in the Extra Step page of the checkout process, the inner content of the alert cannot be modified.
Cause:
In
https://github.com/odoo/odoo/blob/1e96a3d127e8f521d3027f7110026ae84e11ed5e/addons/website/static/src/components/wysiwyg_adapter/wysiwyg_adapter.js#L784-L789 the logic determines the block using:
`this.closestElement(range.endContainer, 'p, div, ol, ul, cl, h1, h2, h3, h4, h5, h6');` Since the field description template is:
```html
<div class="s_website_form_field_description small form-text text-muted"
contenteditable="true">
text
</div>
```
and the selection occurs within the text (direct child of the editable `div`), the computed `block` becomes the editable area itself. As a result, the cloned alert is inserted *after* the editable area: `block.after($clonedBody[0]);`, making it non-editable.
Solution:
Use the editor’s built-in `insert` command instead of manually inserting clones. This ensures the alert is correctly inserted within the editable region.
Steps to reproduce:
1. Enable "Extra Step During Checkout" in Settings.
2. Open Website → add a product to the cart → proceed to checkout.
3. In the "Extra info" step, open the editor.
4. Select the "Give us your feedback" field.
5. Enable "Field" → "Description".
6. Run the "/alert" command in the description. → The alert content cannot be edited.
opw-5184309
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#232910This update prevents the shopping cart from creating a new line every time a product is added when it uses a single-value attribute that does not create variants. As a result, repeat clicks on the add-to-cart button now correctly increase the quantity on the existing line, improving the checkout experience and avoiding duplicate entries.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have a product attribute with variant creation set to never; 2. have product using only this attribute, with only a single value; 3. open website editor on…
Versions -------- - 18.0+ Steps ----- 1. Have a product attribute with variant creation set to never; 2. have product using only this attribute, with only a single value; 3. open website editor on /shop; 4. enable add-to-cart button & save; 5. use button on the aforementioned product at least twice. Issue ----- Each time the product gets added, a new line is created. Cause ----- Because there's only a single value, the product configurator doesn't pop up by default when adding the product to the cart. Without the configurator pop-up, the `_cart_update` method doesn't receive any `no_variant_attribute_value_ids`, which are used find a matching line if the product template has any `no_variant` attribute. Solution -------- Instead of checking `product.product_tmpl._has_no_variant_attributes()`, to see if we should attempt to match `no_variant_attribute_value_ids`, check if the added product has any `no_variant` attributes that have more than one value or are optional (multi-checkbox). If not, a `no_variant` product behaves the same as a single-variant product. opw-5093175 opw-5137351
This change ensures the Carta Porte PDF uses the same CCP ID as the already signed government document. As a result, reprinting the document will no longer produce a different QR code or mismatched reference number.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_mx_edi_stock - 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 - 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: Goods * 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 Forward-Port-Of: odoo/enterprise#98920
This fix makes website snippets visible again when the site is used in right-to-left languages such as Arabic. It improves the editor experience for multilingual websites by ensuring users can add content blocks without them appearing off-screen.
Original PR description
Steps to reproduce: =================== - Set arabic as default language for website - Try to add a snippet -> you can't see the snippets Cause: ====== Snippets were fetched correctly but were not visible. In RTL languages (like Arabic), the CSS `transform-origin` was set to 'top right', rendering the snippets off-screen. This is due to the browser's interpretation of positioning in RTL mode. For more details, see MDN: https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/position Solution: ========= Force the snippet preview's position by setting `left: 0`. This ensures its positioning is always aligned to the left, regardless of the `transform-origin` value dynamically set by the browser in RTL mode. opw-5214703
When a user scans a different serial or lot for a reserved item, the system now updates the existing reservation instead of creating an extra line. This prevents incorrect backorder messages and makes barcode processing for kit deliveries behave as expected.
Original PR description
### Issue: Scanning an unreserved lot of a kit component creates a new barcode line rather than updating the value of the initially reserved lot. As a result, the backorder porcess considers that…
### Issue:
Scanning an unreserved lot of a kit component creates a new barcode line rather than updating the value of the initially reserved lot. As a result, the backorder porcess considers that every unscanned yet initially reserved quantity is to backorder.
### Steps to reproduce:
- Create a kit product with a kit BOM:
- 1 x COMP (tracked by SN)
- Add two Serial numbers SN001 and SN002 in stock for the COMP product
- Create and confirm a delivery order for 1 unit of oyur kit product
- Go the barcode app to process your delivery
- Scan SN002
> A new line is created instead of updating the initial reservation
- Validate the delivery
#### > A backorder dialog opens proposing to update the unscanned reservation
### Cause of the issue:
Scanning a lot will first try to find a line to update, however, currently a line will only be found if the scanned lot has been reserved or if no particular lot has been reserved:
https://github.com/odoo/enterprise/blob/a1113eebf634302f7ceece612e7ee068c99781e4/stock_barcode/static/src/models/barcode_model.js#L1659-L1661 https://github.com/odoo/enterprise/blob/a1113eebf634302f7ceece612e7ee068c99781e4/stock_barcode/static/src/models/barcode_model.js#L743-L746 In particular, since no line is considered as valid, a new line is created. And, since this new line does not refer to any `move_id` while the existing one does, the move with the initial reservation will be backordered considering none of its demand was fulfilled: https://github.com/odoo/enterprise/blob/a1113eebf634302f7ceece612e7ee068c99781e4/stock_barcode/static/src/models/barcode_picking_model.js#L904-L921
### Fix:
In order to loosen the condition of lot override on barcode lines we add a check on the package and the location of the line in order to avoid use cases where the initial move line already contains info's that are proper to the initial lot.
opw-5100026When a candidate applies through the website job portal with a resume, the system now correctly links the uploaded attachment to the candidate profile. This allows OCR to work as expected on the candidate’s documents, improving recruitment processing and reducing manual follow-up.
Original PR description
Steps: 1) install website_hr_recruitment module 2) create an application through the job portal on the website with a resume 3) OCR is not working on the application Cause: The application attachments are currently not connecting with the candidate profile Fix: while creating the application through the website the system will also create attachments for the candidate profile with which you can use OCR on the candidate Task-4328769
Branch companies can now use payment providers configured on their parent company when customers pay online. This fixes a checkout issue where no compatible payment options were found, restoring the ability to complete payments from branch sales orders.
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 Forward-Port-Of: odoo/odoo#234763
The website editor now works correctly when the site uses a right-to-left language such as Arabic. This fixes misplaced editing borders and makes snippet options visible again, improving the editing experience for affected sites.
Original PR description
__Before this commit__: 1. Set a right-to-left language (e.g. arabic) as default language on the website 2. Open the website editor 3. Select an element of the page => The editor overlay border are…
__Before this commit__: 1. Set a right-to-left language (e.g. arabic) as default language on the website 2. Open the website editor 3. Select an element of the page => The editor overlay border are not in the correct place 4. Open the snippet dialog => The snippets are not visible. __Cause__: Since [this commit][1], `lang` in `session.bundle_params` is (correctly) set to the `request.lang.code`. Consequently, `website.assets_all_wysiwyg_inside` is fetched with the frontend language code in the `searchParams` which shouldn't be the case especially if the website language direction is not the same as the backend one. __Description of the fix:__ The `getBundle` method from outside the iframe is used instead of the frontend one to retrieve the URL of the bundle that matches the language direction of the builder. Backport and adapt the test from [this commit][2]. [1]: https://github.com/odoo/odoo/commit/e10852a45f10c55a833c33a51956e5f [2]: https://github.com/odoo/odoo/commit/7bcd56c07852b77849b05184200c48a task-5246916 opw-5214703
This change fixes an issue where installing the Argentina withholding demo data could create duplicate tax records with copy labels. It helps keep the tax configuration clean and avoids confusion when reviewing or using the setup.
Original PR description
**Description of the issue/feature this PR addresses**: This pr is to avoid duplicated taxes when the demo data is installed. **Steps to reproduce**: 1. Install l10n_ar_withholding module with demo…
**Description of the issue/feature this PR addresses**: This pr is to avoid duplicated taxes when the demo data is installed. **Steps to reproduce**: 1. Install l10n_ar_withholding module with demo data. 2. Take position in "(AR) Responsable Inscripto" company. 3. Check the taxes created on "Invoicing > Configuration > Accounting > Taxes". 4. Delete the filter "Sale or Purchase". 5. Add custom filter: Argentina Withholding Payment Tax type (l10n_ar_withholding_payment_type) is in ["supplier", "customer"]. 6. You will see that there are duplicated taxes (duplicated names) with suffix (Copy). **Current behavior before PR**: Duplicated taxes are created when demo data is installed. <img width="1597" height="795" alt="image" src="https://github.com/user-attachments/assets/51b65037-bb89-4ec7-8adf-21636b68e405" /> **Desired behavior after PR is merged**: No duplicated taxes are created when demo data is installed. _Task latam side_: 1360. _Task Adhoc side_: 57627. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change prevents an access error when a shared analytic account is used across multiple companies in budget-related purchase orders. It ensures users only see budget information they are allowed to access, avoiding failures when creating or reviewing orders.
Original PR description
Steps to reproduce: - Create an analytic account [ACCOUNT] not restricted to any company - Create an analytical distribution model applying [ACCOUNT] to [PRODUCT] not restricted to any company - Create a budget in company [COMP A] using analytic account [ACCOUNT] - Create a budget in company [COMP B] using analytic account [ACCOUNT] - In company [COMP B], create a purchase order, add [PRODUCT] to a line Issue: Access Error is raised Analysis: Because we search with sudo company rules are bypassed and the system assign both budget lines to the order line (budget_line_ids). When we access the field, the system try to access the budget line of the other company, causing the error. As solution we revert https://github.com/odoo-dev/enterprise/commit/4941c1928c9a2bcb38af3cadf023f904c9fd9be0 removing the `sudo` on the search and we explicitly check if the user has read access on the budget analytic model opw-5056712