Daily updates from Odoo
Thursday, March 5, 2026
156 changes
23 changes
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
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
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
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 update ensures the tour in Odoo starts correctly after a browser refresh. It prevents errors caused by the tour being triggered before it's fully registered, improving test stability and user experience.
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
20 changes
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 Enterprise complies with local regulations and provides more accurate currency conversions for transactions involving Uzbekistan.
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 payment 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
This update enables cashiers to record multiple payments for a single order in Point of Sale. Previously, users were limited to one cash payment line, causing issues when multiple people paid at different times. This change improves the user experience and accurately reflects payments made in a group setting.
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 adjusts the Romanian tax reporting (l10n_ro_saft) to align with recent changes in the core Enterprise version (CE). The update removes outdated tax codes and adds new ones, ensuring accurate reporting for Romanian businesses. This ensures compliance with current tax regulations.
Original PR description
Some taxes were no longer needed in CE, so they needed to be removed task-5411745 Forward-Port-Of: odoo/enterprise#109507 Forward-Port-Of: odoo/enterprise#106127
This update adjusts the salary scale parameters used in the Odoo Enterprise’s Belgian payroll module (l10n_be_hr_payroll). Specifically, the base salary figures for the first year of employment and overall salary scale values have been updated to reflect the latest regulations as of January 1st, 2026. This ensures accurate payroll calculations for Belgian employees.
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 enhances the point-of-sale (POS) system by allowing for easier customization of the ticket screen. The changes enable developers to add specific styling classes to the ticket screen, providing greater flexibility for tailoring the user interface. This improves the system's adaptability to different business needs and branding requirements.
Original PR description
See odoo/enterprise#94390 Forward-Port-Of: odoo/odoo#226447
Resolved issues and error corrections
A test was failing due to a time zone discrepancy in the planning module. The fix corrects a calculation that incorrectly shifted dates based on the server's time zone setting, ensuring consistent test results. This prevents disruptions to 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)` ## 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
This update resolves an issue where filtering by 'Analytic Distribution' in Journal Entries and Purchase Orders was returning incorrect results. The fix ensures that 'is set' and 'is not set' filters work as expected, accurately displaying records with and without an analytic distribution. This improves data accuracy and reporting.
Original PR description
**Problem:** When filtering by "Analytic Distribution" in views, using "is set" or "is not set" filters (or searching for False) returns incorrect results. When the filter is 'set' it returns all…
**Problem:** When filtering by "Analytic Distribution" in views, using "is set" or "is not set" filters (or searching for False) returns incorrect results. When the filter is 'set' it returns all records (even the ones without an analytic distribution) and when the filter is 'not set' it returns no records (even the ones without an analytic distribution). **Steps to reproduce:** 1) Go to Accounting > Journal Entries. 2) Apply a filter for Invoice lines > Distribution Analytic Account. 3) Select "is set" or "is not set". 4) Check records. Issue is also reproduceable on Purchase Orders. **Cause:** The `_search_analytic_distribution` method did not correctly handle the case when the value is [False], so it results in an invalid Query. **Solution:** - We need to handle the case when we have False in the value on it's own. opw-5478688 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251816 Forward-Port-Of: odoo/odoo#247777
A test failure related to invoice data formatting was resolved. The fix ensures the correct invoice data is used in a key export process, preventing potential errors and ensuring consistent invoice generation for Turkish VAT invoices. This improves the reliability of the e-invoice export functionality.
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 resolves a problem preventing the correct generation of CSV reports for Peru-specific accounting. The fix addresses an incompatibility with a recent Python update, ensuring reports are now created without errors. 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 update expands the color field options within the Odoo Gantt editor to include all integer fields from the underlying model. Previously, only fields directly visible in the view could be selected. This change improves the editor's flexibility and allows for more comprehensive visualization of task data.
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 fixes an issue where VIES validation errors caused errors in the system. The team has broadened the exception handling to catch all `zeep` errors, preventing tracebacks and ensuring accurate VAT number checks. This resolves a previous problem impacting OCR invoice updates.
Original PR description
Catch all `zeep` exceptions instead of only `zeep.Fault`. On 14th of February 2026, the VIES service wasn't working properly, they were returning invalid XML in their response. This caused the `check_vies` call to raise a `zeep.XMLSyntaxError` which wasn't caught, causing a traceback every time VIES was used to validate a VAT number. opw-5938723 (OCR couldn't be refreshed on an invoice because it tried to create a partner from its VAT number and it couldn't be checked with VIES). Forward-Port-Of: odoo/odoo#250123 Forward-Port-Of: odoo/odoo#249853
This update ensures the Odoo command-line interface consistently uses the correct data directory, regardless of user configuration. While the preferred method is using the odoorc configuration file, this change enforces the use of the data directory for the odoo-bin module, providing a more reliable setup.
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 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 key 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 technical issue within the mass mailing module that prevented certain elements from being correctly displayed. The change ensures that a key method is interpreted correctly, improving the overall reliability and accuracy of the mass mailing process. This ensures consistent and accurate email campaigns.
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 fixes an issue where duplicate Dimona activities were being created in the payroll system, particularly when updating employee versions. The change ensures that Dimona activities are only created once, streamlining payroll processing and preventing potential data inconsistencies. This improves the reliability of the Belgian payroll calculations.
Original PR description
This pr restores the previous behaviour of the dimona and part-time activities creation when the cron is ran or when a version or employee is updated. The original bug was: create an instance on…
This pr restores the previous behaviour of the dimona and part-time activities creation when the cron is ran or when a version or employee is updated. The original bug was: create an instance on saas-18.4 with l10n_be_hr_payroll settings > company > my company > update infos > country: Belgium employee > new > payroll > contract > start_date: any date (this should create a first dimona activity) settings > technical > automation > scheduled actions > "HR Employee: Update Current Version" > run manually `_trigger_l10n_be_next_activities` in `hr.version` of `l10n_be_hr_payroll` is duplicating Dimona activities on records that already have one. We check if a dimona activity already exists for a given `hr.employee` before creating the new activity. Same is done for dimona declaration of part times. The activity now redirects to the employee form (instead of the version form) and appears in it. [tasks-5134380](https://www.odoo.com/odoo/project/1251/tasks/5134380) Forward-Port-Of: odoo/enterprise#109304 Forward-Port-Of: odoo/enterprise#96423
This update resolves a problem where Odoo couldn't send email templates without a linked record. A recent change in the Odoo codebase caused this to fail. This fix ensures email templates can now be sent correctly, regardless of whether a record is associated with them.
Original PR description
Add explicit support for sending an email template with no actual record, i.e., calling `template.send_mail(False)`. This used to work but now fails since https://github.com/odoo/odoo/pull/227477. task-6000637
A technical issue causing the Activity Logs report to appear incorrectly in the Sign Template list view has been resolved. The fix corrects a misconfiguration in the report's model, ensuring it now displays within the Sign Request view and prevents errors.
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 fixes an issue where the system was incorrectly returning multiple bank records when a company contact had the same account number on multiple child contacts. This ensured accurate bank information is displayed and used within the Odoo system, preventing potential data inconsistencies.
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
A bug was causing the task list to display duplicate 'New' and 'Create New' buttons, leading to confusion and potential duplicate task creations. This fix removes the duplicate buttons by preventing the ProjectTaskTemplateDropdown component from rendering in dialog contexts. This ensures a cleaner and more intuitive task creation experience.
Original PR description
Steps to Reproduce --- 1. Enable Task Dependencies in Project settings 2. Create project with no task templates 3. Open task form -> Blocked By tab -> Add a line 4. Observe duplicate "New" and "Create New" buttons Issue --- - The task list view displays both “New” and “Create New” buttons, resulting in duplicated creation actions. Current Behaviour --- - Two different creation buttons are displayed simultaneously Expected Behaviour --- - Only a single “New” button should be displayed Root cause --- - ControlPanel refactoring removed props.showButtons without adding !env.inDialog check to task views. Fix --- - Add !env.inDialog check , this prevents the ProjectTaskTemplateDropdown component from rendering in dialog contexts, eliminating the duplicate button issue. Related - https://github.com/odoo/odoo/pull/220325 task - 5403917
6 changes
Enhancements to existing features
This update adjusts the salary scale parameters used in Odoo's Belgian payroll (l10n_be_hr_payroll) to reflect changes in Belgian tax regulations as of January 1, 2026. These updated values ensure accurate payroll calculations and compliance with local legislation.
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
Resolved issues and error corrections
This update fixes an issue where WhatsApp messages weren't accurately identifying the main user. The change ensures that the correct partner ID is sent, improving the reliability and accuracy of WhatsApp communication within the Odoo Enterprise system. This ensures users receive messages from the intended contact.
Original PR description
Enterprise counter-part. https://github.com/odoo/odoo/pull/251641
This update expands the color options available in the Gantt editor within web_studio. Previously, only specific fields were selectable for color assignment. Now, all integer fields within the model are accessible, providing 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
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 clarifies the behavior of Helpdesk article searches when using non-root articles as the main article. Previously, searches didn't include descendant articles. Additionally, a minor issue with dropdown display has been addressed to ensure consistent functionality.
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#107438This update fixes a potential data error that could occur when moving folders linked to accounting settings to the trash. The system now prevents these folders from being deleted during a routine data cleanup process, ensuring data integrity and stability. This resolves a technical issue identified through monitoring and testing.
Original PR description
When a workspace(folder) linked to a folder setting is moved to the trash and the ``Base: Auto-vacuum internal data`` cron runs, a traceback will generate. Steps to reproduce the error: - Install…
When a workspace(folder) linked to a folder setting is moved to the trash and the ``Base: Auto-vacuum internal data`` cron runs, a traceback will generate. Steps to reproduce the error: - Install ``documents_account`` module - Go to Documents > Configuration > Files Centralization > Enable Accounting > Select any workspace > Save > - Click on Journals > Create a new > Select any Journal > Create a Workspace A > Save - Go to Documents > Click on Workspace A > Actions > Move to trash - Run the ``Base: Auto-vacuum internal data`` cron Traceback: ```py ForeignKeyViolation: update or delete on table "documents_document" violates foreign key constraint "documents_account_folder_setting_folder_id_fkey" on table "documents_account_folder_setting" ``` solution: override the ``_get_gc_clear_bin_domain`` method to exclude folders linked to folder settings, preventing their deletion during the garbage collection. sentry-7193540869 Forward-Port-Of: odoo/enterprise#109434 Forward-Port-Of: odoo/enterprise#104875
13 changes
Enhancements to existing features
This update simplifies how Odoo creates stock packages during the 'Put in Pack' process. By moving the creation logic into a separate method, it makes customizations easier for users needing to adjust package creation rules. This improves flexibility and maintainability of the stock module.
Original PR description
Move the logic that creates a new 'stock.quant.package' into a dedicated method `stock.picking::_get_put_in_pack_package`. This allows cleaner overrides when custom logic is needed for package creation during the "Put in Pack" process. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249050 Forward-Port-Of: odoo/odoo#247952
This update adjusts the salary scale parameters used in the Odoo Enterprise's Belgian payroll module (l10n_be_hr_payroll). Specifically, the values for January 1st, 2026, have been updated to reflect current salary regulations in Belgium, ensuring accurate payroll calculations. This change maintains compliance with local tax and social security requirements.
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
Resolved issues and error corrections
This update addresses instability in the HTML editor's automated tests. The tests were unreliable due to the toolbar being a popover, making it susceptible to timing issues during runbot execution. The fix involves adjusting timeouts and addressing dependencies to ensure consistent test results.
Original PR description
Forward-Port-Of: odoo/odoo#251122
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. The change also includes a security update to prevent journal entries from appearing in the filter.
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
This update fixes a potential data error that could occur when deleting folders linked to accounting settings. The change prevents a database conflict during the regular cleanup process, ensuring data integrity and stability. This resolves a technical issue identified through monitoring and testing.
Original PR description
When a workspace(folder) linked to a folder setting is moved to the trash and the ``Base: Auto-vacuum internal data`` cron runs, a traceback will generate. Steps to reproduce the error: - Install ``documents_account`` module - Go to Documents > Configuration > Files Centralization > Enable Accounting > Select any workspace > Save > - Click on Journals > Create a new > Select any Journal > Create a Workspace A > Save - Go to Documents > Click on Workspace A > Actions > Move to trash - Run the ``Base: Auto-vacuum internal data`` cron Traceback: ```py ForeignKeyViolation: update or delete on table "documents_document" violates foreign key constraint "documents_account_folder_setting_folder_id_fkey" on table "documents_account_folder_setting" ``` solution: override the ``_get_gc_clear_bin_domain`` method to exclude folders linked to folder settings, preventing their deletion during the garbage collection. sentry-7193540869 Forward-Port-Of: odoo/enterprise#104875
This update resolves a problem where duplicate bank account numbers were sometimes created when managing company contacts, particularly with child contacts. The fix ensures that only one bank record is created per unique account number, preventing data inconsistencies and simplifying bank management.
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
A recent update resolved a validation error that occurred when simultaneously changing a company's fiscal year month and day. This issue was caused by how the system checked constraints, leading to a failure when both the root company and its branches were updated. The fix ensures all changes are applied before validation, preventing the error.
Original PR description
Having a parent company and a chid company selected, and changing both the last day and the last month of the fiscal year as the same time raises a ValidationError. This is because in this case, in the write we successively modify each changed delegated fields from root company to the branches. Then, when checking the constrains we loop through all delegated fields and check if the value of the branches are the same as the root company. This check triggers the error as all values are not set yet. By using a write on branches for all changed delegated fields instead of a simple assignation, the constrains check occurs once all the value have been updated. Steps: - Have a root company and a branch - Select both in company selector - Go to Accounting configuration - Change fiscalyear last month AND ast day at the same time - Save -> ValidationError in `_check_root_delegated_fields` opw-5431145 Forward-Port-Of: odoo/odoo#251941 Forward-Port-Of: odoo/odoo#241413
This update fixes an issue where large company logos in Odoo reports were causing the customer address to overlap. By adding a maximum width constraint to the small company logo, the report layout is now more consistent and readable, ensuring critical information is always visible. This improves the overall presentation of our reports.
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 resolves a visual discrepancy in the Mass Mailing app's card styling, specifically related to rounded corners and background colors when using the 'Stretch to Equal Height' option. The fix ensures that the card's design accurately reflects the preview, improving the user experience for email creation.
Original PR description
**Steps to reproduce:** - Go to mass_mailing app - Add Columns block with multiple content size - Increase Round Corners (e.g. 20 px) - In "Vert. Alignment" field > Select the "Stretch to Equal…
**Steps to reproduce:**
- Go to mass_mailing app
- Add Columns block with multiple content size
- Increase Round Corners (e.g. 20 px)
- In "Vert. Alignment" field > Select the "Stretch to Equal Height" option
- Add color background for the columns
- Save the record and send test mail
- Round corners are not applied
- Background color doesn't expand to the bottom of the body
**Issue:**
Default table style used for the inline conversion of
`await toInline($(editableClone), { $iframe: $(iframe), wysiwyg: this.wysiwyg });` in `mass_mailing_html_field`,
has its 'border-collapse' attribute set to 'collapse' by default in `enforceTablesResponsivity`.
This attribute doesn't work with `border-radius` and the resulting display differs from the preview of the editor.
Relevant links:
https://stackoverflow.com/questions/628301/the-border-radius-property-and-border-collapsecollapse-dont-mix-how-can-i-use https://stackoverflow.com/questions/36035461/what-is-the-difference-between-border-collapse-collapse-and-border-spacing-0
**Fix:**
Use `'border-collapse': 'separate'` and `'border-spacing': 0` but this can
introduce border stacking inside the table element where the original collapse
was needed.
Add back the `overflow` inherited by the card attributes to ensure
inside border are visually properly contained inside the border (but not
sure as to why it was removed 4 years ago).
Also set the height of table sub-elements to `100%` to ensure background
property is properly applied on the whole card body.
opw-5218581
Forward-Port-Of: odoo/odoo#242001This update fixes an issue where SMS reminders weren't being sent for calendar events synced with Google or Microsoft. The system was incorrectly filtering out SMS reminders for these synced events. This change ensures that SMS notifications are consistently delivered for all calendar events, regardless of their sync source.
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
A technical error was causing the Activity Logs report to appear incorrectly within the Sign Template list view, leading to a system error. This update corrects a misconfiguration in the report's model settings, ensuring the report now displays correctly within the Sign Request view and resolves the underlying issue.
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 addresses a change in how Helpdesk articles are searched. Previously, searching from a non-root article would include all descendant articles. Now, searches are limited to the selected article only. Additionally, a minor issue with dropdown functionality has been resolved.
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#107438This update resolves an issue preventing users from sharing content hosted externally (like Google Drive) through the website's share feature. The fix prevents a browser error caused by a security restriction related to accessing content from different web origins. This ensures the share button consistently works for all content types.
Original PR description
Step to reproduce: 1. Install `website_slides` 2. Open any course and add content 3. Select the `Document` type and upload a Google Drive link 4. Save and publish the content 5. Click the "Share" button for this specific content in full screen Issue: - A traceback occurs: `Uncaught Javascript Error > Failed to read a named property 'document' from 'Window': Blocked a frame with origin "http://localhost:3000" from accessing a cross-origin frame.` Cause: - The `_onClickShareSlide` method attempts to calculate the `documentMaxPage` by accessing the internal DOM of the slide's iframe (`iframe.contentWindow.document`). When the content is hosted externally the iframe source is cross-origin. Browsers enforce the Same-Origin Policy. Solution: - Check the origin of the iframe's source URL before attempting to get max page. opw-5422655 Forward-Port-Of: odoo/odoo#250679 Forward-Port-Of: odoo/odoo#241090
1 change
Resolved issues and error corrections
This update fixes a potential data error that could occur when moving folders linked to accounting settings to the trash. The automated system cleaning process was incorrectly attempting to delete these folders, leading to database inconsistencies. This change ensures these folders are excluded from the cleanup process, maintaining data integrity.
Original PR description
When a workspace(folder) linked to a folder setting is moved to the trash and the ``Base: Auto-vacuum internal data`` cron runs, a traceback will generate. Steps to reproduce the error: - Install ``documents_account`` module - Go to Documents > Configuration > Files Centralization > Enable Accounting > Select any workspace > Save > - Click on Journals > Create a new > Select any Journal > Create a Workspace A > Save - Go to Documents > Click on Workspace A > Actions > Move to trash - Run the ``Base: Auto-vacuum internal data`` cron Traceback: ```py ForeignKeyViolation: update or delete on table "documents_document" violates foreign key constraint "documents_account_folder_setting_folder_id_fkey" on table "documents_account_folder_setting" ``` solution: override the ``_get_gc_clear_bin_domain`` method to exclude folders linked to folder settings, preventing their deletion during the garbage collection. sentry-7193540869 Forward-Port-Of: odoo/enterprise#104875
17 changes
New functionality added to Odoo
This update incorporates the Central Bank of Uzbekistan as a source for live currency rates. This change ensures Odoo can accurately reflect the current exchange rates for transactions involving Uzbekistan, complying with local regulations and improving financial reporting. It's a necessary step to support business operations in Uzbekistan.
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
This update adds the ability for helpdesk team administrators to upload an image to their team's profile within the Odoo Enterprise website. This enhancement improves team identification and visual organization within the helpdesk interface, making it easier to manage and recognize different support teams.
Original PR description
Added an image field to the helpdesk team when the web form is selected --- Task-4349012
Enhancements to existing features
This update speeds up testing for the Stock Barcode module by moving company setup steps to a dedicated setup class. This reduces test execution time, particularly when testing related modules like Sale Timesheet, improving overall development efficiency. The change addresses a slow test setup process that was impacting development timelines.
Original PR description
TestBarcodeClientAction [setup is quite slow](https://runbot229.odoo.com/runbot/static/build/102958171-master/tests/profile/profile_2.html#localProfilePath=1), especially because it creates a company. In addition in all classes extending this one, we spend at least 6 minutes on this line. (when testing sale_timesheet -> !stock_barcode_mrp_subcontracting) This commit proposes to move at least the company creation in a setupclass. It would be great to move all the setup in the setupclass but the tests are failling when doing so and could be achieved by a member of the stock_barcode owner team. Tests based on this setup should be a few minutes faster with this change. Forward-Port-Of: odoo/enterprise#109509
Resolved issues and error corrections
This update ensures that product weights sent to the Sendcloud shipping API are always at least 0.001. Previously, weights below this threshold caused errors, preventing shipments from being processed correctly. This change improves the reliability of our shipping integrations with Sendcloud.
Original PR description
The Sendcloud API do not allow parcel details to have a weight value less than 0.00099 . This commit makes sure the products weights are at least 0.001. ref: <img width="1850" height="689" alt="image" src="https://github.com/user-attachments/assets/10242315-3c4d-4670-b77d-8cb429e00891" /> Forward-Port-Of: odoo/enterprise#107676
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 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 across the organization.
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
This update resolves a problem preventing the correct generation of CSV reports for Peruvian accounting modules. The fix addresses an incompatibility with a recent Python update, ensuring reports are created consistently. Removing unnecessary configuration steps improves efficiency and stability.
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 update improves the Gantt editor's functionality by allowing all integer fields within a model to be used for color selection. Previously, only fields directly visible in the editor's view were selectable. This change provides greater flexibility for visualizing project data within the Gantt chart.
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 resolves an issue where approval rules for account moves incorrectly kept list view actions active. The change ensures that when an approval rule is applied to an account move, the associated list view action is automatically deactivated, streamlining the approval process and preventing unintended actions. This improves the reliability of the approval workflow.
Original PR description
Following commit odoo/odoo@c442f72479b50855f40ba079800ee9e5a5690753 When putting an approval rule action_post (account.move) the action bound to the list view must be deactivated. opw-5921128 Forward-Port-Of: odoo/enterprise#106853
This update resolves a technical issue where tests were failing due to how keyboard events were being handled within the Odoo system. The fix ensures that test environments are properly cleaned up, preventing potential memory leaks and improving the stability of the application. This primarily impacts the user experience by ensuring consistent and reliable test results.
Original PR description
Adapt tests failing due to keydown events being applied to the current active element. Community: https://github.com/odoo/odoo/pull/247137 Forward-Port-Of: odoo/enterprise#109386 Forward-Port-Of: odoo/enterprise#107286
The Activity Logs report was incorrectly appearing in the Sign Template list view, causing errors. This update corrects a misconfiguration in the report's model settings, ensuring it now displays correctly within the Sign Request view. This resolves a technical issue that prevented users from accessing the report.
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 test case in the quality control module to reflect a recent change in how stock movements are merged within Odoo. Specifically, the test now accurately reflects the requirement that a new stock movement only merges with an existing one if a 'stock reference' is present. This ensures the quality control process aligns with the latest system functionality.
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#109538 Forward-Port-Of: odoo/enterprise#99342
This update fixes an issue where time formatting was inaccurate, particularly with rounding. It now correctly formats time values in list and graph views, aligning with the standard DateTime widget behavior and allowing for more flexible time display options.
Original PR description
The rounding of time was not correct. I was always flooring, but before the new duration the rounding was depending of the precision of the duration. The rounding has been restored as before and put…
The rounding of time was not correct. I was always flooring, but before the new duration the rounding was depending of the precision of the duration. The rounding has been restored as before and put in formatDuration. formatFloatTime has been modified to use formatDuration and now take the same options (specify the unit of time of the value). The graph view and list view didn't extract the otpions from the fields with widget. Now, they get the options and give them to the formatter. The widget was showing the seconds by default, but it doesn't match with the behavior of the DateTime widget. It has been changed and now the seconds are shown only if the options 'showSeconds' is true and it's false by default. The impacted views has been restored as before the original commit. The options of float_time widget couldn't take falsy values, now it can. an improvment has also been done: the popover on the float_time widget doesn't show up if the input value and the formattedValue are the same. followup of TASK-5347051 Forward-Port-Of: odoo/enterprise#108072
This update fixes a bug where the cash drawer wasn't opening when the cash details popup was accessed in the Italian Point of Sale (POS) system. The issue was resolved by ensuring the cash drawer opening function is called correctly. Now, opening the cash details popup consistently triggers the cash drawer to open, as it should.
Original PR description
When opening the cash details popup the cash drawer should be opened. It was not the case for the Italian fiscal printer. Steps to reproduce: ------------------- * Setup a Italian fiscal printer with cash drawer support * Open PoS * Open the cash details popup > Observation: The cash drawer does not open * Try to close the PoS session * Open the cash details popup > Observation: The cash drawer opens Why the fix: ------------ The cash drawer opening function was simply not called opw-5391094 Forward-Port-Of: odoo/enterprise#109278 Forward-Port-Of: odoo/enterprise#107987
This update fixes an issue in the barcode picking interface where adding multiple extra products triggered a repetitive confirmation dialog. Now, the dialog opens only once and dynamically updates, allowing users to easily select or deselect products before confirming the addition, streamlining the picking process.
Original PR description
When adding extra products in the barcode picking interface, the confirmation dialog did not handle correctly the scan of multiple extra items. Before: Scanning multiple extra products successively opened (mutex + promise) the dialog multiple times. The user had to confirm/cancel each extra product addition one by one. After: The dialog is now only opened once and updated when scanning multiple extra products before confirming. The user can select/deselect the extra products to add before validating. [opw-5193269](https://www.odoo.com/odoo/project/49/tasks/5193269) Forward-Port-Of: odoo/enterprise#108810 Forward-Port-Of: odoo/enterprise#104932
This update ensures that timesheets automatically reflect whether a task or project is billable. Previously, the system didn't correctly associate billable status with the selected project or task within the Timesheet Assistant. This fix ensures accurate billing records for time spent on projects and tasks.
Original PR description
Steps to reproduce: - Open Timesheet Assistant - Add new Timesheet - Choose a project or task so so_line of timesheet become True - is_billable is still False Source of the bug: - compute_is_billable was missing depends decorator task-5956059 Forward-Port-Of: odoo/enterprise#109141 Forward-Port-Of: odoo/enterprise#108295
This update resolves a minor issue within the account reports testing suite. The fix ensures that a specific test tour related to audit trails is correctly executed, improving the reliability of our reporting tests. This ensures consistent and accurate reporting functionality.
13 changes
Enhancements to existing features
This update adjusts the Romanian tax reporting within the Enterprise module to align with recent changes in the Core Enterprise (CE) version. The update removes outdated tax codes and adds new ones, ensuring accurate reporting for Romanian businesses. This ensures compliance and improved financial data accuracy.
Original PR description
Some taxes were no longer needed in CE, so they needed to be removed task-5411745 Forward-Port-Of: odoo/enterprise#109368 Forward-Port-Of: odoo/enterprise#106127
This update streamlines the process of setting up tests for key Odoo modules, specifically related to payroll and timesheet management. By centralizing test setup, the team has improved the efficiency and reliability of our automated testing, leading to faster identification and resolution of potential issues.
Original PR description
Forward-Port-Of: odoo/enterprise#109476 Forward-Port-Of: odoo/enterprise#108739
Resolved issues and error corrections
This update resolves an issue where the Sendcloud shipping API required product weights to be at least 0.00099. This commit ensures that product weights are now at least 0.001, preventing errors and ensuring accurate shipping calculations through the Sendcloud integration. This improves the reliability of shipments processed through Sendcloud.
Original PR description
The Sendcloud API do not allow parcel details to have a weight value less than 0.00099 . This commit makes sure the products weights are at least 0.001. ref: <img width="1850" height="689" alt="image" src="https://github.com/user-attachments/assets/10242315-3c4d-4670-b77d-8cb429e00891" /> Forward-Port-Of: odoo/enterprise#107676
This update fixes an issue where tax reports were generating negative values for carried over tax lines (-81, -82, etc.). This ensures accurate tax reporting and avoids potential discrepancies in financial data. The change was triggered by a bug report and related internal tracking.
Original PR description
When generating the xml for tax report, negative values should not be present in the xml for carried over lines (81, 82, 83, 86, 87, and 88) Steps: - Create a RBILL for today - 1 month, add an invoice line with tax using one of the following tags: -81, -82, -83, -86, -87 or -88 in its base refund repartition line - Open the tax report on the month of the RBILL - Generate the xml, either by the dedicated button, or by creating and posting the closing entry -> there is line(s) for negative amounts opw-5955323 opw-5428395 Forward-Port-Of: odoo/enterprise#109389 Forward-Port-Of: odoo/enterprise#108916
This update resolves an issue where refreshing the tax return report page caused a system error. The fix ensures the report loads smoothly after refreshing, improving the user experience and preventing data disruptions. This enhancement focuses on stability and reliability of a key accounting function.
Original PR description
Previously, refreshing the tax-return reports page could lead to a traceback due to `account.report` being empty when `get_options` was called. This happened especially when switching reports or refreshing the page after selecting a report. Steps to reproduce: 1. Go to Accounting > Tax Returns 2. Click on any tax return 3. Open the report using action_open_report 4. Refresh the page ref: https://drive.google.com/file/d/1z3D7lurg4gyFh7bmCj2PQZ1A-Bg2FvKj/view This commit: - Adds fallback logic in `get_options` to recover the report from previous options or context. - Checks if the report exists before rerouting or processing options. As a result, refreshing the page no longer causes a traceback and the report reloads smoothly.
This update resolves a bug in the AI chat composer that caused crashes when the HTML composer was enabled. The fix ensures focus handling correctly works for both text and HTML composer types, preventing errors and improving stability.
Original PR description
*=ai_app In AI chat, focusing the composer used to call ev.target.select(). That works for the text composer (textarea), but not for the HTML composer (contenteditable), where select() doesn’t exist and causes a TypeError. This update makes focus handling respect the active composer mode: - text mode keeps the existing select behavior - html mode uses the editor focus path instead task-5981018
This update resolves a rare crash in the Gantt view that occurred when users filtered tasks through search options. The fix prevents the renderer from losing track of pills when filters are applied, ensuring the Gantt view remains stable and reliable for users.
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.
This update ensures that WhatsApp messages sent through the Enterprise version of Odoo accurately include the correct user's ID. Previously, the system was sending messages with an incorrect partner ID, which could cause issues with message delivery and user identification. This fix resolves a technical error that has been corrected.
Original PR description
Enterprise counter-part. https://github.com/odoo/odoo/pull/251641 Forward-Port-Of: odoo/enterprise#109364
This update resolves a problem where the Stripe payment integration wasn't working correctly for certain locations (like Mexico). The change to default to EUR caused an error when the currency wasn't active, preventing the Stripe account from loading. This fix ensures Stripe functionality is reliably available for supported regions.
Original PR description
**STEP TO REPRODUCE** On a freshdb with only base module. 1. install hr_expense_stripe. 2. install l10n_mx (or any location that's not EU, US or UK). 3. select one of the mx demo company. 4. try opening the invoicing/accounting app. 5. There will be a traceback when loading the stripe account on the dashboard. **CAUSE** https://github.com/odoo/enterprise/pull/108293 changed the default currency from USD to EUR. But EUR could be unactive when searching for it, leading to to stripe_currency_id being empty. opw-59752385
This update corrects a technical issue that was preventing internal users from accessing AI tools within the Odoo Enterprise platform. The fix involved adjusting access permissions to allow internal users to retrieve the necessary tool information, ensuring seamless functionality for AI-powered features. This resolves a reported error during voice transcript commands.
Original PR description
Steps to reproduce: 1. Open any editor and use /voice transcript command. 2. Start recording, say some words, stop recording. 3. Observe the access error on `tool_ids`. The `tool_ids` field on `ai.topic` is restricted to `base.group_system`, preventing internal users from accessing it. The fix is to use sudo to retrieve the available tools. ticket task-5965009
This update resolves an issue where tax report tags were incorrectly sorted, preventing proper auto-completion functionality. The fix ensures tags are correctly ordered, improving the user experience and accuracy of tax reporting. Improved testing has also been implemented to prevent similar issues in the future.
Original PR description
Commit https://github.com/odoo/odoo/commit/db0d499952192ede0def2a070e103ba67952387c inverted some tags which is wrong Tags must be sorted for the auto complete to work properly Improving tests to catch more errors opw-5415426
This update improves the Gantt editor by allowing all integer fields within a model to be used as color options. Previously, only fields directly visible in the editor's view were selectable. 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
Features or functions removed from Odoo
This update removes outdated, specific French translations (`fr_BE` and `fr_CA`) for the account asset and reports modules. By reverting to the standard `fr` translations, we ensure consistency and simplify future updates, reducing potential maintenance overhead.
Original PR description
The files had just a few overrides that were either incorrect or not needed. We remove the files to rely on the generic `fr` translations. task-5921458
5 changes
Resolved issues and error corrections
This update removes a display field ('Visible Internally Only') from the customer rating form in the Helpdesk module. This field was no longer needed as customer ratings are no longer visible on the website. This change improves the user experience and simplifies the Helpdesk interface.
Original PR description
**Steps to reproduce:** - Open a Helpdesk ticket with a customer rating. - View the rating form. - Observe the field ‘Visible Internally Only’ still showing. **Issue:** - The field is displayed even though ratings are no longer shown on the website. **Reason:** - The field is now irrelevant but still present in the view. **Fix:** - Invisible the ‘Visible Internally Only’ field from the customer rating form in the affected version. **Task id - 5359052** Forward-Port-Of: odoo/enterprise#100686
This update resolves an issue where users would encounter an error when opening a POS configuration after deleting the 'Tyro Surcharge' product. The fix prevents the system from attempting to access a deleted product, ensuring smoother POS operations. This improves the user experience and prevents unexpected errors.
Original PR description
This error occurs when the user deletes the `Tyro Surcharge` product and then attempts to open any POS configuration. Steps to reproduce: --- - Install `pos_tyro` module(without demo) - POS > Products > Delete `Tyro Surcharge` - Load `Clothes` > `Open Register` Traceback: --- `ValueError: No record found for unique ID pos_tyro.product_product_tyro_surcharge. It may have been deleted.` At [1], when we try to access the `product_product_tyro_surcharge` product, we encounter an error because the product has been deleted. [1]- https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/pos_tyro/models/pos_config.py#L9-L10 sentry-7059172832
This update fixes an issue where the system was incorrectly returning multiple bank records when a company contact had the same account number listed on multiple child contacts. This ensured accurate bank account management and prevented potential data inconsistencies.
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 resolves an issue where Field Service users couldn't add customers to tasks, resulting in an access error. The fix uses a secure method (sudo) to update partner records during task creation, allowing users to correctly assign customers without restricted access limitations.
Original PR description
Steps to Reproduce: - 1. Log in with a user having only "Field Service > User" access. 2. Create a new task in an field service project. 3. Add a customer on the task. 4. Access error is raised. Issue: - - Field service users could not create a task with a customer. - An access error appeared during task creation. Cause: - - When a customer was added to the task, the partner_phone inverse method was triggered. - This method attempted to write on the partner record. Solution: - - Used sudo() in the inverse method to update the partner phone securely, bypassing restricted access. task-5039657
During migration, the `l10n_pl` end-migrate script was loading for every company using the `pl` chart template, including child companies. However, account codes must be [unique](https://github.com/odoo/odoo/blob/18.0/addons/account/models/account_account.py#L1033) across parent and child companies. Since the chart is already loaded for the root company, reloading it for child companies cause duplicate account code errors during migration. To prevent this, restrict chart loading to root
Original PR description
During migration, the `l10n_pl` end-migrate script was loading for every company using the `pl` chart template, including child companies. However, account codes must be…
During migration, the `l10n_pl` end-migrate script was loading
for every company using the `pl` chart template, including child companies.
However, account codes must be [unique](https://github.com/odoo/odoo/blob/18.0/addons/account/models/account_account.py#L1033) across parent and child companies.
Since the chart is already loaded for the root company, reloading it for child companies cause duplicate account code errors during migration.
To prevent this, restrict chart loading to root companies only, which is consistent with how account code uniqueness is enforced.
**Steps to reproduce:**
1. Create a database in 17.0
2. Install `account_accountant` and `l10n_pl`
3. Create a child (branch) for the company using the `pl` chart template
4. Migrate the database to 18.0
5. Migration fails with duplicate account code validation errors
**Traceback**
```py
Traceback (most recent call last):
File "/home/odoo/odoo18/community/odoo/service/server.py", line 1366, in preload_registries
registry = Registry.new(dbname, update_module=update_module)
File "<decorator-gen-13>", line 2, in new
File "/home/odoo/odoo18/community/odoo/tools/func.py", line 97, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/odoo18/community/odoo/modules/registry.py", line 129, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/home/odoo/odoo18/community/odoo/modules/loading.py", line 523, in load_modules
migrations.migrate_module(package, 'end')
File "/home/odoo/odoo18/community/odoo/modules/migration.py", line 222, in migrate_module
exec_script(self.cr, installed_version, pyfile, pkg.name, stage, stageformat[stage] % version)
File "/home/odoo/odoo18/community/odoo/modules/migration.py", line 259, in exec_script
mod.migrate(cr, installed_version)
File "/home/odoo/odoo18/community/addons/l10n_pl/migrations/2.1/end-migrate.py", line 8, in migrate
Template._load_data({'account.account': Template._get_account_account('pl')})
File "/home/odoo/odoo18/upgrade/migrations/account/0.0.0/pre-ensure-deferred-accounts.py", line 36, in _load_data
return super()._load_data(data, *args, **kwargs)
File "/home/odoo/odoo18/community/addons/account/models/chart_template.py", line 677, in _load_data
created_records[model] = self.with_context(lang='en_US').env[model]._load_records(all_records_vals, ignore_duplicates=ignore_duplicates)
File "/home/odoo/odoo18/community/odoo/models.py", line 5531, in _load_records
records = self._load_records_create([data['values'] for data in to_create])
File "/home/odoo/odoo18/community/odoo/models.py", line 5435, in _load_records_create
records = self.create(vals_list)
File "<decorator-gen-196>", line 2, in create
File "/home/odoo/odoo18/community/odoo/api.py", line 498, in _model_create_multi
return create(self, arg)
File "/home/odoo/odoo18/community/addons/account/models/account_account.py", line 987, in create
records._ensure_code_is_unique()
File "/home/odoo/odoo18/community/addons/account/models/account_account.py", line 1064, in _ensure_code_is_unique
raise ValidationError(
odoo.exceptions.ValidationError: Account codes must be unique. You can't create accounts with these duplicate codes: 01.000.100, 01.000.200, 01.000.400, 01.000.900, 02.000.100, 02.000.200, 02.000.300, 02.000.900, 03.000.100, 03.000.200, 03.000.300, 03.000.400, 03.000.500, 03.000.600, 03.000.700, 03.000.800, 03.000.900, 03.050.100, 03.050.200, 03.050.300, 03.050.900, 07.010.200, 07.010.300, 07.010.400, 07.010.500, 07.010.600, 07.020.100, 07.020.200, 07.020.300, 07.030.100, 07.030.200, 08.000.100, 08.000.200, 08.000.300, 08.000.400, 08.000.500, 10.000.100, 10.000.200, 10.000.900, 13.000.100, 13.000.200, 13.000.900, 14.000.100, 14.000.200, 14.000.900, 14.050.100, 20.000.100, 20.000.200, 20.000.300, 21.000.100, 22.000.100, 22.010.100, 22.010.200, 22.010.300, 22.020.100, 22.020.200, 22.020.300, 22.030.100, 22.030.200, 22.030.300, 22.030.400, 22.030.500, 22.030.600, 23.000.100, 23.000.200, 23.000.900, 24.010.100, 24.010.200, 24.020.100, 24.020.200, 24.030.100, 24.030.200, 24.030.300, 24.030.400, 24.050.100, 24.090.100, 24.090.200, 24.090.300, 24.090.900, 28.000.100, 29.000.100, 29.010.100, 29.020.100, 30.000.100, 30.000.200, 30.000.300, 30.000.400, 30.000.500, 30.000.600, 30.000.700, 30.000.800, 30.000.900, 31.010.100, 31.060.100, 31.090.100, 33.000.100, 33.000.200, 33.000.300, 33.000.400, 33.000.500, 33.000.600, 34.010.100, 34.020.100, 34.020.200, 34.020.300, 34.020.400, 34.060.100, 34.070.100, 39.000.100, 40.000.100, 40.010.100, 40.010.200, 40.010.300, 40.010.400, 40.010.900, 40.020.100, 40.020.200, 40.020.300, 40.020.400, 40.020.500, 40.020.600, 40.020.700, 40.020.900, 40.030.100, 40.030.200, 40.030.300, 40.030.400, 40.030.500, 40.030.600, 40.030.700, 40.030.800, 40.030.900, 40.040.100, 40.040.200, 40.050.100, 40.050.200, 40.050.300, 40.050.900, 40.090.100, 49.000.100, 49.000.200, 49.000.300, 49.000.400, 50.000.100, 50.000.200, 50.010.100, 50.010.200, 52.010.100, 52.070.100, 53.000.100, 53.000.200, 55.000.100, 55.000.200, 58.000.100, 60.000.100, 60.010.100, 60.020.100, 62.000.100, 62.010.100, 64.000.100, 64.010.100, 65.000.100, 65.010.100, 70.000.100, 70.000.200, 70.000.300, 70.000.400, 70.010.100, 70.010.200, 70.010.300, 70.010.400, 73.000.100, 73.000.200, 73.000.300, 73.000.400, 73.010.100, 73.010.200, 73.010.300, 73.010.400, 74.000.100, 74.000.200, 74.000.300, 74.010.100, 74.010.200, 74.010.300, 75.000.100, 75.000.200, 75.000.300, 75.000.400, 75.000.500, 75.000.600, 75.000.700, 75.000.900, 75.010.100, 75.010.200, 75.010.300, 75.010.400, 75.010.500, 75.010.900, 76.000.100, 76.000.200, 76.000.300, 76.000.400, 76.000.900, 76.010.100, 76.010.200, 76.010.300, 76.010.900, 79.000.100, 79.000.200, 79.000.300, 79.000.400, 79.000.500, 80.000.100, 80.000.200, 80.000.300, 80.000.400, 81.010.100, 81.020.100, 81.030.100, 81.040.100, 82.000.100, 83.000.100, 83.000.200, 83.010.000, 83.010.100, 83.010.200, 84.010.000, 84.020.100, 84.020.200, 85.010.100, 85.020.100, 85.020.200, 85.020.300, 86.000.100, 87.000.100, 87.000.900
```
**Fix:**
- Load `account.account` records only for root companies during When the chart template loads for `pl` localization.
opw-5932421
upg-3895331
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-pr2 changes
Resolved issues and error corrections
This update corrects a reporting issue where services were incorrectly included in the EC Sales List report for Northern Ireland transactions. The change aligns with specific government regulations regarding international sales data, ensuring accurate VAT reporting and compliance. This fix addresses a discrepancy identified by regulatory requirements.
Original PR description
# How to reproduce - Set your accounting localization to a country in the EU - Activate the account_intrastat module - Create a Sales Order for a Northern Ireland customer - Add a service and a good to the SO - Confirm the SO - Create an Invoice and confirm it - Go to the EC Sales List report # The problem The service is incuded in the report but it should not according to : https://www.gov.ie/en/department-of-foreign-affairs/publications/protocol-on-irelandnorthern-ireland/ https://finance.belgium.be/en/enterprises/vat/international/brexit/special-status-northern-ireland#q2 opw-5929905
This update clarifies the chatbot's message when a conversation ends, changing from 'Conversation ended...' to 'Conversation has ended.' This change removes potential confusion caused by ellipses, ensuring a clearer and more professional user experience for our customers.
Original PR description
This commit updates the chatbot completion message from 'Conversation ended...' to 'Conversation has ended.' The previous version used ellipses, which typically suggest an incomplete thought. Since the message is meant to clearly indicate that the conversation has concluded, the ellipses were unnecessary and potentially confusing.