Monday, September 14, 2026
11 changes · 17.0
New functionality added to Odoo
Indian companies can now generate Balance Sheet and Profit and Loss reports in Schedule 3 format. This supports local compliance needs and makes statutory financial reporting easier within Odoo.
Original PR description
In this PR, we have added Balance Sheet and Profit and Loss Schedule 3 reports for Indian localization. TaskID - 2381149 Co-authored By: Kishan Rathod <kir@odoo.com>
Enhancements to existing features
The Indian accounting setup now includes tags needed for Schedule 3 financial reports. This helps companies in India organize accounts for statutory reporting under the Companies Act with less manual setup.
Original PR description
In this PR, we have added account tags for Schedule 3 reports for Indian localization. TaskID - 2381149 Co-authored By: Kishan Rathod <kir@odoo.com>
Resolved issues and error corrections
Users signing in while a live connection was open could be unexpectedly sent back to the login page. This fix prevents an older session from being restored during that process, making login more reliable for affected pages such as live chat.
Original PR description
Before this commit, signing in from a page holding a websocket connection could land the user back on the login form. This happens because the websocket handshake marks the session dirty to get it written on disk, and _save_session sends a "session_id" cookie back for every dirty session. A handshake answered between the login response and the request that follows it therefore puts the pre-login session back in the browser. Note that the failure was seen on master, where a livechat tour signs in with the bus connected, but every version since 17.0 answers the handshake the same way. This commit saves the session from the handshake itself, so that the response carries no session cookie. https://runbot.odoo.com/odoo/error/947173
Installing the Ecuador inventory localization no longer fails when an optional inventory accounting component is not installed. The setup now skips account-specific configuration unless the needed accounting fields are available, allowing businesses to install the module independently.
Original PR description
Steps to reproduce the bug:
- On a database without stock_account installed:
- Install l10n_ec_stock alone (single-module install, no auto-install cascade)
Problem:
Installing l10n_ec_stock raised:
ValueError: Invalid field 'valuation_in_account_id' on model 'stock.location'
The post_init_hook calls _l10n_ec_setup_location_accounts(), which writes valuation_in_account_id and valuation_out_account_id on stock.location (addons/l10n_ec_stock/models/account_chart_template.py). These fields are defined by stock_account, not by stock or l10n_ec, which are the module's only dependencies. When stock_account happens not to be installed, the fields don't exist on the model and the write() fails.
Solution:
Guard _l10n_ec_setup_location_accounts() with a check that valuation_in_account_id exists on stock.location before writing to it, skipping the valuation account setup when stock_account isn't installed.
runbot-237915Fixed an issue where Helpdesk teams linked to multiple community forums could show an error instead of the forum list. Users can now use the “Ask the Community” flow reliably, including when eLearning forum features are installed.
Original PR description
### Steps to Reproduce: 1) Install `website_helpdesk_slides_forum` module 2) On a Helpdesk team, link 2 (or more) forums under `Commnity Forums`. 3) Click on website smart button and then click `Ask…
### Steps to Reproduce: 1) Install `website_helpdesk_slides_forum` module 2) On a Helpdesk team, link 2 (or more) forums under `Commnity Forums`. 3) Click on website smart button and then click `Ask the community` button. ### Error: ``` odoo.addons.base.models.ir_qweb.QWebException: Error while render the template KeyError: '_forums' Template: website_helpdesk_slides_forum.helpdesk_forums ``` ### Root Cause: https://github.com/odoo/enterprise/blob/1bdd673c5fd19e335dc0948d2beed7a282e5e172/website_helpdesk_forum/controllers/website_forum.py#L18-L22 On clicking the "Ask the Community" button calls the `helpdesk_forums` controller. A single forum redirects straight to it. Several forums get rendered through `get_template_xml_id()`, with only `forums` in context. `get_template_xml_id()` is overridden in `WebsiteSlidesForumHelpdesk`, which points to : https://github.com/odoo/enterprise/blob/1bdd673c5fd19e335dc0948d2beed7a282e5e172/website_helpdesk_slides_forum/views/helpdesk_templates.xml#L3-L5 a primary copy of the inner partial `forum_all_all_entries`. That partial needs `_forums` (and, once extended by website_slides_forum, courses_discussions too), both only ever set by the page template's own t-call: [Reference](https://github.com/odoo/odoo/blob/23af2b443735c6d3a2f64e44f9ea5da45638b052/addons/website_forum/views/forum_forum_templates_forum_all.xml#L18-L19) Since `helpdesk_forums` is rendered directly instead of going through `website_forum.forum_all`, `_forums` is never set, hence `KeyError` occurs. The base `website_helpdesk_forum` module has the same root cause one level up, surfacing as a different error: https://github.com/odoo/enterprise/blob/1bdd673c5fd19e335dc0948d2beed7a282e5e172/website_helpdesk_forum/controllers/website_forum.py#L24-L25 `website_helpdesk_forum.forum_all` does not exist anywhere in the codebase. A team with multiple forums, without `website_helpdesk_slides_forum` installed, hits ``` ValueError: View 'website_helpdesk_forum.forum_all' in website 1 not found ``` Instead of a listing page. ### Fix: - Both `get_template_xml_id()` implementations now return the real, working `website_forum.forum_all` page template, which already sets `_forums/courses_discussions` through its own `t-call` and wraps the result in website.layout. - `helpdesk_forums()`'s render values are now built through an overridable `_get_helpdesk_forums_render_values()` hook instead of a hardcoded dict, so subclasses can extend the context. - `website_helpdesk_slides_forum` uses that hook to set `hide_forum_slides_link=True`, and adds one small non-primary view inheriting `website_slides_forum.forum_all_all_entries` that conditions the `/slides` promo link (not the "Course" badge, which doesn't navigate anywhere) on `not` `hide_forum_slides_link`. This targets the link element itself rather than a `t-call` site in `forum_all`, so it correctly applies whether `website_slides_forum` groups a given forum as "regular" or "course-linked". **opw-6332175**
This fixes an error that occurred when users opened sale or purchase receipts from Invoice Analysis. Businesses using receipts can now drill down from analysis reports to the receipt form without interruption.
Original PR description
When enabling Sale/Purchase Receipts and trying to open the form view from Invoice Analysis, an error occurs. The issue is caused by the `move_type` used in `_where()`, which includes a type that is not defined in the `move_type` field selection. Steps to reproduce: - Enable Sale/Purchase Receipts. - Create a Sale/Purchase Receipt for partner A and confirm it - Go to Invoice Analysis and open the Pivot view - Click on a cell to open partner A's receipt, then try to open the form view - Error Ticket [link](https://www.odoo.com/odoo/project.task/6462153) opw-6462153
The Mexican DIOT tax report has been adjusted to avoid duplicate entries when users expand grouped report lines. This prevents a display error that could block users from viewing the report after using pagination.
Original PR description
Account reports can use "Load More" to paginate the lines generated when expanding a groupby. A report line can contain several expressions, which may return overlapping grouping keys. Problem: The…
Account reports can use "Load More" to paginate the lines generated when expanding a groupby. A report line can contain several expressions, which may return overlapping grouping keys. Problem: The limit and offset are applied while computing each expression, before their results are aggregated by grouping key. As a result, a grouping key from a previous page can be returned again by the next "Load More" request. This results in duplicate report lines. In 17.0, this causes an Owl error because `line.id` is used as the key when rendering the lines, and the lines can’t be viewed. The DIOT report is affected because it contains multiple expressions whose grouping keys can overlap. Solution: Disable "Load More" on the DIOT report by removing its pagination limit. Example steps to reproduce: 1. Create or switch to a Mexican company and install `l10n_mx_reports` so the DIOT report is available. 2. Create a partner and 100 posted journal entries for that partner in the same period. Add the `+DIOT: 16%` tag to all 100 account move lines and the `-DIOT: Retención` tag to the first 90. 3. Open Accounting > Reporting > Tax Reports > DIOT. 4. Unfold the partner and click "Load More". Related ticket: opw-6471063
This update adjusts automated tests to handle small rounding differences correctly. It helps keep validation reliable for field service sales and Belgian payroll accounting without changing day-to-day user functionality.
Original PR description
See community PR opw-6227836
Corrects a rounding issue that could add or remove a cent in rare invoice tax calculations. This helps ensure Belgian invoices and related electronic invoice files show accurate totals and are not rejected by Peppol validation.
Original PR description
*=account,stock,test_resource **PROBLEM** float_round method introduces a small error in the result because of normalization/denormalization. For example, `float_round(4.44444,…
*=account,stock,test_resource **PROBLEM** float_round method introduces a small error in the result because of normalization/denormalization. For example, `float_round(4.44444, precision_rounding=0.03)` returns `4.4399999999999995` instead of the closer IEEE 754 binary 64 value of `4.4400000000000003908` (that would be printed as `4.44`). Most of the time this is ok, but in some very very particular cases, this rounding error can affect the result of further computations. Below are steps for a legitimate use case where this fails. **STEP TO REPRODUCE** 1. Install l10n_be, and use the be demo company. 2. Create a 21% tax, price included. Create a fixed tax of 0.01, affecting basis, but not price included. 3. Create two lines: - qty = 3, unit price = 8.95, discount = 30%, the 21% tax price included. - qty = 1, unit_price = 80.20, discount = 40%, fixed tax then 21% tax price included. 4. Validate the invoice, the `subtotal_amount` and the `total_amount` of the first line will be wrong (a surplus of one cent). 5. If you generate a ubl file to send to peppol, and you try validating it, this surplus of one cent will cause peppol to refuse the invoice. **CAUSE** When entering _compute_all_tax() the first time the unit price for the first line is `8.95` (or at least the closest float representation of `8.95`). compute_all() returns the right result this time. We enter it a 2nd time, but this time, the orm have rounded the unit price using `float_round()`, introducing a small error (unit price is `8.950000000001`). compute_all() returns a result that is wrong because of the small error in unit price, it's this wrong result that is used on the invoice. opw-6227836
This fixes how recruitment creates a linked contact for an applicant by using the intended applicant-related values. It helps ensure applicant contact records are created accurately, reducing data errors during hiring workflows.
Original PR description
The values associated with the applicant's linked partner must be used during creation. Task-6479653
FedEx ZPLII shipping labels are now saved with a .zpl extension instead of .zplii, preventing browsers from incorrectly adding .txt to the filename. This makes downloaded labels easier to use directly with compatible label printers and avoids manual renaming.
Original PR description
TL;DR When downloading a `.zplii` shipping label from the chatter on a Delivery Order (using FedEx), the browser automatically adds .txt to the end of the filename, saving it as `.zplii.txt` Step to…
TL;DR
When downloading a `.zplii` shipping label from the chatter on a Delivery Order
(using FedEx), the browser automatically adds .txt to the end of the filename,
saving it as `.zplii.txt`
Step to reproduce:
- install `delivery_fedex_rest` with demo
- open shipping method menu -> Fedex Us -> label format = `zplii` -> save
- create a SO, click on 'Add Shipping",
- select fedex as shipping method -> get rate -> add -> confirm SO
- go to delivery and validate
- notice, in thread, a attachment with ZPLII extension appears
- download (.txt is appended to file)
Issue:
- `fedex_rest_send_shipping` post message with documents with extension as
`fedex_rest_label_file_type` i.e. `ZPLII`
https://github.com/odoo/enterprise/blob/735490d7ba9bdc6d0df7a0bd07c0d4e36d1ed2d4/delivery_fedex_rest/models/delivery_fedex.py#L193-L195
- when the attachment is created for this document , it's mimetype is computed
to be `text/plain` from [guess_mimetype](https://github.com/odoo/odoo/blob/5de4a5f6caee09881e7e147062f9eab9f8916a61/odoo/tools/mimetypes.py#L192) method, as data is plain ASCII code
- moreover, when downloading, [_get_stream_from](https://github.com/odoo/odoo/blob/5de4a5f6caee09881e7e147062f9eab9f8916a61/odoo/addons/base/models/ir_binary.py#L89) tries to guess extension
using [get_extension](https://github.com/odoo/odoo/blob/5de4a5f6caee09881e7e147062f9eab9f8916a61/odoo/tools/mimetypes.py#L210) which return `None` as len('zplii') > 4, [see](https://github.com/odoo/odoo/blob/5de4a5f6caee09881e7e147062f9eab9f8916a61/odoo/tools/mimetypes.py#L221)
- finally, as we got `None`, and mimetype is `text/plain`, `.txt` is appended [here](https://github.com/odoo/odoo/blob/5de4a5f6caee09881e7e147062f9eab9f8916a61/odoo/addons/base/models/ir_binary.py#L149)
Fix:
- we use `zpl` as extension for file instead of `zplii` as there is not
difference between them from printing perspective
- as length of 'zpl' is <=4 , `get_extension` will considered it as valid
opw-6410968