Daily updates from Odoo
Thursday, May 28, 2026
31 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 pull request includes performance optimizations across several Odoo modules, primarily focused on improving the speed and responsiveness of key business processes. These changes address identified bottlenecks and enhance the overall user experience. The update is part of the Odoo 19.2 release, ensuring a smoother and more efficient Odoo environment.
Original PR description
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
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
This update introduces a new EC Sales list report specifically for Hungary, providing more detailed sales data. Instead of grouping solely by customer, it now analyzes transactions based on transaction type (e.g., B, C) and transaction state (U or T), ensuring accurate reporting according to Hungarian regulations. This allows for a more granular view of sales activity.
Original PR description
This commit implement the EC Sales list for Hungary This report is a bit different from the main EC Sales list, instead of just grouping the lines on partner_id, we need to group on specifics fields on account.move: - l10n_hu_transaction_type: B, C, K, R or V This field represente the type of Intra Community Transaction, it's a selection field with all the legal possible values. We leave the field blank for normal transactions. - l10n_hu_transaction_state: U or T Represent if the transaction is a new one (U) or a correction (T) The grouping of the report works like this: groupby partner_id, l10n_hu_transaction_type, l10n_hu_transaction_state This mean for a single partner, we can have up to 12 different lines. [task-4950959](https://www.odoo.com/odoo/project/967/tasks/4950959) Linked:https://github.com/odoo/enterprise/pull/110448 Forward-Port-Of: odoo/odoo#253556
This update introduces a new EC Sales list report specifically for Hungarian businesses. The report now groups sales data by tax codes (B, C, K, R & V) instead of just customer ID, aligning with Hungarian tax regulations. It also includes the necessary tax return data for this report.
Original PR description
This report is a bit different from the main EC Sales list, instead of just grouping the lines on partner_id, we need to group on specifics tax.tags [B, C, K, R & V]. It also adds the tax returns for this same report. [task-4950959](https://www.odoo.com/odoo/project/967/tasks/4950959) Linked:https://github.com/odoo/odoo/pull/253556 Forward-Port-Of: odoo/enterprise#110448
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
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 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 resolves issues preventing IoT drivers from receiving websocket messages due to startup problems. Specifically, it handles scenarios where the device initially lacks an IP or database connection, and ensures the websocket client starts correctly after a successful device send attempt. This enhances the reliability of data transmission from IoT devices.
Original PR description
This commit fixes several issues which can cause websocket messages to not be received: 1. If the IoT box does not have an IP when it first starts, the Websocket class will not be started (due to…
This commit fixes several issues which can cause websocket messages to not be received: 1. If the IoT box does not have an IP when it first starts, the Websocket class will not be started (due to `@require_db`). It will remain closed even if the IoT box connects to the network shortly after. 2. If the IoT box does have an IP but can't reach the database when it starts, the Websocket client will crash due to a missing try/except around the request to get a session from the DB. 3. If the IoT box fails the first `send_all_devices` call, the websocket channel will not be set when the Websocket client starts. This causes no messages to be received, since it does not subscribe to the channel. The changes are as follows: 1. The `@require_db` helper is removed from the Websocket client, and instead the server URL is provided explicitly. 2. Any exception raised by the session request is caught and logged, and the websocket can still continue connect attempts. 3. Instead of starting the websocket client after the first call to `send_all_devices`, it is started after the first *successful* call to `send_all_devices` so the channel is guaranteed to be set. 4. The closing status code is now logged as a warning instead of debug. This is to make it easier to troubleshoot websocket disconnections at a glance. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
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 ensures that backorders created during point-of-sale transactions are correctly linked to the original POS order. Previously, these backorders lacked a connection, making inventory management more complex. This fix streamlines the process by maintaining a clear link between the POS order and all associated backorder pickings.
Original PR description
The delivery transfer for a product tracked by serial number is not linked to the POS order when there is no available stock. When validating a POS delivery in real time, stock can split the transfer…
The delivery transfer for a product tracked by serial number is not linked to the POS order when there is no available stock. When validating a POS delivery in real time, stock can split the transfer into a completed picking and a backorder (e.g. one line fully delivered with lots, another serial-tracked line with no stock and no serial number). Steps to reproduce: ------------------- * Setup two products: one tracked by qunatity with some quantity on-hand an other tracked by SN but no quantity on-hand * Open Pos * Sell in one order, both products without providing SN * Validate payment * Open Inventory: two deliveries sould exist under Inventory Overview of PoS Orders > Observation: The first picking shows the POS order as Source Document but the backorder has no source document and is not linked to the POS order. Why the fix: ------------ Pos Origin (Source Document, POS order, session) was only written on the pickings returned by `_create_picking_from_pos_order_lines`, which did not include pickings created during `_action_done()`. Extend the write to the initial pickings and their backorders so every transfer stays tied to the originating `pos.order`. opw-6090606 Forward-Port-Of: odoo/odoo#266111 Forward-Port-Of: odoo/odoo#259370
This 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 resolves an issue where UBL imports with taxes set to 'price_include' were failing to correctly calculate and apply taxes, particularly for invoices with multiple items. The fix ensures accurate tax calculations and adjustments, especially when quantities vary, improving the reliability of UBL import processes.
Original PR description
**PROBLEMS** 1. On a company with taxes with price_include = True, we fail to retrieve a tax when importing a ubl. 2. The price_unit adjustement for when importing price-included taxes doesn't account for quantity. **STEP TO REPRODUCE** 1. Have a setup where the tax are only price_include. 2. Import a ubl, the taxes will not be retrieved. 3. Run odoo only with the fix for problem 1, and import the same ubl with some invoice quantity != 1 4. Notice the price unit are messed up for lines with quantity != 1 (odoo tries to correct the untaxed amount with a line, but this doesn't fixes the tax). opw-6159394 Forward-Port-Of: odoo/odoo#266107 Forward-Port-Of: odoo/odoo#262686
This update resolves a potential issue that caused Out of Memory errors during the installation of the `sale_subscription` module on databases with extensive sales order data. The fix ensures that newly added fields are correctly initialized to 'null' during installation, preventing performance bottlenecks and installation failures.
Original PR description
### Description: Installing `sale_subscription` on databases with a large number of `sale.order` and `sale.order.line` can cause Out of Memory (OOM) errors. The issue comes from two stored compute fields, `last_invoiced_date` and `plan_id`. Since these depend on newly added fields, they should default to `null` during installation. ### Reference: opw-6201267 Forward-Port-Of: odoo/enterprise#118419 Forward-Port-Of: odoo/enterprise#118008
This update resolves a printing problem reported by a client who was unable to print without LNA. The fix addresses a missing check that was causing errors during the printing process. This ensures consistent printing functionality for all users.
Original PR description
Based on the ticket below the client is experiencing an issue when printing without LNA. This PR fixes the missing key check opw-https://www.odoo.com/odoo/project/49/tasks/6232008 Forward-Port-Of: odoo/enterprise#118101 Forward-Port-Of: odoo/enterprise#118005
This update enhances the accessibility of carousels on our website, making them easier to navigate using a keyboard. Specifically, it adds visual focus indicators, pauses the carousel when focused, and supports 'home' and 'end' keys for navigation. These changes improve the user experience for all visitors, particularly those using assistive technologies.
Original PR description
[FIX] website: improve carousel accessibility To improve keyboard accessibility on carousels, the indicators container is not focusable anymore, and the indicators themselves now only have one…
[FIX] website: improve carousel accessibility
To improve keyboard accessibility on carousels, the indicators container
is not focusable anymore, and the indicators themselves now only have
one focusable button at a time.
The tab order is thus: previous button > active indicator > next button.
(The previous and next button may both appear before.)
You can still navigate among indicators with the left and right arrows,
which also moves the focus to the newly targetted indicator.
Note that other accessibility improvements remain to be done on the
carousels (add a pause/play button on auto-sliding carousels, place the
buttons before the carousel slide in the tab order, add some aria
attributes (roledescription, live), adaptative labels...).
[FIX] website: make focus visible on carousel arrows
When focusing manually (with tab / shift+tab) the previous/next arrows
in carousels, it is hard to follow where the focus is, because there is
no outline and the contrast is too small.
This commit adds a specific outline if the button is `:focus-visible`
(with both black and white to work on any background).
[IMP] website: pause carousel on focus within
Carousels are paused on hover (or touchstart), but if the focus is
inside one, it won't pause. That can make it hard to navigate within
interactive carousels during the sliding interval (e.g. the dynamic
products, which by default has 4 different products with 3 different
focusable links/buttons).
This commit applies the same behavior on focusin as Bootstrap's default
on mouseover, and on focusout as on mouseout.
[IMP] website: support home/end keys on carousels
When the focus is in a carousel, pressing the "home" key displays the
first slide and pressing the "end" key displays the last slide.
task-5470023
Forward-Port-Of: odoo/odoo#266428
Forward-Port-Of: odoo/odoo#244939This update corrects a bug preventing employees administrators from seeing the attendance smart button for other employees. The issue stemmed from how the system determined who could view attendance based on group permissions. Now, users with the necessary administrator and attendance manager groups will correctly see the button, ensuring efficient attendance management.
Original PR description
## Issue When logged in with a user who has the *Employee: Administrator* (`hr.group_hr_manager`) and the *User: Read his own attendances* (`hr_attendance.group_hr_attendance_own_reader`) groups, but…
## Issue
When logged in with a user who has the *Employee: Administrator* (`hr.group_hr_manager`) and the *User: Read his own attendances* (`hr_attendance.group_hr_attendance_own_reader`) groups, but not the *Officer: Manage attendances* (`hr_attendance.group_hr_attendance_officer`) group, the user won't be able to see their own attendance on their own employee's form view.
Additionally, a user without no Employee group but with the *Officer: Manage attendances* group could not see the attendance smart button on other employees form view.
## Steps to reproduce
1. Install *Attendances* (`hr_attendance`)
2. Set Marc Demo's groups:
- *Employees: Administrator*
- *Officer: Manage attendances*: unchecked
- *User: Read his own attendances*: checked (implied by Role / User)
3. Log in as Marc Demo and open his own form in Employees
4. **The attendance smart button is missing, even though Marc Demo has the group to see his own attendance.**
For the second issue:
1. Set Marc Demo's groups:
- *Employees: No*
- *Officer: Manage attendances*: checked
- *User: Read his own attendances*: checked (implied by Role / User)
2. Log in as Marc Demo and open another employee's form
3. **The attendance smart button is missing, even though Marc Demo has
the group to manage other employee's attendance.**
## Cause
There are two employee views defined in `hr_attendance`: `hr_employee_public_view_form` and `view_employee_form_inherit_hr_attendance`. The two views have different conditions under which the attendance smart button is displayed:
- In the public view, which is seen by users who do not have the *Employee: Administrator* group, the button is only displayed if the employee form is the one of the current user.
https://github.com/odoo/odoo/blob/b13d831e4c3c27ec7756302270f78c15f576a296/addons/hr_attendance/views/hr_employee_public_views.xml#L9-L15
https://github.com/odoo/odoo/blob/b13d831e4c3c27ec7756302270f78c15f576a296/addons/hr/models/hr_employee_public.py#L119-L123
**This means that a user without the _Employee: Administrator_ group cannot see the attendance button of other employees, even with the _Officer: Manage attendances_ group.** This view should take into account the *Attendance Manager* group.
- In the other view, which is displayed for users with the *Employee: Administrator* group, the button is only displayed for attendance officers.
https://github.com/odoo/odoo/blob/b13d831e4c3c27ec7756302270f78c15f576a296/addons/hr_attendance/views/hr_employee_view.xml#L24-L29
**This means that if a user is an Employee Administrator, but is not an Attendance Officer, they cannot see their own attendance, even with the "own attendance" group.** This second view should take into account the _User: Read his own attendances_ group.
opw-6167399
Forward-Port-Of: odoo/odoo#263826This update resolves an issue preventing users from unreconciling SEPA CT payments with a 'pending' online status. Previously, the system incorrectly blocked this process, causing delays in bank statement reconciliation. The fix allows internal unreconciliation flows to bypass validation, ensuring accurate bank statement matching.
Original PR description
**Issue:** The account_online_payment module overrides `action_draft` to raise a UserError for sepa_ct payments belonging to a batch with a `payment_online_status` = 'pending' or 'accepted'. This…
**Issue:** The account_online_payment module overrides `action_draft` to raise a UserError for sepa_ct payments belonging to a batch with a `payment_online_status` = 'pending' or 'accepted'. This blocks the bank statement unreconciliation process. When `delete_reconciled_line` is called, it tries to set payments to draft and re-post them, despite it being an internal process not a manual user modification. **Steps to reproduce:** - Setup a 'sepa_ct' payment method on a bank journal. - Create a bill with a vendor with a trusted bank account. - Create a payment for that bill with a 'sepa_ct' payment method. - Add the payment to a batch. - Manually set the `payment_online_status` = 'pending'. - Create a bank transaction and reconcile it with the batch. - Try to unreconcile the lines on the transaction - Result: UserError 'You cannot modify a payment that has already been sent to the bank.' **Fix:** Pass a context flag to `action_draft` during the unreconciliation flow so that the validation is skipped when the call originates from the internal unreconcile flow. OPW-6080464 Forward-Port-Of: odoo/enterprise#118206 Forward-Port-Of: odoo/enterprise#117921
This update resolves an issue where Live Chat users were unable to access chatbot messages due to restricted access controls. The fix adjusts permissions to allow users with the 'Live Chat / User' role to access the necessary data, ensuring proper functionality of the Live Chat feature. This change was triggered by a previous update.
Original PR description
**Steps to Reproduce** 1. Install the **Live Chat** module in version 18.4 or above. 2. Go to: **Settings → Users** * Open your user and change the access rights from **Live Chat / Administrator** to…
**Steps to Reproduce**
1. Install the **Live Chat** module in version 18.4 or above.
2. Go to: **Settings → Users**
* Open your user and change the access rights from **Live Chat / Administrator** to **Live Chat / User**.
* Alternatively, create a new user giving him rights of the **Live Chat / User** group.
3. Login using the Live Chat user.
4. Open the **Live Chat** application and navigate to: **Live Chat → Sessions**
5. Open any existing session. The session and its messages are accessible without any issue.
6. In the search bar, click: **Filters → Custom Filter**
7. Select the field `Chatbot Messages (chatbot_message_ids)`. You will face the below traceback.
**Issue Description:**
The issue happens because `discuss.channel` records are accessible to users having the `im_livechat_group_user` group through the Sessions menu: https://github.com/odoo/odoo/blob/459a775a066fe1465e53fc751045baed39f80118/addons/im_livechat/views/im_livechat_channel_views.xml#L310-L315
The field `chatbot_message_ids` is defined as:
https://github.com/odoo/odoo/blob/459a775a066fe1465e53fc751045baed39f80118/addons/im_livechat/models/discuss_channel.py#L165
This field points to the `chatbot.message` model, but access to that model is restricted to `im_livechat_group_manager` only:
https://github.com/odoo/odoo/blob/459a775a066fe1465e53fc751045baed39f80118/addons/im_livechat/security/ir.model.access.csv#L15
As a result, when a Live Chat user tries to use `chatbot_message_ids` in a custom filter, Odoo attempts to read `chatbot.message` records and raises an `AccessError`.
This issue started happening after the access rights changes introduced in pr : https://github.com/odoo/odoo/pull/201880
Specifically, the following ACL changes:
https://github.com/odoo/odoo/pull/201880/changes#diff-c1592d633a34db44a7cc2a527482cecc56127cbba72649e7318dcf63ccf477afR19-R20
**Solution:**
To fix this issue, added the group `im_livechat_group_manager` on the field `chatbot_message_ids` so only those user can access the field who belong to the group.
**Traceback:**
```.py
odoo.exceptions.AccessError: You are not allowed to access
'Chatbot Message' (chatbot.message) records.
This operation is allowed for the following groups:
- Live Chat/Administrator
Contact your administrator to request access if necessary.
```
opw - [6169395]
upg - [4274573]
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
Forward-Port-Of: odoo/odoo#264682This update resolves an issue where the 'Info & Tags' button was hidden in the mobile Documents app's kanban view. The fix adjusts CSS styling to ensure the chatter is always visible and accessible, improving usability for mobile users. This prevents a frustrating experience when accessing document details.
Original PR description
**Steps to reproduce:** - Go to Documents app in mobile - Go to the kanban view - Add some files and select one - Click on `Info & Tags` button in the control panel - Reload the page - Chatter is not…
**Steps to reproduce:** - Go to Documents app in mobile - Go to the kanban view - Add some files and select one - Click on `Info & Tags` button in the control panel - Reload the page - Chatter is not displayed but the button is still enabled - Switching to the list view properly shows it **Issue:** We have two conflicting css styling on mobile: - `overflow-hidden` was added for mobile to avoid multiple scroll bars - `min-height: 100%` which is due to the default `o_kanban_ungrouped` in the controller css This means that the element is present at the bottom of the page, but we can't get to it manually. When re-enabling the action we are properly moved to the existing chatter (but we can't go back to the top). Also the documents panel should have a single scrollbar to display all the records, but we still need a way to scroll the messages of the chatter. **Fix:** Set `min-height: 0;` for documents kanban to ensure the chatter is still visible and accessible on mobile by default. This makes the chatter take the full available height when displayed. original overflow fix: https://github.com/odoo/enterprise/commit/945b9e2b1c6752bd905695aa40b0babcf38c50cd opw-6061993 Forward-Port-Of: odoo/enterprise#118134 Forward-Port-Of: odoo/enterprise#113168
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 fixes a problem where users weren't notified when an expense's payment authorization status changed (e.g., cancelled). The fix ensures that users receive timely updates, improving the accuracy of expense tracking and reducing potential errors. This resolves an issue reported by internal teams.
Original PR description
## [FIX] hr_expense_stripe: Fix error messages coherence Fix the incoherent punctuation ## [FIX] hr_expense_stripe: Fix reversed and expired authorizations Before this, when receiving an `issuing_authorization.updated` event, the event would be ignored and the user would never know that the expense had been cancelled opw-6210055 Forward-Port-Of: odoo/enterprise#117257
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