Wednesday, July 2, 2025
33 changes · saas-18.2
Enhancements to existing features
This update makes Odoo's automated user journey tests more explicit when an action is expected to leave or reload a page. It helps reduce false test failures and improves confidence in releases without changing day-to-day user workflows.
Original PR description
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#216390 Forward-Port-Of: odoo/odoo#216007
The Spanish TicketBAI localization now uses a renewed Bizkaia demo certificate, replacing one that had expired. This keeps related testing and demo flows working reliably for future releases without changing day-to-day business features.
Original PR description
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#216353 Forward-Port-Of: odoo/odoo#203293
This update improves internal automated tour tests by clearly marking steps that navigate away from the current page. This helps reduce false test failures and supports more stable quality checks across several Odoo apps, without changing day-to-day user workflows.
Resolved issues and error corrections
This fixes an intermittent issue where the message composer could lose focus while posting or editing messages, causing keyboard actions to behave inconsistently. It also strengthens related automated tests so these communication features are checked more reliably in future releases.
Original PR description
Follow-up of https://github.com/odoo/odoo/pull/214626 Runbot error 181952 is hardly reproduce-able. Don't have a exact idea what causes the problem. These are theories of the causes: 1. insertText,…
Follow-up of https://github.com/odoo/odoo/pull/214626
Runbot error 181952 is hardly reproduce-able. Don't have a exact idea what causes the problem.
These are theories of the causes:
1. insertText, contains, triggerHotkey of mail helpers are not robust enough (lack simulation, not robust against CPU load / prone to race conditions).
2. focus in composer is lost non-deterministically
Previous attempts were thinking the root cause are mail test helpers and web test helpers would fix issue, but that's probably not the exact cause of issue. A more likely candidate is composer loosing focus and therefore pressing of keys do not make proper transition from message with composer to message without composer.
One likely cause of loosing focus is `processMessage` that reuses the old ref after asynchronous handling of message edition / post. This commit fixes by using the current ref of texarea.
Test helpers can still be prone to problems. That's why this commit this converts the most important LOCs to web test helpers. The user interactions are made with `contains().press()`, where the `contains()` enforces focus on the targeted element, giving more guarantee the composer is focused for proper press of key. `press("Control+Enter")` were not working because this passed "Control+Enter" instead of "Enter" as `ev.key`. This was fixed by using more primitive syntax `["Control", "Enter"]` which is better parsed for proper `ev` object of KeyboardEvent.
Runbot-error-227618
Forward-Port-Of: odoo/odoo#216756Miscellaneous changes
reproduction: 18.0+18.1: 1. In Todo, insert an inline image, and create a link including the image and some text 2. click on the text part, click edit button, modify the label area and click apply 3. the image is removed Test case 2: 1. go to Recruitment, and open an application and click "Send interview" 2. click on the link inside the template, change the url 3. apply, format of the button breaks 18.2: same flow with test case 2, click apply causing a traceback 18.3: same flo
Original PR description
reproduction: 18.0+18.1: 1. In Todo, insert an inline image, and create a link including the image and some text 2. click on the text part, click edit button, modify the label area and click apply 3.…
Original PR description
In this commit, we add expectUnloadPage to steps that require it to explicitly declare that the step will cause the page to be unloaded. Forward-Port-Of: odoo/enterprise#88825 Forward-Port-Of: odoo/enterprise#88602
This fixes the boxed invoice PDF layout so the totals table no longer looks visually detached after recent spacing changes. Business documents printed from Odoo will appear cleaner and more consistent for customers and internal users.
Original PR description
**Description:** Due to a recent [commit](https://github.com/odoo/odoo/commit/12ef230df58122fbdac0b4c1b4781c535b8516ba), a margin-top was added to the total table for the report type-pdf.…
**Description:** Due to a recent [commit](https://github.com/odoo/odoo/commit/12ef230df58122fbdac0b4c1b4781c535b8516ba), a margin-top was added to the total table for the report type-pdf. Previously,in the box layout, this table did not have a top border because it appeared visually connected to the preceding table — they seemed seamlessly joined. However, after the margin was added,the table now appears visually disconnected, making the absence of a top border look inconsistent and awkward. Steps to reproduce: - install account module - select box external layout - create invoice - print report as pdf Before commit:  After commit:  opw - [4873157](https://www.odoo.com/odoo/project/70/tasks/4873157) upg - [2839564](https://upgrade.odoo.com/odoo/upgrade.request/2839564) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214803
This change fixes an unstable automated test in Odoo's messaging infrastructure. It prevents outdated background worker behavior from interfering with current test runs, improving confidence in release validation without changing user-facing features.
Original PR description
This commit fixes the `subscribe to presence channels according to store data` test. Some of the websocket worker functions are debounced meaning some old worker functions can be called after the test ends. Since `_patchWebsocketWorker` with cleanup patches the prototype of the worker, patches can be executed from old workers which is an issue. This commit ensures only the actual instance is patched. fixes runbot-226354 Forward-Port-Of: odoo/odoo#216810
This fixes an issue where opening allocations from a time off type could show the same employee-specific remaining balance text on every allocation record. The allocation list now displays time off type names without carrying over the previously selected employee, making the information clearer and more accurate for HR users.
Original PR description
### Steps to reproduce: - Create a Time off type - Create allocations for some employees with the created type - Navigate to an allocation for a specific employee - Click on the time off type in the allocation form - Click on the smart button 'Allocations' - Notice each record showing the same time off type (X remaining out of Y) ### Cause: This is happening because when going through the allocation of a specific employee we add him in the context 'employee_id' so we compute the display name of the leave type and set it for each record as the same value as we compute leaves depending on the contextual employee. ### Fix: We are preventing the computation of the display name by forcing the employee_id in the context to force when we are using the smart button for allocations in the time off type form view opw-4841096 Forward-Port-Of: odoo/odoo#216699 Forward-Port-Of: odoo/odoo#215454
Portal users should no longer see broken chat styling when viewing documents that include the portal chatter. The update prevents the chat hub from appearing in that specific portal context, keeping the document page layout consistent and usable.
Original PR description
When a chat window is open while a portal user accesses a document where portal-chatter is available, its styles break because ChatHub is not rendered inside the Shadow DOM where Chatter is. Since all required styles are within the Shadow DOM, this causes styling issues. This commit fixes the issue by disabling ChatHub in portal chatter. This commit also includes backport of https://github.com/odoo/odoo/pull/203703 Task-4645905 Forward-Port-Of: odoo/odoo#204325
Changing a leave request from Extra Hours to another time-off type now properly removes the old overtime link. This prevents incorrect overtime deductions or stale attendance connections when HR updates an employee's leave request.
Original PR description
This commit fixes a bug that occurs when switching a leave request of type "Extra Hours" to another time-off type. The issue happens when editing a leave request that allows deduction from overtime, as it remains linked to attendance overtime that needs to be unlinked. task-4756706 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207780
When the HR Contract app is uninstalled, related HR menu items are now put back under their correct original sections. This prevents confusing navigation changes for users after removing the app.
Original PR description
This PR adds an uninstall_hook to restore the correct parent menus under the hr module that were overridden by this module. Task: 4818020 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213954
Employees using flexible working hours will now see all days normally in the Time Off calendar instead of some days appearing unavailable based on the underlying schedule. This avoids confusion when reviewing or requesting time off for flexible schedules.
Original PR description
The calendar view in the Time Off app was displaying greyed-out days. These days corresponded to those from the underlying work schedule on which the flexible working hours were based. Steps to reproduce: ------------------- * In the Work Information tab of an Employee, set the Working Hours to flexible. * Save and click on the Time Off smart button > Observation: Some days were greyed-out Why the fix: ------------ `get_unusual_days()` usually return a dict of each days with True or False. That dict is then interpreted to display white or greyed-out days. Simply be returning False, every days are going to be white. opw-4816609 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212932
This fixes an unstable automated test related to email performance counters. The change helps reduce random test failures in validation pipelines, making releases more reliable without changing user-facing behavior.
Original PR description
runbot-160897 Forward-Port-Of: odoo/odoo#216782
Website forms now correctly show or hide fields when visitors change a selection field. This prevents irrelevant fields from staying visible and helps forms behave as configured by website editors.
Original PR description
Problem:
After (https://github.com/odoo/odoo/commit/82fac504803fd17520a1289eb1e38bc7662c54a2), in a form, if a field is set to be visible only when another select field has a specific value (e.g., "x"), that field remains always visible regardless of the selected value.
Cause:
`isFieldVisible` evaluates visibility using the form's default values. This happens because `getFormDataIncludingDisabledFields` returns a cloned form, and cloning a form does not preserve field values.
Solution:
Remove disabled attribute from the `formEl` fields and create
`FormData` then revert the changes.
Steps to reproduce:
- Add a form
- Change a field ("A") type to selection
- Set another field ("B") to be visible only when "A" has a specific value
- Save
- Change the selection to a value that should hide "B"
> "B" remains visible
opw-4874379
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prQuotation and sale order lines with long product descriptions now resize correctly when reopened. This removes unnecessary blank space, making documents easier to review and edit.
Original PR description
## Versions 18.0+ ## Issue Blank spaces appear at the bottom of each Sale Order line when a long product description is set. ## Steps to reproduce - Create a new quotation: - Add a product; - Change the description for a long one (3+ lines) or add one; - Go back to the quote list view; - Come back to the quote. ## Cause The component's height computation is done before the columns' widths' computation which then resizes based on font styles, making the text take less space and blank spaces appear. ## Fix Force the computation of the SO line's height once the component is mounted. opw-4766800 Forward-Port-Of: odoo/odoo#216581
Fixes an issue where images in email templates could stay locked to a previously saved size after being edited. Users can now resize images back to their default size in the editor, with email-friendly dimensions still applied correctly when saved.
Original PR description
Problem: When resized images (e.g., with `style.width: 50%`) are processed by `convert_inline`, `width` and `height` attributes may be added for email client compatibility. These attributes override resizing changes, forcing the last saved dimensions and preventing fallback to the image's default size. Solution: Remove `width` and `height` attributes from the content inserted into the editor. They will be correctly re-applied on save if needed. Steps to reproduce: - Create a new email template - Add an image - Resize the image to 100% - Save - Resize the image back to default - The image keeps the 100% size opw-4863515 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213786
The update ensures invoice payment references are consistently handled as text instead of a missing value. This prevents an automated test failure in the Peruvian stock reports localization and improves reliability for invoice processing checks.
Original PR description
steps to reproduce: 1. install l10n_pe_reports_stock module 2. run the test `test_payment_reference_autocomplete_invoice` This commit ensures that the payment_reference field is always a string, because it returs false when it is None, which causes an assertion error build_error-75601 Forward-Port-Of: odoo/odoo#215873
Fixed an issue where the journal button could disappear when creating a draft accounting entry for one payslip in a batch. Payroll users can now access the related journal entry as expected, even when other payslips in the same batch are not yet completed.
Original PR description
**Steps:** - Install the hr_payroll_account module - Navigate to the payroll menu and open a batch payslip. - Select a batch containing two or more payslips and create a draft entry for any single…
**Steps:** - Install the hr_payroll_account module - Navigate to the payroll menu and open a batch payslip. - Select a batch containing two or more payslips and create a draft entry for any single payslip in the batch. --- **Description of the issue/feature this PR addresses:** When a draft entry is created for a single payslip within a batch, the journal smart button becomes invisible. --- **Cause:** The issue occurs during the account move creation process. When generating an account move for a batch payslip, the process checks the status of all payslips in the batch. If any payslip is not in the done state, the account move is not created, resulting in the journal smart button not appearing. --- **Fix:** This PR adjusts the account move creation logic to allow account moves to be created for batch payslips, ensuring the journal smart button remains visible even if some payslips are not in the done state. task-4440533 Forward-Port-Of: odoo/enterprise#76681
The automated checks for Point of Sale configuration settings were moved into the POS Enterprise module where the related functionality belongs. This helps keep validation aligned with the correct product area and supports more reliable builds without changing user-facing behavior.
Original PR description
move tests for POS configuration settings from point_of_sale to pos_enterprise refer to this commit :https://github.com/odoo/odoo/pull/215611/commits/0074d743451834424706608fc76f32b0df9c5f1c build_error-227602
A test setup issue in Documents Sign was corrected so sign requests use the proper contact record and email information. This prevents false test failures in builds without demo data, helping keep automated validation reliable.
Original PR description
This commit fixes a ValidationError triggered during sign request creation tests due to missing signer emails in "no demo" builds. The root cause was incorrect data passed into the test helper create_sign_request_1_role: the user record (res.users) was passed instead of its corresponding partner (res.partner). Since the sign.request.item expects a valid partner_id, this led to signer_email being computed as False, violating the constraint that requires all signers to have valid email addresses. This change ensures the proper partner_id (user.partner_id) is passed when creating the request item, allowing the email computation and constraint to behave as expected. This fix unblocks TestSignedDocument.test_gc_clear_bin build_error-224070 Forward-Port-Of: odoo/enterprise#88508
Point of Sale users with UrbanPiper integrations will no longer see the same online or offline store status notification again after reloading the POS. This reduces unnecessary interruptions and improves the checkout experience for staff using delivery platform connections.
Original PR description
Steps: ==== - Configured UrbanPiper credentials in `pos.config` and selected platform providers (e.g., Ubereats, Justeat). - On session start, a pop-up confirms the store is online on enabled platforms. - Reload the pos Issue : ==== - The same pop-up appeared again on POS reload, leading to a poor user experience. Fix: ==== - Removed duplicate call from `pos.store` that triggered provider status notifications unnecessarily. - Enhances user experience by preventing repeated popups on session reload. task-4879125 Forward-Port-Of: odoo/enterprise#88027
The barcode receipt screen now avoids overlapping column headers on very small screens, especially when using languages with longer labels such as French. This makes partial receipt validation easier to read and reduces confusion for warehouse users working on mobile devices.
Original PR description
Issue ----- When processing partial receipts on small resolution screens, the incomplete transfer window has an overlap of its headers for translations with long terms. Steps to reproduce ----- - Set…
Issue ----- When processing partial receipts on small resolution screens, the incomplete transfer window has an overlap of its headers for translations with long terms. Steps to reproduce ----- - Set DB language to French - On Inventory>Configuration>Operation Types, configure the operation type "receipts" to create backorders on "Ask" - Create an incoming transfer - Open barcode on a low resolution screen (eg 340x400px) - Open the transfer in barcode - Process part of the quantity - Validate the partial transfer --> The "Terminé /" & "A faire" column headers overlap Cause ----- The resolution is not wide enough to fit the headers without word break. However breaking words isn't a suitable solution either as it makes headers unreadable. For example, "Terminé /" & "A faire" would read as "Term A " " iné fair" " / e " Given that the 2 columns are semantically related, we can merge their headers together without losing readability. Visual comparison ----- Low resolution before (left) & after the fix (right).  Desktop display is a bit affected but still readable.  ----- Ticket: opw-4715939 Forward-Port-Of: odoo/enterprise#87177
When an invoice is reset to draft, related deferred accounting entries that were already posted are now properly cancelled. This helps keep accounting records consistent, including when audit trail protections are active.
Original PR description
When resetting an invoice to draft, its posted deferred entries should be cancelled. This is adding a test to the linked fix. Linked community PR: https://github.com/odoo/odoo/pull/216628 opw-4891975 Forward-Port-Of: odoo/enterprise#88992
The scheduled payroll data update has been changed to run once a week instead of more frequently. This reduces unnecessary background processing while keeping payroll reference data refreshed on a regular schedule.
Original PR description
Forward-Port-Of: odoo/enterprise#88564 Forward-Port-Of: odoo/enterprise#88492
Kenyan NHIF/SHIF payroll reports now include payslips for the month selected by the user, preventing payslips from appearing under the wrong month. The report wording was also simplified by removing an unclear explanatory line.
Original PR description
- load payslip according to the Month value, currently, may payslip appears on june selection - remove the line 'the selection will cover ...' task-4775801 Forward-Port-Of: odoo/enterprise#88996 Forward-Port-Of: odoo/enterprise#85609
Users with inventory and helpdesk access but no sales permissions can now create or work with repair-related tickets without hitting an access error. The change avoids reading a restricted sales order field when the user is not allowed to access it, reducing interruptions for support and operations teams.
Original PR description
### Before this PR If an user has only inventory, helpdesk group and it does not have "sales" permission , the error "you have not access on this field sale_order_id" appear. It appears because on helpdesk_sale that field is restricted to two specific groups. In the same module that fields is popped out during copy , but in the prepare of helpdesk_repair is accessed without checking permission ### After this PR The field is not accessed if it has no permission Forward-Port-Of: odoo/enterprise#86514
This fix improves Swedish SIE4 accounting file imports by ignoring extra object details that are not needed for transactions. This prevents those details from being mistaken for transaction amounts, reducing the risk of incorrect imported accounting data.
Original PR description
The aim of this commit is ignoring the whole object list when we import transactions. The object list is represented by the elements between `{}` [[1]]. As we don't need these elements, we do ignore them to avoid a potential issue where we identify an element from this object list as the transaction's balance.
opw-4868415
[1]: https://sie.se/wp-content/uploads/2020/05/SIE_filformat_ver_4B_ENGLISH.pdf
Forward-Port-Of: odoo/enterprise#88892
Forward-Port-Of: odoo/enterprise#88784This fix prevents imported French FEC files from overwriting existing account names when multiple accounts share similar codes but have different labels. It helps preserve accurate accounting records during import and avoids unintended data changes.
Original PR description
Steps to reproduce: - import a fec with different account 164*** with different names Issue: All the account's name will be overriden Cause: Before 18.0, apparently, code and name were joined and was not an issue solution: update the code to the new logic by filtering out the name from the override (`_apply_template`) opw-4690284 Forward-Port-Of: odoo/enterprise#86809
Odoo Studio now automatically removes extra spaces at the beginning or end of selection values before saving. This prevents confusing duplicate-looking options and makes reused values more reliable across the system.
Original PR description
Before this commit it was possible to create selection values with trailing spaces. This could be very misleading when reusing these values somewhere else. After this commit, such values are trimmed before saving. opw-4877276 Forward-Port-Of: odoo/enterprise#88838 Forward-Port-Of: odoo/enterprise#88255
Rental orders using material resources now show the correct planning status after confirmation. This prevents already planned material-based rental shifts from being incorrectly shown as still needing planning.
Original PR description
_*= sale_planning, sale_renting_planning Steps to Reproduce: - Install the `sale_renting_planning` module. - Create a rental product with the `Plan Service` enabled and the resource type set to…
_*= sale_planning, sale_renting_planning Steps to Reproduce: - Install the `sale_renting_planning` module. - Create a rental product with the `Plan Service` enabled and the resource type set to `Material`. - Create a SO for the newly created product and confirm it. - Observe the state button the shift is already planned but it incorrectly displays `To Plan`. Issue: - Confirming the SO the shift is already planned but the state button still displays `To Plan`. this issue occurs when the resource type is `Material` However it works correctly when the resource type is `User`. Cause: - When we are calculating the planned hours the domain `'resource_type', '!=', 'material'` is passed causes resources type of Material so it will be excluded from the calculation. Fix: - In this commit removed the condition that excluded resources of type Material so that they are included when calculating the planned hours. This ensures the state button shows the correct status. task-3978597 Forward-Port-Of: odoo/enterprise#75861
This update prevents an error from occurring when payment synchronization checks a missing provider type. It improves reliability for accounting payment workflows by avoiding an unexpected interruption in this edge case.
Original PR description
The aim of this commit is making sure that we don't have a traceback when we are trying to do a "in" comparison with an empty `provider_type`. no task id Forward-Port-Of: odoo/enterprise#89115
reproduction: 18.0+18.1: 1. In Todo, insert an inline image, and create a link including the image and some text 2. click on the text part, click edit button, modify the label area and click apply 3. the image is removed Test case 2: 1. go to Recruitment, and open an application and click "Send interview" 2. click on the link inside the template, change the url 3. apply, format of the button breaks 18.2: same flow with test case 2, click apply causing a traceback 18.3: same flow with test case 2, click on the link, do nothing and click away, the popover not close Fix: a partial back port of https://github.com/odoo-dev/odoo/pull/4633 The idea is that when the link doesn't only contain text, we don't show the label input field nor apply the label to the link. Because the label field extracts/display the text content of the link element, the field doesn't support html fragment, applying the label on a link including another element inside will break it. task-4881878 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215023
Task: 4640948 Currently, a sales user with no stock permissions can see the little forecast icon and, upon clicking on it, a link to the forecast report. However, trying to access the report results in an "Access Error" message. The forecast report is important for sales users. This commit will allow them to access the report, but without the option to edit stock pickings (reserve/unreserve buttons). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.
Original PR description
Task: 4640948 Currently, a sales user with no stock permissions can see the little forecast icon and, upon clicking on it, a link to the forecast report. However, trying to access the report results in an "Access Error" message. The forecast report is important for sales users. This commit will allow them to access the report, but without the option to edit stock pickings (reserve/unreserve buttons). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214567 Forward-Port-Of: odoo/odoo#205513
Before this commit, the PlanningCalendarCommonRenderer override the eventToRender method but this method has been removed in parent class. This commit changes the method overriden to make sure the class is added when some shifts have to be highlighted. Forward-Port-Of: odoo/enterprise#81770
Original PR description
Before this commit, the PlanningCalendarCommonRenderer override the eventToRender method but this method has been removed in parent class. This commit changes the method overriden to make sure the class is added when some shifts have to be highlighted. Forward-Port-Of: odoo/enterprise#81770