Tuesday, September 23, 2025
19 changes · saas-18.4
Resolved issues and error corrections
Changing a linked to-do item between numbered and bulleted lists no longer causes an error. The editor now cleans hidden formatting characters before saving the text selection, making list formatting more reliable for users.
Original PR description
Steps to Reproduce: 1. Go to To-Do 2. Create a link 3. Select all using Ctrl + A 4. Switch to order list and then unordered list. 5. Traceback occurs Description of the issue: - This issue occurs because a feff (zero-width no-break space) character is present inside the link. When the link is inside a list and the list type is changed, the `removeFEFF` method is triggered. `removeFEFF` removes the feff characters, but the selection is preserved based on positions from when those feffs were still present inside the link. As a result, after the list type is changed, restoring the selection causes a traceback. Solution: - Triggered `clean_handlers` before preserving the selection. This ensures feff characters are removed from the link before the selection is preserved, preventing invalid selection offsets and avoiding the traceback. task-5095561 Forward-Port-Of: odoo/odoo#227680
This update corrects the date used in a product margin test so automated checks reflect the intended business scenario. It helps keep margin-related quality checks stable and reduces the risk of false test failures during releases.
Original PR description
runbot-230719 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227210 Forward-Port-Of: odoo/odoo#226089
Timesheet reports printed from sales orders now show the related helpdesk ticket name alongside the helpdesk team. This makes billed support work easier to identify and verify for customers and internal teams.
Original PR description
to reproduce: ============= 1. make helpdesk team billable and records timesheets 2. create a helpdesk ticket and link it to a sale order 3. log timesheets on the ticket 4. print the timesheet report…
to reproduce: ============= 1. make helpdesk team billable and records timesheets 2. create a helpdesk ticket and link it to a sale order 3. log timesheets on the ticket 4. print the timesheet report **from the sale order** -> the task column will contain only the helpdesk team name, while it should contain "helpdesk team / ticket name" Problem: ======== in helpdesk_timesheet we inherit `hr_timesheet.timesheet_table` to adapt it to helpdesk tickets, but we use `show_ticket` to display the ticket name, which is only set in `hr_timesheet.report_timesheet` and `hr_timesheet.timesheet_project_task_page` but not in `sale_timesheet.timesheet_sale_page` which is the one used when printing the report from the sale order. Solution: ========= `show_ticket` should be set with value `bool(lines.helpdesk_ticket_id)` which is equivalent to `line.helpdesk_ticket_id` in the t-if condition. so we can directly use `line.helpdesk_ticket_id` and remove the `show_ticket` variable. opw-5002650 Forward-Port-Of: odoo/enterprise#95179
Flexible employee shifts that span multiple weeks now show only the hours allocated to the selected week in the Planning Gantt progress bar. This prevents overstated workload figures and gives managers a clearer weekly capacity view.
Original PR description
### Steps to reproduce: - Install Planning app - Create a shift for a flexible employee that starts on Friday and end on the following Tuesday for example - Go to the gantt view for the week that the shift should start at - Notice the progress bar is showing the whole allocated hours not just the week's hours ### Cause: This mainly happening because when the employee is flexible we are getting the value by multiplying the hours_per_day of his schedule by the period.days and the period is the shift period ### Fix: We use the interval we are just checking as the period now so if the shift is extended to the next week we are just going to use the end of the week as the interval end not the shift's end_datetime opw-5022800 Forward-Port-Of: odoo/enterprise#93404
Creating a milestone from a confirmed Sales Order now keeps the correct project selected. This prevents an error for sales teams using milestone-based service invoicing and makes the workflow smoother.
Original PR description
**Steps to reproduce:** Create a service product with invoicing policy set to Based on milestones. Create and confirm a Sales Order with this product. Open the Sales Order and click on the Milestones stat button. In the milestones list view, click New to create a milestone. **Cause:** The default logic that was supposed to select the default project from context or active_id so it used the active_id which is Sales Order ID. **Issue:** When creating a milestone from a Sales Order, the project was not set correctly, which caused an error. **Fix:** Add the project_id field in list view to avoide default method call. task-5090316 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website shop product page now respects the editor setting for showing or hiding the Terms & Conditions block. This prevents customers from seeing that section when a business has intentionally disabled it.
Original PR description
**Description** - following this commit: odoo/odoo@bbb2d98d9ab97ce729d59b9858b63daccf5434e2 terms and conditions was explicitly called with t-call, which ignores whether the view is active or not. This caused the block to remain visible even when toggled off in the website editor. The fix ensures that the call to `website_sale.product_terms_and_conditions` is wrapped in `is_view_active(...)`, so the snippet is only rendered when enabled. **Steps to reproduce before the fix:** 1. Go to website → open any product in edit mode. 2. Toggle off the Terms & Conditions option. 3. The block still shows up. **After the fix:** toggling off correctly hides the block. opw-5096452 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Belgian payroll Dimona module now prevents editing the student status directly on employee records when that status is controlled elsewhere. This avoids inconsistent employee data and reduces the risk of payroll or reporting errors.
Original PR description
This commit marks `l10n_be_is_student` field as readonly in `hr.employee` model since it is a related field of `hr.version` and it is not editable in `hr.version` and so there is no reason to make in editable in employee model. runbot-error-231303
The website search suggestions menu now chooses the side of the search bar with the most available screen space. This prevents the dropdown from appearing cramped or partially hidden when users zoom in or browse with a smaller window, improving the shop search experience.
Original PR description
Scenario: - go to /shop - increase zoom to 175% (or decrease height of window) - search "a" and let the suggestions dropdown open Result: the dropdwon menu is shown on top of the search bar, where…
Scenario: - go to /shop - increase zoom to 175% (or decrease height of window) - search "a" and let the suggestions dropdown open Result: the dropdwon menu is shown on top of the search bar, where there is the less space available. Cause: When the dropdown doesn't fit fully in the viewport below the searchbar it is always added on top even if there is less space available. The code was added in 15.0 62c265ee7d7cf36db01bf6a95b2c5ea9843ba2d3 with the intent of putting the dropdown on the top if it increased the page height when putting it below (eg. when we put a search bar in the footer). But in saas-18.2 refactoring (b9b3a605e0f4c5da3a258c980107d6162da7f44f), the code was rewritten and now: - the dropdown has a scroll bar if it is too big to fit on viewport - if the dropdown doesn't fit fully below the searchbar in the viewport, it is placed above the searchbar even if there is less space Fix: place the dropdown below the searchbar if there is more space below than above. opw-5019685 Forward-Port-Of: odoo/odoo#225220
This fixes an HR issue where updating employee version records could fail when the selected records belonged to different employees. HR teams can now apply changes more reliably without errors in multi-employee scenarios.
Original PR description
Problem: the write method on the version is not working if the versions are coming from multiple employees. This commit fixes the issue by taking care if the versions belong to different employees. task-5085086 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
The Spanish Modelo 130 report now uses an end-date selection instead of a date range. This prevents users from expecting only the selected range while the report actually calculates from the start of the fiscal year, reducing confusion in tax reporting.
Original PR description
Currently mod130 report is configured to compute from the beginning of the fiscal period, however the date filter widget is in range mode. This means that when a user open the report and select a date range, the entries will not be just in the selected range but span from the beginning of the fiscal year to the end of the range, creating confusion. We should disable filter date range, so the date widget allow to set an end date to the current period Enterprise PR: https://github.com/odoo/enterprise/pull/90044 opw-4933241 Forward-Port-Of: odoo/odoo#226177 Forward-Port-Of: odoo/odoo#218544
This update adds test coverage for Spain's Modelo 130 tax report to help ensure it continues to calculate and display correctly. It reduces the risk of reporting issues for Spanish businesses relying on this tax workflow.
Original PR description
opw-4933241 Forward-Port-Of: odoo/enterprise#94251 Forward-Port-Of: odoo/enterprise#90044
This fix prevents live chat call cleanup logic from disrupting automated checks for operator assignment and chatbot call behavior. It helps keep internal quality checks stable without changing the customer-facing live chat experience.
Original PR description
Since [1], rtc sessions are garbage collected when creating new live chat sessions. Rtc sessions that didn't receive any update during the last minute are considered as inactive. This can interfere with agent assignation tests: operators in a call are not prioritized. If the session is garbage collected, they are not in a call, and tests can fail. fixes runbot-232705 [1]: https://github.com/odoo/odoo/pull/211359 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#227716 Forward-Port-Of: odoo/odoo#227648
The offer creation form now uses the correct employee when opened from an employee record. This prevents users from seeing the wrong employee name in the "Offer for" field, reducing confusion during offer preparation.
Original PR description
#### Steps to reproduce Employees -> Create employee (or select employee) with offer -> Offers smart button -> New: wrong employee name in "Offer for ..." #### Reason Wrong key passed to context of the offers view via action_show_offers method #### Solution Replace key 'default_employee_version_id' with 'default_employee_id' task-5003544
Long out-of-stock messages on product pages now stay within their visible badge or message area when the screen is narrowed. This prevents messy overflow on the shop page and improves the customer experience on smaller screens.
Original PR description
When the Out-of-Stock message contains a long string of text at certain screen sizes, the text is longer than the parent div Steps to reproduce -------------------- 1. Have a tracked product with Continue Selling off and a long custom Out-of-Stock Message. 2. View the product shop page on the website. 3. Reduce the horizontal screen size until the text goes over the edge of the parent div(red rounded box). Cause ----- No CSS to handle when the text is longer than the parent element. Solution -------- Add text-wrap to parent div so the child element text wraps when necessary. opw-5056843
This update restores correct order summary handling in the Point of Sale by using the current data-saving method. It helps prevent errors caused by calling an outdated method, improving reliability for cashier workflows.
Original PR description
Replace usage of `serialize` (method that was previously removed) by `serializeForORM` in `OrderSummary`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225583
The bank reconciliation report now excludes exchange rate adjustment entries that do not represent real bank money movements. This prevents currency revaluation differences from appearing incorrectly under miscellaneous operations, improving report accuracy for foreign-currency bank journals.
Original PR description
**Steps to reproduce** - Have foreign currency with rates for date 1 and date 2 - Have a Bank journal in foreign currency - Register a transaction in date 1 - In date 2 open the unrealized currency report - Create the adjustment entry - From the Accounting dashboard Bank[EUR] > Reconciliation report **Issue** The adjustment entry difference is present under the 'Misc. operations' line. This occurs because we look for journal entries hitting the bank account but that specific entry should not be reported as it does not represent a bank in/out operation A solution is to exclude the exchange entry journal, so any operation reported there is not taken into account in the report opw-4867870 [Ticket link](https://www.odoo.com/odoo/project/49/tasks/4867870) Forward-Port-Of: odoo/enterprise#94172 Forward-Port-Of: odoo/enterprise#93999
This fix makes several automated website test journeys handle page reloads and redirects correctly. It helps keep validation runs reliable for website, event booth, exhibitor sales, and click-and-collect flows without changing customer-facing functionality.
Original PR description
\* = website_event_booth_exhibitor, website_event_booth_sale_exhibitor, website_sale_collect **Issue:** 1. Several tours across multiple modules were failing on runbot because some steps triggered a…
\* = website_event_booth_exhibitor, website_event_booth_sale_exhibitor, website_sale_collect **Issue:** 1. Several tours across multiple modules were failing on runbot because some steps triggered a page reload or redirect without using `expectUnloadPage: true`, which caused those steps to fail. 2. In the `webooth_exhibitor_register` tour, the behavior of the last step before calling the `_getSteps` function differs depending on the installed modules: - With only `website_event_booth_exhibitor` installed, the last step does not trigger a page reload. - With `website_event_booth_sale_exhibitor` also installed, the same step triggers a redirect to the checkout page, which caused the tour to fail. **Fix:** 1. Added `expectUnloadPage: true` to steps that trigger a reload/redirect, so the tour now waits for the new page to load before continuing. 2. Updated `_getSteps` in both modules: - Moved the problematic step of the `webooth_exhibitor_register` tour inside `_getSteps`. - In `website_event_booth_sale_exhibitor`, the same step was updated with `expectUnloadPage: true` to correctly handle the checkout redirection during the payment flow. runbot-[231586](https://runbot.odoo.com/odoo/error/231586) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change reorganizes editor tests so each scenario has its own timeout instead of sharing one limit across multiple checks. It helps reduce random test failures and keeps development validation more dependable without changing user-facing behavior.
Original PR description
Grouping multiple `testEditor` in a single `it` is bad practice because the timeout of `it` is then shared between the different `testEditor` calls rather than each having their own separate timers. Technically, only the web_edior tests ever timed out, but I split the html_editor ones as well for good measure. runbot-231687 Forward-Port-Of: odoo/odoo#227985
Invoice PDFs now include both the product name and its description when a description is present. This prevents customers from seeing only the description and helps keep invoices clear and identifiable.
Original PR description
When printing an invoice for a product that has a description, only the description appears on the PDF. Commit https://github.com/odoo/odoo/commit/7e553d25890d1e236123f0fa7e11ce86f59448ab removed the concatenation of the product name and description in updateLabel (in product_name_and_description in product module). This commit reintroduce the concatenation of the product name and the product description for invoices by overriding updateLabel in product_label_section_and_note_field in account. Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4988340) opw-4988340