Tuesday, March 10, 2026
43 changes · saas-19.2
Resolved issues and error corrections
This update fixes a problem where the Gantt view for service projects would crash when grouping by project. The issue stemmed from an outdated date format being used for domain filtering. The fix ensures dates are correctly parsed, allowing the Gantt view to function properly.
Original PR description
### Issue: When in the Gantt view of service projects, grouping by project results in a traceback. ### Steps to reproduce: - Create another field service project - Create a task in the new project…
### Issue: When in the Gantt view of service projects, grouping by project results in a traceback. ### Steps to reproduce: - Create another field service project - Create a task in the new project and add start and end dates - Go to Field service > my tasks > gantt view > group by project - Error with traceback `time data 'today' does not match format '%Y-%m-%d %H:%M:%S'` ### Cause: This [commit](https://github.com/odoo/odoo/commit/d1ea43f6721116914762ea323d8a5987f043e87f) added the possibility to use dynamic dates in domains. Then all domains were changed in 42b1fca8e127926a06f503d79c8baeddf7d5ae82 But `_expand_domain_dates()` is trying to parse the dates as if they were written in ISO format: https://github.com/odoo/enterprise/blob/be853cc1ee544dda580960d94417cfdff2c8a7db/project_enterprise/models/project_task.py#L626 ### Solution: We use the method `parse_date()`, which was added with dynamic dates, to parse them. opw-5955317 Forward-Port-Of: odoo/enterprise#109236
This update fixes an issue where new timesheets weren't correctly selecting the appropriate Service Order Line (SOL) when creating them in a multi-company setup. It ensures the timesheet now uses the correct SOL linked to the user's billing rates, regardless of the company being used, improving accuracy in billing.
Original PR description
****Behavior:**** **Current:** In a multi company environment, when a sale contains multiple tasks in some project, and the user has billing rates indicating they should be assigned to a specific…
****Behavior:**** **Current:** In a multi company environment, when a sale contains multiple tasks in some project, and the user has billing rates indicating they should be assigned to a specific task, creating a new timesheet for the project does not set the correct SOL. This only happens if the sale is happening from a company that does not have an employee linked to the user. **Expected:** The new timesheet should be able to connect the current user to the related employee in the billing rates to find the right SOL. In the situation in which multiple companies have created an employee for the same user, and more than one of these has been linked to a SOL in the billing rates (unlikely workflow): We choose the SOL linked to the employee record created for the currently activated company, otherwise, we default to the first employee in the list. **Steps to reproduce:** - Be in a multicompany environment: company A and B - Create User with access to both but only one employee record for company A - Switch to company B - Create 2 services product, both creating a task in the same project. - Activate Billable Rate Indicators in the settings - Create a quote with both services and confirm - Go to the related project, and in the Invoicing tab, link employee from company A to SOL2 - As the user, check both companies but set company B as current active - Go to timesheet and create a new timesheet, when setting the project from the quote, you should see SOL1 by default, however we would want SOL2 as it was configured. opw-5159195 Forward-Port-Of: odoo/odoo#234200
This update refines the visual style of polls within the Discuss feature, enhancing readability and user experience. Specifically, it addresses minor spacing issues, adjusts text and icon sizes for a cleaner look, and removes the 'Select' subtitle when a poll is closed.
Original PR description
- improved spacing (around card, between items, etc.) - small size and opacity / muted tweaks on text and icons - don't show "Select" subtitle when poll has closed Before / After <img width="1618" height="578" alt="Screenshot 2026-03-04 at 18 33 44" src="https://github.com/user-attachments/assets/bef827cd-d9f6-4067-8f77-4f3e17f6f73f" /> <img width="1581" height="571" alt="Screenshot 2026-03-04 at 18 32 51" src="https://github.com/user-attachments/assets/aeb9af94-5095-4784-8b87-d06876c52ba3" /> Forward-Port-Of: odoo/odoo#252074
This update fixes a visual issue where the "Permission Needed" label in the device selector on the public discuss page appeared misaligned or overflowed on smaller screens. The change ensures the label displays correctly and adapts to different screen sizes, improving the overall user experience across desktop and mobile devices.
Original PR description
**Description of the issue this PR addresses:** Ensure the `Permission Needed` label in the device selector on the discuss public page displays correctly and remains properly aligned when device…
**Description of the issue this PR addresses:** Ensure the `Permission Needed` label in the device selector on the discuss public page displays correctly and remains properly aligned when device permissions are not granted. **Current behavior before PR:** - Since this [PR](https://github.com/odoo/odoo/pull/247838), the label could appear misaligned or overflow the button on smaller screens, causing UI inconsistencies on both desktop and mobile. **Desired behavior after PR is merged:** - The label stays properly aligned and adapts correctly to the available space, preventing UI glitches across screen sizes. task-[6007860](https://www.odoo.com/odoo/project/1519/tasks/6007860) Before [Larger and Smaller Devices]: <img width="639" height="49" alt="image" src="https://github.com/user-attachments/assets/1cd1e240-0f40-42f9-bf93-823add81878f" /> <img width="343" height="39" alt="image" src="https://github.com/user-attachments/assets/a7a0f920-39e3-4bb3-a647-461c94cab395" /> After [Larger and Smaller Devices]: <img width="638" height="47" alt="image" src="https://github.com/user-attachments/assets/16aa419b-2190-4fd1-a459-8a376d90c349" /> <img width="425" height="41" alt="image" src="https://github.com/user-attachments/assets/fb245378-c04b-4dd8-8c5b-39ad4adefadf" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update enhances the Time Off Gantt view by displaying total worked hours in the progress bar and streamlining actions. The 'Save' button has been removed, replaced with 'Approve' and 'Refuse' buttons for direct approval/rejection, and a 'Reset' button has been removed. These changes improve the user experience and efficiency of managing time off requests.
Original PR description
Changes Show total worked hours in the progress bar before the employee name. Remove the Save button from the popover and add Approve and Refuse buttons for direct action. Remove the Reset button from the Gantt view. UX improvements: Show the deferred icon on the pill. Fix popover margins and remove unnecessary message. task-5941368
This update fixes an issue where meeting dates displayed in the CRM were incorrectly showing a day after the scheduled meeting. The fix aligns the displayed date with the user's timezone setting, ensuring accurate meeting information. This improves the user experience and prevents confusion regarding meeting times.
Original PR description
# How to reproduce - Use a browser extension to manage your browser's timezone - Set your browser's timezone to a timezone with quite a big delay (like "America/Grand_Turk" if you live in Europe) -…
# How to reproduce - Use a browser extension to manage your browser's timezone - Set your browser's timezone to a timezone with quite a big delay (like "America/Grand_Turk" if you live in Europe) - Go to the form view of an opportunity - Click on the smart button for meetings (Should be "No Meeting" if it is a new Opportunity) - In the calendar view, add a new meeting for very late in the day (Example : 2026-02-10 22:00:00 => 23:00:00) - Go back to the opportunity for view # The problem The date displayed is a day after the meeting that was just set up. Taking back our example, the date displayed would be 2026-02-11 # Why The calendar view uses the browser's timezone to manage the dates. The smart button does not. It is not possible to make the smart button use the browser's timezone, atleast in a clean way. That is because the smart button's data is managed by a python template, which does not have access to the browser's data. Trying to change the data displayed by the framework would be clunky as the html would need to be edited directly. The fix that I implemented follows what the hr_appraisal module does for it's smart button with a date: use the timezone set in the user's preferences. opw-5898520 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251840 Forward-Port-Of: odoo/odoo#247984
This update resolves a technical issue that previously caused errors during the replenishment process in MRP, purchase stock, and stock dropshipping modules. The fix improves stability and reliability of these key inventory management functions.
Original PR description
Fix 705e27a caused a `Singleton Error`, which was then addressed in cd66456. This commit improves the follow up fix and adds a test. Forward-Port-Of: odoo/odoo#250983
This update resolves an issue where tip calculations in Point of Sale were incorrect when the decimal separator in Odoo settings was changed. The fix ensures the NumberBuffer service dynamically retrieves the correct decimal separator, preventing stale data from causing calculation errors. This improves the accuracy of tip amounts for all users.
Original PR description
Steps to reproduce: 1. Open the Point of Sale. 2. In Odoo Settings, change the Decimal Separator (e.g., from '.' to ','). 3. Go back to the PoS and add a Tip. 4. Observe that the tip math is wrong. Cause: The 'NumberBuffer' service is a singleton initialized at PoS startup. During initial setup, it caches the decimal point from 'services.localization.decimalPoint' into 'this.defaultDecimalPoint'. Because the service is a singleton, this value remains stale if settings are changed without a server refresh. When the 'NumberPopup' is opened, it uses the cached stale separator, causing parsing issues in methods like 'addTip'. Solution: Modify the 'NumberBuffer' service to fetch the decimal separator directly from the 'localization' service during the '_setUp' process. opw-5895622 Forward-Port-Of: odoo/odoo#247769
This update resolves an issue where the 'Return' button incorrectly appeared on picking forms, even when the picking hadn't been completed. The fix ensures the button is only visible when the picking is in the 'Done' state or linked to a sales or purchase order. This prevents confusion and ensures users only initiate returns when appropriate.
Original PR description
_*= sale_stock, purchase_stock Steps to Reproduce: - Create a Helpdesk ticket. - Click Replace, and the picking form opens. - Add product lines to the picking to deliver to the customer. - Observe that the Return button is visible and shows a warning when clicked, even though the picking is not in Done state. Cause: - When `stock_account` is installed, the Return button visibility is overridden to always show (`invisible=0`), ignoring the original condition (`state != 'done'`). Solution: - Restore the Return button visibility to its original condition so it’s only shown when the picking is Done or when picking is linked to any PO or SO. task-5075584 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242473
This pull request reverts a recent change to the HR employee module. This action was taken to adhere to our stable release policy and address a breaking change. The previous change has now been rolled back to ensure stability and prevent potential disruptions for our users.
Original PR description
Breaking stable policy 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#252789
A recent test failure in the Sale-MRP module has been resolved. This change added a necessary user group permission to the test environment, allowing it to correctly access and test the 'tracking' field on product forms. This ensures the tests run reliably and helps maintain the stability of the Sale-MRP functionality.
Original PR description
Runbot Error: https://runbot.odoo.com/odoo/runbot.build.error/240918 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where the working time assigned to tasks wasn't accurately calculated when a company's holiday was active. The fix ensures that the correct working time is applied, considering company-specific holidays, and allows users to view and enable hidden fields for accurate time tracking.
Original PR description
__ Fix after revert bf9729e997b15777a981ac258b0088107804fbe6 __ Let's say we have 2 companies: company A and company B. We create a public time off of a few days starting before today and ending 2…
__ Fix after revert bf9729e997b15777a981ac258b0088107804fbe6 __ Let's say we have 2 companies: company A and company B. We create a public time off of a few days starting before today and ending 2 days later in company A, then switch back to company B. In company B, we create a project and a task, and assign this task. The working time to assign will stay at 0. 1. Switch to company A and create a timeoff starting before today and ending later. 2. Switch back to company B. Create a project, a stage and a task. 3. Enable the debugger. 4. The field Working Time to Assign is invisible by default, so open studio, click on View, and check Show Invisible Elements. 5. Click on the tab Extra info and on the block Working time to assign. Uncheck Invisible. 6. Close studio and assign someone to the task. Make sure that you do this operation at a different time than the one recorded for the last stage change. The hours under Working Time to Assign should compute the difference between the last time the task got its stage changed and the time of assignation Nothing happens When computing the working time to assign, we also take into consideration leaves: if this happened during public holidays, we consider that it took no working time to get assigned. However, when a holiday is set in another company, the Working Time to Assign duration will be impacted, as the domain to retrieve the corresponding leaves is the following: https://github.com/odoo/odoo/blob/c7e965a61b7ce856c2daa8e2574cf4c60caf7a20/addons/resource/models/resource_calendar.py#L537-L546 The company isn't taken into account in the domain, applying the holiday for every company. __ opw-5222883 Forward-Port-Of: odoo/odoo#248725 Forward-Port-Of: odoo/odoo#246994
This update fixes an issue where instructions added to work orders weren't correctly linked when creating purchase orders (MOs) via the mobile app. The problem stemmed from a previous change that prevented the necessary data from being passed to the server. This ensures that instructions from the BOM are now properly associated with the MO, improving the mobile workflow for shop floor operations.
Original PR description
# How to reproduce - Create a BOM for a product with a Work Order - Add instructions to the WO - Using mobile, create a new MO for the product # The problem The instructions are not linked to the MO. This can easily be seen via the shop floor application # Why This issue is identical to https://github.com/odoo/odoo/pull/197889. This commit https://github.com/odoo/odoo/commit/b1ceec4c616d8ad2fee5b0fa1ce76c85cacbb344 removed the operation_id field from the workorder kanban mobile view, which is used in the MO form on mobile. operation_id is then not passed to the server in vals_list when creating the MO but it is required to link the instructions from the BOM to the MO. opw-5950983 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250090
This update resolves an issue where sending digest emails would fail when a company didn't have a website configured. The fix prevents a key error by checking if a website exists before attempting to access website-related data. This ensures digest emails can be sent reliably for all companies, regardless of their website setup.
Original PR description
When a company has no website configured, sending a digest email raises a traceback. Steps to reproduce the error: - Install ``website`` module - Create a new company and switch to it - Create a new digest email > In KPIs, Enable Visitors > Add recipient > Save - Click on Send Now button Traceback: ```py KeyError: res.company(1,) ``` https://github.com/odoo/odoo/blob/dee3fdee0326db032d95639eb8ee9386bb1762d4/addons/website/models/digest.py#L49-L59 If no website exists for the company, ``websites_per_company`` becomes an empty dictionary. Therefore, accessing ``websites_per_company[company]`` raises the above traceback. sentry-7239108433 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248981
This update fixes an issue where flexible calendar employees were incorrectly displaying grayed-out days in planning and related modules. The change ensures that only public holidays and leaves are reflected as unavailable, providing a more accurate representation of employee availability. This improves the usability of the planning app for employees with flexible work schedules.
Original PR description
### Issue: When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible…
### Issue:
When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible calendar should not have any grayed out days other than public holidays.
### Steps to reproduce:
- Create a new work schedule:
- Flexible Hours
- 24 hours per week
- 8 average hours per day
- Create an employee with this work schedule
- Open Planning app
- Only the three first days of the week are not grayed out
### Cause:
With 24 hours per week, the worked time can be done in three days. Odoo considers that the first three days of the given time frame are worked, but the others aren't. This result is returned by `_work_intervals_batch()`. In `_unavailable_intervals_batch()` we then build the unavailabilities by taking the inverse of the work intervals. The only exception was for fully flexible resources (i.e. without a calendar).
### Solution:
The case we need to consider is for flexible resources: they are available anytime, all week long except on public holidays and leaves.
To do this we fix the method `_unavailable_intervals_batch()` which is then called by each module. If the resource is flexible, then we only return the interval of the public holidays overlapping with the time frame.
Works in `appointment`, `hr_holiday_gantt`and `project_enterprise`.
In `planning`, we need to skip the case where nothing is returned in `leaves_mapping` otherwise it will consider the `company_leaves` during weeks with no public holiday or leaves.
In `hr_attendances_gantt`, `_unavailable_intervals_batch()` is not called. So we change the way the unavailabilities were computed to call `_unavailable_intervals_batch()` instead.
opw-4879481
Forward-Port-Of: odoo/odoo#252285
Forward-Port-Of: odoo/odoo#245741This update fixes an issue where flexible calendar employees were incorrectly displaying grayed-out days in planning and related modules. The change ensures that only public holidays and leaves are reflected as unavailable, providing a more accurate representation of employee availability. This improves the planning experience for teams utilizing flexible work schedules.
Original PR description
### Issue: When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible…
### Issue:
When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible calendar should not have any grayed out days other than public holidays.
### Steps to reproduce:
- Create a new work schedule:
- Flexible Hours
- 24 hours per week
- 8 average hours per day
- Create an employee with this work schedule
- Open Planning app
- Only the three first days of the week are not grayed out
### Cause:
With 24 hours per week, the worked time can be done in three days. Odoo considers that the first three days of the given time frame are worked, but the others aren't. This result is returned by `_work_intervals_batch()`. In `_unavailable_intervals_batch()` we then build the unavailabilities by taking the inverse of the work intervals. The only exception was for fully flexible resources (i.e. without a calendar).
### Solution:
The case we need to consider is for flexible resources: they are available anytime, all week long except on public holidays and leaves.
To do this we fix the method `_unavailable_intervals_batch()` which is then called by each module. If the resource is flexible, then we only return the interval of the public holidays overlapping with the time frame.
Works in `appointment`, `hr_holiday_gantt`and `project_enterprise`.
In `planning`, we need to skip the case where nothing is returned in `leaves_mapping` otherwise it will consider the `company_leaves` during weeks with no public holiday or leaves.
In `hr_attendances_gantt`, `_unavailable_intervals_batch()` is not called. So we change the way the unavailabilities were computed to call `_unavailable_intervals_batch()` instead.
Forward-Port-Of: odoo/enterprise#109706
Forward-Port-Of: odoo/enterprise#105521This update fixes a minor usability issue in the sale timesheet module. Previously, the 'Billing Type' setting for billable projects was hidden within a muted description field, making it easy for users to miss. Now, the field is clearly visible, ensuring users can easily adjust billing settings when needed.
Original PR description
Before this commit, when the project is billable, the user can also alter Billing type. However, that field is in muted and displayed inside the description of billable feature and so the user could miss he could alter a field inside that description. This commit makes sure billing type field is no longer in muted to correctly show the field can be edited. task-5994180
This update resolves several issues related to shift scheduling and resource allocation within the planning module. Specifically, it corrects errors in how allocated time is calculated, ensures accurate comparisons of shifts, and improves the mobile user experience for viewing maps and managing interventions. These fixes enhance the reliability and usability of the planning system.
Original PR description
## [FIX] planning: make sure allocated_percentage is defined in the view Before this commit, since we remove the allocated percentage field from the form view, the framework js does not know that…
## [FIX] planning: make sure allocated_percentage is defined in the view
Before this commit, since we remove the allocated percentage field from
the form view, the framework js does not know that field has a default
value and so it will set 0 by default for the float field and give it as
parameter when it will request an onchange when the user wants to create
a new shift.
This commit makes sure the field is inside the form view to be sure the
default value is taken into account to correctly compute the
allocated_hours.
## [FIX] planning: make sure we compare apples with apples
Before this commit, the copy previous week action in planning.slot could
crash because values for new shifts could contain Commands in
`resource_ids` field.
This commit makes sure we convert those commands into resource ids to be
able to compare those ids with the ones on the shift processed.
## [FIX] planning_field_service: display map view in mobile in My Map
Before this commit, the `My Map` action displays the calendar view in
mobile instead of the map view.
This commit makes sure we first display the map view in any device when
`My Map` action is loaded.
## [FIX] planning_field_service: hide field service buttons when slot not published
Before this commit, some buttons in planning.slot were visible even if
the intervention is not published or in progress.
This commit makes sure the buttons are visible when the state of the
intervention is published or in progress depending on what is the
purpose of the button.
## [FIX] planning_field_service: open full form view in calendar
This commit makes sure the form view is fully opened in the calendar
view of planning.slot instead of opening it inside a modal.
## [FIX] web_gantt: undo the rechescule of shifts and keep resources set
Before this commit, when the user reschedules a shift by drag and
dropping a pill in the gantt view and the group by is by Resources, if
the shift was assigned to more than one resource and the user undo his
action, the shift will be assigned to only the resource where the pill
was before the drag and drop instead of keeping its initial resources
set.
This commit makes sure the resources which were assigned to shift are
correctly set once the user undo the reschedule made.
## [FIX] planning_holidays: correctly compute the search domain for is_absent
Before this commit, the `employees on time off` filter does not return
the shifts with at least one human resource off due to wrong calculation
made in the search method of `is_absent` field defined in
`planning.slot` model.
This commit fixes the issue to correctly show the shifts with at least
one human resource off in the period of the shift.
## [FIX] planning_field_service_{sale_timesheet,worksheet}: display photos before materials
This commit makes sure the Photos button is before the one to add
materials in the intervention.
## [FIX] planning: display icon instead of label in calendar view
This commit reviews the popover in the calendar view of planning.slot to
replace the label by the icon to let more space for the value of each
fields displayed in that popover.
It also display in week by default the calendar view of planning slot in
My planning menu
## [FIX] planning: don't send re-assign email when one more resource is assigned
Before this commit, when the user edits a shift to add an additional
resource to the shift, the resource initially assigned to the shift will
receive a re-assign email even if he is still assigned to the shift.
This commit makes sure the email is sent only when the resource is no
longer assigned to the shift.
## [FIX] planning_field_service: add navigation map button to popovers and some fixes
This commit mainly adds a button to easily redirect the user to google
map with the customer address.
## [FIX] planning: don't show seconds in allocated_hours field
Before this commit, due to a rework of duration format, the allocated
hours now displays the seconds which is not really needed and take more
space than expected.
This commit makes sure we don't display the seconds in the allocated
hours field of planning.slot since that information is not really
useful.
## [FIX] planning{_field_service}: simplify display_name and conflicts warning
This commit simplifies the conflict warning in the form to have a
minimal warning message. The display name has been reviewed to only
display partner_id and role_id if partner_id otherwise project_id and
role_id will be displayed.
## [FIX] planning: don't include material resources when a human resource is set
This commit removes the material resources in the compute allocated
hours when there is at least one human resource set with it since we
could assume the material resources will just be used by the human
resource(s) assigned to the shift.
## [FIX] planning_field_service: fix geolocation when sign_in/complete intervention
Before this commit, the geolocation feature does not work because it was
only done in sign in button in calendar popover of planning.slot but the
feature is also needed when the user clicks on sign in and complete
buttons in the other views of planning.slot.
This commit makes sure the geolocation feature works in any view where
the sign in and complete buttons are currently displayed.
## [FIX] planning_field_service: add subtypes
## [FIX] planning: don't generate shifts in multi create when no resource available
Before this commit, when the user wants to create multiple shifts for a
certain resource in the gantt to cover a whole week (weekend included),
the shifts in the weekend will be generated as open shift since the
resource does not work during the weekend. Actually, the shifts should
not be generated in non working day for the resource.
This commit makes sure the shifts are not generated in non working day
of a resource selected.
## [FIX] planning_field_service: facilitate the work of planning manager
Before this commit, the planning manager cannot sign in for one of his
workers in the case, one worker forgot to do it and the intervention is
in the past. Hide price feature does not work correctly because the
check to know if the feature is enabled or not does not take the right
setting (wrong module because the feature has been moved before the
merging the main task).
This commit make sure the sign in button is available even if the
intervention is in the past. Some wordings have been reviewed and fix
typo to correctly check if hide price is enabled or not in the setting
of planning.
This commit also hides some fields for planning user when field service
is enabled in planning to only show the most important information for
the workers.
## [FIX] planning_field_service: add Today filter by default in My Map
## [FIX] planning_field_service: sign-in should recompute end date when needed
Before this commit, since the user can sign in when the shift is in the
past, we need to recompute the end_datetime to make sure the
end_datetime set is not before the start_datetime.
This commit recomputes the end_datetime when the shift is in the past
and the user clicks on sign in since the button will update the start
datetime to current time.
## [FIX] planning{_field_service_worksheet}: fix mobile form view in gantt
Before this commit, the Photos button displayed in the form view in
gantt does not have the same width than the other buttons in the form in
mobile. Moreover, a margin left is added on the first button in the form
view in gantt but in mobile that button is no longer aligned with the
other ones displayed.
This commit fixes those issues to make sure the buttons in the form view
displayed in the gantt view have the same width and the same alignment.
## [FIX] planning_field_service: fix break_time compute
Before this commit, the allocated hours field contained the sum of the
working hours of the human resources when there is at least one human
resource and so the working hours of the material resource assigned on
the intervention is not taken into account. Also, the compute of break
time field does not correctly compute it when there is more than one
resource.
This commit adapts the compute of break time according to the changes
made in the compute of allocated hours.
## [FIX] planning_field_service: hide Sign in button when no customer set
## [FIX] planning_field_service: fix SOL flow when confirming shift and portal
Before this commit, the portal views were not correctly supported the
portal user (missing sudo to find interventions completed and related to
the user which is the customer). A route is not adapted to the new route
in field service feature of helpdesk.
This commit fixes the access error in the portal to make sure the portal
user can access to intervention made for him.
## [FIX] planning_field_service_sale_timesheet: avoid copying SO and SOL
Before this commit, when field service and Billing features are
installed in planning and the user duplicates an existing intervention,
the SO and SOL fields are also copied and so the new materials added to
the new intervention will be added inside the same Sale Orders then the
one copied which is not really expected.
This commit avoid copying SO and SOL when duplicating an intervention
when field service is enabled in planning.
## [FIX] planning_field_service_sale_timesheet: rename label of back button in product
## [FIX] project_timesheet_forecast: fix compute effective hours
Before this commit, when field service and Billing features are enabled
in planning and the user completes an intervention, the allocated hours
and the break time are recomputed when the timesheets are generated for
the intervention, because of the hours recorded could be wrong in the
case the intervention finished after the working schedule of the workers
assigned. The issue is because when a timesheet is created, the
timesheet_ids field is recomputed and recompute effective hours and
allocated hours with other fields. Moreover, timesheet_ids is not stored
and is inside the compute of effective hours and that field is stored
which is not a good practise since the compute of effective hours will
do many write on db since timesheet_ids field will be recomputed each
time we need to read that field.
This commit reviews the compute of effective_hours to no longer depends
on timesheet_ids and makes sure the effective_hours field in
planning.slot are recomputed for the right slots when the employee_id,
date, task_id, project_id and unit_amount field are updated (or when the
timesheet is created). By doing that, that compute will only be computed
when needed.
## [FIX] planning_field_service: add some fields in calendar portal, and some more fixes
This commit adds the new fields added by field service in the planning
portal made for employees without any users to access in the backend.
task-5921961
task-5994180This update optimizes the calculation of sales planning data by ensuring that planning fields are only computed for sales orders directly related to planning activities. Previously, all sales orders were processed, which was inefficient. This change improves performance and resource usage within the sale planning module.
Original PR description
Before this commit, the compute of planning_hours_to_plan and planning_hours_planned fields computes for all SOLs even the ones which are not related to planning. This commit makes sure the both computes calcules the planning field for the SOLs which are related to planning, that is: - SOL is linked to a product with planning_enabled set to True - or at least one planning slot has the SOL set. Issue detected during a fix of migration script of task-5258989
This update automatically deletes task assignment email notifications, preventing them from piling up in the system. Previously, these emails were retained indefinitely, which could impact performance and storage. This change ensures a cleaner and more efficient system.
Original PR description
Task assignment notification emails (sent via message_notify when a user is assigned to a project task) were configured with mail_auto_delete=False, causing them to accumulate in the mail.mail table indefinitely. These are transient notifications that don't need to be retained after sending. Forward-Port-Of: odoo/odoo#251853
Previously, users couldn't search for tasks assigned to them within the Odoo portal. This fix resolves that issue, allowing users to easily find and manage tasks assigned to them directly from the portal interface. This improves efficiency and ensures users can quickly locate and work on their assigned tasks.
Original PR description
Description of the issue/feature this PR addresses: - On the portal task, "Search In Assignees" always returns no tasks. <img width="1482" height="979" alt="Screenshot 2026-02-04 at 23 02 53" src="https://github.com/user-attachments/assets/263429b4-0c32-4323-bf88-2dfaf2115181" /> <img width="1430" height="943" alt="image" src="https://github.com/user-attachments/assets/3c196cc1-f12d-4064-838d-8e29914e5fab" /> Current behavior before PR: - Cannot search for tasks in the portal by assignee. Desired behavior after PR is merged: - Can search for tasks in the portal by assignee. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247239
This update fixes a visual imbalance in the layout of Knowledge articles within the Odoo system. The change ensures consistent spacing on both sides of the editor content, resulting in a more professional and balanced appearance. This improves the overall user experience for viewing and editing articles.
Original PR description
The Knowledge article layout shows a visual imbalance due to asymmetric horizontal spacing in the editor content. This change makes the horizontal spacing consistent on both sides, improving the overall visual balance while maintaining proper spacing and layout consistency. Task-5222643 Forward-Port-Of: odoo/enterprise#108437
This update enhances the payroll system's ability to find worker codes by incorporating DMFA and egov3 codes alongside the previous display name search. This change improves accuracy and efficiency in matching worker codes, streamlining payroll processing.
Original PR description
before when searching for worker code it only used display name now it uses dmfa, egov3 codes Task#6020172
This update resolves a bug that prevented users from deleting employee leave report records within the reporting module. The system was incorrectly attempting to delete a record that doesn't have a corresponding database table. This fix ensures that the delete function works as expected, preventing data inconsistencies.
Original PR description
When the user tries to perform delete operation on the ``hr.leave.employee.report`` model, a traceback appears. Steps to reproduce the error: - Install ``hr_holidays`` module with demo data - Go to > Time Off > Reporting > by Employee > Switch to Graph View - Click on any record > Select any record > Actions > Delete Traceback: ```py UndefinedTable: relation "hr_leave_employee_report" does not exist ``` ``hr.leave.employee.report`` model is ``_auto=False``, meaning that no database table is created for this model. When the user attempts to delete a record of that model, It will lead to the above traceback. sentry-7202115608 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247315
This update fixes a visual issue in the chart granularity select dropdown in Chrome, particularly in dark mode. The changes ensure the icon is clearly visible and horizontally aligned with the label, providing a better user experience. This improves the overall appearance and usability of the dashboard.
Original PR description
## Description of the issue/feature this PR addresses: Current behavior before PR: - In Chrome, the select dropdown showed label and picker icon stacked vertically. - In dark mode, the picker icon was not clearly visible due to a change in picker color. Desired behavior after PR is merged: - Use flex + align-items: center to align label and icon horizontally. - Use a fixed spreadsheet color for the icon to ensure visibility. - Add a transition for smooth picker icon rotation. Task: [5418157](https://www.odoo.com/odoo/project/2328/tasks/5418157) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251100
This update fixes an issue where credential errors were displayed in a confusing format. It also corrects how XML invoices are generated when an OIB (tax ID) isn't provided, ensuring accurate invoice creation. New tests have been added to validate these improvements.
Original PR description
- Credentials errors have a separate format in MER, they should now be displayed in a more user-fiendly manner - Correcting XML generation for partners with no explicit OIB provided - Adding tests for both changes task-none --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252284 Forward-Port-Of: odoo/odoo#249448
This update prevents the appearance of the "...") button in the members panel for regular users. Previously, this button was visible even when users couldn't perform any actions on channel members, leading to an empty popover. This change improves the user experience by removing unnecessary options.
Original PR description
Partial backport of https://github.com/odoo/odoo/pull/246580 Before this commit, the button "..." on channel members was visible even for non-owner / admins. Normal members cannot make any action on members, so there's no point in showing this button: clicking on it shows an empty popover. This commit prevents the showing of this button when member has no actions. Before / After <img width="244" height="223" alt="Screenshot 2026-03-06 at 12 50 59" src="https://github.com/user-attachments/assets/2257e27a-33b3-4c33-94a7-0d81dff3e0a9" /> <img width="244" height="206" alt="Screenshot 2026-03-06 at 12 51 21" src="https://github.com/user-attachments/assets/6da655a3-30b4-430b-bdf6-7c2316674ebc" /> Forward-Port-Of: odoo/odoo#252439
This update fixes an issue preventing the IoT box's Wi-Fi access point from connecting. The problem was resolved by changing the Wi-Fi standard to 802.11a, which is compatible with modern Wi-Fi equipment. This ensures consistent connectivity for IoT box configurations.
Original PR description
Before this commit, the `hostapd` Wi-Fi access point that is started to allow configuring the Wi-Fi network on the IoT box could not be connected to when using the latest images. The exact cause is unknown, but the Odoo code has not changed so it seems to be due to an OS or driver update. After this commit, we set the Wi-Fi mode to 802.11a, which enables modern Wi-Fi standards on the AP, whereas before it defaulted to 802.11b which is the oldest Wi-Fi standard. This change makes the network visible and able to be connected to. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252404
This update allows administrators to view and revoke user sessions, enhancing security and control over access to the Odoo system. The change was implemented to centralize session management and provide administrators with the tools they need to manage user access effectively.
Original PR description
An administrator must be able to revoke other users' sessions. The revocation action has been moved to the `res.session` model. Add the view that allows admins to view user sessions and revoke them. Task-5941823 Forward-Port-Of: odoo/odoo#248813
This update resolves several issues impacting the AI chatbot functionality, specifically related to prompt management and voice transcription. The fixes ensure users can correctly define prompts for AI interactions and address errors preventing public users from accessing the AI chat, improving overall AI performance and reliability.
Original PR description
This PR fixes the following bugs: - After 2acc117, users have the ability to define prompts for ai.prompt.button records instead of using the name field as the prompt. However, the VoiceTranscription component wasn't updated to use the new prompt field. - The _render_prompt method should return the `name` of the `ai.prompt.button` if no `prompt` is defined or no `rendering_record` is passed to the method. However, this check didn't take into account that `prompt` may contain empty HTML, for example `Markup(<p></p>)`. - Accessing render_model field on `ai.prompt.button` records raises AccessError. - An error would occur if a public user (or portal) tried to chat with the AI using the live chat. - The composer retrieved by the `TranscriptionComponent` doesn't take the model of the current record into consideration.
This update resolves a problem that prevented users from creating spreadsheets with date filters. The issue occurred when the 'Spreadsheet Account' module was active. This change ensures the system correctly handles spreadsheets without the 'Spreadsheet Account' module, improving spreadsheet functionality.
Original PR description
Steps to reproduce: - Install Spreadsheet and Accounting - If `spreadsheet_edition_account` is installed, uninstall it - Go to Spreadsheets, create a new one and add a "Date" global filter => Traceback This commit fixes the issue by handling the case where no fiscal year is not installed. Task: 6002612 Forward-Port-Of: odoo/odoo#251919
This update optimizes the process of linking analytic lines to invoices during reinvoicing. Previously, the system always performed a search for analytic lines, even when no related sale order lines existed, leading to unnecessary queries. Now, the system directly returns an empty recordset when no reinvoicable sale order lines are found, improving performance and efficiency.
Original PR description
Description of the issue/feature this PR addresses: When retrieving analytic lines to link for reinvoicing, the method performs a search even when there are no reinvoicable sale order lines associated with the invoice lines. Current behavior before PR: The method always executes an account.analytic.line search using the domain returned by _analytic_line_domain_get_invoiced_lines, even when no reinvoicable sale order lines are found. This results in an unnecessary query that will always return an empty recordset. Desired behavior after PR is merged: If no reinvoicable sale order lines are found, the method directly returns an empty account.analytic.line recordset, avoiding the extra query and slightly improving performance. part of: https://github.com/odoo/enterprise/pull/108685 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update prevents invoice generation errors when subscriptions include both standard products and timesheet-based services. The fix ensures that invoices can be created correctly even if a timesheet service hasn't been delivered, avoiding a previous crash. This improves the reliability of subscription invoicing.
Original PR description
**Issue:** When generating an invoice for a subscription that contains a mix of regular products (invoiced on order) and timesheet-based services (invoiced on delivery), a traceback can occur if the…
**Issue:** When generating an invoice for a subscription that contains a mix of regular products (invoiced on order) and timesheet-based services (invoiced on delivery), a traceback can occur if the timesheet service has 0 delivered quantity. **Cause:** During the invoice creation process, `_get_reinvoiced_analytic_lines_to_link` iterates over the newly created invoice lines to link analytic lines. It filters the linked sale order lines using `_is_line_reinvoicable()`. If the invoice only contains standard products (because the timesheet line was skipped due to 0 delivery), `so_lines` evaluates to an empty recordset. then calling `_get_range_dates` causes a treace beack because it needs to ensure that ther is at least 1 order `self.ensure_one()` **Fix:** Added a safeguard (`if not so_lines: continue`) inside the loop. If an invoice line does not contain any reinvoicable sale order lines, it is now safely skipped, allowing standard subscription lines to be invoiced alongside undelivered timesheet lines without crashing. task: 5966725
This update resolves an issue where autofilling pivot formulas in certain situations caused errors and incorrect data formatting. Specifically, it prevented crashes and ensured that positional formulas worked as expected when referencing dimensions perpendicular to the header. This enhancement improves the reliability and accuracy of pivot table reports.
Original PR description
If we autofill a positional pivot formula in the dimension perpendicular to the positional header, it would not work correctly: - We would crash if the position wasn't in the original pivot table - We would drop the positional part otherwise (`"#country_id", 1` would become `"country_id", 25`). Task: [5909266](https://www.odoo.com/web#id=5909266&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form)
This update resolves a technical issue preventing the correct display of sales timesheet slots within the planning module. The fix ensures that the planning module integrates seamlessly with the sale timesheet, improving the accuracy of time tracking data. This resolves a minor visual discrepancy.
Original PR description
Steps to reproduce: - Install sale_timesheet & planning; - Install planning_field_service_sale_timesheet; Traceback: Element `'<xpath expr="//field[@name='project_id']">'` cannot be located in parent view This commit fixes the inheritance of the planning.slot tree views.
This update ensures the background color of the 'Discuss' dropdown in the Odoo dark theme matches other dropdowns, resolving a visual inconsistency. Previously, the 'Discuss' dropdown had a darker background than other dropdowns in dark mode. This change improves the overall user experience and visual consistency across the Odoo platform.
Original PR description
Before this commit, background of dropdown discuss actions in dark theme were darker than other dropdown in web client. This comes from https://github.com/odoo/odoo/pull/247352 that harmonized NotificationSettings bg with discuss dropdown bg, by changing discuss dropdown BG to match NotificationSettings. However, the inverse should have been done, which is what this commit does. Before / After <img width="1241" height="810" alt="Screenshot 2026-03-09 at 16 30 10" src="https://github.com/user-attachments/assets/d1b1d201-a175-4f34-b95b-999126616a98" />
This update resolves an issue where chatbot session names weren't displayed correctly in live chat and triggered errors when used with the website editor. The fix ensures the chatbot's name is accurately displayed and prevents a crash caused by conflicting channel operations, improving the overall chatbot experience.
Original PR description
*=test_discuss_full Before this PR: - When starting a session with a chatbot, the name of conversation is not visible on livechat channel. Because the name is computed from agent/customer history and not from bot history. - Using a chatbot while the website editor is active could trigger a TypeError traceback. This PR: - computes the name properly from bot history. - adds a guard that closes the transient channel Steps to reproduce traceback: - go to localhost:8069/@/contactus - start chatbot and select some answer - receive traceback task-[5881970](https://www.odoo.com/odoo/project/1519/tasks/5881970)
This update resolves an issue where navigating back from the message search panel on mobile devices resulted in a technical error (traceback). The fix ensures a smooth navigation experience by correctly handling back button presses within the search panel, aligning with established design patterns for similar components. This improves usability for mobile users.
Original PR description
...in mailboxes on mobile * = crm_livechat, im_livechat Enterprise PR: https://github.com/odoo/enterprise/pull/110150 Before this commit, navigating back from a mailbox message search panel on mobile would result in a traceback. Steps to reproduce: 1. Open Discuss on mobile 2. Navigate to bookmarks in bottom bar 3. Open message search 4. Navigate back -> traceback This happens because the `useBackButton` in ActionPanel registers a callback function taken from the env. Said function is missing when the ActionPanel is mounted outside of a chat window or meeting view. This commit fixes the issue by adding a `close` props to ActionPanel, and using that as a callback for back navigation. This is an established pattern for similar closable components like Popover, Dialog and EmojiPicker. task-6013922
This update fixes a bug on mobile devices where navigating back from the message search panel in Live Chat would cause an error. The fix ensures a smoother user experience by correctly handling back navigation within the ActionPanel component, aligning with established design patterns.
Original PR description
...in mailboxes on mobile community PR: https://github.com/odoo/odoo/pull/252512 Before this commit, navigating back from a mailbox message search panel on mobile would result in a traceback. Steps to reproduce: 1. Open Discuss on mobile 2. Navigate to bookmarks in bottom bar 3. Open message search 4. Navigate back -> traceback This happens because the `useBackButton` in ActionPanel registers a callback function taken from the env. Said function is missing when the ActionPanel is mounted outside of a chat window or meeting view. This commit fixes the issue by adding a `close` props to ActionPanel, and using that as a callback for back navigation. This is an established pattern for similar closable components like Popover, Dialog and EmojiPicker. task-6013922
This update resolves an issue preventing users from generating reports in the Belgian Payroll module. The fix automatically saves the data before report generation, addressing a technical error that caused failures. This ensures consistent and reliable report creation for users.
Original PR description
**Steps to reproduce:** - Open Belgian Payroll - From Reporting Menu select 274.XX Sheets - Create New Sheet - Select a Year and a month with Eligible Employees > 0 (for the Generate dropdown to be enabled) - Press Generate button and then try to generate any form (do this directly without pressing save manullay button) **Issue:** The generation of any form (PDF, XML, XLSX) fails due to the receive of an empty self. **Fix:** If the user tried to generate the reports without saving, do an automatic save internally before attempting to generate the reports in the backend. task-5936740
This update resolves an issue where deleting an account move in the l10n_sa module could trigger a crash. The fix addresses a problem within the system's attachment handling, preventing errors when removing associated records. This ensures smoother operation and prevents data loss during account move deletion.
Original PR description
Since https://github.com/odoo/odoo/pull/242777 the deletion of an account.move may crash. Indeed, the deletion of the move delete its corresponding attachments, and ir.attachment has an ondelete method that checks the attached move, namely _unlink_except_posted_pdf_invoices(). The method checks some condition on the corresponding moves, which have just been deleted, hence raising a MissingError. runbot_build_error-237850 Forward-Port-Of: odoo/odoo#252808
This update fixes an issue where accrual calculations for stock-based orders were inaccurate, particularly when orders were partially delivered. Now, accrual lines are created separately for each sale order line, providing a more precise accounting of invoiced and delivered quantities and their associated unit prices. This ensures accurate financial reporting for sales and purchase orders involving stock.
Original PR description
### [FIX] (stock_)account: cost method
> Before this commit, we tried to access to `product.product` `cost_method` field in `account` module.
> The issue is: this field is defined in `stock_account` which means we can try to read an unexisting field if we try to generate accruals from a sale order or a purchase order without `stock` installed.
>
> This commit creates an helper method, overrided in `stock_account`, to avoid this issue.
### [FIX] account: split stock variation accrual lines
> Before this commit, accrual lines created for stock variations in case of already incoived not delivered quantities were summed together.
> This commit keeps them separate: one line by sale order line.
>
> Also, those lines' label is rewritten to be more specific, giving the amount of invoiced and delivered qties, and with what unit price.
task-5934232
Forward-Port-Of: odoo/odoo#250408This update fixes an issue where payslips weren't being created correctly for employees with flexible working hours. The change ensures that work entries are generated for all employees, regardless of their working hours configuration, leading to accurate payroll calculations. This resolves a previous error impacting employee pay reporting.
Original PR description
**Version:** - 19.0 **Steps to reproduce:** - Create an employee. - Leave the Working Hours field empty. - Set the contract dates and a wage. - Create a payslip using the smart button. **Issue:** - Worked day lines are empty for flexible employees when the payslip is created from the smart button. **Cause:** - Flexible employees were being skipped because their working hours were empty, which results in work entries not being generated. **Solution:** - Updated the condition to also generate work entries for flexible employees. Task-5431870 Forward-Port-Of: odoo/enterprise#109497 Forward-Port-Of: odoo/enterprise#103101