Wednesday, September 9, 2026
17 changes · saas-19.4
Enhancements to existing features
This update improves how Italian electronic invoices represent cash rounding adjustments. It keeps tax calculation behavior stable across the system while adding the required exempt tax detail only when the XML invoice is generated.
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 show the account name when the related move only has “/” as its name. This makes accounting information easier to read and avoids unhelpful placeholder labels in reconciliation views.
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 a stock barcode issue where a default source location could be missing from the data cache. It helps prevent errors or interruptions when users process barcode picking batches.
Original PR description
Previous commit 62c570a4 [1] from odoo/enterprise#117220 introduces a new getter on BarcodePickingBatchModel: `operationSourceLocation`. The issue comes from `default_location_src_id` which is not guaranteed to be in cache. [^1] 62c570a47cc1884cb31c4e1288b86dfab37daadf
This update fixes PDF handling so it works consistently across the supported Ubuntu version and newer PDF software libraries. It helps reduce failures when generating or processing PDF documents in affected Odoo Enterprise features.
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
This fix prevents payment provider information from trying to create setup records during read-only page loads. It avoids transaction errors in automated browsing and regular read flows while keeping normal setup behavior unchanged when changes are allowed.
Original PR description
…-only cursor
Since the payment provider state rework (state -> is_live/active), _compute_journal_id materializes an account.payment.method.line for providers that don't have one yet. journal_id is a non-stored computed field, so this runs on every read, including web RPC reads served by a read-only cursor, raising:
cannot execute INSERT in a read-only transaction
This shows up on test_click_everywhere for the demo provider, whose payment method line is not created at install time.
Skip the lazy creation when the cursor is read-only. The line is still materialized on the next read/write access, so behaviour is unchanged for setup flows.
error runbot-940133
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-prThis fixes how Romanian e-invoicing attachments are read so the system uses the existing file data in the correct format. It prevents errors caused by treating attachment content as text when it is already stored as file data, helping invoice processing remain reliable.
Original PR description
A previous commit (https://github.com/odoo/odoo/commit/41fe2ebdb9cc37341362d7af829c087a5f72f9f1) added an `encode` call to a line fetching the raw attachment. This assumes the attachment value is a `str`. However, the raw attachment values are actually `bytes` objects. This PR removes the `encode` call and adjusts the tests to reflect the change. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286480
This fix updates internal Sign tests so they work consistently with different supported PDF library versions. It helps prevent avoidable test failures during upgrades or maintenance, with no expected change for end users.
Original PR description
Prior to this commit, `PageObject` was not re-exported by `odoo.tools.pdf`, forcing tests (such as `test_origin_offset_translation` in `sign`) to patch internal module paths like `PyPDF2._page.PageObject`. This resulted in test failures depending on the installed PDF library version: - `pypdf` (>= 3.0.0): `PyPDF2` submodules no longer exist. - `PyPDF2` 1.x: `PageObject` resides in `PyPDF2.pdf` rather than `PyPDF2._page`. To resolve this: - `PageObject` has been re-exported through `odoo.tools.pdf`. - Update `test_origin_offset_translation` to import `PageObject` via `odoo.tools.pdf` and use `patch.object` with standard attribute names (`cropbox`, `add_transformation`). runbot-946795 Forward-Port-Of: odoo/enterprise#130236 Forward-Port-Of: odoo/enterprise#130017
This fix makes Odoo's PDF tools expose a needed PDF page component consistently across supported PDF library versions. It helps prevent version-related test failures and improves maintenance stability without changing everyday user workflows.
Original PR description
Prior to this commit, `PageObject` was not re-exported by `odoo.tools.pdf`, forcing tests to patch internal module paths like `PyPDF2._page.PageObject`. This resulted in test failures depending on the installed PDF library version: - `pypdf` (>= 3.0.0): `PyPDF2` submodules no longer exist. - `PyPDF2` 1.x: `PageObject` resides in `PyPDF2.pdf` rather than `PyPDF2._page`. To resolve this, this commit re-exports `PageObject` through `odoo.tools.pdf` across all backend wrappers. runbot-946795 Forward-Port-Of: odoo/odoo#286347 Forward-Port-Of: odoo/odoo#285978
Corrected formatting in two app descriptions so they render properly in Odoo instead of showing errors or raw text. This improves the Apps page presentation for Mail and Taiwan ECPay e-invoicing without changing business functionality.
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
The accounting logo is now displayed correctly in tax return activities. This makes the activity view clearer and more consistent for users working with accounting tasks.
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
A spelling mistake was fixed in the Helpdesk Auto Assignment group name. This keeps labels consistent and avoids confusion for users or administrators viewing access groups.
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
This fix lets Odoo modules customize how calendar view filters are calculated. It helps ensure calendar screens show the right records in different business areas, reducing incorrect or missing calendar entries.
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 when Field Service Planning is installed. This restores an expected filtering option, helping users quickly find unassigned work without changing other calendar behavior.
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 fix removes a warning that appeared when generating manufacturing work-in-progress reports in certain test/demo setups. The report keeps the same visible content, but now uses the correct template structure so monitoring and automated checks stay clean.
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#285666French invoices now show the VAT-on-debits mention only when it applies to service taxes with a non-zero VAT amount. This prevents misleading wording on service invoices using the correct tax setup and removes unnecessary text from 0% export or international invoices.
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
The Indian GST reporting token refresh now correctly extends the existing token validity without replacing the stored token with an unrelated response value. This prevents token data from being accidentally cleared or corrupted during automatic refreshes, helping GST reporting integrations remain stable.
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#130313A test helper was adjusted so it no longer accidentally connects to the same database as the main test process when certain environment settings are present. This prevents automated test runs from hanging, improving reliability for development and release validation.
Original PR description
TestCommand.test_shell spawns a subprocess running `odoo-bin shell` with stdin/stdout piped through a pty. When PGDATABASE is set in the environment, that subprocess inherits it and resolves the same db_name as the parent test process, then calls Registry(dbname) to open a shell console against it. Steps to reproduce: - export PGDATABASE=db_name - ./odoo-bin -i test_core --test-tags .test_shell Forward-Port-Of: odoo/odoo#287137