Daily updates from Odoo
Tuesday, June 24, 2025
36 changes · master
Enhancements to existing features
Notebook tabs are now easier to read, with the active tab standing out more clearly and a subtle hover effect on other tabs. This improves day-to-day navigation in affected screens while also aligning internal styling names with Odoo coding guidelines.
Original PR description
This PR accentuates the difference between an active tab and other tabs, as well as adding a small hover effect. Furthermore, these changes provided an opportunity to update the naming of the Notebook component's CSS variables, ensuring compliance with our coding guidelines. task-4797562 PR com: https://github.com/odoo/odoo/pull/213204 | Before | After | |--------|--------| | <img width="348" alt="tab-before" src="https://github.com/user-attachments/assets/a2c8eae4-1701-457b-ad84-f2b19433a513" /> |  |
Sign users get clearer list and kanban views, including shared status, responsible person, signed document details, and filters for shared templates. Shared signing links are easier to identify and manage, while access to shared requests is better aligned with template permissions.
Original PR description
In this commit, **List View Improvement** - Implemented functionality to stop sharing from the list view when document is shared. - Add fields of 'Responsible' and 'signed document' in list view. - Rename 'shareable' field to 'shared' for better clarity. - Hide sign request of public user from document menu of user when sharing a template for sign. - Add a icon to display 'shared' templates in kanban view when template is shared by link. - Add filter to filter out shared templates. - Now, the shared sign request will be accessible to all users who have permission to access the sign template. **Improve the share wizard form view and add validity of share request** - the ability to manually stop sharing documents using the Stop Sharing option remains. However, the option to set a validity period like with other document types, is still not available. task-4279714
Rental orders can now be linked to planning slots so availability is checked before a customer books online. This helps businesses such as hotels, bike rentals, or car rentals avoid accepting bookings when the required resource is already unavailable.
Original PR description
## [IMP] website_sale{_stock}_renting: move hook in website_sale_renting This commit reviews a bit the code in WebsiteSaleDaterangePicker to be able to reuse the product availabilities feature…
## [IMP] website_sale{_stock}_renting: move hook in website_sale_renting
This commit reviews a bit the code in WebsiteSaleDaterangePicker to be
able to reuse the product availabilities feature developed in
website_sale_stock_renting to be able to reuse it in other module
depending on website_sale_renting module.
## [IMP] {sale_renting_}planning: bind slot and SO
In the case of Rental of services, such as bike rental, car rental, hotel room rental...
Relying on the resources makes a lot of sense. It is already enabled to book a resource in such case!
However, when no resources are available for the role specified by the product, a booking (Rental Order)
can anyway be confirmed which therefore leads to conflicts in planning since no resources are available for this order!
In the case of an hotel, they can't make a new room!
Such use case can be worked around in Rental with some automations.
However, eCommerce needs to be fed with availabilities in order to prevent double booking from website.
task-4863072This update adjusts automated tests for spreadsheet pivot views after an underlying library change. It helps keep quality checks reliable so future document spreadsheet updates can be validated with confidence.
IoT boxes can now pair correctly when a company runs multiple Odoo databases. The pairing process includes the target database and lets the IoT box authenticate to the right place, avoiding failed connections in multi-database environments.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/214960 We now provide the database name in the pairing token so that the IoT box is able to reach the specific database that we are pairing from. This fixes not being able to use the IoT in a multi-DB environment. We also add a new `/iot/authenticate` route, so that the IoT box can acquire a session in the correct DB. This is needed as the websocket connection requires an active session. task-4815521
The “To Check” review feature is now limited to authorized accounting roles, such as bookkeepers and accounting administrators. This helps prevent general billing or invoicing users from incorrectly marking accounting entries as reviewed.
Original PR description
The To Check feature should only be used by the accountants. A random user who only use accounting to create bills and invoices shouldn't be allowed to review and mark a move as checked. This is why now we only show the feature to accountant (Bookkeeper and Accounting admins) and raise an error if a user without the good rights try to change the checked field. Linked: https://github.com/odoo/odoo/pull/211598 Linked: https://github.com/odoo/upgrade/pull/7740 task-4807991
This update streamlines how customer follow-up records check whether related accounting activity exists. It avoids a more fragile query pattern, helping keep the feature reliable without changing day-to-day user workflows.
Original PR description
odoo/odoo#205208
The field service task form has been reorganized so planned dates and allocated hours appear in the main left section instead of crowding the right side. This makes the most relevant scheduling and workload information easier to find when working on field service tasks.
Original PR description
Before this commit, the task form view of a fsm task contains many fields in the right part. This commit moves the planned dates and the allocated_hours in the left part of the form view but only for fsm tasks. task-4753294
Appointment scheduling can now limit how many people each staff member can handle per time slot, not just resources like rooms or equipment. Businesses can also allow multiple separate bookings in the same slot up to a configured limit, making group classes, consultations, and visits easier to manage.
Original PR description
Before this commit, we only managed resources' capacities for the appointments. From this commit we extend the manage capacities for the users. Users can be booked for the given number of people at max. Also, the user's capacity is shared therefore different people can book an appointment with a user until the capacity of the user. Task-4144546
Payment processing for SEPA Direct Debit now tracks failures through the payment transaction status instead of relying on exceptions. This makes subscription payments easier and more reliable for other Odoo apps to handle, reducing rollback-related issues.
Original PR description
Before this commit the payment engine relied on raising exceptions. That was inconvenient for other modules (ex. Subscription)to use payment as it was needed to handle exceptions and cursor rollback. After this commit the payment engine will rely on only the transaction state. task-3648413 See also: - https://github.com/odoo/odoo/pull/169967
Payroll batches now select employee contract versions directly, making it clearer which payslips will be generated before processing. The update also improves default wizard values, date handling, payroll dashboard navigation, and a Saudi payroll form layout issue.
Original PR description
Problem ---------- Change the pay run selection of employees to selection of versions directly Pre-fill the pay run wizard Change datetime in date In l10n_sa the pay run form view is not well displayed In the payroll dashboard: a click in a specific payrun open the form view Objective ---------- - Filter directly per versions, we can see which payslip will be generated (less magic than before) - Change view to select versions with the hr_version list view - Set a default schedule pay to monthly and a placeholder for the structure_id - Change datetime in date and _get_name_for_period date conversion - Move the report field in l10n_sa pay run form view - Correct the onClickLine in the payrun part of the payroll dashboard Solution ---------- - Use the valid contract filter from the generate_payslip method in the _get_valid_versions_domain directly task-4878411
Colombian and Peruvian electronic invoicing generation was updated to use Odoo’s newer shared UBL tools, improving maintainability and consistency with required tax formats. The update also includes a small Belgian accounting fix so setup scripts only update accounts that actually exist, preventing avoidable installation errors.
Original PR description
We refactor the Colombian and Peruvian UBL to use the new UBL generation helpers. Community PR: https://github.com/odoo/odoo/pull/214151 DIAN doc: https://www.dian.gov.co/impuestos/factura-electronica/Documents/Anexo-Tecnico-Factura-Electronica-de-Venta-vr-1-9.pdf task-4242065
The barcode app now displays a stock move line description when it adds information beyond the product name. This helps warehouse staff better identify picking or movement details directly in the scanning interface.
Original PR description
This commit adds the description of a stock move to the interface of the barcode app, in case that the description is not empty and is not the same as the product name (which is the current default). odoo/odoo#177390 Task-4126824
Planning and Gantt schedule items now show start and end times in a shorter HH:MM format. This makes schedule labels easier to read and leaves more room for important details, especially in languages where AM/PM formatting takes extra space.
Original PR description
## [IMP] planning: condensed time displayed in planning This commit changes a bit the display name of planning template to condense the time displayed for start and end time. ## [IMP] web_gantt: condense time displayed in pill display name Before this commit, the time displayed to show start and end time of a pill could be long in some languages, like in English when we use AM and PM, because of that, there are not enough spaces to display other useful information in the display name of the pill. This commit changes the time format to display the time in HH:MM in the display name of pill. task-4801407
The Colombian electronic invoicing module has been updated to use the latest retry process. This keeps invoice submission recovery aligned with the main platform changes and helps maintain reliability when retrying failed electronic document operations.
Original PR description
in odoo/odoo#211194 we refactored the retry mechanisim, l10n_co_edi is the only edi that is using the refactored function, hence, need to updated task-4728978
Resolved issues and error corrections
This fix prevents editor-only styling files from being included in the main website builder asset bundle. It reduces the risk of unintended visual effects or maintenance issues in appointment, knowledge, rental sales, and studio website editing features.
Original PR description
*: website_appointment, website_knowledge, website_sale_renting, website_studio
In commit [1], the website builder was rewritten in owl. The concept of `*.inside.scss` files was introduced: style that is loaded on pages, inside the iframe only during edition.
The `html_builder.assets` bundle was not supposed to have those. We fix this issue and potential future issues by adding a remove on all modules that include all files within `static/src/{website_builder,plugins}`.
[1]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2
Community PR https://github.com/odoo/odoo/pull/215218Spreadsheet filter editors now handle cases where a filter has no default value without causing incorrect behavior. This helps users configure spreadsheet filters more reliably, especially when leaving optional filter values blank.
Original PR description
Task: 4886119
The payroll pay run kanban view no longer crashes when opened. This restores access to the pay run overview, helping payroll teams continue their work without interruption.
Original PR description
Problem ---------- - Traceback when payrun kanban view is open Objective ---------- - Make the payrun kanban view available Solution ---------- - Remove the xpath in the PayrunKanbanHeader task-4890216
Code cleanup and technical improvements
The Planning app code has been reorganized by moving separate planning classes into their own files. This does not change user-facing behavior, but it makes the codebase easier to maintain and safer to update in the future.
Original PR description
- split planning classes each to its own file extract from this: odoo/enterprise#81319 Task: 4866865
The IoT-related driver and homepage components were consolidated into a single module structure. This reduces internal complexity and helps keep maintenance of connected device features more consistent without changing day-to-day business workflows.
Original PR description
`hw_posbox_homepage` files had no reason to be placed in a separate module, we then merged it into `hw_drivers`, that we renamed `iot_drivers` in the meantime. Community PR: odoo/odoo#213749 Task: 4860513
Miscellaneous changes
Steps to reproduce: - Open Follow-up levels for 15 days -Check the option for “Automatic” - Go to the email template set in the “Content Template” and set a test email in the CC of the email configuration. - Open the follow up reports for a sample customer who is in the “15 days” stage and change the next reminder date to be a day before today. The reminder must be set to automatic. - There will appear a red ribbon on the right corner that says “In need of action” - In another tab, open sch
Original PR description
Steps to reproduce: - Open Follow-up levels for 15 days -Check the option for “Automatic” - Go to the email template set in the “Content Template” and set a test email in the CC of the email…
Steps to reproduce: - Open Follow-up levels for 15 days -Check the option for “Automatic” - Go to the email template set in the “Content Template” and set a test email in the CC of the email configuration. - Open the follow up reports for a sample customer who is in the “15 days” stage and change the next reminder date to be a day before today. The reminder must be set to automatic. - There will appear a red ribbon on the right corner that says “In need of action” - In another tab, open scheduled actions and Open the action “Account Report Followup; Execute followup” - Run this action manually Issue: Go to the previous tab and notice that the email is only sent out to the customer partner record and not the cc email address Note: This issue only occurs if the automatic followup is set. If we try to manually followup by clicking on the “Follow Up” button on the customer report, the email is sent correctly to both addresses. Cause: When running the cron, the recipients aren't in the options Solution: Add an helper to find all necessary recipients from the template if no recipient ids in the options opw-4527398 Forward-Port-Of: odoo/enterprise#87014 Forward-Port-Of: odoo/enterprise#83944
When creating a SEPA Direct Debit (SDD) mandate for a contact, mandates linked to a child contact are not recognized as valid at payment registration. It should be but it suggests a configuration issue so it needs a warning but not an error. task-4507135 Forward-Port-Of: odoo/enterprise#85882
Original PR description
When creating a SEPA Direct Debit (SDD) mandate for a contact, mandates linked to a child contact are not recognized as valid at payment registration. It should be but it suggests a configuration issue so it needs a warning but not an error. task-4507135 Forward-Port-Of: odoo/enterprise#85882
**Current behavior:** A user who can otherwise use the entire mps can not add 'rows' to the view (i.e., write on `ResCompany` `mrp_mps` fields). **Expected behavior:** Can add rows to the MPS. **Steps to reproduce:** 1. Install `mrp_mps` with demo data 2. Edit "Demo" user access rights so they only have the mrp manager group 3. Open MPS -> click `Rows` dropdown (under search bar) and add/remove one -> access error **Cause of the issue:** Field is on `ResCompany` and the MPS us
Original PR description
**Current behavior:** A user who can otherwise use the entire mps can not add 'rows' to the view (i.e., write on `ResCompany` `mrp_mps` fields). **Expected behavior:** Can add rows to the MPS. **Steps to reproduce:** 1. Install `mrp_mps` with demo data 2. Edit "Demo" user access rights so they only have the mrp manager group 3. Open MPS -> click `Rows` dropdown (under search bar) and add/remove one -> access error **Cause of the issue:** Field is on `ResCompany` and the MPS user can't write to that model. **Fix:** Permit writes on `ResCompany` `mrp_mps` fields if they are on an mps field and the user has the mrp manager group. opw-4591655 Forward-Port-Of: odoo/enterprise#87765 Forward-Port-Of: odoo/enterprise#80881
Issue / current behavior: In the gantt view of hr.attendance, the no content help screen will only show if there's no rows. In the case of a fresh database with only the Administrator employee, the help will not appear because the admin row exists by default. Required behavior: The gantt view should show the no content help screen if recordIds inside the single row is empty, meaning that there's no hr.attendance records. task-4874129 Forward-Port-Of: odoo/enterprise#87874
Original PR description
Issue / current behavior: In the gantt view of hr.attendance, the no content help screen will only show if there's no rows. In the case of a fresh database with only the Administrator employee, the help will not appear because the admin row exists by default. Required behavior: The gantt view should show the no content help screen if recordIds inside the single row is empty, meaning that there's no hr.attendance records. task-4874129 Forward-Port-Of: odoo/enterprise#87874
Steps to Reproduce: - Open the Planning app. - Click on the avatar of a resource. - Refresh the page, then click on the avatar of a resource again. Issue: - A traceback error occurs when clicking on the avatar after a page refresh, likely due to component destruction or incomplete loading. Solution: - Consolidated multiple RPC calls into a single method in the parent component to avoid issues with component destruction during `super.onWillStart`. - Modified `onWillStart` to ensure `h
Original PR description
Steps to Reproduce: - Open the Planning app. - Click on the avatar of a resource. - Refresh the page, then click on the avatar of a resource again. Issue: - A traceback error occurs when clicking on the avatar after a page refresh, likely due to component destruction or incomplete loading. Solution: - Consolidated multiple RPC calls into a single method in the parent component to avoid issues with component destruction during `super.onWillStart`. - Modified `onWillStart` to ensure `hr_access` data is fetched without risking lifecycle conflicts. task-4210513 Forward-Port-Of: odoo/enterprise#86878 Forward-Port-Of: odoo/enterprise#75121
- Reworking the DIOT report to comply with 2025 standard - Adjusting operation_type values on res.partner to match - Adjusting DIOT tests and other tests affected by the rework Community PR: https://github.com/odoo/odoo/pull/204742 task-4568859 Forward-Port-Of: odoo/enterprise#88253 Forward-Port-Of: odoo/enterprise#82864
Original PR description
- Reworking the DIOT report to comply with 2025 standard - Adjusting operation_type values on res.partner to match - Adjusting DIOT tests and other tests affected by the rework Community PR: https://github.com/odoo/odoo/pull/204742 task-4568859 Forward-Port-Of: odoo/enterprise#88253 Forward-Port-Of: odoo/enterprise#82864
In this PR: ========== - We are improving the mobile view to make online orders more consistent and seamless. task-4585233 Forward-Port-Of: odoo/enterprise#88166 Forward-Port-Of: odoo/enterprise#80838
Original PR description
In this PR: ========== - We are improving the mobile view to make online orders more consistent and seamless. task-4585233 Forward-Port-Of: odoo/enterprise#88166 Forward-Port-Of: odoo/enterprise#80838
### Issue: Steps to reproduce: - In the settings enable packagings - Create a storable product P with Units as uom and a barcode - Inventory > Configuration > Product > Units & Packagings - Click on pack of 6 > Packaging Barcodes > New - Create one for your product with a different barcode - Go to barcode > Inventory count #### Issue 1: - Scan your packaging > It create a line for 1 Pack of 6 - Apply #### > If you check on the product form you have 1 on Hand unit #### Issue 2
Original PR description
### Issue: Steps to reproduce: - In the settings enable packagings - Create a storable product P with Units as uom and a barcode - Inventory > Configuration > Product > Units & Packagings - Click on…
### Issue: Steps to reproduce: - In the settings enable packagings - Create a storable product P with Units as uom and a barcode - Inventory > Configuration > Product > Units & Packagings - Click on pack of 6 > Packaging Barcodes > New - Create one for your product with a different barcode - Go to barcode > Inventory count #### Issue 1: - Scan your packaging > It create a line for 1 Pack of 6 - Apply #### > If you check on the product form you have 1 on Hand unit #### Issue 2: - Scan your packaging > It create a line for 1 Pack of 6 - Scan your product > Nothing happens rather than adding one unit #### Issue 3: - Scan your product > It create a line for 1 Unit - Scan your packaging > Nothing happends rather than adding 6 units ### Cause of the issue: The issue 1 is the most problematic as it introduce corrupted data. The issue has been introduced by Commit 188ad6980222a77168c462cf149cb79bf28ca2e6 where packagings have been merged with uoms. Prior to this commit, scanning a packaging would convert the barcodeData to to be expressed in the uom of the product: https://github.com/odoo/enterprise/commit/188ad6980222a77168c462cf149cb79bf28ca2e6 The commit came with the additional feature of creating lines refering dirrectly to the packaging, for instance scanning a pack of 6 would create one line: 1 pack of 6. While this behavior make sense in the context of pickings since stock moves can bear different uoms than the product it self, it does not in the context of stock.quant's since the uom of the quant is necessarily the one of the product: https://github.com/odoo/odoo/blob/9f8e9ca2676f5e3ccc34522d444d1f02e2d21f92/addons/stock/models/stock_quant.py#L53-L55 Now, the issue is that in inventory counts you edit quants via the barcode lines. When the barcode changes are applied in db, we provide the data's to write or create via these lines: https://github.com/odoo/enterprise/blob/38e0ae75c2cfddfe76535847ff8b67823b0c6419/stock_barcode/static/src/models/barcode_model.js#L920-L928 https://github.com/odoo/enterprise/blob/f2dd6326c2084ed467c3e4c3e9d931f41309ad79/stock_barcode/static/src/models/barcode_quant_model.js#L307-L320 which can not provide to the backend the packaging uom in order to convert the related quantities (as it is not a quant field). In particular, the Command.create and Command.update are simply populated expecting these qties to be expressed in the product_uom. ### Fix: Converting the barcodeData's quantity in case a packaging is provided will solve all issues since all the save commands will be expressed in the expected uom and since the barcode machinery is already tailored to treat the addition of appropriate qties. opw-4872894 Forward-Port-Of: odoo/enterprise#87999
The size of fields for Previous Payroll IDs was set to 20 characters. According to the STP xml schema, the max size is 200. This is already checked with the schema validation so the limit can be safely removed. This commit also adds a disclaimer for the users informing them regarding STP compliance. opw-4820852 Forward-Port-Of: odoo/enterprise#88248 Forward-Port-Of: odoo/enterprise#87068
Original PR description
The size of fields for Previous Payroll IDs was set to 20 characters. According to the STP xml schema, the max size is 200. This is already checked with the schema validation so the limit can be safely removed. This commit also adds a disclaimer for the users informing them regarding STP compliance. opw-4820852 Forward-Port-Of: odoo/enterprise#88248 Forward-Port-Of: odoo/enterprise#87068
**Current behavior:** Scanning a package type in an MO in barcode while having a raw move line (component line) selected will result in a traceback. **Expected behavior:** Put the comp line in a new pack of that package type. **Steps to reproduce:** 1. Make a packge type 2. Make a new MO -> open it in barcode 3. Scan some component, select the new line 4. Scan the barcode of the package type -> traceback **Cause of the issue:** We end up calling `action_put_in_pack` when `
Original PR description
**Current behavior:** Scanning a package type in an MO in barcode while having a raw move line (component line) selected will result in a traceback. **Expected behavior:** Put the comp line in a new pack of that package type. **Steps to reproduce:** 1. Make a packge type 2. Make a new MO -> open it in barcode 3. Scan some component, select the new line 4. Scan the barcode of the package type -> traceback **Cause of the issue:** We end up calling `action_put_in_pack` when `this.resModel` is `MrpProduction` (which does not define this method). **Fix:** Define the method for the barcode MRP model to display a notification to, rather, scan a product (scanning a package here doesn't make sense). opw-4564834 Forward-Port-Of: odoo/enterprise#87629 Forward-Port-Of: odoo/enterprise#81374
When we enable the integer rounding option on this report, a traceback is raised at the report opening. It happens because integer rounding didn't support a groupby when a custom engine is used. opw-4688616 Forward-Port-Of: odoo/enterprise#87618 Forward-Port-Of: odoo/enterprise#86452
Original PR description
When we enable the integer rounding option on this report, a traceback is raised at the report opening. It happens because integer rounding didn't support a groupby when a custom engine is used. opw-4688616 Forward-Port-Of: odoo/enterprise#87618 Forward-Port-Of: odoo/enterprise#86452
Before this commit, the statement attachment was created only when doing an import but not when creating the statement manually. This commit will move the logic to create the attachment into the create of account bank statement task-4863754 Forward-Port-Of: odoo/enterprise#87599
Original PR description
Before this commit, the statement attachment was created only when doing an import but not when creating the statement manually. This commit will move the logic to create the attachment into the create of account bank statement task-4863754 Forward-Port-Of: odoo/enterprise#87599
Before, The closing balance of saft export for the unaffected earnings account was always at zero which makes no sense. Now this is fixed as the closing balance should always be equal to the initial balance. Forward-Port-Of: odoo/enterprise#88096 Forward-Port-Of: odoo/enterprise#87419
Original PR description
Before, The closing balance of saft export for the unaffected earnings account was always at zero which makes no sense. Now this is fixed as the closing balance should always be equal to the initial balance. Forward-Port-Of: odoo/enterprise#88096 Forward-Port-Of: odoo/enterprise#87419
Removed the module as it was removed in fe442111dc22b5d0bb9717ff69a5f473e1e81d50, and mistakenly resurrected in 65ed1bddbb2d032f74ef84afc9add85a1503dec5 Forward-Port-Of: odoo/enterprise#87742
Original PR description
Removed the module as it was removed in fe442111dc22b5d0bb9717ff69a5f473e1e81d50, and mistakenly resurrected in 65ed1bddbb2d032f74ef84afc9add85a1503dec5 Forward-Port-Of: odoo/enterprise#87742
From saas-18.2, some account changes on Swedish CoA when other module(s) are installed have been breaking the test for the export (that exports all the available account). This commit adapts the expected test file to ignore this changes and ensures the result always stays the same, no matter what modules are installed on the database. This fixes the currently recurring runbot errors from saas-18.2 and up: [runbot-159821](https://runbot.odoo.com/odoo/error/159821) Forward-Port-Of: o
Original PR description
From saas-18.2, some account changes on Swedish CoA when other module(s) are installed have been breaking the test for the export (that exports all the available account). This commit adapts the expected test file to ignore this changes and ensures the result always stays the same, no matter what modules are installed on the database. This fixes the currently recurring runbot errors from saas-18.2 and up: [runbot-159821](https://runbot.odoo.com/odoo/error/159821) Forward-Port-Of: odoo/enterprise#86752
Since #82896 reconciling bank statement line that has a partner with company_id set to a branch company leads to removing the partner from the statement line when validating the reconciliation. Steps: - Create a branch company and select it. - Create a contact with company_id == the branch company. - Create and confirm an invoice with that contact as partner. - Go back to accounting dashboard, and open bank reconciliation widget. - Create a new transaction with the invoice amount and tha
Original PR description
Since #82896 reconciling bank statement line that has a partner with company_id set to a branch company leads to removing the partner from the statement line when validating the reconciliation. Steps: - Create a branch company and select it. - Create a contact with company_id == the branch company. - Create and confirm an invoice with that contact as partner. - Go back to accounting dashboard, and open bank reconciliation widget. - Create a new transaction with the invoice amount and that partner. - Select it, and select the invoice we created, and click on Validate. - Notice that the partner is not set (removed) from the transaction. Fix: Add another condition to check if the statement line company matches the partner company before trying to unset the partner if its company isn't a root company. opw-4809740 Forward-Port-Of: odoo/enterprise#88103 Forward-Port-Of: odoo/enterprise#87440