Thursday, March 5, 2026
43 changes · saas-19.2
New functionality added to Odoo
This update incorporates the Central Bank of Uzbekistan as a source for real-time currency rates. This change ensures Odoo can accurately reflect currency values for transactions and reporting within Uzbekistan, complying with local regulations. It’s a key step in supporting business operations in that market.
Original PR description
## Description of the issue/feature this PR addresses: This PR adds the Central Bank of Uzbekistan as a provider for currency update task-id - 5917344 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#108059
Enhancements to existing features
This update expands the 'Unpaid' filter in the vendor bill section to now display draft bills alongside posted bills. This allows users to see all outstanding bills, regardless of their status, improving visibility and streamlining payment management. A technical update ensures journal entries are correctly filtered, maintaining data accuracy.
Original PR description
In this commit: - Updated the `Unpaid` filter to show draft bills in addition to posted bills. The filter now includes all non-cancelled bills with payment status `Not Paid` or `Partially Paid`. - Backported the logic from 18.0 to ensure journal entries are filtered out by checking that type is not equal to `journal_entry`. task-5900283 Forward-Port-Of: odoo/odoo#251208 Forward-Port-Of: odoo/odoo#247179
Resolved issues and error corrections
This update resolves an issue where new chart types added to Odoo weren't clearly identified in the data selection menus. By adding placeholder names, users can now easily distinguish between different chart types when building reports. This ensures accurate and efficient chart creation.
Original PR description
We recently added a lot of chart types that handle Odoo data but we faialed to add a placeholder name (which is handy to differentiate them in the datasource menu). Task-5979722 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#251135
Features or functions removed from Odoo
This pull request removes a redundant widget from the account module. It was previously linked to an outdated commit and is no longer needed. This simplifies the system and reduces potential maintenance overhead.
Original PR description
After https://github.com/odoo/odoo/commit/fbbbd3314a1574b1196a59bd4229ee81aa932eb7 , this widget is useless --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update enhances the HR payroll user interface by adding a placeholder to the 'struct_id' field. This improves usability by guiding users to select the correct pay category, making the system easier to navigate and reducing potential errors. The change is a simple UI improvement.
Original PR description
- The 'struct_id' field lacked a placeholder, making the UI less intuitive for users. - Added 'placeholder="Choose a pay category"' to improve the user experience. Task: 5960838
This update enhances the Point of Sale (POS) system by adding a class name to the ticket screen, allowing for easier customization and future improvements. This change, stemming from a previous enterprise-level update, streamlines the development process and provides a more flexible foundation for future POS enhancements. It's part of a larger effort to improve the POS experience.
Original PR description
See odoo/enterprise#94390 Forward-Port-Of: odoo/odoo#226447
This update adjusts the salary scale parameters used in the Odoo Enterprise's Belgian payroll module. Specifically, the starting salary values for 2026 have been updated to reflect current Belgian tax regulations. This ensures accurate payroll calculations for our Belgian clients.
Original PR description
. Update cp200_salary_scale_first_year values for 01/01/2026 . Update cp200_salary_scale values for 01/01/2026 task-5485636 Forward-Port-Of: odoo/enterprise#107473
This update fixes an issue where combo product prices were being incorrectly doubled. The change ensures that only the individual item prices within a combo are summed, preventing inflated totals. This improves the accuracy of combo pricing for customers.
Original PR description
Combo product prices were doubled in the `comboTotalPrice` and `comboTotalPriceWithoutTax` getters, as we were summing the `displayPrice` of all the combo lines, including the parent line, which already had its `displayPrice` as the sum of its children. So now, we filter out the parent line in those getters before summing. Forward-Port-Of: odoo/odoo#247347
This update fixes a previous error that prevented users from sending follow-up reports by post when they lacked sufficient permissions to modify company settings. The fix allows for necessary changes to be made as an administrator, ensuring reports can be successfully sent without interruption. This resolves a potential roadblock in the report delivery process.
Original PR description
Issue: Before this commit, when sending a follow up report by post, an access error is thrown if the user doesn't have enough access to modify the res.company model Fix: modifying the external_report_layout_id as sudo opw-5482855 Forward-Port-Of: odoo/odoo#248677
This update fixes an issue where resource calendars incorrectly calculated working hours when using full-day periods. The system now averages the start and end times of a shift to ensure accurate half-day calculations, resolving a potential discrepancy in scheduling and reporting. This ensures resources are scheduled correctly across all working periods.
Original PR description
### Steps to reproduce: - Go to any working schedule of an employee. - Add a working hour line for any day and choose day period as full day. - Change work from 10:00, and work to 18:00. ### Issue: - Resource was explicitly setting 12 if any hour_from/hour_to was missing. - Resource always consider that the working time is 8AM-5PM. ### Fix: - We will calculate the avg of working hours( hour_from + hour_to)/2 - Doing this we will always get the middle of day. task: 5912748 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247756
This update resolves a technical issue where incorrect partner IDs were being assigned during stock dropshipping operations. The fix automatically filters out invalid 'False' values, ensuring data integrity and preventing errors when assigning partners to shipments. This improves the reliability of the dropshipping process.
Original PR description
**Issue:** The error is produced due the changes introduced in this https://github.com/odoo/odoo/commit/4290724a4c8c57fba4f4d3d688d38f65dadcc38f commit. Particularly because of this assertion…
**Issue:**
The error is produced due the changes introduced in this https://github.com/odoo/odoo/commit/4290724a4c8c57fba4f4d3d688d38f65dadcc38f commit. Particularly because of this assertion checking :
https://github.com/odoo/odoo/blob/b5d3970e6b05e2c35ce16e972e659d152c4de70e/odoo/orm/models.py#L5207
This assertion is failing because of the condition related to `is_dropship`. When `is_dropship` is `True`, the `partner_id` is expected to be `p.sale_id.partner_shipping_id.id`
https://github.com/odoo/odoo/blob/b5d3970e6b05e2c35ce16e972e659d152c4de70e/addons/stock_dropshipping/models/stock.py#L95
However, for the specific picking record in some cases, `sale_id` is not set
https://github.com/odoo/odoo/blob/b5d3970e6b05e2c35ce16e972e659d152c4de70e/addons/sale_stock/models/stock.py#L190
As a result of the current implementation, the [expression](https://github.com/odoo/odoo/blob/b5d3970e6b05e2c35ce16e972e659d152c4de70e/addons/stock_dropshipping/models/stock.py#L95) evaluates to **False**. That False value is then included in the generated list.
**For example** : lot.partner_ids = [2, False, 5, 6]
With the recent changes, when this assignment happens, it **no longer ignores False values**. Instead, during the write process, the ORM internally calls **browse()** on the provided IDs. Since False is not a valid ID, the assertion inside browse() **fails**, this can be seen in the **traceback**.
This shows that when the field is being written, the ORM validates the IDs by calling browse(), and since False is included in the list, the assertion fails.
**Solution:**
To resolve this issue, I have use `mapped. As 'mapped()' will filter out all the empty(False) values from the recordset.
By switching to **mapped()** and returning a recordset instead of a list of IDs, False values are automatically excluded. As a result, no invalid IDs are passed to browse(), and the assertion error is avoided.
I have also added the if `p.is_dropship and p.sale_id.partner_shipping_id` condition because it fallback to the picking partner if there is no sale order partner to use
**Other Optimization:**
I have used `with_prefetch` to fetching `picking_ids`, it is just the purely ORM friendly optimization.
It ensures that all related records are prefetched efficiently across lots. It is not related to the bug above mentioned.
**Traceback:**
```python
File "/home/odoo/src/odoo/saas-19.1/addons/stock_dropshipping/models/stock.py", line 95, in _compute_partner_ids
lot.partner_ids = list(p.sale_id.partner_shipping_id.id if p.is_dropship else p.partner_id.id for p in picking_ids)
^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/fields.py", line 1866, in __set__
self.write(protected_records, value)
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/fields_relational.py", line 765, in write
self.write_batch([(records, value)])
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/fields_relational.py", line 786, in write_batch
self.write_real(records_commands_list, create)
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/fields_relational.py", line 1553, in write_real
comodel.browse(
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/models.py", line 5202, in browse
assert all(ids) or all(isinstance(x, NewId) or x for x in ids), "Invalid falsy real id"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Invalid falsy real id
```
opw: 5922525
upg: 3889582
tgb: 2449
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#249047This update resolves a technical error preventing users from hearing incoming ringtones during VOIP calls. The previous code was attempting to access a missing component, resulting in a system error. This fix ensures that ringtones play correctly for users, improving the call experience.
Original PR description
requestIncomingRingtone() was calling this.ringtoneService.incoming.play(), but ringtoneService is not defined on UserAgent, leading to: ``` TypeError: Cannot read properties of undefined (reading 'incoming') when handling VOIP:PLAY_INCOMING. ``` Forward-Port-Of: odoo/enterprise#109480
This update corrects a test case within the quality control module to reflect a recent change in how stock transfers are handled. Specifically, the test now accurately assesses scenarios where stock references are required for merging transfers, ensuring data integrity and consistent behavior. This resolves a potential issue impacting how quality checks are performed.
Original PR description
Fix the test case to align with the updated picking move merge behavior, where the next transfer merges into an existing one only when a stock reference is set TaskID-5242340 Forward-Port-Of: odoo/enterprise#109428 Forward-Port-Of: odoo/enterprise#99342
A test was failing due to a time zone discrepancy in the planning module. The fix corrects a calculation error related to how the current date is determined, ensuring the test now passes consistently. This resolves a potential instability in the planning functionality.
Original PR description
__ ## Error description The test fails when it is launched at 23h. We obtain an assertion error: `AssertionError: datetime.datetime(2026, 2, 26, 11, 0) != datetime.datetime(2026, 2, 25, 11, 0)` ##…
__ ## Error description The test fails when it is launched at 23h. We obtain an assertion error: `AssertionError: datetime.datetime(2026, 2, 26, 11, 0) != datetime.datetime(2026, 2, 25, 11, 0)` ## Origin of the issue In the `_default_start_datetime()` method of planning, we return `return datetime.combine(fields.Date.context_today(self), time.min)`. So, we call context_today. which is implemented this way: https://github.com/odoo/odoo/blob/f3ec2aa4514c03874aae96ae975e2617e8260c72/odoo/orm/fields_temporal.py#L154-L158 Let's say the hour of the test is 23h50 in GMT+0. The slot will be created at 23h50 in GMT+0. But if the time zone of the environment is set at GMT+1, at the moment of the `_compute_datetime`, we will call this piece of code, where we will translate 23h50 to GMT+1, we will obtain 00h50, then only return the day, which offsets the result of one day in the future. X-original-commit: d91c53869842f65a60088ffa101f67404af6e58e Forward-Port-Of: odoo/enterprise#108891
This update corrects a minor display issue in the accounting dashboard. Previously, the 'Reconnect Bank' button was incorrectly shown for accounts without an expiration date due to a technical detail in the code. Now, the button only appears when an expiration date is present, ensuring a cleaner and more accurate user interface.
Original PR description
The aim of this commit is fixing the behavior of Reconnect bank button in accounting dashboard. Before this commit, a synchronization without any expiring date will always show the Reconnect bank button in the accounting dashboard because the expiring due days (in the JS widget) is null and not undefined. This condition led to check the second part of the condition where null <= 0. Which is true in javascript. Now, we are checking the type of expiring due days as first condition, if it's not a number, we don't check the second part of the condition, and then we don't display the Reconnect Bank button. no task id Forward-Port-Of: odoo/enterprise#109414
This update resolves a problem preventing the correct generation of CSV reports for Peru-specific accounting. The fix addresses an incompatibility between Python 3.13 and CSV formatting, ensuring reports are created accurately. The change also streamlines the CSV configuration process for improved efficiency.
Original PR description
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises ValueError: bad delimiter or lineterminator value This is due to…
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises
ValueError: bad delimiter or lineterminator value
This is due to python/cpython#113797 which added new validations to dialect definitions. For this issue, that the delimiter can not be in the line terminator. This can be fixed via a different trick, which is documented:
> The optional `restval` parameter specifies the value to be written
> if the dictionary is missing a key in `fieldnames`.
so if we add a trailing fieldname which *can not* be found in the row dicts, then `DictWriter` will always write out an empty trailing cell (the default `restval` is an empty string), which should result in the same output.
Also remove the `csv.register_dialect` calls, that's so subsequent CSV calls can easily refer to a common configuration but here two different dialects are being registered under the same name, and each one is only used for the following `DictWriter` call, so at best this is a complete waste of time and at worst this is a race condition in threaded configurations. Just pass the formatting parameters directly to the `DictWriter`.
https://runbot.odoo.com/odoo/error/240950
Forward-Port-Of: odoo/enterprise#109437
Forward-Port-Of: odoo/enterprise#109081This change makes automated web tours wait until the tour is fully available before starting. It prevents tests from failing after a browser refresh due to timing issues, improving stability without changing normal user workflows.
Original PR description
Add a `waitUntilTourRegistered` helper to ensure a tour is present in the client-side registry before starting it. After a browser refresh, the tour definition may not yet be loaded when execution resumes. This could cause the tour to abort because it is triggered before being registered. The new helper waits up to 5 seconds for the tour to be available, preventing race conditions and improving test stability.
This update improves the Gantt editor within Odoo Enterprise by allowing all integer fields to be used with the color selection feature. Previously, only fields directly visible in the editor's view could be chosen. This change provides greater flexibility for visualizing project timelines and tasks.
Original PR description
Before this commit, only fields already present in the view were selectable for the color field in the gantt editor. After this commit, all int fields of the model are available task-5981029 Forward-Port-Of: odoo/enterprise#109189
This update enables cashiers to record multiple payments for a single order in the Point of Sale system. Previously, users were limited to one cash payment line, causing issues when multiple people paid separately. This change improves the user experience and accurately reflects scenarios like groups paying together.
Original PR description
Before this commit: ============ - The user is not able to process multiple cash payment lines. An error pop-up appears saying `There is already a cash payment line.` After this commit: ============ - The user can process multiple cash payment lines. Use Case: ----------- - If a group of people goes to a restaurant and one person leaves earlier, he decides to pay $10 at the cashier and leave. When the others pay later, the cashier will see that $10 has already been paid and can add another cash payment line for the remaining amount. Task-5969853 Forward-Port-Of: odoo/odoo#250639
This update fixes a limitation where managers needed a specific group to access their team's voip call records. By changing the access rule to the standard 'group_user' group, all managers now automatically have access, simplifying permissions and improving usability. This ensures consistent access for managers without requiring additional group assignments.
Original PR description
voip_hr defines a record rule that gives managers access to their subordinates' voip.call records. However, this rule is linked to the group 'hr.group_hr_user', which is not granted to all managers. This commit links the rule to the base.group_user group instead, so that all managers can access their subordinates' records without the need for an additional group. [Task-5363640](https://www.odoo.com/odoo/project/5778/tasks/5363640). Forward-Port-Of: odoo/enterprise#100691
A test related to video calls in the Odoo chat window was failing intermittently. This change ensures the test receives the correct data at the start, preventing a delayed data fetch that caused the video to not display properly. This fix addresses a technical issue without impacting the core call functionality.
Original PR description
Test `auto-focus participant video in one-to-one call in chat window` failed non-deterministically at the following step: ``` .o-discuss-CallParticipantCard[aria-label='Batman'] video ``` This issue…
Test `auto-focus participant video in one-to-one call in chat window` failed non-deterministically at the following step: ``` .o-discuss-CallParticipantCard[aria-label='Batman'] video ``` This issue happens because very late in test there's a debounced store fetch of `channels_as_member` from receiving a new message, a call notification, and these store data contain outdated rtc session data, some of which are on `camera_is_on` being `false` instead of `true` that is simulated just prior to the failing step that expects showing of video stream on UI. This commit solely fixes the test by forcing a `channels_as_member` fetch at the very beginning of the test, as to prevent risk of such a late fetch of store data that contains the outdated rtc session data. Note that this test shows a genuine problem and there's ongoing work to solve it (see Task-4966085). This commit merely fixes the test to not show this problem that is out-of-scope of the intent of the test. Fixes runbot-error-240554
This update fixes an issue where clicking an icon within a link's popover didn't work as expected. The fix ensures that link popovers open and function properly when a user clicks on an icon inside the link, improving the user experience for links containing icons.
Original PR description
Problem: When a link contains an icon, clicking on the icon does not properly open the link popover. The popover opens and immediately closes. Cause: The logic for opening the link popover does not handle the case where the selection is not collapsed and is around an icon inside a link. This scenario was not covered in the existing conditions. Solution: Handle the non-collapsed selection case similarly to images: if the selection is around an icon inside a link, the link popover should open correctly. Steps to reproduce: - Add a link. - Insert an icon inside the link. - Click on the icon. - Observe that the link popover opens and closes immediately. task-5921393 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a display issue in the India payroll localization where a download button remained visible when the payment mode was set to 'Manually'. The fix ensures the button is hidden correctly, preventing confusion for users. This change improves the user experience for employees using the India payroll system.
Original PR description
Problem ------------------ When the user selects the "Manually" payment mode in the employee payslip, there is nothing to download but the download button is still visible. Affects all companies but only when the India Payroll localization is enabled. Objective -------------------- The Payslip Payment Wizard for the India payroll localization changed the conditions to hide the download button, so when the localization is enabled, all views are overwritten and the button becomes visible for all companies when "Manually" payment mode is selected. Solution ---------------------- Add the manual payment mode to the list of conditions to hide the download button in the l10n_in_hr_payroll localization. Task: 5975685
This update resolves an issue where the Odoo tour would sometimes fail to start after a browser refresh. The change adds a simple delay to ensure the tour is fully loaded and registered before execution, resulting in more reliable tour functionality. This improves the overall user experience and test stability.
Original PR description
Add a `waitUntilTourRegistered` helper to ensure a tour is present in the client-side registry before starting it. After a browser refresh, the tour definition may not yet be loaded when execution resumes. This could cause the tour to abort because it is triggered before being registered. The new helper waits up to 5 seconds for the tour to be available, preventing race conditions and improving test stability. 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
A test failure related to invoice data formatting was resolved. The fix ensures the correct invoice data is used in a key process, preventing potential errors and ensuring proper invoice generation for Turkish VAT invoices. This improves the reliability of the invoicing system.
Original PR description
In the `test_which_service_to_call` test, we are calling `_call_web_service_before_invoice_pdf_render` with invoice_data. But invoice_data is just a dict with `invoice.read()` and the extra key extra_edis. Instead of manually building invoice_data, we should call `_get_default_sending_settings`, which is meant to be used in the base `account.move.send` flow. Why this fix? Because by not calling `_get_default_sending_settings`, we risk changing the expected invoice_data format used in `_call_web_service_before_invoice_pdf_render`, which could lead to KeyErrors. Spotted while developing https://github.com/odoo/enterprise/pull/80590, the test failed, raising the ['invoice_edi_format'] key error. no-task Forward-Port-Of: odoo/odoo#251885 Forward-Port-Of: odoo/odoo#232105
This update fixes a potential issue with how the Odoo command-line interface handles data directories. While the recommended method is using the odoorc configuration file, this change ensures that the `--data-dir` option is consistently enforced by the platform, providing greater stability.
Original PR description
The prefered way is to use the odoorc config file, but some plateforms let their users configure their config file, but --data-dir should be enforced by the plateform. Forward-Port-Of: odoo/odoo#251937
This update corrects a minor display issue with employee names in the HR module. Specifically, it ensures that the help text associated with employee name fields is correctly copied, improving the user experience and data consistency. This change is a simple fix to enhance readability.
Original PR description
Copy string and help field attributes for virually related employee fields. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251809
This update fixes an issue where large company logos on customer documents were overlapping with important address information. By adding a maximum width constraint to the small company logo, the document layout is now cleaner and more professional, ensuring critical customer details are always visible. This improves the overall presentation of customer documents.
Original PR description
**Description of the issue/feature this PR addresses:** Similar issue described in: https://github.com/odoo/odoo/pull/249432 Since there is no `max-width` defined for `o_company_logo_small`, if a user uploads a large logo, the customer address overlaps with the company details. This can be tested by previewing the document with a large logo. <img width="684" height="449" alt="image" src="https://github.com/user-attachments/assets/aa2ac10b-cb0f-448a-ade3-6e7bb8b1fcff" /> **Current behavior before PR:** <img width="681" height="383" alt="image" src="https://github.com/user-attachments/assets/cf7d5740-db51-43e3-b8f6-70325e9e28c0" /> **Desired behavior after PR is merged:** <img width="505" height="307" alt="image" src="https://github.com/user-attachments/assets/b175a06a-cde0-4808-a1fb-276fd96272c3" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr cc @ForgeFlow Forward-Port-Of: odoo/odoo#251976
This update fixes a rounding discrepancy in early payment discounts, specifically when 'Always (upon invoice)' cash discount tax reduction is used. Previously, discounts were calculated line-by-line, leading to minor discrepancies. This change ensures discounts are rounded globally for accurate calculations, improving financial reporting.
Original PR description
**PROBLEM** There is a rounding issue with early payment discount when cash discount tax reduction is set to always (upon invoice). The move.line created for the discount is computed by applying the discount to each line, rounding each line individually. But the early payment discount is computed by rounding globally. **STEP TO REPRODUCE** 1. Create a payment term, with early discount of 1%, and cash discount tax reduction set to 'Always (upon invoice)'. 2. Create an invoice with 4 identical lines, unit price 4.76€ and tax 15%. 3. set the payment term on the invoice and save. 4. Go to journal item, early payment discount is 0.20€. 5. toggle discount_amount column on the the journal item tab. 6. notice on the last line, that balance - discount_amount = 0.19€ instead of 0.20€ opw-5865308 Forward-Port-Of: odoo/odoo#251138 Forward-Port-Of: odoo/odoo#247996
This update fixes an issue where SMS reminders weren't being sent for calendar events synced with Google or Microsoft. The fix ensures that Odoo correctly handles SMS notifications for these synced events, aligning with the intended behavior of email reminders being delegated to Google. This improves the reliability of reminders for all users.
Original PR description
SMS reminders are not sent for calendar events synced with Google, even though only email reminders should be delegated to Google. Reproduction steps: * Create a calendar event in Odoo with an SMS…
SMS reminders are not sent for calendar events synced with Google, even though only email reminders should be delegated to Google. Reproduction steps: * Create a calendar event in Odoo with an SMS reminder. * Sync the calendar with Google. * Wait for the reminder to trigger. * Observe that no SMS is sent by Odoo. Cause: The event reminder scheduled action groups events by alarm type and calls `_get_events_by_alarm_to_notify`. For Google-synced events, `_get_notify_alert_extra_conditions` blindly excludes any event with a `google_id`, assuming Google will manage all reminders. This exclusion is incorrect for non-email alarms (e.g. SMS), which must still be handled by Odoo. Fix: The alarm type is propagated through the context so Google-specific exclusions only apply to email reminders. This restores SMS notifications while preserving the existing behavior for emails. A context key is used for stability; a proper method argument will be introduced in master. opw-5172958 Forward-Port-Of: odoo/odoo#251742 Forward-Port-Of: odoo/odoo#241026
This update resolves a bug where the cursor would disappear when replying in the HTML composer, particularly in Firefox. The fix involves adding invisible characters around mentions to ensure proper cursor movement and text insertion, improving the user experience for composing messages.
Original PR description
In chatter, using "Reply" in HTML composer could focus the composer without giving a usable caret. The inserted partner mention is a non-editable link (`contenteditable="false"`), and selection could end up inside that node, so typing would not insert text. This also fix the related firefox issue: mentions are rendered as `a[contenteditable=false]`. Firefox is stricter than Chrome for carret positions around non-editable inline nodes, so clicking before a mention or moving left from its right edge could make stuck. so we register mention selectors as FEFF providers in the mention plugin. (a feature of html_editor FEFF plugin to add invisible boundary characters around mentions, which gives firefox what it need to move carret around. some tests had to be adapted to take the insertion of FEFFs in the composer text into account task-5262368 Forward-Port-Of: odoo/odoo#250711 Forward-Port-Of: odoo/odoo#250296
A technical issue was causing the Activity Logs report to appear incorrectly within the Sign Template list view, leading to errors. This update corrects a misconfiguration in the report's model settings, ensuring it now displays correctly within the Sign Request view and resolves the underlying error.
Original PR description
Version: - saas-18.2 Issue: - The "Activity Logs" report was showing in the Sign Template list view. When clicking it, a traceback occurred because the report tried to read a `sign.request` record from a `sign.template` context. Cause: - The report model was set to `sign.request`, but the`binding_model_id` was set to `model_sign_template`. - This mismatch caused the report to appear in the wrong place. Solution: - Updated the `binding_model_id` to `model_sign_request` so the report now appears in the Sign Request view, which matches the report model and prevents the error. task-5984137 Forward-Port-Of: odoo/enterprise#109171
This update corrects a bug where the system was incorrectly returning multiple bank records due to duplicate account numbers, particularly when dealing with child company contacts. The fix ensures that only one bank record is created, streamlining bank management and preventing data inconsistencies. This improves data accuracy and reliability.
Original PR description
The function `_find_or_create_bank_account` is expected to return one or no record at all. In the case of child contacts, it is possible that the same account number was set on multiple records, leading the function to return multiple banks. Forward-Port-Of: odoo/odoo#251733
This update fixes a technical issue within the mass mailing module that ensured the correct identification of editable elements. Previously, the system incorrectly interpreted a shared method, leading to potential inaccuracies. This change improves the reliability and accuracy of mass mailing operations.
Original PR description
Description of the issue/feature this PR addresses: This PR makes sure `isSelectionInEditable` is correctly checked in `EmptyNotEditableElementsPlugin`. `isSelectionInEditable` is a shared method previous code interpreted it as property. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251744
This update resolves an issue where US-specific reports were incorrectly appearing in Odoo databases set up for India. The fix ensures that the necessary US Payroll module is automatically installed when the base HR Payroll module is installed, preventing this unexpected report visibility. This improves the user experience for international clients.
Original PR description
**Version:** saas-19.1 **Steps to reproduce:** - Create a new database with India as country. - Install l10n_in_hr_payroll. - US company based reports are visible. **Issue:** Reports specific to us payroll localisation are visible for base hr_payroll module **Cause:** The l10n_us module was missing as the auto_install dependency. **Solution:** Added l10n_us as the auto_install dependency in the manifest file. **task-5948747** Forward-Port-Of: odoo/enterprise#108435
This update resolves a technical issue preventing the holiday calendar tour from functioning correctly in certain situations. The fix ensures the tour consistently displays and operates as intended, improving the user experience. This change was identified and addressed through automated testing.
Original PR description
This fix adjusts the tour in `test_hours_time_off_request_calendar_view` as it was failing in some cases. runbot error 237682 Forward-Port-Of: odoo/odoo#249458 Forward-Port-Of: odoo/odoo#249267
This update corrects a persistent warning message appearing after deleting a payslip in the HR payroll system. The fix involves canceling the payslip before deletion to ensure accurate duplicate checks, preventing unnecessary warnings. This improves the user experience and data integrity.
Original PR description
### Steps to reproduce: - Create two payslips for the same employee for the same period. - Delete one of them; the duplicate warning still appears on the other payslip. ### Fix: - Before deleting a payslip, first cancel it so the current payslip can be skipped while checking for duplicate payslips. - Then trigger recompute _compute_issues for duplicates payslips task: 5427473 Forward-Port-Of: odoo/enterprise#104124
This update fixes an inconsistent spacing issue in the Poll Result message displayed in the message list. Previously, there was extra space above the poll result box, which has now been removed. This ensures a cleaner and more professional look for all users.
Original PR description
Before this commit, Poll Result in message list had some unwanted spacing between the message header and the poll result box. The bottom spacing is fine but not the top. Before / After <img width="263" height="161" alt="Screenshot 2026-03-04 at 16 44 12" src="https://github.com/user-attachments/assets/b827bc1e-ee67-4f73-bea5-3bfc3ed7ed2d" /> <img width="271" height="150" alt="Screenshot 2026-03-04 at 16 43 57" src="https://github.com/user-attachments/assets/fc816b40-f375-48f3-a283-ea064d2b4cfb" /> Forward-Port-Of: odoo/odoo#252050
A test within the Odoo stock module was intermittently failing due to inconsistencies between the database and the test environment. This update adds a database refresh step to the test, ensuring accurate data and preventing these random failures. This improves the reliability of our stock management testing.
Original PR description
In Signal app, the test `test_set_inventory_quant_to_zero` was failing randomly when asserting that the quant no longer exists after calling `_unlink_zero_quants()`. All required conditions for deletion were met: - inventory_quantity == 0 - user_id is False - quantity == 0 - reserved_quantity == 0 The method `_unlink_zero_quants()` performs a raw SQL query to select zero quants. Since raw SQL does not trigger an automatic ORM flush, the quant state could be out-of-sync with the database at the time of the query, making the deletion non-deterministic. Add an explicit `flush_all()` before calling `_unlink_zero_quants()` in the test to ensure the database reflects the latest ORM state and avoid random failures. Runbot-241210 Forward-Port-Of: odoo/odoo#252006
This change corrects a visual issue where the 'invalid locators' warning was appearing incorrectly within a form due to an outdated XPath targeting a duplicate element. The fix ensures the warning now displays correctly after the 'Be aware' alert, resolving a potential user experience problem. This was caused by differences in database view ordering.
Original PR description
The XPath `//div[hasclass('alert-info')]` used to insert the invalid locators warning matches multiple elements since the website module has another `alert-info` div inside the visibility field:…
The XPath `//div[hasclass('alert-info')]` used to insert the invalid locators warning matches multiple elements since the website module has another `alert-info` div inside the visibility field: https://github.com/odoo/odoo/blob/31c199f3d19b8f9c54d582b6a5c4684e1ed38d0a/addons/website/views/website_pages_views.xml#L221
<img width="1065" height="633" alt="image" src="https://github.com/user-attachments/assets/dab8955c-d01b-4682-871a-b7499ed99297" />
<img width="1427" height="986" alt="image" src="https://github.com/user-attachments/assets/a05efb5d-254b-4e3a-ad14-530ae6718be6" />
On databases created before the invalid locators feature was added, the website inherited view has a lower ID than the web one, so it is applied first. This causes the XPath to match the wrong element and places the warning in the middle of the form fields instead of after the "Be aware" alert. This is not reproducible on runbot since fresh databases always have the correct ID ordering.
<img width="2291" height="956" alt="image" src="https://github.com/user-attachments/assets/fc7eee11-c66e-4d84-b827-f2ed61c76a97" />
We now target the correct alert div that is a direct child of the sheet element. Hence, the inheriting order no longer affect the location of the warning.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#251631This update resolves a rare issue in the Gantt view that could cause it to crash when users interact with search filters. The fix prevents a data loss scenario that occurred when a search filter removed a task pill while a hover event was still active, ensuring a more stable user experience.
Original PR description
This commit fixes a traceback in the Gantt view caused by a race condition during search operations. If a user clicks a search dropdown item located directly above a task pill, and that search filters out the underlying pill, a `pointerenter` event can fire on the pill just as the dropdown closes. Because the search amy already be applied, the renderer could lose track of the pill, causing the handler to crash when trying to access it. This commit adds a safety check to the event handler to exit early if the hovered pill is no longer found in the renderer. Forward-Port-Of: odoo/enterprise#109545
This update clarifies how Helpdesk articles are searched when a non-root article is selected as the main article. Previously, searching didn't include descendant articles. Additionally, a minor issue with the dropdown functionality has been addressed to prevent empty dropdowns. The team has opted to provide clearer guidance on this behavior rather than attempting a complex domain fix.
Original PR description
*: website_helpdesk_knowledge **Steps to reproduce:** - Install Helpdesk/Knowledge/Website apps - Go to Knowledge - Set up a Knowledge workspace root article with some child articles to it - Go to…
*: website_helpdesk_knowledge
**Steps to reproduce:**
- Install Helpdesk/Knowledge/Website apps
- Go to Knowledge
- Set up a Knowledge workspace root article with some child articles to it
- Go to Helpdesk > Configuration > Helpdesk Teams
- Open a Helpdesk team, and go to its Help Center config
- Check Knowledge and set a non-root article as main Article
- Go to Website > Help
First issue (non-root main article):
- Type a word which is present in both the article and one of its child articles
- Only the given article match the word
- If you use the root article it will match in any descendant
Second issue (in every case):
- Type a word in the search bar
- Wait for the dropdown to appear
- Click elsewhere, dropdown is properly hidden
- Try to change the search > Traceback
**Issue:**
The domain used to find the articles to match the search uses the current id as the `root_article_id`:
`['|', ('id', '=', team_article.id), ('root_article_id', '=', team_article.id)],` which was previously working in every case as it was not possible to set a non-root article in the team setting.
This was later changed to allow any article as the default website page. As a result, when a non-root article is selected, the search domain only applies to that specific article and no longer includes its descendants.
The other issue is related to the added boostrap attribute `data-bs-toggle="dropdown"` which is not properly reset when the dropdown is removed, and triggers the creation of an empty dropdown.
**Fix:**
Doesn't seem easy to fix to allow the search on all the descendants of the given article as we can't use the article `root_article_id` and filter out the unwanted results in a clean way (and it doesn't seem doable with a direct domain). Instead clarify the situation in the help of the article.
Also manually reset the attribute for `_onFocusOut`.
related: https://github.com/odoo/enterprise/commit/ed971d4d02624f8b864ab6c37c6e7db8ba3dfe11
opw-5258607
Forward-Port-Of: odoo/enterprise#109612
Forward-Port-Of: odoo/enterprise#107438This update resolves a tour test failure caused by a delay in order synchronization. The fix adds a waiting step to ensure the order is fully processed before initiating refunds, preventing a constraint error related to negative order amounts. This ensures refunds are handled correctly within the system.
Original PR description
In this commit: =============== - Fix the tour `test_mx_pos_invoice_order_and_refund` failing with **WARNING**: `The amount of the order must be positive for a sale and negative for a refund`. caused by an order sync issue with the backend. Cause: ====== - The tour started the refund immediately after validating the order, while the original order was still syncing with the backend. - Because of this, the constraint `_l10n_mx_edi_constrains_amount_total` was triggered since the order had `amount_total < 0` but `refunded_order_id` was not set yet. Fix: ==== - Add a waiting step in the tour to make sure the order is fully synced before starting the refund flow. Task: 5993576 Error: 237980