Thursday, June 18, 2026
31 changes · master
New functionality added to Odoo
This update adds a keyboard shortcut to the Pay Now button within the account payment workflows. This will allow users to initiate payments more quickly and efficiently, streamlining the payment process and reducing the time spent navigating the interface.
Original PR description
Self explanatory. No task ID
Enhancements to existing features
This update simplifies Partner Ledger reports for US and Canada users by removing the unnecessary display of account codes. The 'Show Account' filter is now automatically toggled off for these localizations, ensuring a cleaner report view and reducing visual clutter. This change improves the user experience for our key customers in these regions.
Original PR description
Purpose: US and Canada localizations don't use account codes, so it has no value on the report and creates visual clutter. Thus, a "Show Account" filter for Partner Ledger reports will be added in the Posted Entries dropdown, similar to Aged Payable and Aged Receivable reports. Current Behavior: The account code always appear as a column on partner ledgers for all countries. Expected Behavior: By default, companies in US and Canada will have the "Show Account" filter toggled off. All other countries will have the filter toggled on. task-6128250
This update streamlines how Odoo responds to events within the browser by replacing older listener methods with a more modern approach. Specifically, it enhances the responsiveness of key modules like Documents, Knowledge, and Sales, improving overall user experience. This change focuses on internal technical improvements.
Original PR description
* documents,iap_extract,knowledge,mrp_workorder,room,sign,social, spreadsheet_edition,spreadsheet_sale_management,timesheet_grid, web_enterprise,web_gantt,web_grid,web_studio,website_knowledge This commit converts useExternalListener to useListener where the target is window or document.
This update simplifies currency conversion within our financial reports. By centralizing currency rates in the `account.move.line` fields, we've eliminated redundant and complex report-specific calculations. This change improves report efficiency and reduces the risk of errors when currency exchange rates update.
Original PR description
Now that currency conversion is implemented in the `consolidation_rate` and `consolidation_balance` fields on `account.move.line`, the per-report boilerplate — manually joining the currency table and wrapping each column with `_currency_table_apply_rate` — is redundant. Replace it by passing `Query` objects through to the report queries and referencing the new fields directly. The conversion logic now lives in a single field definition; if the underlying rate mechanism changes, no report needs to be touched. The per-report diff is intentionally minimal: each site just drops the manual join and replaces the wrapped expression with the field reference.
This update changes the color of the 'To Review' status badge on employee records from grey to orange. This improves readability, particularly in dark mode, ensuring that HR staff can quickly identify and address outstanding tasks.
Original PR description
The 'To Review' status on employees uses a grey badge ('secondary'), which has poor contrast and is nearly invisible in dark mode.
Update the 'review_state' field options to change '2_to_review' to 'warning' (orange). This ensures the badge is readable in both light and dark modes.
Task: 6289919
Forward-Port-Of: odoo/enterprise#120486
Forward-Port-Of: odoo/enterprise#120268Resolved issues and error corrections
This update fixes a minor issue in the demo data for the Odoo Enterprise HR payroll module. Specifically, a reference to an employee type was incorrect, preventing demo records for non-permanent employees from functioning properly. This change ensures the demo data accurately reflects the system's configuration.
Original PR description
The non-permanent employee demo records referenced a missing XML id l10n_id_contract_type_non_permanent for employee_type_id. Point them at the actual record, l10n_id_employee_type_non_permanent. task-6215687
This update resolves an issue where the project ID field was incorrectly marked as optional in the timesheet view. The system now correctly enforces the requirement for a project ID, ensuring accurate timesheet tracking and reporting. This change improves data integrity within the Enterprise module.
Original PR description
`project_id` is always required in the parent timesheet view. Setting it to `optional="hide"` in this inherited view is invalid. task-6113642
This update ensures that staff members, designated as part of an appointment type, are automatically added as attendees to new appointments created through the Gantt view. Previously, this step was manual. This change improves the user experience by streamlining appointment creation and ensuring staff are always included.
Original PR description
### Steps to reproduce: - Install 'Appointment' app - Configure an Appointment Type with your user as staff member - Go to the Appointments Gantt view - Click on the 'New' button to create a new…
### Steps to reproduce: - Install 'Appointment' app - Configure an Appointment Type with your user as staff member - Go to the Appointments Gantt view - Click on the 'New' button to create a new appointment > The staff member is not automatically added to the meeting's attendees (guests) list. ### Cause of Issue: When generating the default values for a new calendar event from the Gantt view (indicated by `booking_gantt_create_record` in the context), the base `default_get` method doesn't account for auto-adding staff members in obvious cases (when there's only one staff member available or the current user is one of the staff). ### Fix: Override `default_get` in `calendar.event` to automatically add these staff members when they are the only available option, providing a smarter and more seamless UX. opw-6181794 Note: the same PR was done for 18.0, but now this is moving it to master since it's more of a feature not a fix. Original PR: https://github.com/odoo/enterprise/pull/118331
This update improves the clarity of payslip reports by ensuring all line rates are consistently displayed with two decimal places. Previously, trailing zeros were shown, which was visually confusing. This change provides a more professional and accurate representation of employee compensation.
Original PR description
Problem: A lot of trailing zeros were displayed on the rate of each payslip line, in the salary tab of the payslip form. Solution: At first, it was decided to remove trailing zeros. But in the end, we chose to always display 2 decimal places. Task-6310227
This update resolves a technical issue that previously caused errors when users attempted to copy heading links within the knowledge editor. The change removes a dependency on the HistoryPlugin, streamlining the process and ensuring a smoother user experience. This improves the reliability of the knowledge editor for all users.
Original PR description
Prevent traceback when clicking the button to copy a heading link to the clipboard. Technical - Commit https://github.com/odoo/enterprise/commit/70bb74faecadea768bb17a4feb69fa327623ab5d removed the history dependency, although commit() is provided by HistoryPlugin and still requires it. Task-6267431
This change resolves a potential issue during software updates. A previous version of the Point of Sale module caused conflicts with the new stable version, leading to upgrade script errors. Renaming the 'obox_pos' module ensures compatibility and a smooth update process.
Original PR description
A stable module `obox_point_of_sale` was added in saas-19.3 but in master a module `obox_pos` is also present. This will cause some big upgrade script in the FW of `obox_point_of_sale` so renaming the module in master to prevent this error.
This update resolves a problem where test data from one test case was incorrectly carried over to subsequent tests, leading to unreliable results. The fix ensures that the test environment is properly reset after each test, preventing this 'cross-test pollution' and improving the stability of our testing process.
Original PR description
At each test end, the DB is reverted to the Savepoint, but the registry is not reloaded. This causes cross-test pollution This commit fixes this by reloading the registry after each test runbot-error-940278
This update ensures that the employee is automatically selected when creating a new off-cycle payslip. Previously, users had to manually choose the employee, which was a manual and potentially confusing step. This change streamlines the process and improves user efficiency.
Original PR description
Steps to reporoduce: 1) open any employee who has at least one payslip 2) open the employee view and click on payslip smart button 3) List view will open, now click on 'new Off-cycle' button 4) Employee is not there by default. Issue: The employee should be set by default. Solution: Add default_employee_id to the action context so that the employee is set by default when creating a new off-cycle payslip. task-6309649
This update improves the clarity of payslip reports by only showing bank accounts when there's a positive payment amount. Previously, bank accounts were always displayed, even with zero balances. This change simplifies the report and reduces visual clutter for users.
Original PR description
Now, on payslip's reports, bank accounts are shown at the bottom of the page only if there is a strictly positive amount to pay. task-6311010
This update replaces a problematic function (`cleanTerm`) with a more robust one (`normalize`) in the mail system. Removing the fallback to empty strings prevents hidden errors and ensures data integrity, leading to more reliable email processing.
Original PR description
This commit removes the `cleanTerm` function and replaces its usages with `normalize`. When the value provided to `cleanTerm` is not a string, it falls back to returning an empty string. This is seen as a bad practice, as it could easily hide programming errors. There is no sense to calling `normalize` on something other than a string; if another kind of value ends up in there, it is most likely a mistake. [Task-4818712](https://www.odoo.com/odoo/1519/tasks/4818712) Community: https://github.com/odoo/odoo/pull/262514
This update corrects a display issue where the 'DIMONA Category' column was missing from employee type lists for employee types not associated with a specific country. The fix ensures this column is always visible, regardless of the employee type's country setting, improving data visibility and reporting accuracy.
Original PR description
Steps to reproduce: 1. Install l10n_be_hr_payroll 2. Go to the list view of employee types 3. Show the column DIMONA Category 4. The category is missing for some records (Employee, Student, etc) Cause: The field is invisible if the country of the employee type is not Belgium. But it should still be visible for employee types without a country. Fix: change the invisible condition to allow employee types without country. Task: 6303674
This update corrects a technical error in the Odoo Enterprise payroll module that was causing incorrect cache behavior when rule parameters were missing from the database. The fix ensures that the system correctly identifies missing parameters, preventing errors and improving the stability of payroll calculations. This resolves a potential issue impacting payroll accuracy.
Original PR description
After https://github.com/odoo/enterprise/commit/1ee878fea4e5985852960bb4640a32abfa95ac9e: `_get_cached_parameter_from_code` returns `SENTINEL` when a rule parameter doesn't exist in the DB. `CacheLayer.__getitem__` uses that same `SENTINEL` to detect absent keys. When the stored value IS `SENTINEL`, it is indistinguishable from a missing key; so every subsequent lookup falls through to the parent and raises `KeyError` which `ormcache.lookup()` treats as a miss. applied fix: make _get_cached_parameter_from_code use different object than Sentinel for missing parameters.
This update prevents deleting a batch payment once linked payments have been marked as 'sent' and an XML export file has been generated. This ensures continued compliance with SEPA regulations, which require payments to remain marked as sent. Disallowing deletion maintains the integrity of export files for reporting.
Original PR description
When you create a batch payment, linked payments are marked as sent, and an export file is generated (XML). But if you delete the batch payment, the payments will remain marked as sent, meaning you won't be able to re-generate a new XML file for those payments. As we don't want to unmarked them as sent (we can't for SEPA payments), we decided to disallow the batch payment deletion in those cases. task-6117210 Forward-Port-Of: odoo/enterprise#117748
This update corrects a technical issue in the l10n_ch_reports module that was causing errors during financial report processing. The problem stemmed from a removed subformula not being reset to a default value, leading to incorrect calculations. This fix ensures accurate report generation by setting the subformula value to False.
Original PR description
The subformula was [removed](https://github.com/odoo/enterprise/pull/117601) without resetting its value to False, leaving existing values in the database. This causes errors when processing records that still contain a subformula value. ```.py Invalid subformula in expression "balance" of line "Treasury shares": -sum ``` To prevent these errors, existing subformula values are reset to False opw-6297901 Forward-Port-Of: odoo/enterprise#120663
This update fixes a minor visual issue in the web studio's property tag display within SelectMenus. Previously, tags were limited to 200px, leaving unused space. Now, tags automatically expand to fill the available width, creating a cleaner and more efficient user experience.
Original PR description
Before: Each tag was limited to 200px, leaving available space unused. After: Each tag now expands to 100% of the available width. task-5226503 Forward-Port-Of: odoo/enterprise#120260
This update resolves an issue that caused a traceback when users deleted the last column from a table within the Odoo Report Editor. The fix prevents a technical error by ensuring the editor handles the scenario where a table has no remaining columns gracefully. This improves the overall stability and reliability of the report design process.
Original PR description
Problem: When deleting the last column in a table in studio we get a traceback. Cause: `firstCell` will be null if we delete the last cell in the table. Fix: Added a null check on `firstCell` before calling `setCursorEnd`, so the cursor is only repositioned when the table still has remaining cells. Steps to reproduce: - Edit a report with a table. - Remove all columns. - Traceback will occur when deleting the last one. opw-6263696 Forward-Port-Of: odoo/enterprise#119502
This update fixes a display issue where the AI button was incorrectly shown in the Mass Mailing builder but not the Website Builder. The fix redirects patching to the Website Builder, ensuring the AI button appears only when using the website functionality. This improves the user experience for website visitors.
Original PR description
__Problem__ When opening the Mass Mailing builder after the Website Builder, the AI button is still shown. Conversely, if we open the Website Builder after the Mass Mailing builder, the AI button is never shown. This happens because Owl mounts the Builder component only once as long as we don't refresh the page. Since we patch the generic HTML Builder to put the AI button in the sidebar, the state of the first time it's mounted is preserved. __Fix__ Patch the Website Builder directly instead, as we only want the AI button to be available in the website. Community PR: odoo/odoo#270266 task-6189057 Forward-Port-Of: odoo/enterprise#120688
Features or functions removed from Odoo
This update removes the ability for AI conversations to suggest channel completion with '#' symbols. This change aligns the AI experience with the recent removal of channel autocompletion in the Discuss app, streamlining the user interface and improving consistency. Now, only '@' mentions are suggested within AI chat and AI composer channels.
Original PR description
This PR removes support for '#' channel autocompletion from AI conversations to align with the removal of channel autocompletion in Discuss. Only '@' suggestions remain available in AI chat and AI composer channels. community: https://github.com/odoo/odoo/pull/269214 task-6113197
This pull request removes outdated code related to generating payroll payslips in the Odoo Enterprise module. This cleanup improves the codebase's efficiency and reduces potential maintenance overhead. The change has no direct impact on business users.
Original PR description
. Remove hr.payroll.generate.warrant.payslips dead code task-6308624
This update removes a deprecated overtime work entry type within the US payroll module. The change ensures the system aligns with current regulations and simplifies payroll processing. This update primarily affects how overtime hours are tracked and reported.
Original PR description
- changed the reference to the overtime work enty type as it's removed. task-id: 6281648
This update removes outdated 'onWillRender' hooks used in the HR payroll module. As part of the ongoing Owl 3 migration, these hooks have been replaced with modern alternatives to ensure the payroll system continues to function correctly and efficiently. This change improves system stability and prepares for future updates.
Original PR description
As part of the Owl 3 migration, replace deprecated onWillRender hooks with the appropriate Owl 3 alternatives.
This update removes a technical field related to how messages are fetched within the Helpdesk system. The change streamlines message access by centralizing control through the mail module, improving efficiency and security. This ensures consistent access to messages across different use cases.
Original PR description
This change removes `website_message_ids` field considering: - Toward using a unique route for fetching the messages, the mail module should be the main gateway to restrict access to messages. Since reading a field that contains the whole messages of a record without pagination is not a good idea and considering what `website_message_ids` does (defining domains depending on the share context), this change moves the domain responsibility to a method on `mail.thread`. - There are some use cases (e.g. reading the comments on slides) where the same restriction as fetch route restriction is needed to get the correct data. Those cases would use a same fetch domain method from `PortalWebClientController`. [Community PR](https://github.com/odoo/odoo/pull/261003)
Code cleanup and technical improvements
This update removes outdated and easily replaceable 'useComponent' elements across several Odoo modules. This refactoring streamlines the codebase and improves maintainability. The changes primarily affect the account reports and knowledge modules, ensuring a cleaner and more efficient system.
Original PR description
Remove some useComponent that can easily be replaced. Task-6268109 PR community: https://github.com/odoo/odoo/pull/267742
This update modernizes the IoT module by transitioning to a new standard for defining component properties (OWL3). Unused prop definitions related to a reporting component have also been removed, streamlining the module's structure and reducing complexity.
Original PR description
This commit changes all the props definitions in the IoT module to the new OWL3 style. It also removes the prop definitions for the `IoTReportLocalStorage` component, as the props are never used.
This update refactors how Odoo determines the current website, moving from a database query to a controller-based approach. This change enhances efficiency and stability by avoiding reliance on the original `website` model method. The update improves the underlying data retrieval process.
Original PR description
The corresponding community PR adds a controller `/website/get_current_website_id` to get the current website. This commit uses it instead of the `website` model's method `get_current_website`.
This update simplifies website routing by replacing older methods with a more reliable approach. It ensures that website-specific data is consistently accessed, leading to improved accuracy and stability. Future work will address more complex fallback scenarios.
Original PR description
[REF] base/website: migrate controllers and models to `self.env.website` Replaced legacy `get_current_website()` calls with `self.env.website` across controllers and models where fallback behavior…
[REF] base/website: migrate controllers and models to `self.env.website` Replaced legacy `get_current_website()` calls with `self.env.website` across controllers and models where fallback behavior was unintended. Mechanics & Context: - For routes defined with `website=True`, the routing layer automatically injects `website_id` into the context. - `self.env.website` natively reads this `website_id` from the context, behaving exactly like `get_current_website(fallback=False)` (without falling back to `host_id` or the first available website). - `host_id` (added during routing) represents the website matched strictly by domain name, independent of `website=True` or website-module specific overrides. Scope of Cleanup: This PR intentionally focuses only on the call sites that can be safely converted to a plain `self.env.website`. Locations that require explicit fallback handling, such as falling back to `host_id` (the strict domain-matched website) or a default website, have been left out of this pass when it's linked to a complex feature or behavior. They require deeper analysis and will be addressed in a subsequent PR.