Daily updates from Odoo
Saturday, March 21, 2026
24 changes · master
Resolved issues and error corrections
This update resolves a performance issue in the Followup Report, which was significantly slower in version 19.1 compared to 19.0. By simplifying the filtering process, this change optimizes report loading times, preventing potential cron job timeouts and improving overall system responsiveness.
Original PR description
To reproduce the issue, on a large db: - Open the form view of a res.partner - Click on the "Due" smart button, to open the Followup Report ==> The opening of the report takes much longer in 19.1…
To reproduce the issue, on a large db: - Open the form view of a res.partner - Click on the "Due" smart button, to open the Followup Report ==> The opening of the report takes much longer in 19.1 than it used to in 19.0. This is a problem when processing the followup with the cron, as it can cause it to time out. This situation happens because we now use a subquery computing the partner from the account.partial.reconcile objects linked the the move lines (because the Partner Ledger needs to consider move lines made without any partner as well). in 19.0, a domain on the partner_id field was directly executed, taking hence advantage of the index existing for that field. While this makes sense for the Partner Ledger, it's not relevant for the Followup Report. Indeed, in that report, when filtering on a single partner, we only want to show the open invoices and unreconciled payments made for that partner, so we'll never need to consider the lines without partner. We can therefore use the standard domain on partner_id in that case, like before, solving the perf issue in the meantime. Forward-Port-Of: odoo/enterprise#110966
This update fixes a performance issue with the budget report, ensuring it runs efficiently when the account_budget_purchase module is active. Previously, a change introduced a bug that caused slow report generation. This fix restores the optimized performance previously achieved in another module.
Original PR description
The performance optimization introduced in account_budget (see PR #99096) pushes the budget_line_ids filter down to the underlying SQL queries of budget.report to avoid building the full UNION result before applying the filter. account_budget_purchase fully overrides budget.report._compute_all() and its table_query, thereby bypassing the optimized implementation introduced in PR #99096. As a result, the budget_line_ids filter was not pushed down to the SQL level, causing large UNION queries to be executed without filtering and leading to degraded performance. Apply the same optimization in this module to restore the expected performance improvement when account_budget_purchase is installed. | Scenario | Execution Time | | :--- | :--- | | **Before this Commit** | **passed virtual time limit** | **After this Commit** | **1.25 seconds** opw-5930127 Forward-Port-Of: odoo/enterprise#110859 Forward-Port-Of: odoo/enterprise#109322
This update clarifies error messages when payments are declined due to country restrictions. Previously, the message was generic ("Country not allowed"). Now, the system uses the actual vendor location to provide a more relevant and helpful error message, improving the user experience for international payments.
Original PR description
A company in belgium creates a card, it's "allowed countries" is set to Belgium by default. If said card is used to pay online on a website ending with .be, it is understandable that the user believes the vendor to be located in Belgium If it is not the case (the vendor is actually in Luxembourg), the payment is refused but the message on the refused expense is unclear "Country not allowed" The change adds the data received to make the decision in the error message task: 5478443 Forward-Port-Of: odoo/enterprise#110613 Forward-Port-Of: odoo/enterprise#103974
This update resolves a validation error with ARCA (the Argentinian tax authority) that prevented invoices from 'Final Consumers' without VAT/CUIT numbers from being processed correctly. The system now automatically handles these transactions, sending a valid 'null' value to ARCA, ensuring invoices are successfully validated and submitted.
Original PR description
**Description of the issue/feature this PR addresses:** This PR fixes a validation error (Code 10015) returned by ARCA (formerly AFIP) when attempting to validate invoices for "Final Consumers"…
**Description of the issue/feature this PR addresses:** This PR fixes a validation error (Code 10015) returned by ARCA (formerly AFIP) when attempting to validate invoices for "Final Consumers" (Consumidor Final) who do not have a VAT/CUIT number assigned. The system currently defaults the DocNro field to 0, which is rejected by the fiscal authority's web service. **Current behavior before PR:** When a contact is marked as "Final Consumer" but lacks a specific ID number (VAT/CUIT), the integration sends DocNro: 0 to ARCA. This triggers Error 10015, as "0" is not considered a valid identification number for this responsibility type, leading to a blocked invoice. **Desired behavior after PR is merged:** For contacts meeting these conditions (Final Consumer without a defined ID), the system will now automatically categorize the transaction as "sigd" (System Identified/Global Data) instead of a standard Final Consumer. By doing this, the DocNro is sent as None (or null), which is the legally accepted format by ARCA for these specific cases, successfully bypassing the validation error. Forward-Port-Of: odoo/enterprise#106881
This update corrects a recent change that disabled a key feature – the display of seconds – in MRP modules. To ensure accurate time tracking within MRP processes, this setting has been re-enabled. This ensures MRP modules accurately reflect time-based activities.
Original PR description
Previously, showSeconds was True by default. It has now been set to False by default so we need to enable it for MRP modules. Forward-Port-Of: odoo/enterprise#111269
This update fixes an issue where the Spanish balance sheet incorrectly excluded certain retained earnings, leading to inaccurate equity calculations. The change ensures all relevant equity accounts are included, guaranteeing consistent and reliable equity totals for Spanish businesses. This improves the accuracy of financial reporting.
Original PR description
Description of the issue this commit addresses: The ES balance sheet “prior periods” line only matched code 12, so retained/unaffected earnings posted on other codes were skipped, which could understate or skew equity totals. --- Desired behavior after this commit is merged: The line now includes both accounts with code 12% and accounts of type equity_unaffected, so carried-forward results are always included and equity totals stay consistent. --- task-6047627 Forward-Port-Of: odoo/enterprise#111249
This update resolves an error that occurred when creating payments for invoices using the Bacs Direct Debit method. The issue was triggered when a user removed the bank account number from the relevant journal. Now, the system correctly prevents the payment creation and displays a clear error message, ensuring accurate invoice payment processing.
Original PR description
Currently, an error occurs when user creates a payment for an invoice. **Steps to Reproduce:** - Install `l10n_uk_bacs` with demo data. - Switch to the `UK company`. - Go to `Journals`, select the…
Currently, an error occurs when user creates a payment for an invoice. **Steps to Reproduce:** - Install `l10n_uk_bacs` with demo data. - Switch to the `UK company`. - Go to `Journals`, select the `Bank Journal`, and remove the `Bank Account Number`. - Go to `Invoices` and create an invoice by adding an `invoice line` with price greater than zero. - `Confirm` the invoice. - Click `Pay`, select `Bacs Direct Debit` as the payment method, and click `Create Payment`. `ValueError: Expected singleton: res.partner.bank()` This error occurs when creating a payment for an invoice using the Bacs Direct Debit payment method. The constraint check bacs bank account trigger [1], but since the journal has no bank account number, it raises an error here [2]. Similar error also occurs when validating a batch payment [3]. This commit ensures that if the journal has no bank account, or if the bank account is invalid, the system raises the same validation error. In batch mode, it raises a UserError when the account is missing. [1]: https://github.com/odoo/enterprise/blob/8405155aa94b4f26efb202cbf815e874375a7f49/l10n_uk_bacs/models/account_payment.py#L52-L58 [2]: https://github.com/odoo/enterprise/blob/8405155aa94b4f26efb202cbf815e874375a7f49/l10n_uk_bacs/models/res_partner_bank.py#L18-L19 [3]: https://github.com/odoo/enterprise/blob/8405155aa94b4f26efb202cbf815e874375a7f49/l10n_uk_bacs/models/account_batch_payment.py#L74 sentry-7259107152 Forward-Port-Of: odoo/enterprise#107235
This update resolves a problem where the company logo was appearing too large on various financial reports. The fix targeted a generic CSS selector that was affecting multiple reports, ensuring consistent logo sizing across the enterprise platform. This improves the visual presentation of key financial documents.
Original PR description
This selector is generic and is impacting all the reports in `report_templates.xml` which are making use of the same class name. task-5951770 Community PR: https://github.com/odoo/odoo/pull/249432 Forward-Port-Of: odoo/enterprise#110858
This update fixes a previous issue where the tax returns journal wasn't automatically translated into all supported languages. The team has now implemented a standard translation process, ensuring the journal is correctly translated for all users and languages, improving accuracy and usability.
Original PR description
Currently, the tax returns journal is created in the code and not via the standard `@template` function that makes sure it is always translated in the installed languages. So for now it was only translated in language of the current user. We refactored the code so the journal gets created via the standard `@template` function and thus automatically gets translated into all the installed languages. task-5921458 Forward-Port-Of: odoo/enterprise#111261 Forward-Port-Of: odoo/enterprise#107465
This update resolves issues related to processing physical cards through Stripe, specifically for UK users. It includes fixes for missing ETA information and incorrect shipping status handling, ensuring accurate expense tracking and preventing errors during card creation. Additionally, improved logging has been added to aid in debugging test failures.
Original PR description
Forward-Port-Of: odoo/enterprise#110880 Forward-Port-Of: odoo/enterprise#110263
This update fixes an issue in the GSTR report testing process. Previously, the tests were incorrectly deleting tax amounts. Now, the system removes taxes from the account move line, ensuring more accurate report calculations and compliance. This change improves the reliability of the GSTR reports.
Original PR description
Before this PR: - A test case was deleting taxes. After this PR: - Removed the taxes from the account move line instead of deleting the taxes. Related PR: https://github.com/odoo/odoo/pull/245243 task-5472834 Forward-Port-Of: odoo/enterprise#111384 Forward-Port-Of: odoo/enterprise#105174
This update streamlines the new user sign-up experience by removing unnecessary steps in the automated tour. This improves the onboarding process, making it faster and more intuitive for new customers to get started with Odoo Enterprise. The change is a simple fix to enhance user experience.
Original PR description
runbot-238363 Forward-Port-Of: odoo/enterprise#110843
This update corrects a minor issue where ticket buttons in the Helpdesk email templates were incorrectly identified as links. The change ensures buttons are properly recognized and function as intended within the editor, improving the user experience when editing ticket messages. This resolves a visual inconsistency and ensures buttons work as expected.
Original PR description
Without the `btn` class, buttons are identified as links by the editor. This commit adjusts the buttons inside the mail templates so that they are properly handled by the editor. Steps to reproduce: - Have demo data - Turn on developer mode - Go to Helpdesk > Customer Care - Open ticket "Where can I download a catalog?" - In the debug menu, go to Messages - Open the first template - Click on the "View Ticket" button - Edit the link => The link popover recognized it as a link instead of a button. As of saas-18.2, the style is replaced by a plain link style when changing the URL. task-5948539 Forward-Port-Of: odoo/enterprise#111215 Forward-Port-Of: odoo/enterprise#107888
This update corrects a technical issue in the Peruvian tax implementation (l10n_pe_edi) that resulted in incorrect tax calculations for Tiered Sales Tax (ISC). The original refactor removed a key element needed for accurate tax generation, and this PR restores it to ensure proper tax reporting for Peruvian businesses.
Original PR description
In [^1] the PE implementation for XML generation was rewritten to use the new dict_to_xml design rather than a large QWeb view. In that refactor the `TierRange` key on `TaxCategory` was lost. This PR re-introduces it. task-6046603 [^1]: odoo/enterprise#87598 Forward-Port-Of: odoo/enterprise#111061
This update corrects a technical issue where archived partners were incorrectly identified during bank statement retrieval, leading to inaccurate partner assignments. Now, the system only considers active partners when searching for bank statements, ensuring data accuracy and preventing potential errors in financial reporting. This improves the reliability of our accounting processes.
Original PR description
Description of the issue this commit addresses: Partner auto-detection on statement lines could match archived partners via SQL causing unexpected partner_id assignment. Desired behavior after this commit is merged: Partner retrieval from bank account, partner name, and previous statement lines only considers active partners, preventing archived matches. runbot-238918 Forward-Port-Of: odoo/enterprise#111259 Forward-Port-Of: odoo/enterprise#110446
This update removes outdated code related to a previous worksheet feature. The removal of a redundant context key ensures the system runs more efficiently and reliably. This change improves the overall performance of the web studio interface.
Original PR description
Since the worksheet rework, the context key `worksheet_no_generation` that used to skip the model generation has now become useless. This commit removes last lines of code using it. *https://github.com/odoo/enterprise/commit/49a84d3ffea49cf8f7fea904e7082b101158bbe9 Forward-Port-Of: odoo/enterprise#110339
This update addresses a technical issue that caused tracebacks in the timesheet assistant when a user didn't have an assigned employee within the company. The fix ensures the assistant functions correctly for all users, preventing errors and improving the user experience. This resolves a minor instability.
Original PR description
This PR fixes two tracebacks when the current user has no employee in the current company and tries to open either the timesheets assistant or systray Task-6041462 Forward-Port-Of: odoo/enterprise#110815
This update resolves an error that occurred when setting tax return periods for Dutch companies in the Odoo Enterprise system. The issue stemmed from a misconfiguration during a recent update, and this fix restores the correct function call to ensure accurate tax return period setup. This prevents a crash when users try to configure these periods.
Original PR description
Currently, an error occurs when configuring tax return periods for a Netherlands company. - This PR [97615](https://github.com/odoo/enterprise/pull/97615) introduced the…
Currently, an error occurs when configuring tax return periods for a Netherlands company. - This PR [97615](https://github.com/odoo/enterprise/pull/97615) introduced the `_get_tax_tags_for_nl_sales_report()` function - In the 19.1 fw port, the implementation is different. This function is neither added nor called. Instead, `_get_ec_sales_tax_tags()` is called in its place. - In the 19.2 fw the function is still missing, but it is called, so it does `Traceback` `AttributeError: 'l10n_nl_reports.ec.sales.report.handler' object has no attribute '_get_tax_tags_for_nl_sales_report'` We fix this by using `_get_ec_sales_tax_tags()` in `19.2`, just as `v19.1` does. **Steps to reproduce:** - Install `l10n_nl_reports` and `accountant` modules - Set up an `NL company`. - Go to `Accounting > Tax Returns > Set Periods`. - Set the date - Click `Apply` Tickets links: [6035534](https://www.odoo.com/odoo/project.task/6035534), [6045553](https://www.odoo.com/odoo/project.task/6045553), [6045241](https://www.odoo.com/odoo/project.task/6045241), [6037249](https://www.odoo.com/odoo/project.task/6037249) opw-6035534 opw-6045553 opw-6045241 opw-6037249 Forward-Port-Of: odoo/enterprise#110820
This update resolves a technical issue within the l10n_co_edi_pos module related to how a template was being constructed. The fix ensures proper formatting of POS receipts, preventing potential display problems. This change improves the reliability of the receipt generation process.
Original PR description
`class` cannot be set on the `t` element. Moving to the `div`. runbot-242041 runbot-242042 Forward-Port-Of: odoo/enterprise#111450
This update fixes a technical error that prevented users from saving planning slot forms when attempting to add resources. The issue stemmed from attempting to access records that had already been deleted. This change ensures smoother operation and prevents data saving failures in specific scenarios.
Original PR description
This error occurs upon saving a `planning.slot` form view. Steps to reproduce: - Install `planning_field_service` module - Settings > Technical > Discuss > `Subtypes` - Delete `Field Service Resources Changed` & `Field Service Status Changed` - Planning > New(open form view) > Add `Resources` and Save Traceback: `ValueError: External ID not found in the system: planning_field_service.mt_intervention_resources_changed` The error occurs because, in the `_track_subtype` [method], we attempt to retrieve a reference to records that have already been deleted. [method]: https://github.com/odoo/enterprise/blob/7e1a72d75ca672ea3660cc236f93571a441bb734/planning_field_service/models/planning_slot.py#L145-L150 sentry-7338382431 Forward-Port-Of: odoo/enterprise#110824
This update corrects a technical error in the Planning module's role search filter. Previously, the filter incorrectly used string IDs, causing issues with selecting roles. This fix ensures the filter uses correct integer IDs, improving the reliability of role selection within the Gantt view.
Original PR description
Steps to reproduce: ------------------------------------------ 1. Install Planning module 2. Click on any shift in Gantt view > Edit 3. In the Resource field, click on Search More to open the…
Steps to reproduce: ------------------------------------------ 1. Install Planning module 2. Click on any shift in Gantt view > Edit 3. In the Resource field, click on Search More to open the selection dialog 4. In the pop-up window, observe that a default filter is already applied 5. Click on the Roles filter in the search panel Observation: ------------------------------------------ The filter on the Roles field applies an 'Invalid Record ID' in the domain Issue: ------------------------------------------ the default filter on `role_ids` passes the role ID as a string (e.g., 4) instead of an integer (4). This happens because the `filter_domain` uses `[self]`, and `self` is substituted with `label.trim()` in `_getFieldDomain`, which is always a string even when the underlying value is a numeric ID https://github.com/odoo/odoo/blob/accaa246d5818572996660f967624978e906b5c3/addons/web/static/src/search/search_model.js#L1747-L1750 Solution: ------------------------------------------ Replace `[self]` with `[raw_value]` in the `filter_domain` of the `role_ids` search field, the `raw_value` variable holds the actual typed value (integer ID) instead of the string label. opw-6003611 Forward-Port-Of: odoo/enterprise#109781
This update significantly speeds up the process of expanding project tasks to include related users. Previously, a slow search query was triggered repeatedly, impacting performance with a large number of tasks. The change now uses a more efficient search method, resulting in a 10x performance improvement.
Original PR description
Before this commit, expanding the `user_ids` involved fetching all the tasks satisfying a domain by a search call and returning only the active users by accessing the field `user_ids` from the fetched recordset of tasks. This approach introduced slowness with a big number of `project.task` since for each batch of **1000** records, a `__get__` call on the field will trigger an `SQL` query. I have updated the code to have the inverse field `task_ids` in the `res.users` model and did the search, the other way around searching directly the `res.users` model. | Tasks | Before | After | | :--- | :--- | :--- | | 300K | 30s | 1.4s | opw-5942477 Forward-Port-Of: odoo/enterprise#110641
This update resolves issues where the timesheet timer wasn't accurately tracking attendance and changes weren't consistently saving to all timesheets. Specifically, it now correctly pauses the timer when checked out and ensures all timesheet edits are saved regardless of whether they're new or existing records, leading to more reliable timesheet data.
Original PR description
This PR fixes two bugs in the timesheets systray: - The timer does not take into account the moments when you are checked out on attendance - When closing the systray without saving, changes are only saved for a new timesheet, not on existing ones Task-6042077 Forward-Port-Of: odoo/enterprise#111096
This update simplifies the softphone's user interface by removing complex z-index management, resolving stacking issues that caused disruptions with modals and calls. It ensures the softphone consistently appears as an overlay, improving usability and stability without impacting core functionality.
Original PR description
Before this commit, the `Softphone` component was instantiated as part of the `SoftphoneContainer`, main component of the backend. After this commit, the `SoftphoneContainer` now renders nothing and…
Before this commit, the `Softphone` component was instantiated as part of the `SoftphoneContainer`, main component of the backend. After this commit, the `SoftphoneContainer` now renders nothing and manages the `Softphone` component by showing it, or not, as an *overlay*. This comes with several functional and technical advantages / fixes. TECHNICAL: The z-index of the main softphone component changed multiple times over the years. Commit [1] forced the softphone on top of all modals always, commit [2] changed it to be below of all modals always without any kind of explanation, big refactorings at [3] and [4] kept kinda the same "below all modals" behavior, then finally commit [5] recently made it more complex by forcing the softphone on top of modals during calls and, to keep things working, it forced all "voip dropdowns" on top of *everything* at all times... all of that messing with z-indexes which is basically never a good idea. The result is that it was now needed to identify "voip dropdowns" with a specific "o-voip-dropdown" class, which is a source of mistake and complexity especially when using standard components that could open standard dropdowns themselves. With this commit: no more extra classes and no more messing with z-indexes at all. FUNCTIONAL: A) Stacking bug Messing with z-index as explained above led to wrong stacking order: - Open the softphone - Open the availability dropdown at the top left (in prod mode) - Open the user preferences modal (in Odoo navbar) (or any other) => Bug: it is between the softphone and its dropdown (this can be seen by moving the modal or being on a smaller screen but also by the fact the dropdown is not faded and can still be interacted with). B) Softphone / Modal / Calls flow As proven by the [1] -> [5] series, there is no good "softphone always at the bottom/top" rule. What is really wanted is the softphone to act as any other overlay in Odoo: when it opens, it is at the top. Then if other things are opened, they also open at the top. The only exception at the moment being "what if I receive a call while I have dialogs that are opened?": simple, this commit closes the softphone and re-opens it so it is now at the top of overlays again, just like if the user asked that overlay to open. Then during the call, if the user wants to open a modal again, it opens above the call to be usable (which [5] "broke"). Then if the user wants to access what is below (the modal or the softphone), just like always, the user must close what is on top (the modal / the softphone). We could also later have a button to "move the softphone on top" just like when receiving a call, that might also be a good idea to not have to close top modal to use the softphone... but in general we just rely on users closing what is in front of them. Recently we also introduced the PiP mode at [6] which minimizes the need of wanting to keep the whole softphone on top. [1]: https://github.com/odoo/enterprise/commit/12b3c8d1cdfda64bbe13528f08c0cb11bcbfb466 [2]: https://github.com/odoo/enterprise/commit/767e9123fe627313c75f8eb2c324ea9d8e6e09f6 [3]: https://github.com/odoo/enterprise/commit/bbdb033031720365c448c6f3de40906ee0c4243e [4]: https://github.com/odoo/enterprise/commit/52b3065993c41c6b7c65dda586a66fdd865b3afd [5]: https://github.com/odoo/enterprise/commit/eb5a1e9b41f5b08821ad5e8a6e6e32d7bad07f46 [6]: https://github.com/odoo/enterprise/commit/2170ada30120f9d60bb039d5b384d5a081c85509 task-6052118