Friday, March 20, 2026
15 changes · 19.0
Enhancements to existing features
Invoice and bill journal item lines now visually mute zero-value debit and credit amounts. This makes accounting screens easier to scan by drawing attention to meaningful amounts instead of repeated 0.00 values.
Original PR description
In order to improve the readability muting the 0.00 credit / debit on journal items in invoices / bills task: 5960944 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
Resolved issues and error corrections
Resetting the “Lead Forward: Send to partner” email template now works without triggering a validation error. This keeps CRM partner forwarding administration reliable when templates are restored to their default version.
Original PR description
Steps to reproduce: - Create a lead > click on gear icon > Forward to partner - Send the forward and ensure there is at least one record of crm.forward.to.partner - Navigate to email templates technical settings menu and search for Lead Forward: Send to partner - Click on Reset Template in the template form Current behavior: - Validation Error thrown Expected behavior: - No validation error thrown and template is reset Note: MailTemplate._check_can_be_rendered was added in version 18.3 which checks for invalid object references when trying to alter + save templates. This template was out of date and fails the check Referenced PR: https://github.com/odoo/odoo/pull/176623 opw-6001560 Forward-Port-Of: odoo/odoo#252599
The Canadian localization now clarifies that the PST number field can also be used for Quebec Sales Tax (QST) registration numbers. This reduces confusion for Quebec businesses and helps users enter the correct tax registration details in the existing field.
Original PR description
Currently, the `l10n_ca_pst` field label and help message implies that it is only for the PST number; however, in Quebec the proper name for such a value is the Quebec Sales Tax or (QST) registration number. As such, by updating the help message we clarify to the users that both PST and QST should be placed here. task-5866356
Selecting a suggested mention after typing @ in the message composer no longer causes an error. This keeps users from being interrupted when adding people or items to messages.
Original PR description
Problem: Opening the composer, typing "@" and selecting any item causes a traceback. Cause: After 8c99b17fcc3a612fd897da9ee29e2f53254d5933, the attribute `channel` was renamed to `thread`. Some code still referenced the old `channel` attribute, leading to errors when selecting mentions. Steps to reproduce: - Open the composer. - Type "@" to trigger mentions. - Select any item from the suggestions. - Observe a traceback. opw-6030307 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254127
This fix stops anonymous website visitors from triggering invalid presence channel subscriptions when viewing pages with chatter, such as eCommerce product pages. It reduces unnecessary warning messages in server logs, making it easier for teams to notice real operational issues.
Original PR description
## Description When an anonymous website visitor loads a page that includes the chatter component (e.g. a product page in eCommerce), the `res.partner` `presenceChannel` computed field constructs a…
## Description
When an anonymous website visitor loads a page that includes the chatter component (e.g. a product page in eCommerce), the `res.partner` `presenceChannel` computed field constructs a bus channel string using `this.id`, which is `undefined` for anonymous visitors. This produces the channel name `odoo-presence-res.partner_undefined`, which does not match the expected regex pattern in `ir_websocket.py`, resulting in continuous WARNING logs:
```
WARNING db odoo.addons.mail.models.ir_websocket: Malformed presence channel: odoo-presence-res.partner_undefined
```
On a production instance with moderate website traffic, this generates **100+ warnings per day**, adding noise to the logs and making it harder to spot real issues.
## Root Cause
In `addons/mail/static/src/core/common/res_partner_model.js`, the `presenceChannel` computed field unconditionally builds the channel string:
```javascript
presenceChannel = fields.Attr(null, {
compute() {
const channel = `odoo-presence-res.partner_${this.id}`;
// ...
},
});
```
When `this.id` is `undefined` (anonymous visitor with no partner record), the channel becomes `odoo-presence-res.partner_undefined`.
Note: `monitorPresence` has a guard `this.id <= 0`, but `undefined <= 0` evaluates to `false` in JavaScript (NaN comparison), so it does not catch this case.
## Fix
Added a guard in the `presenceChannel` compute to return `null` when `this.id` is not set. This prevents the malformed channel from being subscribed to via the bus service. When `presenceChannel` is `null`, `_triggerPresenceSubscription` evaluates to falsy and no subscription is made.
## Steps to reproduce
1. Install the `website_sale` module (or any module that adds chatter to public pages)
2. Open a product page in an incognito/private browser window (anonymous visitor)
3. Check the server logs
**Expected:** No warnings related to presence channels
**Actual:** `WARNING ... Malformed presence channel: odoo-presence-res.partner_undefined` appears on every page load
## CLA
Corporate CLA for **Polimex Holding Ltd.** is included in this PR (`doc/cla/corporate/polimex.md`).
---
Contributed by [Polimex Holding Ltd.](https://polimex.co) — Official Odoo Partner based in Bulgaria, specializing in access control, security systems, and ERP integration. Bug discovered through automated production log monitoring across multiple Odoo 19 instances.The project dashboard now avoids an error when users belong to a custom project-related group instead of the standard project user group. This keeps the dashboard accessible and prevents interruptions for affected users.
Original PR description
### Description of the issue/feature this PR addresses: If you create a custom group and not using project user group, if you click on "Dashboard" in the project, KeyError profitability_items appears. It appears because it accesses to panel_data without checking if panel_data is not empty. ### Current behavior before PR: Appear KeyError profitability_items ### Desired behavior after PR is merged: No error --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A new automated test was added to make sure document numbering remains reliable when database savepoints are rolled back. This helps prevent future code changes from silently breaking an important accounting consistency safeguard.
Original PR description
The aim of this commit is to ensure the feature doesn't get silently broken in case some underlying code gets reworked. task-id: None
This update adjusts how Odoo automatically refreshes GST tokens, moving from a scheduled 5-hour interval to a permanent manual trigger. This change ensures compliance and reduces the risk associated with automated token updates. The process is now controlled by specific actions within the application.
Original PR description
With this PR, the GST token refresh cron interval is updated from 5 hours to 9999 months to effectively disable automatic execution. The cron will instead be triggered manually from `validate_otp` and `_cron_refresh_gst_token` based on the token expiration time.
This update resolves an issue preventing the creation of overtime attendance records across multiple days for employees. The fix addresses a technical error that caused a system failure when attempting to schedule overtime shifts spanning consecutive days. This ensures accurate overtime tracking and avoids disruptions to employee scheduling.
Original PR description
An expected singleton error is raised when we try to create an attendance on multiple days Steps to reproduce: 1. Install Attendances and Work Entries 2. Go to Employees and open Anita Oliver 3. Go to Settings tab and set the Overtime Ruleset to Default Ruleset 4. Go to Attendances and create a new attendance for employee Anita Oliver from Friday 12:00 AM to Saturday 2:00 AM 5. An error is raised Problem: ... Solution: ... opw-5946944
This update corrects an issue where Chilean VAT invoices (l10n_cl_edi) could generate negative folio numbers when no Chilean Fiscal Authority File (CAF) was configured. The fix ensures that folios are correctly assigned, preventing sequence corruption and costly database retries. This improves invoice accuracy and stability.
Original PR description
`l10n_cl_edi` overrides `account.move._get_last_sequence()` to ensure the folio belongs to an available in-use CAF. When no CAF exists at all, `l10n_latam.document.type._get_start_number()` returns 0 and the fallback builds a previous sequence using start_nb - 1. Formatting -1 as `:06d` yields “-00001”, which then propagates to “FAC -00002”, “-00003” and corrupts the sequence chain. In addition, returning an invalid “last sequence” may force `sequence.mixin` to search for a free number under the UNIQUE constraint by retrying increments inside a savepoint and rolling back on UniqueViolation, which is costly when many values are already taken see [ _locked_increment()](https://github.com/odoo/odoo/blob/18.0/addons/account/models/sequence_mixin.py#L352). Now we only reset to the CAF start when an in-use CAF actually exists (start_nb > 0). opw-5918758 Forward-Port-Of: odoo/enterprise#108909
This update resolves an issue where GS1 barcode filtering would fail due to an error when the barcode contained date information. The fix allows the system to correctly filter products based on GS1 barcodes, even if they include date components, ensuring accurate internal transfer tracking.
Original PR description
Steps to reproduce: - Activate the GS1 nomenclature - Create a product "P1" with the barcode: 15099590225865 - Create an internal transfer with one unit of P1 - Go to Barcode > Operations > Internal…
Steps to reproduce: - Activate the GS1 nomenclature - Create a product "P1" with the barcode: 15099590225865 - Create an internal transfer with one unit of P1 - Go to Barcode > Operations > Internal Transfers - Scan the barcode: 15099590225865 to filter transfers by this product barcode Problem: An validation error is raised: A ValidationError is raised: "A GS1 barcode nomenclature pattern was matched. However, the barcode failed to be converted to a valid date." Explanation: GS1 barcodes must follow a strict nomenclature based on well-defined rules. For example, a GS1 product barcode should start with the Application Identifier 01 followed by 14 digits. The GS1 parser processes the barcode rule by rule and applies the first matching rule. In this case, the barcode 15099590483921 is interpreted as a date because it starts with "15", which corresponds to a GS1 Application Identifier for a date. As a result, the parser attempts to convert the first six digits into a date and raises a ValidationError. Solution: Catch the ValidationError raised during GS1 date parsing in filter_on_barcode and explicitly reset parsed_results to False, allowing the normal filter on product resolution logic to continue. This prevents GS1 parsing errors from blocking valid barcodes and ensures that product is correctly filtered opw-5929064 Forward-Port-Of: odoo/enterprise#110679 Forward-Port-Of: odoo/enterprise#110636
This update corrects a visual issue where the live chat button in the edit mode on desktop wasn't correctly sized. The fix ensures the button takes up the appropriate space, and also resolves a related issue where a fallback button was incorrectly displayed when no live chat link was available. This improves the user experience for editing live chat configurations.
Original PR description
This is a small fixup of 55ade43b18e2896b8dbf0f3364b0f4956faee14b Scenario: in edit mode and desktop, add ai livechat snippet block with no fallback or livechat button. Result: only when editing, the livechat button doesn't take 100% of container width. Cause: the change of 55ade43b18e2896b8dbf0f3364b0f4956faee14b tried to be minimal and missed this use case in the merged 19.0 solution. Fix: in template ai_website_livechat.s_ai_livechat_edit, copy exactly the structure of ai_website_livechat.AILivechatComponentedition. Note: also fixes that the fallback button is shown even when there is no link since df05441e469157890253b5550b5f8735723b28fb. opw-5458575
This update resolves an issue where the topbar menu wasn't correctly updated after an AI Agent opened a menu option. The fix ensures that the topbar reflects the currently active menu, improving the user experience when interacting with the AI Agent. This change was driven by a task to address a specific UI bug.
Original PR description
Purpose: -------- When a menu (view) was opened through an AI Agent, the menu in the topbar was not updated. This commit fixes this behaviour by setting the menu when the menu's action has been loaded Task-6017607
This update fixes an issue where imported spreadsheets lost their connection to the original linked records. The change ensures that newly created spreadsheet documents maintain the same linked record as the source document during the import process, improving data consistency and workflow efficiency.
Original PR description
When importing an XLSX or CSV document into a spreadsheet, the linked record is lost on the newly created spreadsheet document. This happens because the conversion creates a new document through `copy()`, while `res_model` and `res_id` are computed fields and are not copied by default. This commit explicitly forwards the linked record values during the conversion so the created spreadsheet keeps the same linked record as the source document. Task: [6008920](https://www.odoo.com/odoo/project/2328/tasks/6008920)
This update resolves a minor typo within the industry_fsm_report module, specifically in the project task views. The corrected naming ensures proper functionality and avoids potential display issues within reports. This change improves the reliability of sales reporting.
Original PR description
the view name is incorrect and already used for this view https://github.com/odoo/enterprise/blob/60e9e0f3232c9cd1e9675cb2e5c4b054dc57bbda/industry_fsm_sale/views/project_task_views.xml#L358