Tuesday, September 8, 2026
12 changes · 19.0
Enhancements to existing features
Bank reconciliation entries that previously showed a placeholder “/” as their name will now use the related account name instead. This makes reconciled line descriptions clearer and easier for accounting users to understand.
Original PR description
This commit will treat move with "/" as their name as empty, and put the name of the account in the reconciled line name task-6424612
Italian electronic invoices now handle cash rounding lines more safely when generating XML. This avoids changing shared tax calculation behavior while still ensuring the correct exempt tax information is included in the invoice export.
Original PR description
Remove the override of `_prepare_product_base_line_for_taxes_computation` since it's a low level method used by a lot of flows. Instead, we just add the 0% exempt tax on the line on-the-fly at the generation of the xml. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
The quotation layout now keeps section totals aligned when the optional Related Task column is shown. This prevents amounts from appearing in the wrong place or being cut off, making quotations easier to read and present accurately.
Original PR description
Steps to reproduce: --- - Install `industry_fsm_sale` module. - Create a quotation. - Add a section line, then a product line below it. - Enable the optional `Related Task` column from the column…
Steps to reproduce: --- - Install `industry_fsm_sale` module. - Create a quotation. - Add a section line, then a product line below it. - Enable the optional `Related Task` column from the column selector. Issue: --- - When the Related Task optional column is enabled, the section line's aggregated Amount value appears in the wrong column or is clipped. Root cause: --- - `getSectionColumns()` computes the section title's colspan as `columns.length - sectionCols.length + 1` [1]. This formula assumes all non-section columns sit in the middle of the list, with the aggregated amount column (`price_subtotal`) anchored at the right end. - The `task_id` [2] field was added via `position="inside"`, which appends it at the end of `<list>` after `price_subtotal` — breaking that assumption by placing a non-section column after the aggregated amount column. - This makes the section title colspan one unit too wide when `task_id` is enabled, shifting the section's aggregated Amount cell past the `price_subtotal` header column. Fix: --- - Changed the xpath to insert `task_id` after the `discount` field, placing it in the middle of the column list where the colspan formula correctly absorbs it into the title span and keeps the amount column aligned. [1]: https://github.com/odoo/odoo/blob/ed22e3c299d6606f8014e2ffdd4a30f5c7be83ec/addons/account/static/src/components/section_and_note_fields_backend/section_and_note_fields_backend.js#L449 [2]https://github.com/odoo/enterprise/blob/2de1512bce6e2bef16ebd45629cbaf0839bebcbf/industry_fsm_sale/views/sale_order_views.xml#L9-L11 Before: <img width="1254" height="262" alt="image" src="https://github.com/user-attachments/assets/7a62c22c-b002-49d9-a75c-f569987f565e" /> After: <img width="1230" height="337" alt="image" src="https://github.com/user-attachments/assets/951f213a-09af-4b07-be30-d69dae2cc51e" /> opw-6472638 ---
Website builder users can now click inside editable navigation links without the text cursor jumping to the start of the link. This makes editing menu or navbar link text smoother and prevents a small but disruptive editing annoyance.
Original PR description
Problem: Clicking inside a navigation link in website builder causes the caret to jump to the start of the link element. Cause: `LinkPlugin` unconditionally reset the selection to the start of non-editable link elements, ignoring whether the anchor node was inside an editable child element. Solution: Do not reset selection if the anchor node is inside a `contenteditable` element. Steps to reproduce: - Open website builder. - Click inside a navbar link to place the caret. => Caret no longer jumps to the start of the link. opw-6535386 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286527
Fixes an issue where moving sections around a sales order could crash the page if an empty product line was present. Users can now rearrange sections without interruption, even before all products have been selected.
Original PR description
Description of the issue/feature this PR addresses: Fixes #239948. When creating a Sales Order, if you add an empty product line (without selecting a product yet) and then drag a section above or…
Description of the issue/feature this PR addresses: Fixes #239948. When creating a Sales Order, if you add an empty product line (without selecting a product yet) and then drag a section above or below it, Odoo's frontend throws an `UncaughtPromiseError: Cannot read properties of undefined (reading 'data')`. Current behavior before PR: During the drop event of the drag-and-drop sequence, `SectionAndNoteListRenderer.sortDrop` searches for the record by its `dataRowId`. For an empty product line, this can fail during the re-indexing, resolving `record` to `undefined`. Unconditionally passing this undefined record into [getParentSectionRecord](cci:1:/addons/account/static/src/components/section_and_note_fields_backend/section_and_note_fields_backend.js:19:0-22:1) causes the crash. Desired behavior after PR is merged: If a record isn't found during [sortDrop](cci:1:/addons/account/static/src/components/section_and_note_fields_backend/section_and_note_fields_backend.js:475:4-496:5), we safely exit the function using an early return (`if (!record) return;`). This prevents the crash and allows the user to resequence sections seamlessly without errors, even when empty lines are present. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a display issue where text in notebook tab content, such as Contact Notes, could stop wrapping and create unwanted scrollbars. Tab headers will still stay on one line, while the content area returns to normal readable wrapping.
Original PR description
Since 7d26b3444f61, `white-space: nowrap` is set on `.o_notebook.horizontal` itself instead of on `.nav-item`, so it is inherited by the whole notebook content. On Contact -> Notes, this makes the paragraphs of the html field stop wrapping. The editable is wrapped in an `overflow-auto` div (Wysiwyg template) and gets a `min-height: 180px` inside a notebook, so the resulting horizontal scrollbar shrinks the available height and a vertical scrollbar shows up as well. Scope the rule back to the tab headers: horizontal tab titles still never wrap, and vertical ones keep the wrapping behaviour introduced by that commit. task-5933892 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
Refreshing India GST access now correctly extends the existing token validity without replacing the saved token with an unrelated response value. This prevents incorrect token data from being stored and helps keep GST reporting access reliable.
Original PR description
Previously, `_cron_refresh_gst_token` updated the value of `l10n_in_gstr_gst_token` when refreshing the GST token using `response.get('txn')`.
However, the response received during a token refresh is: `{'status_cd': '1', 'status_desc': 'If previous Auth Token is found'}`
The GST token itself remains unchanged during a refresh; only its validity is extended. Therefore, writing `l10n_in_gstr_gst_token` with `response.get('txn')` is unnecessary and incorrect.
This commit removes that write operation.
Forward-Port-Of: odoo/enterprise#130546
Forward-Port-Of: odoo/enterprise#130313Delivery failure messages now display the configured outgoing mail server name instead of showing 'None'. This makes email troubleshooting clearer for users and support teams when a message cannot be sent.
Original PR description
Steps to reproduce: 1. Run a local SMTP server that responds with a server error. The server file is provided in the task [refuse_smtp.py](https://github.com/user-attachments/files/27166855/refuse_smtp.py) 2. Create an outgoing server for this SMTP server 3. Send an email Issue: The delivery failure reason displays Mail delivery failed via SMTP server 'None' instead of the configured server name. Cause: ir.mail_server.send_email() builds the failure message from the smtp_server argument, but in the common path the mail is sent via mail_server_id. In that case, the actual SMTP server is resolved in connect(), while smtp_server remains unset, so the error message shows None. Solution: Store the resolved server label on the SMTP connection when opening it, and reuse that value when formatting send failures. opw-6139168 Forward-Port-Of: odoo/odoo#280750 Forward-Port-Of: odoo/odoo#261776
Tax return activities now display the Accounting logo as expected. This makes the activity easier to recognize and keeps the accountant experience visually consistent.
Original PR description
Before PR: - Accounting logo was not visible in Tax return activities. After PR: - Accounting logo is visible in Tax return activities. task-6463584 Forward-Port-Of: odoo/enterprise#129501
French invoices now show the VAT payable on debits mention only when it is relevant for service taxes with a non-zero VAT amount. This avoids confusing or unnecessary wording on export invoices and ensures service invoices follow the intended French tax rules.
Original PR description
**Purpose** Follow-up to fix two issues reported in #277109 regarding the "TVA exigible d'après les débits" mention on French invoices. **Fixes Applied** 1. **Tax Scope Mismatch:** Changed `t.tax_scope == 'consu'` to `t.tax_scope == 'service'`. To trigger the exigibility mention on a service product, the user will configure a proper "service" scoped tax, not a goods tax. 2. **International/Export Invoices:** Added a check for `amount != 0`. Previously, the mention would print on international export invoices if the applied 0% tax had exigibility set to `on_invoice`. This hides the redundant mention for 0% exports.
On mobile devices, opening a full-screen image preview in the HTML editor now hides the editor toolbar so the preview controls remain accessible. This improves usability when viewing images and avoids the toolbar blocking key actions in the lightbox.
Original PR description
When displaying the full screen image preview lightbox on mobile, the toolbar remains displayed. Because of this, the toolbar of the lightbox cannot be accessed. This commit hides the toolbar when a lightbox is displayed. task-6370220 Forward-Port-Of: odoo/odoo#274949
Creating a new CRM stage no longer shows a warning about recalculating opportunities. The warning now appears only when editing an existing stage, reducing confusion for users setting up CRM stages.
Original PR description
Changing whether a CRM stage is won may trigger the recomputation of its opportunities. An onchange warning was added to inform users about this potentially expensive operation. However, the warning was also displayed when creating a stage because the onchange was triggered while initializing the form. Fix: Only display the warning when editing an existing stage, as it's useless to show this warning when creating a new stage. Task-6424174 Forward-Port-Of: odoo/odoo#284679