Thursday, May 28, 2026
17 changes · saas-19.2
New functionality added to Odoo
This update adds a new tax return type specifically for Indonesian businesses within the Odoo Enterprise system. This enhancement allows users to accurately report Indonesian tax obligations, improving compliance and financial reporting for this market. It leverages existing reporting capabilities to provide a streamlined solution.
Original PR description
Create new module l10n_id_reports and add return type for Indonesia. task-6239169 Forward-Port-Of: odoo/enterprise#118467 Forward-Port-Of: odoo/enterprise#118304
Enhancements to existing features
This update enhances the Balance Sheet report to accurately reflect accounting standards (GAAP) by ensuring that all equity accounts are displayed individually, rather than grouped. This change improves the clarity and accuracy of financial reporting for users.
Original PR description
*=l10n_us_reports In the Balance Sheet, according to the GAAP rules, all equity accounts should be individually visible. task-6240500 Forward-Port-Of: odoo/enterprise#118149
Resolved issues and error corrections
This update resolves an issue preventing a key test from running properly. The test relied on a setting controlled by another module, which wasn't present in the test environment. By directly ensuring the tax return journal is visible in the test, the tour now completes successfully, ensuring consistent test results.
Original PR description
The tour clicks a Tax Returns button rendered on the tax-return journal's kanban card on the accounting dashboard. That button only appears when show_on_dashboard is True on the journal, which is flipped by an inverse defined in the accountant module. Since account_reports does not depend on accountant, running this test on a database without accountant installed (e.g. account_reports only) leaves the journal hidden and the tour times out on the first step. To fix this we force the journal to be shown in this test rather than relying on accountant. runbot-error-242120 Forward-Port-Of: odoo/enterprise#116806
This update enhances the documentation for Odoo's API key management system. Specifically, the documentation for the `res.users.apikeys` methods has been clarified and expanded to provide clearer instructions for developers. This improves the overall usability and maintainability of the system.
Original PR description
Clarify and complete the docstrings of `res.users.apikeys` methods: - document accepted union types for `scope` and `expiration_date` parameters of method `_generate`, and standardize its `:returns:` and `:rtype:` annotations - add missing parameter descriptions for `generate` and `revoke` Forward-Port-Of: odoo/odoo#265488
This update optimizes the performance of our spreadsheet functionality, specifically when working with large tables like Accounting Balances Sheets. By streamlining how the system checks styles, it reduces recalculation times during common actions like resizing windows or sorting data, leading to a smoother user experience.
Original PR description
Avoid using the :has() selector and use a specific class on the body instead to replicate the same behavior. This reduces work during the "Recalculate Style" phase (for example when hovering rows in large tables such as the Accounting > Balances Sheets). It lowers recalculation time during window resizes, heavy scrolling, and table sorting by preventing broad selector matches and limiting style checks to elements with the specific class. Forward-Port-Of: odoo/enterprise#118535
This update fixes a dependency issue within the Italian reporting module (l10n_it_reports). A new filter was added to correctly handle pension fund type information, previously sourced from a related module. This ensures accurate reporting for Italian businesses using the Enterprise suite.
Original PR description
Commit: 0a5657297f312cb3e5f6c3ab6a281acf71fbee3b added a filter for the field l10n_it_pension_fund_type which is defined in l10n_it_edi_withholding and not l10n_it_reports runbot-242217 Forward-Port-Of: odoo/enterprise#113185
This update fixes a technical issue where the 'Outgoing Mail Server' option was incorrectly showing up in user preferences when the system parameter was set to 'False'. The fix ensures the system correctly interprets this setting as a boolean, preventing the option from appearing unnecessarily. This improves the user experience and avoids potential confusion.
Original PR description
**Steps to reproduce:**
- Go to Settings > System parameters
- Set the `base_setup.default_external_email_server` to `False`
- Go to any User > Preferences tab
- `Outgoing Mail Server` option is visible
- The choice dropdown is available if the Gmail/Outlook settings are set
**Issue:**
`has_external_mail_server` is a Boolean field computed from the `base_setup.default_external_email_server` system parameter.
After [1] it is parsed as a string with `get_str`, which means that the conversion from string to boolean will return `True` when the value is set and not null.
```py
bool('False') -> True
```
(It also seems that on saas this value is set by default)
**Fix:**
Properly parse it as a boolean using `get_bool`.
[1] https://github.com/odoo/odoo/commit/3482ba72c8cd461d5c6609f4953decc1d5a55dd8
opw-6229696
Forward-Port-Of: odoo/odoo#266490This update corrects a bug in the Helpdesk app where the Email Alias helper wasn't visible when the default external email server was disabled. The fix ensures the system correctly interprets the server setting as a boolean, preventing a misinterpretation that was causing the issue. This ensures the Helpdesk app functions as expected regardless of the external email server configuration.
Original PR description
**Steps to reproduce:**
- Go to Settings > System parameters
- Set the `base_setup.default_external_email_server` to `False`
- Install Helpdesk app
- Go to any Helpdesk Team
- Email alias helper is not visible
**Issue:**
`has_external_mail_server` is a Boolean field computed from the `base_setup.default_external_email_server` system parameter.
After [1] it is parsed as a string with `get_str`, which means that the conversion from string to boolean will return `True` when the value is set and not null.
```py
bool('False') -> True
```
(It also seems that on saas this value is set by default)
**Fix:**
Properly parse it as a boolean using `get_bool`.
[1] https://github.com/odoo/enterprise/commit/c710031215c76a9e7ddb694d2a2787c8cca40dcd
opw-6229696
Forward-Port-Of: odoo/enterprise#118425This update resolves an issue preventing the attendance management system from correctly filtering employees based on their country code. A security restriction was removed to allow necessary access, ensuring accurate attendance reporting and payroll processing in Saudi Arabia. This change improves data accuracy and functionality.
Original PR description
/hr_attendance:TestAttendanceManager.test_attendance_manager_rights uses write function defined in l10n_sa_hr_payroll_attendance which in some cases requires to read the country_code of an employee to filter. Access rights on employees blocked it from reading country_code. Added sudo on employee for reading and filtering on country_code. task-6226413 Forward-Port-Of: odoo/enterprise#117718
This update fixes an issue where product lines in generated invoices weren't always displaying the internal item reference. The change ensures that all product lines now include this crucial information, improving the accuracy and clarity of invoices generated from external vendor bills. This ensures proper tracking of products within our accounting system.
Original PR description
Some XML vendor bills generated by external ERPs were missing the Description tag, which typically contains both the [ITEM_REF] and ITEM_NAME. As a result, product lines in the generated PDF could appear without the internal item reference. This commit ensures that the item reference is always included in the displayed product line. task-6080328 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259086
This update fixes a bug where removing formatting from text within uneditable blocks could incorrectly change the user's selection. The fix ensures that selections within editable regions are properly preserved, improving the overall editing experience. This resolves an issue where formatting removal was not functioning as expected in certain scenarios.
Original PR description
Description of the issue/feature this PR addresses: Before this PR, removing formatting from a partially selected text nested inside a contenteditable="false" block could incorrectly alter the selection. This happened because selectAroundNonEditable checked for the presence of a closest uneditable ancestor instead of verifying whether the closest element itself was editable. As a result, selections inside nested contenteditable="true" regions were mistakenly treated as uneditable. This PR fixes the issue by checking the editability of the closest element directly. task-6201120 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where CFDI (Mexican electronic invoice) documents were being generated with incorrect length limits for key data fields. The swap of values has been corrected, ensuring that generated invoices are now compliant with Mexican regulations. This change does not impact existing valid invoices.
Original PR description
Issue: length limits for attributes `Folio` and `Serie` of the `<cfdi:Comprobante>` elements were swapped, which could result in generation of invalid documents. Solution: swapping the values. This should not affect anything for existing valid documents. task-6046738 Forward-Port-Of: odoo/enterprise#118452 Forward-Port-Of: odoo/enterprise#116955
This update corrects a visual issue where the 'is typing' indicator incorrectly appeared in muted conversations. The change ensures that this indicator is disabled for muted channels, improving the user experience and preventing unnecessary notifications. This resolves a minor but potentially confusing display issue.
Original PR description
Before this PR, the "is typing" indicator could be shown on a muted conversation. This PR disables this feature for muted conversations by forcing the isTyping field to false when muted. Ideally, we should not even send the is typing notification, but that is not possible since we broadcast them to the entire channel. task-6154090 Forward-Port-Of: odoo/odoo#265480
This update removes a redundant CSS rule that was slowing down the application's style recalculation process. While the change didn't affect how the Kanban view looked, it significantly improved overall performance by reducing the time browsers spent evaluating styles. This results in a faster and more responsive user experience.
Original PR description
Remove the unused selector `[class*="col-"]:has` from `kanban_color_picker_field.scss`. It no longer affects the view but negatively impacts global CSS performance because the global selector `[class*="col-"]` combined with `:has` is expensive to evaluate. This caused long "Recalculate style" times reported in the selector stats. Even if it no longer affects rendering, browsers still spend time evaluating it during style recalculation, hurting performance. Removing the selector removes that cost. Steps to reproduce: 1. Open the Project app. 2. Go to Configuration > Projects. 3. Switch to Kanban view. 4. Click the "..." button on a Kanban card. 5. Inspect the color picker with the dev tools and remove the rule on a `col-6` node nothing changes, demonstrating the rule is now useless. Forward-Port-Of: odoo/odoo#266382
This update fixes an issue where combo product prices were incorrectly duplicated in sales orders when all component prices were zero. The fix ensures the combo price is accurately distributed across its items, preventing double-billing and improving order accuracy. This improves the user experience and reduces potential pricing discrepancies.
Original PR description
**Problem:** When a combo product has a price but all of its combo components have a zero list price, the quotation shows the combo's price twice: once on the combo line itself and once on the last…
**Problem:** When a combo product has a price but all of its combo components have a zero list price, the quotation shows the combo's price twice: once on the combo line itself and once on the last combo item line. **Steps to reproduce:** 1. Create a combo product with a non-zero price and two or more combo groups whose component products have a zero list price. 2. Create a sale order, add the combo, pick one item per group. 3. Look at the quotation/order: the combo line total and the last combo-item line both show the full combo price. **Current behavior:** The full combo price ends up on the last combo item line; the other combo items show 0. The combo line then displays the same total via `_get_combo_totals`, so the same amount appears twice. **Expected behavior:** The combo's price is spread across its combo items so no single line duplicates the combo total. **Cause of the issue:** `_get_combo_item_display_price` prorates the combo price by each combo's base price. When every base price is 0, every prorated price is 0, so `combo_price_delta` equals the full combo price and is added to the last combo as a rounding correction, concentrating the whole price there instead of spreading it. **Fix:** Treat an all-zero base case as "no proration signal" and split the combo price evenly across combos before the delta adjustment runs. The delta correction then only handles rounding, as intended. opw-6217945 Forward-Port-Of: odoo/odoo#265829 Forward-Port-Of: odoo/odoo#265010
This update resolves an issue where double-clicking images within the Media Dialog caused a technical error. The fix uses a flag to track processing clicks, preventing multiple actions from being triggered, ensuring a smoother user experience when editing website content.
Original PR description
Steps to reproduce: 1.Open the website in Edit mode. 2.Add a snippet with an image. 3.Replace the image. 4.After replacing image, double-click on it to open the Media Dialog. 5.Inside the Media…
Steps to reproduce: 1.Open the website in Edit mode. 2.Add a snippet with an image. 3.Replace the image. 4.After replacing image, double-click on it to open the Media Dialog. 5.Inside the Media Dialog, double-click on the same or any other image. 6.Traceback occurs. Before this commit: parentElement was becoming null because parentElement is a DOM position check.it requires the element to be physically attached in the DOM tree to find its parent.Since this.props.node is not yet in the DOM at that point, parentElement returns null. After this commit: 1.The issue is fixed using a boolean flag: isProcessingClick. Initially, the flag is set to false. When the first click starts, it is updated to true. If another click occurs during the same flow (e.g during a double click), isProcessingClick is already true, so the function immediately returns and prevents the action from being executed multiple times. 2.we now pass closestSnippetEl directly from replaceMedia() through params.this allows the dialog taken snippet reference using (closestElement(mediaEl , "[data-snippet]")) without depending on the media node being attached to the DOM. task-6033320 Forward-Port-Of: odoo/odoo#266664 Forward-Port-Of: odoo/odoo#254790
This update fixes an issue where new link previews displayed a technical ID in the breadcrumb instead of a user-friendly 'New' label. The change ensures that new previews show 'New' until saved, and then display the actual URL, improving the user experience and clarity.
Original PR description
**Problem:** Opening a new `mail.link.preview` record from the technical view shows the internal record reference (e.g. `mail.link.preview,NewId_0x...`) in the breadcrumb instead of the standard…
**Problem:**
Opening a new `mail.link.preview` record from the technical view shows the internal record reference (e.g. `mail.link.preview,NewId_0x...`) in the breadcrumb instead of the standard "New" label.
**Steps to reproduce:**
1. Settings / Technical / Discuss / Link Previews
2. New
3. Observe the breadcrumb
**Current behavior:**
The breadcrumb displays `mail.link.preview,<id>`.
**Expected behavior:**
The breadcrumb should display "New" until the record is saved, and the source URL once saved.
**Cause of the issue:**
The model defines no `name` field and does not set `_rec_name`, so the default `_compute_display_name` falls into its fallback branch and returns `f"{record._name},{record.id}"` — exposing the technical reference in the breadcrumb both for unsaved records (`NewId_...`) and saved ones.
**Fix:**
Setting `_rec_name = 'source_url'` lets the standard display name machinery compute a meaningful label from the existing required field. Unsaved records then surface the standard "New" placeholder via the web client and saved records surface their URL, without introducing a redundant `name` field or overriding the compute.
opw-6095012
Forward-Port-Of: odoo/odoo#263577