Daily updates from Odoo
Saturday, May 9, 2026
12 changes · saas-19.1
Resolved issues and error corrections
This update fixes a bug where abandoned cart emails were sometimes sent twice. A recent change in how the system determines the customer's email address caused a conflict with an older fix. This change ensures that emails are only sent once, regardless of how the customer's email address is determined.
Original PR description
During a previous fix (https://github.com/odoo/odoo/pull/206158), fallback values were added for an explicit `email_to` if the default email template for the abandonned cart was missing them. But…
During a previous fix (https://github.com/odoo/odoo/pull/206158), fallback values were added for an explicit `email_to` if the default email template for the abandonned cart was missing them. But since (https://github.com/odoo/odoo/pull/172714), the template uses `use_default_to` == True, which will compute the default partner and add them to `partner_ids` of the `mail.mail` record. So the old bug of "abandoned cart email is sent twice" reappered: the if condition fails to account for `use_default_to` being set, so the partner email is set explicitly on `email_to` AND referenced in `partner_ids`, which de-facto sends the email twice to the customer on the sales order. ## FIX: We account for `use_default_to` in the if condition before adding the fallback. How to reproduce: 1) Setup a database with demo data and website_sale 2) Visit the shop as a visitor, add stuff to your cart 3) Sign up for portal access and add new stuff to cart (will attribute SO to new portal account) 4) Wait for the abandoned cart email to trigger (can be forced by playing with `cart_recovery_email_sent`: false,`is_abandoned_cart`: true and triggering the CRON) -> mail is sent twice to the customer Remarks: - changed the unit test to actually capture the generated `mail.mail` and apply some asserts on it OPW-6134731 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261039
This update fixes an issue where some UBL invoices were being processed incorrectly. The change ensures that invoices with a valid CustomizationID are prioritized, improving the accuracy of invoice processing. A fallback mechanism remains in place for unknown UBL formats to maintain compatibility.
Original PR description
Some UBL invoices we receive both have a node CustomizationID signifying that it's a bis3 and a UBLVersionID 2.1 (which should be illegal). We don't block malformed bis3 invoices. But we should try to guess that it's a bis3 if it has the perfect customization. We can keep the fallback in case it's an unknown bis3 format. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263527 Forward-Port-Of: odoo/odoo#263285
This update resolves a critical issue where the rental website would crash when overlapping closed days and public time off periods were selected. The fix simplifies the availability check to focus solely on time ranges, ensuring a stable and reliable rental availability display for customers. This improves the user experience and prevents lost sales.
Original PR description
Steps to reproduce: - Install website_sale_renting_planning. - Create a rental service product linked to a planning role. - Enable Sync Shifts and Rental Orders on that role. - Add a two-day public time off on the working calendar. - Open the product on the website with overlapping dates. Current behavior: The shop crashes when the selected dates overlap a closed day and a public time off. Expected behavior: The website should show rental availability without crashing when both cases overlap. Issue: The availability flow mixed two kinds of calendar data while it only needed time ranges, so the overlap broke the website flow. Fix: Keep the unavailability check focused on time ranges for closed days and public time off so both cases can be combined safely. Ref: odoo/enterprise#98165 odoo/enterprise#102070 odoo/enterprise#102076 task-6164218 Forward-Port-Of: odoo/enterprise#115480
This update prevents website editors from getting stuck when interactions fail during the edit mode transition. Previously, a single error would halt the entire process, blocking content changes. Now, errors are handled gracefully, allowing the editor to continue and ensuring a smoother editing experience.
Original PR description
When entering website edit mode, `websiteEditService.handleEditPage()` calls `InteractionService.stopInteractions()`. Currently, a failure while destroying a single interaction aborts the entire stop sequence. This prevents the editor from loading, leaving users unable to modify or delete the element that caused the failure. Any errors encountered during destruction are caught and stored so the remaining cleanup can complete, and then they are rethrown. This ensures the transition to edit mode is not blocked by a single element's failure. task-5180598 Forward-Port-Of: odoo/odoo#263098
This update resolves an issue where portal users couldn't see timesheets associated with tasks. The fix adjusts how timesheet visibility is determined, reflecting changes made during a recent portal system update. Now, portal users will correctly see timesheet information for shared tasks.
Original PR description
Steps to reproduce: - Install `website_timesheet` - Enable timesheets from website - Share a task with a portal user - Log in as the portal user - Open the tasks on the portal Issue: The Timesheets is not visible. Root cause: Earlier, portal card visibility and existence were controlled directly in the QWeb template. After the portal refactoring, their visibility and existence are now managed by `portal.entry` records. Fix: Determine timesheet visibility using the corresponding `portal.entry` record. task-5455588
This update resolves an issue where standard users couldn't create projects from templates due to permission restrictions. Adding `sudo` ensures the necessary access is granted, preventing errors and allowing all users to utilize project creation features without disruption. This improves overall system stability and usability.
Original PR description
Steps to reproduce: - Ensure: - Marc Demo is a “Project” admin - All projects have “allow_task_dependencies” set to false. This will remove the “Use Task Dependencies” group from Role / User, so the…
Steps to reproduce: - Ensure: - Marc Demo is a “Project” admin - All projects have “allow_task_dependencies” set to false. This will remove the “Use Task Dependencies” group from Role / User, so the order of these steps is important - Add Role / User implies “Use Task Dependencies” - Sign in as Marc Demo and attempt to create a new project from the “Product Launch Campaign” template Description: `_inverse_allow_task_dependencies()` uses `_check_project_group_with_field()` to determine if task dependency features should be enabled/disabled by modifying the `hidden` field on `mail.message.subtype` records (e.g. `mt_task_waiting`). This occurs whenever a project is created from templates. However write access to these records are restricted to admins, so we need elevated permissions when attempting to do so. Without `sudo`, access errors are thrown if non-admin users attempt to create projects under specific scenarios (i.e. when `_check_project_group_with_field()` adds or removes a group from the user base group). The search within `_check_project_group_with_field()` also needs elevated permissions to prevent false negatives. Without `sudo`, this search is restricted by the user's record rules. If the user cannot see the specific projects where dependencies are active, the system may incorrectly assume that no projects use these dependencies, and will forcefully unlink the dependency group from `base.group_user`, breaking the feature globally for all users. Applying `.sudo()` to the subtype modification and the project search ensures standard users can create projects from templates without crashing and prevents the accidental global removal of the dependency group. opw-6099425 Forward-Port-Of: odoo/odoo#258996
This update optimizes a key calculation within the sale_timesheet module, significantly speeding up the process of determining employee timesheet warnings. The previous method was inefficient due to unnecessary data retrieval, but this change uses a more targeted SQL query to filter results, resulting in a substantial performance boost.
Original PR description
Previously, computing warning_employee_rate fetched all analytic lines associated with projects.task_ids to check if any employee lacked a sale_order_line in project.sale.line.employee.map. This…
Previously, computing warning_employee_rate fetched all analytic lines associated with projects.task_ids to check if any employee lacked a sale_order_line in project.sale.line.employee.map. This approach had two major flaws: 1- Iterating over all accessible tasks is highly inefficient for large projects, especially since many tasks do not even have associated analytic lines. 2- Fetching analytic lines blindly by task_id could pull in lines linked to a completely different project_id adding performance issues. **Solution**: Since the compute method for the `project_id` field for the `account.analytic.line` model is making sure that the field `project_id` equal the project for the task, then we can remove the domain matching for the `task_id`. We now can replace the `_read_group` with a simple SQL query, filtering out the unmapped projects directly. The benchmark done below was on a database that had around 10M analytic lines, 2K `project_sale_line_employee_map` records and 1M tasks with the top 80 projects in terms of the number of `analytic.lines` + projects that had the most records in the `project_sale_line_employee_map`. | Before | After | | :--- | :--- | | 33.0s | 170.0ms | Forward-Port-Of: odoo/odoo#260935
This update fixes an issue where taxes were incorrectly assigned to the wrong company due to a change in how the system cached tax information. By partitioning the cache based on company ID, we ensure that taxes are now correctly associated with the appropriate business, improving data accuracy and financial reporting.
Original PR description
Details and steps to reproduce are in Issue #262709 Cause: In #248680 the cache was changed to be global (per cr), meaning it is shared across companies. We need to partition the cache by company_id to prevent the assignment of taxes from the wrong company. OPW-6189579 Forward-Port-Of: odoo/odoo#262779
This update fixes a reporting issue where service reverse charge tax wasn't correctly included in the GSTR-3B reports. Now, journal items related to reverse charge supplies are accurately reported in the designated table, ensuring compliance with tax regulations. This improves the accuracy of financial reporting.
Original PR description
Previously, journal items for import of services with reverse charge tax were shown only in table 4(A)(2) and not in table 3.1(d). However, since table 3.1(d) is meant for supplies liable to reverse charge, those entries should also be reported there. With this commit, import of service reverse charge entries are now correctly included in table 3.1(d) as well. Forward-Port-Of: odoo/enterprise#116708
This update fixes an issue where tax reports (specifically for GSTR2B in India) were displaying incorrect signs for bills and credit notes. The change ensures bills show positive amounts and credit notes show negative amounts, aligning with standard accounting practices and improving report accuracy.
Original PR description
In reverse charge taxes, tax tags are added on negative repartition lines, causing the amounts to appear with the opposite sign in reports. Due to this, credit notes were shown as positive amounts and bills as negative amounts. This commit fixes the sign handling so that: - bills are shown with positive amounts - credit notes are shown with negative amounts Forward-Port-Of: odoo/enterprise#116740
The Project Gantt view was incorrectly graying out weekends and off-hours for employees with flexible schedules who had no approved leaves. This update corrects a bug where the system wasn't properly accounting for flexible work arrangements, ensuring accurate availability representation in the Gantt view.
Original PR description
Steps to Reproduce --- - Assign a flexible working schedule to an employee (no leaves) - Open Project > Tasks > Gantt view grouped by Assignee - The employee's weekends and off-hours are grayed out…
Steps to Reproduce --- - Assign a flexible working schedule to an employee (no leaves) - Open Project > Tasks > Gantt view grouped by Assignee - The employee's weekends and off-hours are grayed out Current Behavior --- Flex employees with no approved leaves in the viewed date range have incorrect grayed-out days in the Project Gantt view. Expected Behavior --- Flex employees should have no grayed-out days except approved leaves and public holidays. Issue --- When a flex employee has no leaves in the viewed period, `_get_unavailable_intervals()` returns an empty dict for that resource. `_gantt_unavailability()` then falls back to `company_leaves`, producing incorrect gray intervals. The same case is already handled in `planning` (ref PR), but `project_enterprise` was not covered. Fix --- Add a guard in `_gantt_unavailability()` to return no unavailabilities for flexible resources absent from `leaves_mapping`. Related : https://github.com/odoo/odoo/commit/5f1cd39944134ffa2c30c331f8a5daca56446d78 task - 5063071 Forward-Port-Of: odoo/enterprise#113247
This update resolves an issue where a 'rotting' button was incorrectly displayed in the My Tasks Kanban view, causing a traceback. The fix corrects a misconfiguration in how the system tracks task aging, ensuring accurate reporting of overdue tasks within the Field Service app. This prevents potential confusion and ensures data integrity.
Original PR description
# How to reproduce - Go to All Tasks > All Tasks - Select the Kanban View - Edit the settings of the stage "New" - Set the value of "Days to rot" to a negative number (e.g. -4) - Go to My Tasks >…
# How to reproduce - Go to All Tasks > All Tasks - Select the Kanban View - Edit the settings of the stage "New" - Set the value of "Days to rot" to a negative number (e.g. -4) - Go to My Tasks > Tasks - Click on the red button displaying the number of task rotting # The problem We get a traceback # Cause When we click on that red, button, we call this function : https://github.com/odoo/odoo/blob/af50cb24ac536e6afb14eee8221c69906191ba2b/addons/mail/static/src/js/rotting_mixin/rotting_kanban_header.js#L11-L13 This `toggleFilterRotten` function is patched in `progressBarState` by the `RottingKanbanController` class: https://github.com/odoo/odoo/blob/af50cb24ac536e6afb14eee8221c69906191ba2b/addons/mail/static/src/js/rotting_mixin/rotting_progress_bar_hook.js#L1-L10 https://github.com/odoo/odoo/blob/af50cb24ac536e6afb14eee8221c69906191ba2b/addons/mail/static/src/js/rotting_mixin/rotting_kanban_controller.js#L6-L11 But the `FsmMyTaskKanbanController`, which the specific controller of the My Tasks view in the Field Service app does not inherit from the `RottingKanbanController` class : https://github.com/odoo/enterprise/blob/32496b52d8333f68603bba6a0c1af3ed42f59287/industry_fsm/static/src/views/fsm_my_task_kanban/fsm_my_task_kanban_controller.js#L5 Then why was the rotting button even available ? That's because `fsmMyTaskKanbanView ` inherit from `projectTaskKanbanView`, which header inherit from `RottingKanbanController` : https://github.com/odoo/odoo/blob/af50cb24ac536e6afb14eee8221c69906191ba2b/addons/project/static/src/views/project_task_kanban/project_task_kanban_header.js#L4-L9 opw-6186575 Forward-Port-Of: odoo/enterprise#116530