Monday, January 12, 2026
32 changes · saas-19.1
Resolved issues and error corrections
A bug was causing the timer to malfunction when switching between views with sample timesheet data. This update ensures all sample records have their timers paused, preventing data conflicts and improving the reliability of the timesheet display. This resolves a technical issue impacting user experience.
Original PR description
Steps to reproduce: - Open Timesheets app, - Click on search(magnifying lens) to open on cell with no records. - Let sample record be loaded. Issue: - Timer is already started. If you switch back to grid view and stop the time it throws traceback as it has data of sample records. Reason: - The sample records can have record states that are running. Fix: - Make sure all the sample records created have their timer paused using field `is_timer_running`. - Update condition in time display to check if time is running instead using `is_timer_running` not using `time_start` and `time_pause` as `time_pause` is not an active field. task-5267303 Forward-Port-Of: odoo/enterprise#102035
A recent issue preventing the completion of a key tour test for holiday allocation has been resolved. The problem stemmed from an empty leave type value causing form saving failures and timeouts. The fix ensures a valid leave type is always selected, guaranteeing the tour test runs successfully and accurately demonstrates the holiday allocation process.
Original PR description
Step to reproduce: - Install hr_holidays. - Run the time_off_allocation_warning_tour tour test. - The following error occurs: '(.o_form_readonly, .o_form_saved) has not been found. TIMEOUT: step failed to complete within 10000 ms'. Cause: - The leave type value is coming empty, causing the form to fail to save and resulting in a timeout. Fix: - Ensure holiday_status_id picks a valid leave type from selector. - Provide start dates and set the end dates to check the functionality. Task - 5264183 Forward-Port-Of: odoo/odoo#236639
This update resolves a technical issue within the HTML editor that could cause errors when content is completely removed after being inserted. The fix ensures the editor doesn't attempt to set a selection on a node that no longer exists in the DOM, improving stability and preventing unexpected errors. This primarily impacts the user experience when pasting and editing content.
Original PR description
During an `DomPlugin.insert`, the inserted content is added. Then some transformations are applied to clean up, including the removal of some nodes which are inventoried into `candidatesForRemoval`,…
During an `DomPlugin.insert`, the inserted content is added. Then some transformations are applied to clean up, including the removal of some nodes which are inventoried into `candidatesForRemoval`, and some specific `<br>` nodes. Ultimately, the selection is set after the last inserted node. In some cases, none of the inserted content remains after the clean up. When this happens, the selection is being set after the last inserted node, which is not part of the DOM anymore, and therefore leads to an error. This commit prevents this from happening by detecting when all inserted content was actually already removed. Steps to reproduce: - In a plain web page, copy a <br> into the clipboard - In an editor, put a character on a line - Paste => An error popup was displayed task-5429909 [FIX] html_editor: avoid failing when selection nodes are disconnected This commit addresses a traceback that was spotted but for which the actual scenario remains undetermined. The only possible way this traceback may occur is if nodes inside a selection are disconnected. The test added by this commit produces the same traceback as the observed one. task-5429909 Forward-Port-Of: odoo/odoo#242941 Forward-Port-Of: odoo/odoo#242488
This update resolves an inconsistency in the SLSP reports by standardizing the order of data lines within the reports. Previously, test failures occurred due to varying data presentation. Adding a default order by clause to the SQL queries ensures a consistent and reliable report output.
Original PR description
A recent test was added that tests the lines of the SLSP reports. Up until now, all tests were either testing specific lines (not the report structure) or the export, which uses different queries. This new test is now failing inconsistently due to the order in which the data is being displayed. We add default orderby in SQL queries of the SLSP (using the models default orderby) in order to make the order consistent and avoid further issues.
This update resolves a bug where image styles (like width and transform) were incorrectly applied to new media types after an image was replaced. Now, styles are automatically cleared when switching between image and other media types, ensuring consistent and accurate media display.
Original PR description
**Current behavior before PR:** - When an image had styles applied to it (such as transform or width) and was replaced with another media type like an icon or document, those styles were incorrectly carried over to the replaced media. **Desired behavior after PR is merged:** - Since transform and width styles are meant to apply only to images, they are now removed when an image is replaced with other media types. task-5373362 Forward-Port-Of: odoo/odoo#240284 Forward-Port-Of: odoo/odoo#238319
This update clarifies the call settings interface for users who have muted participants. Previously, the interface was confusing, showing the 'deafen' icon with the 'unmute' label. Now, only the 'undeafen' button is displayed when a participant is muted, providing a clearer and more intuitive experience.
Original PR description
Before this commit, the hint in the call settings was not taking into account if it was deafen or mute. On top of that the icon in the menu was showing the deafen icon but with the unmute label. When deafened, this was redundant with the undeafen button as well since unmute and undeafen are practically doing the same thing. Now, when deafen is activated, only the undeafen button is shown in the call menu and the hint in the call actions is undeafen not unmute. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242519
This update resolves an issue that could cause errors during the removal of certain Odoo modules. The changes ensure that data is handled correctly when a module is deleted, preventing potential data loss or system instability. This improves the overall reliability of the Odoo Enterprise platform.
Original PR description
Companion of https://github.com/odoo/odoo/pull/242777
This update ensures that all MOA (Monthly Accounting) values within the French accounting module are positive integers. Previously, the system could generate negative values, which caused errors. This change improves data accuracy and reliability for French tax reporting.
Original PR description
All MOA fields should be positive integer. task-5380637 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242976 Forward-Port-Of: odoo/odoo#239587
This update corrects a discrepancy in the calculation of employment bonuses for the Belgian payroll module (l10n_be_hr_payroll). The changes ensure bonus calculations are accurate up to March 2026, aligning with the latest tax regulations. This update maintains accurate financial reporting and compliance for businesses using this module.
Original PR description
Forward-Port-Of: odoo/enterprise#103820
This update fixes an issue where the timesheet timer wasn't correctly associated with the task being worked on. The fix ensures the timer uses the correct task or project from the list view, providing a more accurate and user-friendly timesheet experience. This prevents timesheets from being incorrectly linked to the user's favorite project.
Original PR description
### Issue: When looking at the list of timesheet for a task, we can start the time but the timer have default values that don't correspond to the task. ### Cause: `startTimer` in the `timesheetTimerService` is called from the timesheet timer hook without vals. It then makes an orm call to `action_start_new_timesheet_timer` to retrieve the fields (project or task) but as nothing is given in the vals, the selected project is the one returned by `_get_favorite_project_id()`. ### Solution: Get the context of the list view to retrieve the task or the project and input it in `vals`. opw-5342525 Forward-Port-Of: odoo/enterprise#102152
This update corrects a technical issue that prevented users from accessing bank accounts correctly when signing contracts within the HR module. The fix ensures a smooth and reliable process for managing contract signatures and associated banking permissions. This resolves a potential disruption to business operations.
Original PR description
Forward-Port-Of: odoo/enterprise#103807
This pull request addresses an issue with the way absences are managed within the HR Work Attendance module. The fix ensures accurate tracking and reporting of employee absences, improving the reliability of HR data. This update resolves a technical bug impacting the core functionality of this module.
Original PR description
Task: 5470030 Forward-Port-Of: odoo/enterprise#103781
This update resolves an issue where empty popups remained open and displayed incorrect options after content was removed. The fix ensures that popups are correctly closed when empty, preventing errors and improving the user experience. This improves the reliability of the website builder.
Original PR description
**Descripion of the problems** When the content of a popup is deleted, two problems happen: 1. The popup stays open displaying an empty white rectangle. 2. Options relative to the last removed…
**Descripion of the problems** When the content of a popup is deleted, two problems happen: 1. The popup stays open displaying an empty white rectangle. 2. Options relative to the last removed element are still displayed and produce an error if the user interacts with them. **How to reproduce** Drop the snippet `s_popup`, and remove the "Block" element. Problems: 1. the popup is still open but empty, 2. the "Block" options are still displayed. **Origin of the problems** Problem 1 happens simply because nothing takes care of removing empty popups. Problem 2 happens because `RemovePlugin.removeCurrentTarget` set the `nextTargetEl` without first checking if the element is activable or not. Thus, when removing the last block in a popup, the next target is set to the `.o_we_no_overlay` close button, despite it being not activable. As a result, when `BuilderOptionsPlugin.updateContainers` is called, it does not update containers because the target is not activable. Thus, the "Block" options are still displayed despite the element being removed. **Fix** Both problems are fixed by changing `RemovePlugin.isEmptyAndRemovable` such that empty popups are marked as removable. task-5401692 Forward-Port-Of: odoo/odoo#242377 Forward-Port-Of: odoo/odoo#239507
This update fixes minor inaccuracies in the German Point of Sale (POS) reporting process by ensuring the correct net value is used for pricing and by sending amounts as strings to the payment processor, Fiskaly. The changes also improve rounding precision to meet Fiskaly's requirements, and adjust order amounts for customer payments.
Original PR description
In this commit: ------------------ - Transferred **net value** instead of **gross value** for `price_per_unit`. - Included **cash statement business cases** that were prepared earlier but not sent to Fiskaly. - Ensured all **amount fields are sent as strings** to Fiskaly. - Fixed rounding precision using `toFixed()` to maintain **2–5 decimal places**, as required by Fiskaly (e.g., `4.70` should not become `4.7`). - Adjusted logic for **customer account payments** to send the **adjusted order amount** instead of the original total. task: 5122652 Forward-Port-Of: odoo/enterprise#99643
This update fixes an issue where refund alerts in the Point of Sale (POS) system could be triggered incorrectly due to rounding differences in order totals. The change ensures that the system accurately compares refund amounts against original order amounts, preventing false alerts and improving the reliability of the POS system. This update enhances the accuracy of financial reporting within the POS module.
Original PR description
Before this commit, if the total amount of the order had rounding differences compared to the sum of its lines, the system could incorrectly trigger an alert stating that the refund amount exceeds the original order amount. This was due to a direct comparison between the two amounts without considering potential rounding issues. opw-5402240 Forward-Port-Of: odoo/enterprise#103758 Forward-Port-Of: odoo/enterprise#102224
This update resolves a technical issue that caused warnings and potential crashes when searching for delayed production orders in the Manufacturing Orders list view. The change ensures the filter functions correctly and avoids future compatibility problems with Odoo's database system.
Original PR description
Issue before this commit: ========================= Searching for Delayed Productions in the MRP list view triggered: - A deprecation warning in saas-18.4 → 19.0: `warnings.warn("Since 19.0, use…
Issue before this commit:
=========================
Searching for Delayed Productions in the MRP list view triggered:
- A deprecation warning in saas-18.4 → 19.0:
`warnings.warn("Since 19.0, use Domain.custom(to_sql=lambda model, alias, query: SQL(...))", DeprecationWarning)`
- A traceback in master:
`Failed to cast TableSQL('mrp_production', -, None).date_finished into a datetime`
Steps to Reproduce:
=========================
- Install mrp module.
- Open the Manufacturing Orders list view.
- Filter by Delayed Productions.
- Observe the warning (saas-18.4 → 19.0) or traceback (master).
Cause of the issue:
=========================
Recent ORM changes in [PR](https://github.com/odoo/odoo/commit/f811af2c52df798b6ba0fc18e3f45944abdb7a12) disallow using raw SQL expressions as values inside normal domains.
Only Domain.custom() is permitted for injecting custom SQL.
The previous _search_is_delayed implementation used a deprecated pattern,
which caused the warning in current versions and a crash in the master version.
With This Commit:
=========================
- Rewrite the delayed production filter using Domain.custom() to safely generate the SQL.
- Preserve functional behaviour: the filter still returns delayed productions correctly.
- Avoid deprecation warnings and prevent traceback.
TaskID:- 5404547
Forward-Port-Of: odoo/odoo#243134
Forward-Port-Of: odoo/odoo#239574This update resolves a problem where the sign flow's dropdown menu wouldn't display all available styles correctly. Previously, users had to wait for a background process to complete before selecting options, leading to a limited selection. This change ensures all styles are consistently available in the dropdown.
Original PR description
In this tour, when we want to select the third dropdown item in style list menu, we must wait that the rpc get_fonts/ is done, or else, it has only one item in the menu. When the menu is opened before the call is completed, there is only one style. When it is opened after, there is all styles loaded. runbot-error-id~232652 Forward-Port-Of: odoo/enterprise#103813
This update corrects a display issue where the CFDI button was incorrectly shown on payruns that didn't meet Mexican tax requirements. The change ensures the button only appears for payruns containing Mexican payslips, improving the user experience and preventing unnecessary complexity. This fix enhances the accuracy of payroll reporting.
Original PR description
Before this commit, the computed fields `l10n_mx_cfdi_primary` and `l10n_mx_cfdi_secondary` would return True for payruns containing only non-Mexican payslips. This happened because `all()` returns True for empty iterables, causing the CFDI button to appear on payruns that have no Mexican payslips. This commit: - Adds explicit check for Mexican payslips existence before evaluating the CFDI state conditions - Hides `l10n_mx_edi_cfdi_origin` field for non-Mexican payslips - Adds test coverage for CFDI visibility on non-Mexican payruns task-5478038
This update resolves an issue where the attendance app would crash when an employee didn't have a linked calendar. The fix ensures the app handles employees with flexible schedules properly by skipping calendar periods when a calendar isn't assigned, aligning with existing flexible calendar functionality.
Original PR description
Steps to reproduce: - Create an employee - Remove the calendar to have fully flex - Open the attendance app -> traceback When an employee has no resource calendar (resource_calendar_id=False), the _gantt_unavailability method would crash with a TypeError when trying to create a ZoneInfo from calendar.tz (which is False/None). This fix adds a check to skip calendar periods where the calendar is not set, consistent with how flexible calendars are already handled. task-5462208
This update removes a confusing and unnecessary filter option (Templates) from project selection screens in other apps. Previously, the filter appeared globally due to a shared search view. This change simplifies the user experience and ensures consistency within the project module.
Original PR description
**Steps to reproduce:** - Open the Planning app or any app where project_id field - Click New - Click on the Project field - Click Search More - Look at the search filters - The Templates filter is visible **Issue:** The Templates filter shows up when choosing a project from there, even though it is not useful there. **Cause:** They uses the same project search view as the main project app, so the templates filter appears everywhere. **Fix:** Add a condition check in filter to make invisible in other module and show only in project. **Dev Notes (sale_project):** The context was already used for milestone display name computation, but it was missing in the sale_project override. Due to this, when Project Stages were enabled, the milestone display name did not include the deadline. task-5255295 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241797
This update fixes an issue where milestone deadlines weren't shown in the Project list view. The fix ensures that milestone names now accurately include the associated deadline, providing users with clearer project timelines. This improves the usability of the Industry FSM module for project management.
Original PR description
**Steps to Reproduce:** - Install the Industry FSM module. - Navigate to Project Configuration. - Enable Milestones. - Go to the Project list view. - Observe that the Next Milestone does not display the deadline along with the milestone name. **Issue:** The milestone display name is incomplete and does not include the deadline date. **Cause:** The required context was not passed in the overrided action's context, so the display_name computation did not add the deadline to the milestone name. **Fix:** Pass the appropriate context in the action to correctly compute and display the name along with its deadline. Task: 5255295 Forward-Port-Of: odoo/enterprise#103157
This update fixes a visual issue where long product names in the combo configurator popup caused misalignment of product cards. The change ensures all product cards remain consistently aligned and sized, regardless of the length of their names, improving the overall user experience and consistency of the configurator.
Original PR description
Before this commit: ================= Product cards with long names caused a slight vertical misalignment in the combo configurator popup, resulting in inconsistent card sizes within the grid. After this commit: ================== Ensure all product cards remain uniformly aligned and maintain consistent dimensions in the combo configurator popup, even when product names are long. Task:5447320 Forward-Port-Of: odoo/odoo#243089 Forward-Port-Of: odoo/odoo#241720
This update resolves an issue where using many2many filters with archived records caused errors. The fix ensures that the system gracefully handles inactive records, preventing exceptions and maintaining filter functionality. This improves the stability and reliability of the calendar view.
Original PR description
Description of the issue/feature this PR addresses: In fa56409 support was added for many2many filters in the calendar arch. Since X2many fields use the many2one formatter (see makeFilterDynamic) filters need to be passed in the following format [id, display_name]. Since x2many records are not automatically fetched in this format fa56409 added an additional step wherein colors and display names are fetched (by calling searchRead) and filters are properly formatted. An issue arises though if a record is archived and therefore not found by searchRead. In this case the filter will not be properly formatted and formatMany2one will raise an exception. Current behavior before PR: Using a x2many filter with an archived record raises an exception. Desired behavior after PR is merged: Using a x2many filter with an archived record will not raise an exception. (ref: #241522) Forward-Port-Of: odoo/odoo#243030
This update corrects a mistake in how taxes are aggregated for the French (l10n_fr) version of Odoo. Specifically, a calculation error in 'box 15_1' was identified and resolved. This ensures accurate tax reporting for French businesses using Odoo.
Original PR description
During this commit: https://github.com/odoo/odoo/commit/869f80b466ec2246f27e11fa823eb32ac664fb01 we made a mistake in the box 15_1. no task id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243099 Forward-Port-Of: odoo/odoo#243013
This update prevents non-administrator users from accessing the Discuss settings. Previously, they would receive an error message when attempting to change configuration options. Now, the settings menu is hidden, ensuring that sensitive configuration options are only accessible to authorized administrators.
Original PR description
**Steps to reproduce:** Open Discuss > Configuration > Settings. **Current behavior before PR:** Non-admin users encounter an access error when clicking 'Settings'. **Desired behavior after PR is merged:** The 'Settings' menu item is now hidden for users who are not part of the 'Role / Administrator' group. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a technical issue where the test button on the IoT device dashboard incorrectly reported successful connections even when errors were present. The fix standardizes the data format used for IoT device status checks, ensuring accurate reporting and a more reliable user experience. This improves the overall stability of the IoT integration.
Original PR description
This commit fixes several situations where a positive status would be given by the test button despite the presence of an error: - If the websocket connection was used but there was a timeout - If the websocket connection was used but there was any other error - If any 6-digit error code was returned when using the stable IoT box To fix these issues, we stop using the `data['message']` field, since it gets ignored by the websocket confirmation controller. We now use the same result format as the other requests (and the stable IoT box). We also add a check for the `"timeout"` that we receive when a websocket request times out. Forward-Port-Of: odoo/enterprise#103861 Forward-Port-Of: odoo/enterprise#103817
A bug preventing the 'Total Cost' field from appearing in pivot views within the Stock reporting module has been resolved. This update corrects a technical issue related to how data aggregation was handled in pivot views, ensuring the reporting functionality works as expected. This fix improves the usability of the Stock reporting feature.
Original PR description
Steps to reproduce: 1) Make sure "Developer mode" is on, go to "Inventory" -> "Reporting" menu -> "Stock" 2) Click "bug" icon -> select "Action" -> add "pivot" to "View Mode" field 3) Refresh page…
Steps to reproduce: 1) Make sure "Developer mode" is on, go to "Inventory" -> "Reporting" menu -> "Stock" 2) Click "bug" icon -> select "Action" -> add "pivot" to "View Mode" field 3) Refresh page and go back to "Stock" report 4) Go to "pivot" view -> click "Measures" -> select "Total Cost" Expected behavior: The field should be added to the view as an aggregate. Current behavior: An error is thrown, due to a bad SQL query. This is because previously, pivot views used `_read_group` to fetch the data, but now after #194413, it uses the new method `_read_grouping_sets` instead. The issue was that the SQL-computed fields defined in `product_margin` were handled in a special way in an override of `_read_group`. However, when `_read_grouping_sets` was introduced, their special implementation was not implemented, so aggregating on any of those special fields, resulted in a broken SQL query. This commit fixes this issue by overriding `_read_group_sets` for those sepcial fields in a similar way to `_read_group`. opw-5345013 Forward-Port-Of: odoo/odoo#238679
This update fixes a minor discrepancy in sales order tax calculations, specifically when discounts are applied. Previously, a small tax difference ($0.01) could appear in the order total due to a discount. The fix ensures that the tax delta is correctly distributed even with zero tax totals, improving overall financial accuracy.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Set tax rounding to "Round Globally"; 2. create a 19.99% tax; 3. create a new sales order; 4. add a line with a $19.99 unit price & 19.99% tax; 5. add a second line with identical values; 6. apply a 100% global discount (-$38.98 subtotal, -$47.97 total). Issue ----- The order total is $0.01 due to VAT. Cause ----- The `_round_tax_details_tax_amounts` method distributes the "tax delta" across the tax details, but currently it only does this if there's a non-zero target tax amount. In our scenario, we have a $0.01 tax delta, but because our tax total is $0.00 due to the 100% discount, the delta doesn't get distributed, leading to the $0.01 difference not getting corrected. Solution -------- When deciding whether to distribute a tax delta, check the tax delta value instead of the target tax amount. opw-5345538 opw-5097907 Forward-Port-Of: odoo/odoo#243172 Forward-Port-Of: odoo/odoo#240633
A bug in the website tour testing process was causing tests to fail due to snippets being dropped into open popups. This update ensures that popup snippets are automatically removed after being dropped, resolving the issue and improving test reliability. This prevents disruptions to the website tour experience.
Original PR description
**Problem** Before this commit, the tour `test_03_snippets_all_drag_and_drop` could fail with the error `Element (:iframe .o_snippet_preview_wrap[data-snippet-id="s_popup"]) has not been found`. The failure was reproducible locally and appeared non-deterministically on runbot. **Cause** The tour steps could occasionally execute too quickly, leading to non-determinist behavior where snippets were dropped inside a popup that had been inserted but not yet closed. When the dropzone is inside an open popup, some snippets (e.g. `s_popup`) are excluded from the Snippet Viewer, resulting in the error reported above. **Solution** The tour flow is modified such that popup snippets are removed after being dropped, as already happens for every other snippet category. This completely removes the risk that new snippets are dropped into a popup. runbot-233328 Forward-Port-Of: odoo/odoo#242231
This update fixes an issue where inline code blocks wouldn't fully disappear when deleting the last character. Now, removing the final character of an inline code block correctly removes the code style and the block itself, improving the user experience when editing text with code snippets. This ensures consistent formatting and cleaner content.
Original PR description
Text formatted as inline `<code>` (between backticks) is very difficult to remove in some situations, typically at the beginning of a list entry. This commit solves this by removing the code style when its last character is removed. Steps to reproduce: - Create a list - Type some inline code - Put the cursor in the middle - Press Enter - Type some text after the inline code on the second line - Try to remove the inline code from the second line using backspace => The line is removed before the code style disappears task-5375140 Forward-Port-Of: odoo/odoo#240805 Forward-Port-Of: odoo/odoo#238552
This update fixes a minor issue in the HTML editor's testing process. The previous method sometimes duplicated selection actions, leading to inconsistent test results. This change ensures the selection process is more reliable and accurate, improving the overall stability of the HTML editor.
Original PR description
The `simulateArrowKeyPress` method used in hoot tests performs both an actual `press` and modifies the selection. However, in some cases, the `press` already updates the selection because of our own listeners, which leads to a selection similar to performing the action twice. This commit avoids this by making sure the default `press` did not get prevented by our own custom listeners before modifying the selection. task-5438683 Forward-Port-Of: odoo/odoo#243108 Forward-Port-Of: odoo/odoo#241604
This update clarifies the terminology used for payroll input types, renaming 'Other Input Types' and 'Payslip Other Input Types' to 'Salary Input Types'. This change enhances user understanding and simplifies the payroll configuration process, improving overall usability.
Original PR description
Updated the Input type for better clarity and easier understanding for users: - '**Other Input Types**' : 'Salary Input Types' - '**Payslip Other Input Types**' : 'Salary Input Types' **task-5474028** Forward-Port-Of: odoo/enterprise#103632