Friday, April 3, 2026
30 changes · master
New functionality added to Odoo
This update introduces a new module for Romania to comply with SAFT (Simplified Accounting File for Taxes) reporting requirements. Specifically, it focuses on generating the 'On Demand' XML file needed to submit inventory valuation data to the Romanian tax authority (ANAF).
Original PR description
Baiscally the SAFT for Romania consists of 3 xml files to submit. This commit focuses on the "On Demand" xml to submit, consisting in the inventory valuation of of the company. File with fields and value to export can be found here: https://www.anaf.ro/anaf/internet/ANAF/despre_anaf/strategii_anaf/proiecte_digitalizare/saf_t/ task-3748978 Forward-Port-Of: odoo/enterprise#95540
Enhancements to existing features
This update adds thorough tests for the timesheet dashboard's sheet selection functionality. These tests ensure that the correct data is consistently loaded, improving the reliability and accuracy of the dashboard for sales teams. This is an important improvement for data integrity.
Original PR description
add tests for the timesheet dashboard sheet selection to ensure that the right sheet is loaded each time --- task-5956339 Forward-Port-Of: odoo/enterprise#109491
Resolved issues and error corrections
This update adjusts the default behavior for sickness relapse calculations. Due to a change in the maximum sickness period to 56 days, the system now automatically prevents relapse unless explicitly checked. This ensures accurate payroll processing based on the new policy.
Original PR description
Because the sickness period is now 56 days, the heuristic has switched to "mostly always a no," so the relapse checkbox is unchecked by default. Task: 6081595 Forward-Port-Of: odoo/enterprise#112507
Features or functions removed from Odoo
This pull request removed a function in the Odoo Enterprise livechat module that performed no useful action. The function simply forwarded arguments to another function, creating unnecessary complexity. This change improves code clarity and efficiency.
Original PR description
This function does nothing excepts forwarding kwargs to `_add_members`. https://github.com/odoo/odoo/pull/257535
Code cleanup and technical improvements
This update simplifies the process for generating payslips within payruns, addressing outdated and complex code. The changes enhance efficiency and maintainability, ensuring accurate and reliable payslip generation across various Odoo modules. This refactoring improves the underlying system without impacting user experience.
Original PR description
generate_payslips in payruns is old and not pretty: - args are only used in tests - logic in it can be simplified task-6023878
This update enhances the way the timesheet assistant is accessed via URLs. The previous 'action-id' format has been replaced with a more descriptive name, improving clarity and potentially simplifying integration with other systems. This change ensures consistent and reliable access to the timesheet assistant.
Original PR description
This commit adds a name for the assistant in the url, replacing the old 'action-id' format. task-6088873
This update improves the French reporting module by replacing fixed URLs with configurable settings. This allows the system to easily adapt to changes in reporting endpoints, enhancing flexibility and consistency across Odoo Enterprise. It ensures reporting remains functional regardless of future endpoint updates.
Original PR description
This commits replaces the hardcoded ASPOne endpoint constants with system parameters, allowing flexibility to switch between different endpoints. No task ID
This update enhances the user experience on smaller screens by replacing standard checkboxes with a dedicated 'boolean_checkbox' widget. This change improves usability for mobile users accessing sale and subscription features, aligning with modern design standards. The update impacts the sale_subscription and website_sale_renting modules.
Original PR description
*: sale_subscription, website_sale_renting task-6079763
This update resolves a bug where the 'Reconcile' button was incorrectly displayed on mobile devices after a bank reconciliation was completed, causing errors. The fix ensures that the button is hidden when a line is fully reconciled, improving the mobile user experience and preventing errors. This change improves the usability of the mobile accounting application.
Original PR description
Currently, when a line is fully reconciled, we display all the moves, name of the reconciliation, and we hide the `Reconcile`, `Set Partner`, ... buttons, has the line is reconciled, we don't need the buttons. But in mobile, we still display the buttons (like `Reconcile`), leading to a traceback when clicking on it. Furthermore, instead of showing the moves name, we show a `[object Object]`. This bug was probably introduced here: https://github.com/odoo/enterprise/pull/101692 task-6058911 Forward-Port-Of: odoo/enterprise#111605
This update resolves a bug where removing an EPD line in the bank rec widget incorrectly removed associated tax lines. Now, only the EPD line and its corresponding tax line are properly removed, ensuring accurate bank reconciliation reporting. This improves data integrity and prevents errors related to tax calculations.
Original PR description
When removing an EPD line in the bank rec widget, if the invoice line added to the statement line contained a tax, the invoice line was removed aswell. Now, only the EPD line and its tax line are removed. no-task Forward-Port-Of: odoo/enterprise#112020 Forward-Port-Of: odoo/enterprise#110514
This update resolves a technical issue in the Odoo Enterprise payroll analytics testing process. The previous test was failing due to relying on non-existent data, which has now been corrected by directly defining the necessary analytic accounts within the test itself. This ensures the tests run reliably and accurately.
Original PR description
The test that was introduced in the following PR (https://github.com/odoo/enterprise/pull/111140), under some circumstances, was causing problems due to some records not being present. Indeed it was bad practice to use records not defined in the test, so we fix it here by defining the analytic accounts and their plan directly in the test instead of searching for them. Runbot Error: 242151 Forward-Port-Of: odoo/enterprise#112134
This update resolves a duplicate shortcut issue within the Assets view in Odoo. Previously, pressing ALT+P triggered a double action. This fix ensures the shortcut functions as intended, improving user experience and efficiency when managing assets.
Original PR description
This PR (https://github.com/odoo/enterprise/pull/109022) fixed the duplicate ALT + P shortcut in the Assets view. A new one was added in 19.2. opw-5948523 Forward-Port-Of: odoo/enterprise#112588
This update resolves an issue where users were incorrectly added as followers of chatter threads, leading to unwanted notifications. The fix ensures the correct user ID is used, preventing this unintended behavior. Additionally, a cron job optimization was implemented to prevent data clearing during processing, ensuring consistent and reliable execution.
Original PR description
The method call that is supposed to subscribe the current user to the closing entry when posting XBLR used the User id as a Contact id. This caused random contacts to be added as followers of the chatter thread and as a result receiving notifications for it. The fix is simply using the id of the User's Contact instead. Also, as discussed with prro on Discord, fixed the cron clearing its dictionary each loop. opw-5886621 Forward-Port-Of: odoo/enterprise#112709 Forward-Port-Of: odoo/enterprise#107843
A bug was causing partner names in approval reports to be cut off when they exceeded a certain length. This update adds a fix to prevent this overflow, ensuring all partner information is displayed correctly in the report. This improves the report's accuracy and usability.
Original PR description
step to reproduce: - install "approval" with demo data - have a partner with name length > 63 - open one of the approvals and change its type to "general approval" - add this partner in contact field - print approval request report Observation: - the partner overflows out of report Fix: - we limit the partner field with `col-9`. For a safe measure i have added `col-9` for `request_owner_id` and `approver_ids` **Before** <img width="1057" height="326" alt="image" src="https://github.com/user-attachments/assets/a8eea789-5cc7-4658-88b5-78751759d043" /> **After** <img width="994" height="330" alt="image" src="https://github.com/user-attachments/assets/bfbc061b-a6e0-4593-a3cc-c85cb81db6e2" /> opw-6005752 Forward-Port-Of: odoo/enterprise#112361 Forward-Port-Of: odoo/enterprise#111130
A bug in a test for creating articles was causing it to fail due to how sequence numbers were calculated, particularly when demo data was enabled. This update dynamically determines the expected sequence number, ensuring consistent test results regardless of demo data presence. This improves test reliability.
Original PR description
In the `test_article_create` test, a new article is created without specifying a parent and sequence number. The test then asserts the sequence number assigned to this article using a constant. When…
In the `test_article_create` test, a new article is created without specifying a parent and sequence number. The test then asserts the sequence number assigned to this article using a constant. When no sequence number is provided, the system automatically assigns one by taking the highest existing sequence among articles with the same parent and incrementing it by 1. When demo data is enabled, additional users are created along with their corresponding onboarding articles. As the onboarding articles does not have any parent, the onboarding article are included in the computation of the sequence number of the new article we create in the test. These extra articles impacts the sequence number of the new article, causing the test assertion to fail. To resolve this, the test computes the expected sequence number dynamically based on the current state of the data. This ensures consistent behavior regardless of whether demo data is present. runbot-error-id~231695 Forward-Port-Of: odoo/enterprise#106326
This update resolves an issue where the billing period wasn't shown for subscription products within product snippets on the website. The fix ensures that subscription product cards accurately display the billing period, matching the display on the main shop page. This improves the user experience and provides clearer product information.
Original PR description
Steps to reproduce: 1) Go to the Website app. 2) Add a product snippet to any page using the editor. 3) See product card of any subscription product. Issue: - The billing period is not displayed for subscription products in the product snippet, unlike on the shop page. Cause: - `temporal_unit_display` is not included in the `combination_info`which is passed in data used by the product snippet. Fix: - Include `temporal_unit_display` in `combination_info`. opw-6070943 Forward-Port-Of: odoo/enterprise#112787 Forward-Port-Of: odoo/enterprise#112171
This update resolves an issue where platform order flow tests would fail when the test environment didn't have active POS printers. The fix prevents a ValueError from occurring and allows the tests to complete successfully, ensuring consistent test results.
Original PR description
When running platform order flow tests, calling `mark_platform_prep_order_as_printed` raises a ValueError because the test environment lacks active POS printers (they are unlinked during setup). This commit patches the method to catch the ValueError and return False, allowing the POS tours to complete successfully without crashing. build_error-241260 Forward-Port-Of: odoo/enterprise#111076
This update resolves issues with inconsistent tour behavior by refining the triggers used to initiate tours. The changes make the tours more reliable and predictable, leading to a smoother user experience. This fix focuses on internal development and testing.
Original PR description
Fix undeterministic tours by making some triggers more precise in a few steps.
This update corrects a display issue in the accounting dashboard where the 'Reconnect Bank' button was incorrectly shown for synchronizations without an expiration date. The change ensures the button only appears when a synchronization has a defined expiration period, improving clarity and usability.
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 is set to 0 by default. The sync can only be expired or expiring soon if there is an expiring date. opw-6052451 Forward-Port-Of: odoo/enterprise#112195
This update resolves an issue that prevented users from clicking the AI icon within the email composer when working with multiple CRM records. The fix corrects a data parsing error that occurred when handling multiple record selections, preventing a 'TypeError' and ensuring the AI feature functions correctly across all record types.
Original PR description
Currently an exception is generated when the user tries to click the AI icon in the email composer with multiple records. Steps to produce an error: - Install the `crm` module with the demo data - Go…
Currently an exception is generated when the user tries to click the AI icon in the email composer with multiple records. Steps to produce an error: - Install the `crm` module with the demo data - Go to the CRM list view and select multiple records - Click in `Email` from action > click the `AI` icon on the email composer. Error: `TypeError: int() argument must be a string, a bytes-like object or a real ...` This error is generated because when retrieving the `originalRecordId` from the line [1], the code attempts to remove the first and last characters of a string representation of a list. In the single-selection case, the value is "[4]", so slicing off `[` and `]` correctly yields "4". However, when the user selects multiple records, the value becomes "[4, 5]". Slicing the first and last characters in this case produces "4, 5", and passing this string to Number() results in NaN. As a result, `record_id` becomes `None` when calling `create_ai_draft_channel` method, and passing this None value to int() subsequently raises an error. This commit fixes the issue by assigning `recordId` and `recordModel` only when a single record exists. The record IDs are parsed from their string representation using `JSON.parse`, and the first ID is returned when the list contains exactly one element, or false otherwise. sentry-7201070069 Forward-Port-Of: odoo/enterprise#112713 Forward-Port-Of: odoo/enterprise#104873
This update resolves an issue where subscription discounts were causing errors during data import from the Sales module. The change modifies a key method to correctly handle subscription discounts, ensuring smooth data flow and preventing potential disruptions to sales processes. This improves data accuracy and reliability.
Original PR description
This is a test for the related community fix and an override of the **isSaleOrderLineNote** method to add the subscription specific **subscription_discount** lines to be treated as a note when importing it from the Sales module. https://github.com/odoo/odoo/pull/247846 opw-5582448 Forward-Port-Of: odoo/enterprise#112326 Forward-Port-Of: odoo/enterprise#107002
This update resolves a bug where rejected orders were causing duplicate kitchen tickets to be printed. The fix prevents a double-triggering of printing processes, ensuring accurate order management. It improves the reliability of the platform's order fulfillment workflow.
Original PR description
Bug fix: - Prevent duplicate kitchen ticket printing on order rejection. When a user rejects an order, the reject RPC triggers a webhook that calls _fetchPlatformOrder on all devices. This led to deleteOrders being called twice (once by the reject flow, once by the webhook). Fix: claim the print token via mark_platform_prep_order_as_printed in _rejectOrder before sending the reject RPC, so no device gets isReadyToPrint=true from the webhook. - Preparation needs to be sent after PoS accepts the order. ticket-6071740 Forward-Port-Of: odoo/enterprise#112277
This update resolves an issue in Odoo's Web Studio where field visibility settings (based on user groups) were not consistently applied. Previously, toggling the 'Show invisible Elements' checkbox didn't always retain the intended invisible state. This fix ensures that field visibility based on user access is accurately reflected within the Web Studio interface.
Original PR description
Steps to reproduce ================== - Install contacts,web_studio - Login as admin - Go to contacts - Open any record - Open studio - Click on any field - Add the "Role / Portal" group - Toggle the…
Steps to reproduce ================== - Install contacts,web_studio - Login as admin - Go to contacts - Open any record - Open studio - Click on any field - Add the "Role / Portal" group - Toggle the "Show invisible Elements" checkbox - Click on the same field => The field is marked as invisible - Add an invisible condition => The invisible condition is lost (but still applied on the view) Cause of the issue ================== In studio, when fetching the view, the invisible attribute is set to True when the user does not have access to the field (when he is not part of the groups). The goal is to make the field invisible in studio unless the "Show invisible Elements" is toggled. But this causes the actual value of the invisible attribute to be lost. Note that this also applies to the column_invisible attribute. Solution ======== If an invisible/column_invisible attribute is present on the nodes with missing access, we copy the actual value to the `actual_invisible` attribute. We then use that value in the editor, when present. opw-6026971 Forward-Port-Of: odoo/enterprise#112084 Forward-Port-Of: odoo/enterprise#111299
This update resolves a technical issue within the Odoo Enterprise spreadsheet module. Specifically, a missing 'this' keyword was identified and corrected. This ensures the module functions correctly and prevents potential errors without impacting the user experience.
Original PR description
This commit adds the missing `this` since a9cef05b2311e6f620cee3fed7cee34b6c6cad79. Task: 5998915
This update removes the automatic assignment of a VoIP provider to new users. Previously, users were linked to the first provider found, which wasn't ideal for systems with multiple providers. This change ensures a more appropriate 'no provider' default, simplifying setup and avoiding potential issues.
Original PR description
Following this Pull Request, users will not be linked to any VoIP provider by default. Prior to this Pull Request, users were linked to the first `voip.provider` record found. The rationale behind this behavior has been forgotten, but it was likely implemented to spare admins with a single provider from having to assign one. However, for databases with more than one provider, "nothing" is usually the relevant default. See also: [task-6023412](https://www.odoo.com/odoo/project.task/6023412) Forward-Port-Of: odoo/enterprise#111758
This update ensures that when identifying callers during incoming calls, the system now only searches for extensions within the same provider as the person receiving the call. Previously, it could incorrectly identify users from other providers, leading to potential confusion. This change improves accuracy and streamlines the call routing process.
Original PR description
## Context When an incoming call is received, the `get_contact_info` method attempts to identify the caller by resolving the phone number. Among other things, this method searches internal users for an extension matching the phone number. ## Problem In a multi-provider context, this search may return users belonging to a different provider than the callee. However, extensions are only meaningful within the context of their own provider. ## After this commit Extension resolution is now limited to the callee's provider.
This update resolves a technical issue causing excessive memory usage in the account reports module. The fix ensures that report preloading stops when the component is destroyed, preventing a memory buildup that could impact performance. This improves the stability and responsiveness of the account reporting feature.
Original PR description
The preloading of sections would never stop, this is an issue since this would prevent the garbage collector from collecting this big class and all it's objects. We fix this by making sure to stop the reploading when the component is destroyed. It's important to do it this way rather than clearing the timeout as the destruction could happened when the report is loading so the timeout would be unset and a new one would be started. Forward-Port-Of: odoo/enterprise#112810 Forward-Port-Of: odoo/enterprise#112628
This update corrects a bug where the Provident Fund benefit was incorrectly displayed in the Salary Configurator even when it was disabled. The change ensures that PF is hidden when disabled, preventing potential errors and improving the accuracy of salary calculations. This resolves a previous crash risk.
Original PR description
Before: - PF toggle disabled in payroll settings, but “Provident Fund” could still appear in Salary Configurator (Extra Benefits). - Hiding PF from displayed values could make `/salary_package/update_salary` crash with missing `l10n_in_pf_employee_amount`. After: - When `l10n_in_provident_fund` is disabled, PF benefit is filtered out from `_get_benefits_values`. - Empty benefit types are removed, so “Extra Benefits” no longer shows if it only contained PF. - PF initial value is dropped from payload values. - Missing PF value is defaulted to `0.0` in `_get_new_version_values`, preventing update/submit errors. task-6008086 Forward-Port-Of: odoo/enterprise#110275
This update corrects a bug where planning slots were incorrectly created for rental orders, even when the 'Plan Services' feature was disabled. The fix ensures that slots are only generated when 'Plan Services' is active, streamlining the planning process and preventing redundant entries. This improves the efficiency of rental order management.
Original PR description
Steps to reproduce: ------------------- 1. Install `sale_renting_planning`. 2. Create a rental service product with: - "Can be Sold" enabled - "Plan Services" disabled - UoM set to "Units" 3. Create and confirm a rental order with this product. 4. Go to Planning and check for slots related to this order. (no slots at this stage) 5. Update the quantity of the rental order. 6. Check Planning again for slots related to this order. Issue: ------ Planning slots are created after updating the quantity of the sale order, even when "Plan Services" is not enabled. Cause: ------ Slot records are created without checking whether "Plan Services" is enabled, which leads to unwanted planning entries. related commit: 74eef70 Solution: --------- Add a condition to ensure planning slots are created only when "Plan Services" is enabled. opw-6051012 Forward-Port-Of: odoo/enterprise#112355 Forward-Port-Of: odoo/enterprise#112278
This update clarifies the description of the `esg.activity.type` model to explicitly state its use within the ESG reporting framework. Previously, the description was identical to the general `activity.type` model, which could cause confusion. This change ensures clarity and proper tracking of ESG-related activities.
Original PR description
Before this commit, the description of `esg.activity.type` model is the same than the `activity.type` one defined model which could be confusing. This commit updates the description of `esg.activity.type` model to set Activity Type ESG to explicitly mention that model is used in ESG. Forward-Port-Of: odoo/enterprise#112680