Wednesday, September 9, 2026
19 changes · saas-19.3
Enhancements to existing features
Italian electronic invoices now handle cash rounding lines more safely when generating XML. This avoids changing shared tax calculation logic, reducing the risk of side effects in other accounting processes.
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 Forward-Port-Of: odoo/odoo#287016
Reconciled bank statement lines now use the account name when the related move name is just a placeholder slash. This makes accounting records easier to understand and avoids showing unhelpful placeholder text to users.
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 Forward-Port-Of: odoo/enterprise#127842
Resolved issues and error corrections
This fixes an issue where Odoo could mark a chatter message as edited even when the user only opened edit mode and saved without changes. The change makes the comparison ignore hidden email-formatting comments, keeping the message history more accurate and reducing confusion for users.
Original PR description
Steps to reproduce: ------------------------------------- 1. Open the chatter of any record 2. Open the full composer for the Log Note 3. Add some text and paste some images > Post the log note 4.…
Steps to reproduce: ------------------------------------- 1. Open the chatter of any record 2. Open the full composer for the Log Note 3. Add some text and paste some images > Post the log note 4. Click on the Edit option 5. Save the message without editing anything Observation: ------------------------------------- You will notice that the (edited) label appears even though the message wasn't edited at all, only the edit mode was made active. Issue: ------------------------------------- When a message is posted via the mail composer, the email conversion pipeline injects MSO conditional comments like `<!--<![endif]-->` and `<!--[if mso]>...<![endif]-->` into the HTML body. These comments are added by the `_hideForOutlook` and `createMso` https://github.com/odoo/odoo/blob/083e091eaa7d983f6c826c02b0d0652a821227fb/addons/mail/static/src/views/web/fields/html_mail_field/convert_inline.js#L1978-L1988 https://github.com/odoo/odoo/blob/083e091eaa7d983f6c826c02b0d0652a821227fb/addons/mail/static/src/views/web/fields/html_mail_field/convert_inline.js#L1699-L1707 functions to ensure Outlook compatibility, they wrap responsive elements so that Outlook receives simplified table-based fallbacks while modern clients see the original layout. The stored message body on the server retains these comments. When a user clicks "Edit" on such a message, the body is loaded into the OdooEditor. The browser's DOM parser treats `<!--<![endif]-->` as standard HTML comment nodes, which are not preserved in `innerHTML` serialization. So the editor returns the body without these comments, even if the user made no changes. The `edit()` method in then compares `updatedBodyEl.innerHTML` (from editor, no comments) against `messageBodyEl.innerHTML` (from server, has comments), finds a difference, and sends a update to the backend, which stamps the message with the (edited) label. Solution: ------------------------------------- Before comparing innerHTML, strip all HTML comment nodes from both the original and updated body elements. This is done on throwaway DOM elements created solely for comparison. The actual body sent to the server (`body` parameter) is never modified. Note: ------------------------------------- An alternative approach would be to strip comments at the string level using a regex (`html.replace(/<!--[\s\S]*?-->/g, '')`) before creating the DOM elements. This is valid since HTML comment syntax `(<!--...-->)` is strictly defined and no nesting is allowed, so the regex is reliable. opw-6328529 Forward-Port-Of: odoo/odoo#274927
This fixes an internal test issue where large user ID numbers could be displayed differently than expected in message tracking checks. The change helps keep the test suite stable and prevents false failures in full test runs.
Original PR description
When calling message_post() with custom tracking_values, the new_value field is rendered verbatim by the QWeb template into the message body. Automatic tracking (mail_track_mixin) already formats integers via formatLang before setting new_value, but the test was passing a raw integer (self.env.uid), causing a mismatch with the formatted value expected by assertTrackingValueInBody. This only manifests when uid >= 1000.
Step to reproduce:
- Create a db with test_mail installed
- run `psql <db_name> -c "SELECT setval('res_users_id_seq', 1234, true);"` (to forcefully increment the sequence)
- launch the test_track_multi_models test
The test will fail due to this sequence increment when the test suite in ran fully (without splits like on runbot).The Timesheet Assistant now updates immediately when a timesheet date is changed from a linked task. This avoids showing outdated information and removes the need for users to refresh the page manually.
Original PR description
Steps to Reproduce: - Install timesheet_grid and activate Timesheet Assistant - Open a timesheet and click the task external link - Change the timesheet date from the task form and save Issue: When the timesheet date is changed from the task, the assistant still shows the old date until the page is refreshed Fix: Reload assistant timesheets after the linked task is saved and refresh or clear the selected timesheet based on the new date task-6454988
This fixes an issue in the website editor where clicking inside a navigation link could unexpectedly move the text cursor to the start of the link. Editors can now place the cursor where intended, making menu and link text edits smoother and less frustrating.
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#287301 Forward-Port-Of: odoo/odoo#286527
This fix lets calendar views apply the right filtering rules when used across different Odoo apps. It helps ensure users see the correct calendar records for their specific workflow, reducing display inconsistencies.
Original PR description
Add an override for computing the domain of the calendar views to use in different modules opw-6509233 Forward-Port-Of: odoo/odoo#286993
The Planning calendar now shows the Open Shifts filter again when Field Service Planning is installed. This helps users quickly find unassigned work without losing the calendar behavior required by Field Service.
Original PR description
## Steps to reproduce: - Install planning_field_service module - Navigate to Planning calendar view - Notice the side panel filters doesn't have Open shifts filter ## Cause: When installing field service we remove the writable filters in the calendar views of planning ## Fix: We add a read filter to the calendar view instead of the write filter that we remove upon field service installation. Backport of https://github.com/odoo-dev/enterprise/commit/1ab617f1b0cddc9132964979812573286a6148d9 opw-6509233 Forward-Port-Of: odoo/enterprise#130288
This update keeps PDF-related features working reliably across supported Odoo environments by aligning with the PDF library version used on Ubuntu Jammy. It also adds compatibility for newer library versions, reducing the risk of errors when generating or handling PDFs.
Original PR description
Align pypdf usage with the PyPDF2 1.26 API used on Ubuntu Jammy, Odoo 17.0's main supported Ubuntu version, and add the missing compatibility mapping for newer pypdf versions. Forward-Port-Of: odoo/enterprise#130971
On mobile, opening a full-screen image preview now hides the editor toolbar so the preview controls remain accessible. The change also dismisses the keyboard when the preview opens, making image viewing and actions smoother for users.
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#286346 Forward-Port-Of: odoo/odoo#274949
A flaky automated test for accounting reports was corrected so it waits for the report to fully load before navigating. This reduces random test failures and helps keep validation of financial reporting features more dependable.
Original PR description
The issue appeared 1 every 3 run, the reason was because it didn't wait the report to be opened and clicked on the breadcrumb. So it clicked the breadcrumb of the return and not the one of the report. The fix is to add a step in between checking the report is loaded. Runbot error: https://runbot.odoo.com/odoo/error/944180
Corrected formatting in the Mail and Taiwan ECPay module descriptions so they display properly on the Apps page. This prevents confusing raw text or incorrectly formatted lists from appearing to users and reduces unnecessary rendering errors in logs.
Original PR description
Two module manifests hold a `description` whose reStructuredText does not parse. Both are rendered by `ir.module.module._get_desc` (these modules have no `static/description/index.html`, so the RST…
Two module manifests hold a `description` whose reStructuredText does not parse. Both are rendered by `ir.module.module._get_desc` (these modules have no `static/description/index.html`, so the RST path is the one used on the Apps page). ### `mail` The line introducing the list of email-enabled documents is followed by a row of dashes. In reStructuredText an underline directly below a line of text makes it a section title, so docutils treats a 102-character sentence as a heading, then fails on the indented list that follows without a blank line: ``` <string>:38: (ERROR/3) Unexpected indentation. <string>:43: (WARNING/2) Block quote ends without a blank line; unexpected unindent. ``` These are logged every time the description is rendered, and the bullet list ends up rendered as a block quote instead of a list. The dashes are dropped, since the line is a regular sentence and not a section title, and the list is surrounded by blank lines. ### `l10n_tw_edi_ecpay` The whole description is indented, which makes reStructuredText read it as a block quote. A section title is not allowed inside a block quote: ``` <string>:3: (SEVERE/4) Unexpected section title. ``` At SEVERE level this reaches the default `halt_level`, so rendering raises instead of returning a document and `_get_desc` falls back to showing the raw description in a `<pre>` block. The indentation is removed. --- Checked by rendering the `description` of every manifest under `addons/` and `odoo/addons/` with the same docutils settings `_get_desc` uses: these were the only two that reported anything, and both are clean after the change. Forward-Port-Of: odoo/odoo#285323 Forward-Port-Of: odoo/odoo#284360
Fixed a spelling mistake in the Helpdesk “Auto Assignment” group name. This improves clarity for users and keeps the Helpdesk settings text professional and consistent.
Original PR description
This commit fixes the typo in the "Auto Assignment" group. task-6542450 Forward-Port-Of: odoo/enterprise#130880 Forward-Port-Of: odoo/enterprise#130841
The accounting logo now appears correctly in tax return activities, making these items easier to recognize for users. This fixes a minor visual issue and improves consistency in the accounting workflow.
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#130721 Forward-Port-Of: odoo/enterprise#129501
French invoices now show the VAT-on-debits mention only when it applies to service taxes with a non-zero VAT amount. This avoids confusing or unnecessary wording on export invoices and ensures service invoices display the correct legal note.
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. Forward-Port-Of: odoo/odoo#277468
Fixes an issue where refreshing India's GST connection token could incorrectly replace the stored token with an empty or unrelated value. The refresh now only extends the existing token's validity, helping avoid unnecessary GST reporting connection problems.
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#130726
Forward-Port-Of: odoo/enterprise#130313The manufacturing accounting WIP report now avoids a harmless warning that appeared during automated report tests with demo data. This keeps test results cleaner and helps reduce noise for teams monitoring system quality.
Original PR description
Runbot was showing warnings when running the test_reports test with the mrp_account and project_timesheet_forecast modules installed with demo data.
```
Unknown directives or unused attributes: {'data-oe-demo'} from <t t-out="', '.join(docs.account_id.mapped('name'))" data-oe-demo="Acme Corp."/>
```
**Root cause:**
Since data-oe-demo is an html attribute usage of it within `<t>` tag raises a warning after this [commit](
https://github.com/odoo/odoo/commit/ae4824640665fc639e03a13c341f18e73060349e) in saas-19.1.
**Solution:**
Usage of span tag instead of <t> tag ensures the same behaviour without the warning.
[runbot-939604](https://runbot.odoo.com/odoo/error/939604)
Forward-Port-Of: odoo/odoo#285666The restaurant point-of-sale order tracking test now waits until payment validation and backend synchronization are complete before finishing. This prevents false test failures where updated order quantities or edit status had not yet been saved.
Original PR description
The order tracking tour only waited for the feedback screen to be shown after validating the payment. Since order validation is performed asynchronously while the feedback screen is displayed, the tour could finish before the updated order was synced to the backend. This caused the Python test to still see the original quantity and `is_edited` set to false. To fix we wait for the feedback screen continue button to be enabled, which ensures order validation and synchronization have completed before the tour ends. [error-940386](https://runbot.odoo.com/odoo/error/940386) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282726
This fixes an issue that prevented users from creating assets without depreciation directly from vendor bills. Businesses can now record these asset purchases correctly without being blocked by unnecessary account requirements.
Original PR description
This commit fixes the ability to create no depreciation assets from vendor bills. Previously, a condition on the depreciation account and expense account restricted the asset creation. backport of https://github.com/odoo/enterprise/pull/123070 task-6283929 opw-6540498 Forward-Port-Of: odoo/enterprise#130653