Wednesday, July 2, 2025
37 changes · saas-18.3
Enhancements to existing features
This update adds a broad automated testing setup for Point of Sale and related payment, loyalty, restaurant, event, HR, sales, and self-ordering modules. It helps validate key Point of Sale data and startup behavior earlier, reducing the risk of regressions in future changes without directly changing business workflows.
Original PR description
*: point_of_sale, pos_account_tax_python, pos_adyen, pos_event, pos_hr, pos_loyalty, pos_pine_labs, pos_razorpay, pos_restaurant, pos_restaurant_adyen, pos_sale, pos_self_order, pos_stripe, pos_viva_com Add a base for running boot tests in PoS. All models available in the PoS have been added via the `models.ServerModel` tool so that they are available in the `MockServer` In this way, we can simulate the generation of the model definitions required for the related model, JS classes and data service. We can now instantiate the related models and call all the methods specific to each model.
The web interface framework was updated to a newer version with improvements for translating accessibility labels and a fix for template translation handling. This helps make Odoo screens more consistent and accessible for users in different languages.
Original PR description
This brings two commits: - [FIX] parser: t-esc/t-out vs t-translation* - [IMP] compiler: make human-readable ARIA attributes translatable see https://github.com/odoo/owl/releases/tag/v2.8.0. Forward-Port-Of: odoo/odoo#216599
Livechat support reports now open the relevant record directly when a selected report cell contains only one result. This saves users an extra click and makes investigating individual live chat channel activity quicker.
Original PR description
**Purpose of this PR**: For Livechat Support Channel Report when a pivot cell is clicked and the resulting domain returns only one record, the form view is now opened directly, bypassing the list view. **task**-[4753032](https://www.odoo.com/odoo/all-tasks/4753032) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Spanish TicketBAI localization now uses a renewed Bizkaia demo certificate, replacing one that had expired. This helps keep testing and validation flows for Bizkaia electronic invoicing working without certificate-related interruptions.
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 adds the foundation for automated startup tests across several Point of Sale add-ons. It helps Odoo validate these modules more reliably during development, reducing the risk of future regressions without changing day-to-day user workflows.
Original PR description
*: pos_appointment, pos_iot, pos_restaurant_appointment, pos_tyro, pos_urban_piper, pos_urban_piper_enhancements Add a base for running boot tests in PoS. All models available in the PoS have been added via the `models.ServerModel` tool so that they are available in the `MockServer` In this way, we can simulate the generation of the model definitions required for the related model, JS classes and data service. We can now instantiate the related models and call all the methods specific to each model.
The bank reconciliation widget no longer shows a redundant link when the related journal entry is the bank entry itself. This reduces clutter and helps accounting users focus on the items that actually need review.
Original PR description
Before this PR: Link to the bank journal entry was shown in bank reco widget. After this PR: If the journal entry linked is the bank itself, then it will not be shown in bank reco widget. task-4872789
Resolved issues and error corrections
This corrects how the Time Off module builds the list of online team member statuses. It prevents fragile behavior that only worked by accident, making availability checks more reliable.
Original PR description
PR above made a typo in code in which list of "online" member IM status is a list of string, and it uses + to concatenate items like in python but this doesn't work in JS. Thankfully it kinda "worked" because this casted the array into list (e.g. `["a", "b"]` becomes "a,b") and other items were appended to string. Since this list was used for `.includes()` by chance the ".includes()" method is on Array and String and functionally this results to about the same intention... Again by chance! Forward-Port-Of: odoo/odoo#216771 Forward-Port-Of: odoo/odoo#216598
Miscellaneous changes
This commit update the finished move quantity of a production of a serial tracked product to 1 when set the quantity producing (always to 1 in case of a serial tracked product) This is mainly mandatory in case the production need to process quality checks. Task : 4575193 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
Original PR description
This commit update the finished move quantity of a production of a serial tracked product to 1 when set the quantity producing (always to 1 in case of a serial tracked product) This is mainly mandatory in case the production need to process quality checks. Task : 4575193 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#214245 Forward-Port-Of: odoo/odoo#206109
Website pages can now open correctly when their main content record uses a negative internal ID. This prevents backend website views, such as blog posts on Odoo.com, from crashing in these rare data situations.
Original PR description
Steps to reproduce: 1. Install website_blog 2. Create a blog post with a negative ID (you'll need to change it via SQL) -> such kind of record is something we have on Odoo.com 3. Go to that blog post in the backend website view => Crash We have several places where the main-object data is parsed from the HTML, it did not consider the negative ID possibility. In master, an unified way to parse the main-object will be made. task-jke Forward-Port-Of: odoo/odoo#216573
Kiosk orders now receive the correct floating order name using either the table stand number or tracking number. This helps staff identify and fulfill self-order kiosk orders more reliably.
Original PR description
For Kiosk order, set `floating_order_name` with `table_stand_number` or `tracking_number`. task-id: 4711661 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The mail app now hides the link preview delete button from users who are not allowed to remove that preview. This prevents confusing interactions where users saw a delete option and confirmation but nothing happened.
Original PR description
**Current behavior before PR:** The delete button for link previews was visible to all users, including those who did not have access to delete the preview. When such users attempted to delete a link preview, the confirmation dialog appeared, but no action was taken **Desired behavior after PR is merged:** The delete button is only shown to the message author or admin users, ensuring that only users with delete access can see and interact with the button. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change fixes an inconsistent font size calculation in the HTML editor, especially around list formatting. It helps prevent occasional test failures and supports more stable editing behavior for users.
Original PR description
This reverts commit [1] which did not fix the issue. In fact I did it too quickly thinking I knew what the issue was and I didn't. I thought we used round and the real value oscillated around the .5 mark but it's the opposite. We use floor so the real value falls around the .0 mark. To fix it, I replaced floor with round, hoping this won't cause a different test to fail non-deterministically because the real value for that other test would oscillates around the .5 mark. Testing with actual pixel values is tricky, but the feature can't be tested otherwise. [1]: https://github.com/odoo/odoo/pull/216611/commits/eeb3f7c9a5207fb56aa88b06107768b9249ceed1
This fix prevents previously saved image dimensions from being forced back onto images when email templates are edited. Users can now resize an image back to its default size without the editor unexpectedly restoring the last saved size.
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
Long product descriptions on quotation and sales order lines now resize correctly when reopening a quote. This removes unnecessary blank space, making order lines easier to read and keeping documents visually tidy.
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
This fix reduces occasional failures when composing or sending messages by keeping the message editor focused during key actions. It also strengthens related automated checks so the mail feature is less likely to fail unpredictably in testing.
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#216756This fixes an issue where a time off request changed from "Extra Hours" to another type could stay incorrectly linked to overtime attendance. The update helps keep leave balances and overtime deductions accurate when requests are edited.
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
Employees with flexible working hours will now see all days normally in the Time Off calendar instead of some days appearing unavailable based on the template schedule. This avoids confusion when requesting or reviewing time off for flexible workers.
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 fix makes sure a payment reference is treated consistently as text when the Peruvian stock reports module is installed. It prevents an error during invoice payment reference autocomplete checks, improving reliability without changing normal business workflows.
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
Employees using the Timesheets app will no longer see two delete buttons in the employee card view. This fixes a small interface issue that could cause confusion when managing employee records.
Original PR description
Description of the issue/feature this PR addresses: In this PR, we removed the duplicated delete button from the hr employee kanban view when the timesheet app is installed. Root Cause: We missed to inherit the hr employee kanban view within the hr timehseet. Current behavior before PR:  Desired behavior after PR is merged:  Related task: 4843996 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212917
The time off allocation approval screen now hides the approve button once an allocation request has already been approved. This prevents confusion for managers and helps ensure the request status is clearly reflected in the interface.
Original PR description
Originally the approve button still exits after approving the allocation request beacuse of a misleading old condition. The condition has been removed.
Fixes an issue where allocation records opened from a time off type could all show the same employee-specific remaining balance text. This helps HR users see accurate allocation information instead of misleading repeated labels.
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
This update prevents form views and file fields from crashing when certain background binary data is not in the expected text format. It also avoids showing technical, non-stored file fields in automatically generated forms, reducing accidental errors for users.
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#216896 Forward-Port-Of: odoo/odoo#213967
This fixes an internal mail test so it no longer depends on pre-existing demo data. The change helps keep automated checks stable and reduces false failures during validation.
Original PR description
Activity count fail with demo data, due to existing activities. Remove them in test to have deterministic result. runbot-223201
When the HR Contracts module is uninstalled, related HR menu items are now restored to their correct place. This prevents confusing menu organization for users after removing the module.
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
This fixes a visual issue in boxed PDF layouts where invoice total tables appeared separated but lacked a top border. The change makes printed reports look more consistent and professional after a recent spacing update.
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 fixes an issue where the journal shortcut could disappear after creating a draft accounting entry for one payslip in a batch. Payroll users can now keep access to the related journal entry even when other payslips in the same batch are not yet finalized.
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
Point of Sale users connected to UrbanPiper will no longer see the same online/offline store status notification again after reloading the POS. This reduces repeated interruptions and improves the checkout experience for restaurants using delivery platforms.
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 scheduled payroll data update has been adjusted to run once per 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
The Swedish SIE4 import now ignores transaction object details that are not needed for bookkeeping entries. This prevents those extra details from being mistaken for transaction balances, 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#88784A test setup issue in Document Sign was corrected so signer email details are populated properly during automated checks. This prevents false test failures in builds without demo data and helps keep document signing releases 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
Odoo Studio now removes accidental spaces at the end of selection values before saving them. This prevents confusing duplicate-looking options and makes reused values more reliable across configurations.
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
Users working in inventory and helpdesk without sales permissions no longer hit an error when creating repair-related tickets. The change avoids reading sales order information unless the user has the right access, keeping the workflow available for non-sales 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
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
If not specified, the field `youtube_video_category_id` was treated as readonly by default. This commit explicitly sets readonly: false, ensuring that the field is editable. This prevents the value from being lost during posting, as it will now be correctly written to the database. Part of PR: #83571 opw-4646432 Forward-Port-Of: odoo/enterprise#87969
Original PR description
If not specified, the field `youtube_video_category_id` was treated as readonly by default. This commit explicitly sets readonly: false, ensuring that the field is editable. This prevents the value from being lost during posting, as it will now be correctly written to the database. Part of PR: #83571 opw-4646432 Forward-Port-Of: odoo/enterprise#87969
In case of 'quantity' control per quality point. If a complete stock move line is sent to a failure location. The stock move was not split. We could have a stock move line going to a location that is not child of the location of the corresponding move. This can lead issues in case of push_rules or stock valuation. Task: 4575193 Forward-Port-Of: odoo/enterprise#87673 Forward-Port-Of: odoo/enterprise#81275
Original PR description
In case of 'quantity' control per quality point. If a complete stock move line is sent to a failure location. The stock move was not split. We could have a stock move line going to a location that is not child of the location of the corresponding move. This can lead issues in case of push_rules or stock valuation. Task: 4575193 Forward-Port-Of: odoo/enterprise#87673 Forward-Port-Of: odoo/enterprise#81275
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
How to reproduce the issue: With l10n_es on an ES company: - Create an invoice from two months ago with a value of 1000. - Fully credit note this invoice on the current month. - On the mod 349 report, download the BOE report. The BOE report does not contains the rectification despite being mandatory as per: https://www.boe.es/buscar/doc.php?id=BOE-A-2010-5098 (look at the examples in CUMPLIMENTACIÓN DEL REGISTRO DE RECTIFICACIONES). This commit also fixes an issue where invoice reve
Original PR description
How to reproduce the issue: With l10n_es on an ES company: - Create an invoice from two months ago with a value of 1000. - Fully credit note this invoice on the current month. - On the mod 349 report, download the BOE report. The BOE report does not contains the rectification despite being mandatory as per: https://www.boe.es/buscar/doc.php?id=BOE-A-2010-5098 (look at the examples in CUMPLIMENTACIÓN DEL REGISTRO DE RECTIFICACIONES). This commit also fixes an issue where invoice reverted to draft where included in the boe report: - Create an invoice of 100 in January, credit note 50 in May. - Reset to draft both the invoice and the credit note. - Create another invoice of 888 in February, credit note 444 in May. - Generate the BOE report. The invoice reverted to draft is included in the boe report. opw-4653025 Forward-Port-Of: odoo/enterprise#88625 Forward-Port-Of: odoo/enterprise#86127