Thursday, May 15, 2025
88 changes · saas-18.3
Enhancements to existing features
The project kanban view now loads much faster by optimizing how project tasks, favorites, and ratings are looked up. This improves day-to-day navigation for users managing projects, with benchmarked loading time reduced from 1.1 seconds to about 300 milliseconds.
Original PR description
Description ----------- The project task's `is_template` field was previously indexed for `TRUE` values, making lookups for template tasks efficient due to their small number. However, filtering for…
Description
-----------
The project task's `is_template` field was previously indexed for `TRUE` values, making lookups for template tasks efficient due to their small number. However, filtering for non-template tasks ( `is_template = FALSE`) became slow since it requires scanning a large number of records. This impacted performance in domains like `__compute_task_count`. This commit optimizes the query by first fetching template tasks and filtering them out in Python rather than relying on database-level filtering.
Additionally, this commit adds a new field
`res.users.favorite_project_ids` as the inverse relation of `project.project.favorite_user_ids`. This improves `_compute_is_favorite` performance by checking if a project exists in a user's favorites rather than searching through all users who favorited a project. The latter approach was slower due to the larger search space of user-project relationships.
Finally, new indexes are added to `rating.rating` for consumed ratings to optimize `_compute_rating_percentage_satisfaction`. Since most rating lookups include the condition `('consumed', '=', True)`, these indexes will improve query performance across the rating system.
Benchmark
----------
On odoo.com, opening the kanban view of projects, with six favorite projects (typical setup):
| Before | After | Speed up |
|--------|-------|----------|
| 1.1s | 300ms | 3.7x |
Reference
---------
task-4794928
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe live chat demo content has been expanded to show sessions that require specific expertise. This helps business users and evaluators better understand how support routing and chatbot scenarios can work in realistic examples.
Original PR description
Purpose of this commit: To add demo data related to the expertise that the session required. task-4762961
Downloading QR codes for POS self-ordering now also includes an Excel file with shortened ordering links for every table in the selected POS setup. This makes it easier for staff to access, share, or manage table-specific self-order URLs alongside the QR codes.
Original PR description
When the user clicks "Download QR Codes", an XLSX file is now included in the ZIP archive. This file contains the shortened self-ordering URLs for all tables in the selected POS configuration. Task-4771791 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
Tax selections now show clearer, consistent labels such as scope, company, and country details across accounting, product, invoice, and localization workflows. This reduces confusion when choosing taxes and removes older custom display logic that was no longer needed.
Original PR description
TLDR: we had several custom components to display the tax scope, we don't need them anymore. With display_names now supporting markdown, we can remove several components. - many2x_tax_tags was using…
TLDR: we had several custom components to display the tax scope, we don't need them anymore. With display_names now supporting markdown, we can remove several components. - many2x_tax_tags was using search_read instead of name search to fetch the tax scope. This removed several display name features in the many2one dropdown. The tags would display several additional fields: the company name and foreign tax country code (on product form) - it made use of the tax autocomplete component to render the scope - but this was no longer working. - The many2one tax tags did the same as the tax autocomplete but instead used the `specification` feature to retrieve additional fields. Additional problems: - displaying the company in the tax tag was only done for the product template, however this was lost when the context params changed according to the URL. With markdown we can replace all of them by simply improving `_compute_display_name`. so the opportunity is takes to clean up several uses of the tax field. - product form view should display the name, scope, company (multi company mode), foreign country code (for foreign taxes, not displayed in the dropdown) - account form view: name, type, company (multi company mode), country code (not in dropdown) - views that generate entries, for example bank recon & manual recon wizard: name, type, country code (not in dropdown) - invoices and bills: name, scope, country code (not in dropdown) For now, scope is displayed everywhere (in the dropdown), but may not be necessary (see account form and recon) No Task
This update adds new ISO-based date options for sequence numbers, helping businesses generate order or document references with internationally recognized week numbers. Existing sequence formats continue to work unchanged, reducing disruption while allowing more accurate configuration where needed.
Original PR description
Steps ----- 1. Configure the sale order sequence to use `%(woy)s` as suffix; 2. confirm a new sale order in 2025. Issue ----- The week number used in the generated name is off by one from the…
Steps ----- 1. Configure the sale order sequence to use `%(woy)s` as suffix; 2. confirm a new sale order in 2025. Issue ----- The week number used in the generated name is off by one from the expected ISO 8061 week number. Cause ----- The date interpolation used for sequences, passes `%W` to `strftime` to get the week of the year. This uses a non-standard method, starting with the first monday located in the year (2025-01-06)[^1]. The ISO 8061 method starts counting from whatever week has January 4 in it (i.e. first week with at least 4 days), with weeks starting on Monday (2024-12-30). To get this result from `strftime`, `%V` needs to be used in the format string. Solution -------- In order to not break existing week-based sequences, add ISO 8061-based format specifications alongside the current ones: - ISO 8061 week number `%V` → `%(isoweek)s` - ISO 8061 week-based year w/ century `%G` → `%(isoyear)s` - ISO 8061 week-based year w/out century `%g` → `%(isoy)s` opw-4606876 [^1]: https://www.man7.org/linux/man-pages/man3/strftime.3.html
Portal profile updates now check whether a new login is already in use through a simpler lookup instead of creating an extra database checkpoint. This improves performance for a rare validation scenario while keeping the uniqueness check in place.
Original PR description
When updating the login in the form, the code creates a savepoint, that we want to remove for performance reasons, to check if the login is unique. Since it is improbable that 2 concurrent transactions would want to use the same login, we remove the savepoint and do the check using a search. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Bank reconciliation users can now access a broader batch payment search when the initial suggestions are not enough. The popover also shows only five batch payments at a time, keeping the selection list clearer and easier to scan.
Original PR description
Adding the search more logic on batch payment and limiting the display to 5 batch in the popover no task id
This update completes recent changes to activities and addresses issues that caused crashes or made the workflow harder to use. It should make activity handling in Odoo more reliable and smoother for everyday users.
Original PR description
task-4592571 changed up the way activities function, but not everything was completed before the end of the freeze; in addition, it included a number of bugs/crashes/usage inconveniences. This commit adds: This commit also fixes: task-4747156
Accounting and Ecuador localization screens now use the standard tax display format after related platform changes. This keeps tax names consistent across forms and search fields, reducing confusion for users working with invoices, products, reimbursements, and withholding flows.
Original PR description
With the removal of custom tax components in the corresponding community commit, views need to be updated to use the standard display_name and markdown formats now available. No Task
Resolved issues and error corrections
This update adjusts an internal web module test so it no longer fails randomly when the test environment is under heavy load. It helps keep automated checks stable and reduces false alarms during development, without changing user-facing behavior.
Original PR description
The modified test in this commit would occasionally fail at random. This appears to happen only if some code unexpectedly takes a long time to execute. As a result, when we advance the time, it overshoots the debounce function. The underlying issue seems to be an assumption that virtually no time passes between the start of the test and a specific point where only microtasks should run. However, if the testing infrastructure is under heavy load, it's possible for that delay to exceed 25ms. A more robust fix is needed long-term, but for now, this commit only addresses the issue in this specific test. 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
Code cleanup and technical improvements
The order name editing popup has been moved into the main Point of Sale app, where it is actually used. This keeps the restaurant add-on cleaner and helps ensure the feature is available from the correct Point of Sale area without changing user workflows.
Original PR description
This commit moves the EditOrderNamePopup component from pos_restaurant to point_of_sale since the component is only used in point_of_sale. 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
Miscellaneous changes
When the invoice can't be sent via Peppol, we are adding a footer in the Invoice email. We sent this regardless of the partner Peppol status. This PR narrows the cases when we sent the footer. Another issue is that "we recommend" Odoo, we are speaking in the name of our user. A better phrasing will make things fairer, such as this footer keeps its informative value, without being too pushy. task-4782004 Forward-Port-Of: odoo/odoo#209994 Forward-Port-Of: odoo/odoo#209432
Original PR description
When the invoice can't be sent via Peppol, we are adding a footer in the Invoice email. We sent this regardless of the partner Peppol status. This PR narrows the cases when we sent the footer. Another issue is that "we recommend" Odoo, we are speaking in the name of our user. A better phrasing will make things fairer, such as this footer keeps its informative value, without being too pushy. task-4782004 Forward-Port-Of: odoo/odoo#209994 Forward-Port-Of: odoo/odoo#209432
The date and time picker now shows a hand cursor when hovering over selectable dates, making it clearer that dates can be clicked. It also fixes the visual styling of date ranges across month boundaries so only the true start and end dates are rounded.
Original PR description
task-4794212 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
Activities in the Chatter now correctly show the activity type and creator name instead of leaving those details blank. This fixes a display issue so users can more easily understand who created an activity and what kind of follow-up it is.
Original PR description
This commit fixes an issue introduced by de26b96cda16 where some fields of the activity records weren't properly read. Notably `activity_type_id` and `create_uid` which only returned their ID instead of returning (ID, name). This led to a wrong display of the additional informations inside the activities in the Chatter. Where the type of activity and its creator were empty. To fix this, we reimplement the _to_store method so that we properly read the fields while letting the store add their specific fields. task-4794562 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents an error that could appear when a user quickly selects “Show All” while uninstalling a module. The uninstall process now handles empty module data safely, avoiding a disruptive crash in the user interface.
Original PR description
Currently, an error occurs when a user uninstall a module and immediately click the Show All checkbox. **Steps to produce:** - Install any module. - Uninstall that module and quickly click the `Show All` checkbox. **Error:** `ValueError: Compute method failed to assign base.module.uninstall(1,).model_ids` **Root Cause:** At [1], if `module_ids` is empty, no value is assigned to `model_ids`. [1] https://github.com/odoo/odoo/blob/f52d5aff1afa99fa0e8953545b09ad1f7c813b2f/odoo/addons/base/wizard/base_module_uninstall.py#L45-L53 This commit ensures that each record in the compute method is explicitly assigned a value for `model_ids`, thereby preventing the Value error. sentry-6600637515
Fixed an issue where Point of Sale setups with loyalty features could show only special products, hiding the option to load sample data. Special products such as gift cards or eWallet top-ups are now hidden when no regular products exist, so users can still access the sample data option.
Original PR description
**Before this commit:** ======= In a non-demo db with the loyalty module, loading sample data was not possible. Only special products (e.g., gift card, top-up eWallet) were shown, which caused the "Load Sample Data" button to be hidden.  **After this commit:** ======= Hide the special products when no regular products are available. allowing the "Load Sample Data" button to remain visible.  Task: 4743089
The time off allocation approval screen now hides the approve button once an allocation request has already been approved. This avoids confusion for managers and prevents users from thinking an approved request still needs action.
Original PR description
Originally the approve button still exits after approving the allocation request because of a misleading old condition. The condition has been removed.
Fixes an issue where converting a lead into a new customer could fail if no default language was configured for contacts. The system now falls back safely, helping sales users complete opportunity conversion without interruption.
Original PR description
To reproduce: - remove default ir.default for res.partner "lang" field - create a lead and fill both "Company Name" and "Contact Name" - click on "Convert to Opportunity" - choose option "Create a new customer" - click "Create Oppportunity" It crash because there is no default value for the lang field (provided in context or through ir.default) This commit is a followup of odoo/odoo@7b90bf3abc8d to ensure we properly fallback when `default_get()` don't return a value. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects internal typing information used by the web module's shared object utilities. It helps developers avoid mistakes when using these helpers, reducing the chance of related issues in future changes without affecting end users directly.
Original PR description
`K[]` means that `properties` should be passed as an array, which is not the expected format. Typing must be rigorously correct to be useful. See example of error in related ENT PR. Task-4749289
This fixes how the online shop chooses which page header is active by turning off all alternatives before enabling the selected one. It helps prevent incorrect or overlapping header displays, creating a more consistent shopping experience for visitors.
This change prevents popover animations from running during activity-related automated tests. It reduces test timing issues and helps keep validation results stable without changing business features.
Original PR description
HOOT disables CSS animations (https://github.com/odoo/odoo/commit/008541343faa39b5749f1d1621a8832f1a9167ad) But Popover uses `HTMLElement.animate()` directly leading to race conditions. After this commit, the race conditions mentioned should be fixed. runbot-error-188379 runbot-error-188378
This fix removes a problematic header customization step from website onboarding so new customers can create and configure websites again. It is a temporary workaround while the underlying issue is investigated, reducing disruption during the first setup experience.
Original PR description
An issue with view customization related to header (navbar) customization in the website onboarding prevents customers from creating new websites. This is a huge issue as new customers usually start by creating a website on our saas. This commit is a temporary fix of 0571a98 that removes the header customization to allow new customers to configure their website while investigating the origin of the issue. opw-4795208
The AI chat button is now hidden in Documents folder views where there is no specific record for the chat to reference. This prevents users from encountering an error when opening the chatter and clicking the AI button in that context.
Original PR description
How to reproduce: - Open Documents, go into a folder - Open its chatter, click on the AI btn Current behavior: - Traceback: https://pastebin.com/kyCq2yBE Solution: The AI chat requires a record but when opening a folder in the Documents app, there is no record to refer to, resulting to an error. As a fix, we won't show the AI button in case of missing record. Task-ID: 4796869
Kiosk mode now sends the required authorization information when communicating with IoT devices, so actions such as receipt printing are accepted by the IoT Box. The fix also resolves a payment terminal error that could appear after a payment was approved or cancelled.
Original PR description
Kiosk mode didn't sign the request headers with "Authorisation" needed by the IoT to execute actions like printing. This PR fixes it along with an error caused by the refactoring PR https://github.com/odoo/odoo/pull/186359 To reproduce the authorisation issue: connect a kiosk with an iot box + printer, then make a payment. The printing would never be done because no "authorization" is sent in the headers, so the IoT Box refuses to execute the action To reproduce the bug linked to the refactoring: connect an iot terminal (tested with Worldline) then try to make a payment. A traceback appears upon payment approval or cancellation task-4794798
This fix prevents barcode kanban screens from crashing when background requests finish after a user has left the page. It also groups independent data requests together, improving reliability for stock barcode and batch picking workflows.
Original PR description
… condition In JS, rpc is not a service anymore so it will return no matter if the component is already destroyed. In turn, the orm service is protected, so if it is passed it will crash. After this commit, we prevent this race condition and we batch calls that are independant from one another. runbot-error-190605
This fix prevents crashes when viewing document folder details with aliases enabled, especially in debug or read-only views. It also improves how activity assignees, alias spacing, and cleared domain fields appear, making the Documents details panel more reliable and consistent for users.
Original PR description
1. Configure aliases 2. Open documents in debug mode 3. Select or enter a folder 4. Open details panel (Info & Tags) 5. See crash Without debug mode in readonly, you'll see "Activity assigned to" instead of "No activity assignee". Also fixes * domain field disappearing if cleared * irregular spacing of alias in readonly * filtered props passed to the Many2OneField (see related COM PR) Tests are not exhaustive but expanded to increase coverage of alias fields and `isContainer` 'fake' records. Follow up of 4724349 Task-4749289
Manual tax-related returns now run their validation checks immediately when created, instead of waiting for a page refresh. The checks screen also shows a name that matches the return type, reducing confusion for users handling different return processes.
Original PR description
Before this commit: When we would create return manually for instance: Ec sales and intrastat, the checks would not run automatically since they only run on page refresh. The fix here is to run these checks on creation of the return. Another fix is the display name of the checks view. It was always 'VAT Return Checks' which is wrong. Now we base the view name on the return type name. task-4783937
**Original issue** The "View tasks" button was missing in the notification mail sent to users with "Administrator" rights in the Project app. **Root cause** Issue since commit 34a50e83e654017520c0add727215bd7b528ae19 after which implied groups are no longer added to the user. The query in `_get_recipient_data` using the `res_groups_users_rel` table now doesn't fetch the implied groups. In `_notify_get_recipients_groups` of `project.task`, button access was given to project users, this
Original PR description
**Original issue** The "View tasks" button was missing in the notification mail sent to users with "Administrator" rights in the Project app. **Root cause** Issue since commit 34a50e83e654017520c0add727215bd7b528ae19 after which implied groups are no longer added to the user. The query in `_get_recipient_data` using the `res_groups_users_rel` table now doesn't fetch the implied groups. In `_notify_get_recipients_groups` of `project.task`, button access was given to project users, this group is missing from the data returned by `_get_recipient_data`. **Solution** Restore previous behavior by adding the `all_implied_ids` of `res.groups` to the groups returned. opw-4711892 Forward-Port-Of: odoo/odoo#207693
Description of the issue this commit addresses: In the move form view, the sections and notes are made readonly too soon. For example in a purchase order form, when the PO is confirmed, it is still possible to add notes and sections but not to edit them so they are locked once the focus is lost. As it is intended to be able to add notes at such point so it should be possible to edit them too. --- Desired behavior after this commit is merged: This commit makes it so that the readonly
Original PR description
Description of the issue this commit addresses: In the move form view, the sections and notes are made readonly too soon. For example in a purchase order form, when the PO is confirmed, it is still…
Description of the issue this commit addresses: In the move form view, the sections and notes are made readonly too soon. For example in a purchase order form, when the PO is confirmed, it is still possible to add notes and sections but not to edit them so they are locked once the focus is lost. As it is intended to be able to add notes at such point so it should be possible to edit them too. --- Desired behavior after this commit is merged: This commit makes it so that the readonly attribute of the sections and notes depends on the state of the move of the form. Currently, we want the readonly only if the parent is cancelled (cancel), locked (done) or posted (posted). --- Note on the fix: The addition of the sectionAndNoteIsReadonly() getter is the part of the fix that really allows the user to edit text that was previously uneditable. On the other hand, the override of the isCellReadonly method is only here to make sure no readonly classes like text-muted are applied if the cell is still editable. --- opw-4744367 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208638
There was a typo in the history plugin, making an `if` statement useless. This fixes the typo. Backport of https://github.com/odoo/odoo/pull/186917/commits/0269326853abd35e988359e776632b47febf2e60. Forward-Port-Of: odoo/odoo#209946
Original PR description
There was a typo in the history plugin, making an `if` statement useless. This fixes the typo. Backport of https://github.com/odoo/odoo/pull/186917/commits/0269326853abd35e988359e776632b47febf2e60. Forward-Port-Of: odoo/odoo#209946
When the `odoo-enterprise/iot/x509` encounters an unexpected error, we still get an OK response but the result is empty and instead there is an error object returned. Before this commit, we never checked for this error object and so continued to process an empty result, causing a crash. After this commit, we check for these errors and log them, with a different message to distinguish them from the existing errors that we already check for. task-4793795 --- I confirm I have signed the C
Original PR description
When the `odoo-enterprise/iot/x509` encounters an unexpected error, we still get an OK response but the result is empty and instead there is an error object returned. Before this commit, we never checked for this error object and so continued to process an empty result, causing a crash. After this commit, we check for these errors and log them, with a different message to distinguish them from the existing errors that we already check for. task-4793795 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209949 Forward-Port-Of: odoo/odoo#209819
actual_lastcall was being false because it wasn't set in one case inside `add_lastcalls` method. This commit fixes this issue. Forward-Port-Of: odoo/odoo#209215
Original PR description
actual_lastcall was being false because it wasn't set in one case inside `add_lastcalls` method. This commit fixes this issue. Forward-Port-Of: odoo/odoo#209215
In odoo/odoo#209104, the nginx config was revamped to allow for a better access point experience. However, a side-effect of this was that the nginx config in `overwrite_before_init`, which was previously always overwritten, was now being used, causing accesses to port 80 to always be redirected even when the access point was not running. To fix this, we delete the old config file, and also delete the default nginx splash page website. --- I confirm I have signed the CLA and read the PR gu
Original PR description
In odoo/odoo#209104, the nginx config was revamped to allow for a better access point experience. However, a side-effect of this was that the nginx config in `overwrite_before_init`, which was previously always overwritten, was now being used, causing accesses to port 80 to always be redirected even when the access point was not running. To fix this, we delete the old config file, and also delete the default nginx splash page website. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209985 Forward-Port-Of: odoo/odoo#209933
This PR adds the reset of: 1) screen orientation 2) browser_url 3) iot_handlers_etag when disconnecting a database This allows to switch between the different versions of the database more easily and avoid getting stuck with a non existent runbot db instance pos customer display for example Forward-Port-Of: odoo/odoo#209231 Forward-Port-Of: odoo/odoo#209112
Original PR description
This PR adds the reset of: 1) screen orientation 2) browser_url 3) iot_handlers_etag when disconnecting a database This allows to switch between the different versions of the database more easily and avoid getting stuck with a non existent runbot db instance pos customer display for example Forward-Port-Of: odoo/odoo#209231 Forward-Port-Of: odoo/odoo#209112
So it appears from the tour build error screenshot that the redirect doesn’t happen that fast, so we need to wait for it to happen before checking the next step, which is 'Edit'—which overrides it and edits the event details instead of the events list. So, we need to wait for the redirect to happen before checking the next step build_error-164184 referencing this commit : https://github.com/odoo/odoo/commit/b1e424bcd5e985b74496e409fb16c9529bbe848e  Forward-Port-Of: odoo/odoo#209631 Forward-Port-Of: odoo/odoo#208381
**[FIX] website: fix animations in mega menu** Steps to reproduce the issue: 1. Have a mega menu. 2. Go to edit. 3. Select one section of the mega menu. 4. Add an animation. 5. Error appears. The issue arrises since this commit [1], where the new interactions system was introduced. The elements in a mega menu should not animate based on page scroll. But we were still trying to add a scroll listener on an empty array, which caused the error. This commit backports commit [2], wh
Original PR description
**[FIX] website: fix animations in mega menu** Steps to reproduce the issue: 1. Have a mega menu. 2. Go to edit. 3. Select one section of the mega menu. 4. Add an animation. 5. Error appears. The…
**[FIX] website: fix animations in mega menu** Steps to reproduce the issue: 1. Have a mega menu. 2. Go to edit. 3. Select one section of the mega menu. 4. Add an animation. 5. Error appears. The issue arrises since this commit [1], where the new interactions system was introduced. The elements in a mega menu should not animate based on page scroll. But we were still trying to add a scroll listener on an empty array, which caused the error. This commit backports commit [2], which improves Colibri and was merged in a later version. This allows the issue to be fixed. [1]: https://github.com/odoo/odoo/commit/dd13994674d4ef4683f5a4d46a1f604650cfb92b [2]: https://github.com/odoo/odoo/commit/56debb4f907a890511dca123c80e0c420b67cb36 opw-4778576 ------------------------------- **[FIX] website: fix animations not hidden in initial state** - In Website edit mode. - Drag and drop a "Columns" block into the page. - Add a "fade in" animation to the first column of the block. - Save the page. - Bug: instead of being initially hidden before fading in, the column is first visible, then becomes hidden, and only then starts fading in. The issue arises from commit [1], where the new interactions system was introduced. The "o_animate_preview" class, which forces the animated element to be visible during animation preview in edit mode, was no longer being removed when exiting edit mode. [1]: https://github.com/odoo/odoo/commit/dd13994674d4ef4683f5a4d46a1f604650cfb92b opw-4778576 Forward-Port-Of: odoo/odoo#209427
This commit adds steps to the favorite_management_tour to ensure the all steps are performed sequencially between first favorite save and applying a new groupBy. Runbot-112238 Forward-Port-Of: odoo/odoo#209013
Original PR description
This commit adds steps to the favorite_management_tour to ensure the all steps are performed sequencially between first favorite save and applying a new groupBy. Runbot-112238 Forward-Port-Of: odoo/odoo#209013
This error occurs when the user deletes the email alias expense `hr_expense.mail_alias_expense`. Steps to Reproduce: 1. Install the module `hr_expense`. 2. Go to Setting > Technical > Email > Aliases and delete `Expense`. 3. Open Expenses. `ValueError: External ID not found in the system: hr_expense.mail_alias_expense` This error occurs when the system is unable to fetch hr_expense.mail_alias_expense ID while opening the module `Expenses`. This commit ensures that if the ID does
Original PR description
This error occurs when the user deletes the email alias expense `hr_expense.mail_alias_expense`. Steps to Reproduce: 1. Install the module `hr_expense`. 2. Go to Setting > Technical > Email > Aliases and delete `Expense`. 3. Open Expenses. `ValueError: External ID not found in the system: hr_expense.mail_alias_expense` This error occurs when the system is unable to fetch hr_expense.mail_alias_expense ID while opening the module `Expenses`. This commit ensures that if the ID does not exist, the function will return None instead of raising an exception. Sentry: 6559233309 Forward-Port-Of: odoo/odoo#206943
PR odoo/odoo#170012 modified the application of Pension Fund taxes to invoice lines. After the PR, only lines with: `.//AltriDatiGestionale/TipoDato[contains(text(), 'AswCassPre')]` and the correct kind in the `.//AltriDatiGestionale/RiferimentoTesto` tag, got their Pension Fund tax applied. `AswCassPre` is an additional tag belonging to a "best practice" standard agreement from [AssoSoftware](https://www.assosoftware.it/servizi-offerti/standard-fe-e-protocollo-dintesa/). These may be best p
Original PR description
PR odoo/odoo#170012 modified the application of Pension Fund taxes to invoice lines. After the PR, only lines with: `.//AltriDatiGestionale/TipoDato[contains(text(), 'AswCassPre')]` and the correct…
PR odoo/odoo#170012 modified the application of Pension Fund taxes to invoice lines. After the PR, only lines with: `.//AltriDatiGestionale/TipoDato[contains(text(), 'AswCassPre')]` and the correct kind in the `.//AltriDatiGestionale/RiferimentoTesto` tag, got their Pension Fund tax applied. `AswCassPre` is an additional tag belonging to a "best practice" standard agreement from [AssoSoftware](https://www.assosoftware.it/servizi-offerti/standard-fe-e-protocollo-dintesa/). These may be best practices, but they're not at all mandatory for using the SdI, so it happens that invoices do not follow these additional specifications. For everyone else, the Pension Fund tax must be applied on all lines where `.//DatiGeneraliDocumento/DatiCassaPrevidenziale/AliquotaIVA` tag matches the VAT tax of the line. This PR adds code that tells one case from the other. Task [link](https://www.odoo.com/odoo/project/967/tasks/4381089) task-4381089 Forward-Port-Of: odoo/odoo#209601 Forward-Port-Of: odoo/odoo#207853
### Steps to reproduce: - Create a recurring service (product) with invoicing policy set as 'Based on Timesheets' - Create a subscription using the created product - Create a task and link it to this subscription order - Timesheet 3 line in the task one in the past one on the same date of creation and one in the future. - Create an invoice for this order - Notice the quantity has been invoiced is the present timesheet line only - Notice that the 3 timesheet lines have all been vali
Original PR description
### Steps to reproduce: - Create a recurring service (product) with invoicing policy set as 'Based on Timesheets' - Create a subscription using the created product - Create a task and link it to this…
### Steps to reproduce: - Create a recurring service (product) with invoicing policy set as 'Based on Timesheets' - Create a subscription using the created product - Create a task and link it to this subscription order - Timesheet 3 line in the task one in the past one on the same date of creation and one in the future. - Create an invoice for this order - Notice the quantity has been invoiced is the present timesheet line only - Notice that the 3 timesheet lines have all been validated ### Cause: This is happening because when trying to link the lines to the invoice we consider the timesheets within the date range that the user might have set in the create invoice wizard. https://github.com/odoo/odoo/blob/9a4ec08b9a6b07470747923d09adcf51f7e4cd6a/addons/sale_timesheet/wizard/sale_make_invoice_advance.py#L33-L51 https://github.com/odoo/odoo/blob/9a4ec08b9a6b07470747923d09adcf51f7e4cd6a/addons/sale_timesheet/models/sale_order.py#L153 ### Fix: In subscription we can use the last and next invoice dates if the user hasn't set a period for the invoice. opw-4523727 Forward-Port-Of: odoo/odoo#205782 Forward-Port-Of: odoo/odoo#205029
Issue ----- Sending the E-Invoice fails with an error when the Product Desc is missing. Steps to reproduce ----- -Go to Accounting > Customers > Invoices -Create an invoice with a line item such as "Round Off" (no product description) -Send for E-invoice. Fix ---- -This commit adds a validation check to ensure that 'PrdDesc' is only added to the json_payload if `line.name` is present, preventing the error during e-invoice generation. ---- Tickets: opw-4788391 Forward-Port-
Original PR description
Issue ----- Sending the E-Invoice fails with an error when the Product Desc is missing. Steps to reproduce ----- -Go to Accounting > Customers > Invoices -Create an invoice with a line item such as "Round Off" (no product description) -Send for E-invoice. Fix ---- -This commit adds a validation check to ensure that 'PrdDesc' is only added to the json_payload if `line.name` is present, preventing the error during e-invoice generation. ---- Tickets: opw-4788391 Forward-Port-Of: odoo/odoo#209546
Description ----------- When name-searching for a user to be assigned as a manager on an expense, we're currently looking at all users, including portal users, which is a significantly larger search space than just internal users. This leads to a sub-optimal query plan that ignores trigram indexes for matching the `ILIKE` pattern. This occurs due to a corner case in Postgres where, when an order and limit are provided with a `btree` index, it estimates that scanning that index will find mat
Original PR description
Description ----------- When name-searching for a user to be assigned as a manager on an expense, we're currently looking at all users, including portal users, which is a significantly larger search…
Description ----------- When name-searching for a user to be assigned as a manager on an expense, we're currently looking at all users, including portal users, which is a significantly larger search space than just internal users. This leads to a sub-optimal query plan that ignores trigram indexes for matching the `ILIKE` pattern. This occurs due to a corner case in Postgres where, when an order and limit are provided with a `btree` index, it estimates that scanning that index will find matching records faster than scanning the `trigram` index. To address this implicitly, we restrict the users considered to internal users only, as it makes little sense to propose portal users as managers. As a side effect, this significantly alters the query plan to what we expect - a scan of the trigram index on `res.partner.name`. Benchmark ---------- On odoo.com, a `name_search` of an employee with their trigram took: | Before | After | |--------|-------| | 20s | 20ms | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209842
Using `setContent` inside a test with a selection change and rely on the selectionchange event to trigger a modification of the interface that is the very subject of the test is error-prone as the sequence of events in that case is non-deterministic under heavy cpu load and thus ends up creating a hidden race condition. Forward-Port-Of: odoo/odoo#207192
Original PR description
Using `setContent` inside a test with a selection change and rely on the selectionchange event to trigger a modification of the interface that is the very subject of the test is error-prone as the sequence of events in that case is non-deterministic under heavy cpu load and thus ends up creating a hidden race condition. Forward-Port-Of: odoo/odoo#207192
Description of the issue/feature this PR addresses: Adding 2 new accounts that addresses newly enacted law for cash payment rounding. [Legal doc (only in Lithuanian)](https://e-seimas.lrs.lt/portal/legalAct/lt/TAD/5d1b9590e33711ef8cdff2c320e69444?jfwid=m8xvfl87c) approving chart of account with the new added accounts. [Legal doc](https://www.e-tar.lt/portal/lt/legalAct/9926c840f1be11ee9f5b8ffa077f9188) approving the cash rounding itself. As a bonus I added translations for the new accounts
Original PR description
Description of the issue/feature this PR addresses: Adding 2 new accounts that addresses newly enacted law for cash payment rounding. [Legal doc (only in Lithuanian)](https://e-seimas.lrs.lt/portal/legalAct/lt/TAD/5d1b9590e33711ef8cdff2c320e69444?jfwid=m8xvfl87c) approving chart of account with the new added accounts. [Legal doc](https://www.e-tar.lt/portal/lt/legalAct/9926c840f1be11ee9f5b8ffa077f9188) approving the cash rounding itself. As a bonus I added translations for the new accounts, but unsure if I should have done that, let me know if I should remove them. [MORE INFO ABOUT IT ALL](https://www.lb.lt/en/rounding-of-cash-payments) Current behavior before PR: No `5009` and `6319` accounts Desired behavior after PR is merged: Accounts `5009` and `6319` present --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209096 Forward-Port-Of: odoo/odoo#208306
Before this commit, when an user A is invited by an event of user B and none of these users are synchronized with Google, when the synchronization of user A starts or resumes, the event will be synchronized with the user A as organizer in Google. In the meanwhile, in Odoo, the event ownership will be shown as user B, mismatching the organizer field between the two ends. This is problematic because the ownership of the event will be forever wrong in Google. After this commit, when user A start
Original PR description
Before this commit, when an user A is invited by an event of user B and none of these users are synchronized with Google, when the synchronization of user A starts or resumes, the event will be synchronized with the user A as organizer in Google. In the meanwhile, in Odoo, the event ownership will be shown as user B, mismatching the organizer field between the two ends. This is problematic because the ownership of the event will be forever wrong in Google. After this commit, when user A starts or resumes its synchronization with Outlook, previous Odoo events which user A is attendee but not organizer won't be synchronized until the organizer synchronizes its calendar. This will keep the ownership of the event intact in Odoo, and when the organizer synchronizes its calendar with Google, it will be correctly synchronized in Google as well. task-4269432 Forward-Port-Of: odoo/odoo#209870 Forward-Port-Of: odoo/odoo#188848
Before this commit, when opening a pos without admin employees set, the user was blocked into its open session without being able to close it. task-id: 4730841 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208831 Forward-Port-Of: odoo/odoo#206662
Original PR description
Before this commit, when opening a pos without admin employees set, the user was blocked into its open session without being able to close it. task-id: 4730841 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208831 Forward-Port-Of: odoo/odoo#206662
Before this commit, when a product had multiple taxes, the X report was displaying a wrong total base tax amount. This was due to the fact that the tax amount was being calculated as the sum of all the tax bases. This was wrong as the amount tax excluded of the product sold was included twice in this sum. opw-4727830 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208642
Original PR description
Before this commit, when a product had multiple taxes, the X report was displaying a wrong total base tax amount. This was due to the fact that the tax amount was being calculated as the sum of all the tax bases. This was wrong as the amount tax excluded of the product sold was included twice in this sum. opw-4727830 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208642
Because an exception raised by the `_unlink_forbid_parts_of_chain` method when attempting to delete journal entries. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#190019
Original PR description
Because an exception raised by the `_unlink_forbid_parts_of_chain` method when attempting to delete journal entries. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#190019
During the rendering of email marketing templates, links will be automatically shortened to aliases, which also enable tracking on the links' activity. However, since some links are generated by Odoo, these are protected (blacklisted) from being shortened during the email generation process. Since that blacklist is keyword-based, some external pages are also affected by this (notably Google Docs' forms, whose URL contains "/viewform", matching keyword /view. Steps to reproduce: - Creat
Original PR description
During the rendering of email marketing templates, links will be automatically shortened to aliases, which also enable tracking on the links' activity. However, since some links are generated by Odoo, these are protected (blacklisted) from being shortened during the email generation process. Since that blacklist is keyword-based, some external pages are also affected by this (notably Google Docs' forms, whose URL contains "/viewform", matching keyword /view. Steps to reproduce: - Create a new mass mailing - Add a link to a Google Docs form, and a link to a Wikipedia page - Send the mass mailing - On the received email: The link to Wikipedia is shortened, the Google Docs form link is not To reduce the number of false positives, this commit makes it so that blacklist elements need to be followed by a path symbol ( / # ? or link termination) to be counted as positives. task-4196321 Forward-Port-Of: odoo/odoo#201060 Forward-Port-Of: odoo/odoo#190819
**Current behavior before PR:** - Clicking the reset color button did not remove the applied gradient color. **Desired behavior after PR is merged:** - The reset color button now correctly removes the gradient color when clicked. task: 4735054 Forward-Port-Of: odoo/odoo#206778
Original PR description
**Current behavior before PR:** - Clicking the reset color button did not remove the applied gradient color. **Desired behavior after PR is merged:** - The reset color button now correctly removes the gradient color when clicked. task: 4735054 Forward-Port-Of: odoo/odoo#206778
Problem: In Firefox, typing the backtick character "`" can cause it to be automatically deleted. Cause: Typing "`" initiates a composition session. If the selection is changed while `isComposing` is true, Firefox cancels the session and deletes the character. Solution: In `InlineCodePlugin.onInput`, the selection is now modified only when the `<code>` tag is applied. This intentional change ends the composition safely. In all other cases, we avoid changing the selection during compositi
Original PR description
Problem: In Firefox, typing the backtick character "`" can cause it to be automatically deleted. Cause: Typing "`" initiates a composition session. If the selection is changed while `isComposing` is true, Firefox cancels the session and deletes the character. Solution: In `InlineCodePlugin.onInput`, the selection is now modified only when the `<code>` tag is applied. This intentional change ends the composition safely. In all other cases, we avoid changing the selection during composition to preserve user input. Steps to reproduce: 1. Open the HTML editor in Firefox. 2. Type "`". → The character disappears unexpectedly. opw-4760478 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208255
Steps to reproduce the bug: - Enable multi-steps route - Set a remove destination location (e.g., WH/stock/shelf1) on the repair operation type. - Create a new route: - name: Push route - Rule: - Action: push to - Operation type: internal transfer - Source location: WH/stock/shelf1 - Destination location: WH/stock/shelf2 - Create a storable product “P1”: - Update the Qty to one unit in WH/stock - Create a sotrable product “C1”: - Route: select the
Original PR description
Steps to reproduce the bug: - Enable multi-steps route - Set a remove destination location (e.g., WH/stock/shelf1) on the repair operation type. - Create a new route: - name: Push route - Rule: -…
Steps to reproduce the bug:
- Enable multi-steps route
- Set a remove destination location (e.g., WH/stock/shelf1) on the repair operation type.
- Create a new route:
- name: Push route
- Rule:
- Action: push to
- Operation type: internal transfer - Source location: WH/stock/shelf1 - Destination location: WH/stock/shelf2
- Create a storable product “P1”:
- Update the Qty to one unit in WH/stock
- Create a sotrable product “C1”:
- Route: select the new created route → “Push route”
- Create a repair order:
- Customer: Azure interior
- Product: P1
- part:
- Remove one unit of C1
- Confirm the repair
- Start the repair
- End the repair
Problem:
The move of “C1” is duplicated and added to the repair
When a push rule triggers an internal transfer for a component removed during a repair, the newly created stock move wrongly inherits the "repair_id" from the original move.
This happens because the "repair_id" field was not excluded from being copied, resulting in the duplicated move being incorrectly linked to the repair order.
https://github.com/odoo/odoo/blob/11e69870db1c49d9a6af79ffd263e4e162b34b6b/addons/stock/models/stock_move.py#L1854-L1855
https://github.com/odoo/odoo/blob/11e69870db1c49d9a6af79ffd263e4e162b34b6b/addons/stock/models/stock_move.py#L968-L969 https://github.com/odoo/odoo/blob/11e69870db1c49d9a6af79ffd263e4e162b34b6b/addons/stock/models/stock_rule.py#L212
https://github.com/odoo/odoo/blob/11e69870db1c49d9a6af79ffd263e4e162b34b6b/addons/stock/models/stock_rule.py#L240
Solution:
By setting copy=False on the repair_id field, we prevent this unintended propagation.
opw-4689206
Forward-Port-Of: odoo/odoo#208653After more discussion and consideration, this error is considered to have relatively low value and furthermore to possibly be triggered by the chrome shutdown itself e.g. `Page.stopLoading` is documented as > Force the page stop all navigations and pending resource fetches. so that can be the source of "failed to fetch" errors, maybe (didn't actually test it). Note that this is hooked to `_result.done()` aka `not _result.running()`, so there is a window where the issue can still occur (
Original PR description
After more discussion and consideration, this error is considered to have relatively low value and furthermore to possibly be triggered by the chrome shutdown itself e.g. `Page.stopLoading` is documented as > Force the page stop all navigations and pending resource fetches. so that can be the source of "failed to fetch" errors, maybe (didn't actually test it). Note that this is hooked to `_result.done()` aka `not _result.running()`, so there is a window where the issue can still occur (at least as a result of `stopLoading`) while we're waiting for service workers to shut down as well as pending responses. If this is still an issue, we may want to add a separate flag and set it right before or after the `Page.stopLoading` call. Hides runbot errors 54858, 55676, 109214, 109473, 110840, 134469, 162284, 162340, 193182, 198562, and 199232 Forward-Port-Of: odoo/odoo#209902
Problem: In a scrollable editable, the floating toolbar may overflow and appear on top of fixed elements like headers. Solution: Detect overflow relative to the scrollable container and hide the toolbar when it is no longer fully visible. Before:  After:  Steps to reproduce: 1. Open the TODO app. 2.
Original PR description
Problem: In a scrollable editable, the floating toolbar may overflow and appear on top of fixed elements like headers. Solution: Detect overflow relative to the scrollable container and hide the toolbar when it is no longer fully visible. Before:  After:  Steps to reproduce: 1. Open the TODO app. 2. Add enough content to make the editable scrollable. 3. Open the floating toolbar on the first element. 4. Scroll down. → The toolbar overlaps with the page header. opw-4770575 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208401
Since the changes in the tour engine, steps are slightly faster. This commit adds a step in the user switch tour to wait to be actually logged out before continuing runbot-error-135106 runbot-error-135070 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#209831
Original PR description
Since the changes in the tour engine, steps are slightly faster. This commit adds a step in the user switch tour to wait to be actually logged out before continuing runbot-error-135106 runbot-error-135070 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#209831
The XML format used to cancel invoices for freelancers in Bizkaia was invalid. Steps to reproduce: - Configure a freelance company with Bizkaia as tax agency - Create and send an invoice to TicketBAI - Cancel it using "TicketBAI Cancel" - You get an error: "Invalid content was found starting with element 'Renta'. One of '(AnulacionTicketBai)' is expected." This fix follows the official Bizkaia documentation: https://www.batuz.eus/fitxategiak/batuz/lroe/Batuz_LROE_Especificaciones_Env%C
Original PR description
The XML format used to cancel invoices for freelancers in Bizkaia was invalid. Steps to reproduce: - Configure a freelance company with Bizkaia as tax agency - Create and send an invoice to TicketBAI - Cancel it using "TicketBAI Cancel" - You get an error: "Invalid content was found starting with element 'Renta'. One of '(AnulacionTicketBai)' is expected." This fix follows the official Bizkaia documentation: https://www.batuz.eus/fitxategiak/batuz/lroe/Batuz_LROE_Especificaciones_Env%C3%ADo_Masivo_V1_0_7.pdf (see page 30) and the example provided here: https://www.batuz.eus/fitxategiak/batuz/LROE/ejemplos/Ejemplo_Anulacion_1_LROE_PF_140_IngresosConFacturaConSG_79732487C.xml opw-4634677 Forward-Port-Of: odoo/odoo#209392
Scenario: in mobile, edit the link of the category back button Result: the link is changed, but it is overriden by t-att-href so will not be taken into account. Fix: add o_not_editable on parent to prevent editing this part, this prevent to change style but there is no simple way to prevent editing only the link and there is no information that there is a "t-att-href". opw-4725198 Forward-Port-Of: odoo/odoo#209500
Original PR description
Scenario: in mobile, edit the link of the category back button Result: the link is changed, but it is overriden by t-att-href so will not be taken into account. Fix: add o_not_editable on parent to prevent editing this part, this prevent to change style but there is no simple way to prevent editing only the link and there is no information that there is a "t-att-href". opw-4725198 Forward-Port-Of: odoo/odoo#209500
requires: https://github.com/odoo/enterprise/pull/84124 --- In the control panel, any middle element (whether it's the search bar or control_panel_actions) tends to drop below the rest of the content under the `lg` breakpoint due to missing spacing. Under `md`, these elements collapse into dropdowns or toggle buttons as expected. Prior to this commit, there was an issue with the spacing applied between `md` and `lg`. This was either caused by the `mt-md-0` class on the search bar or the
Original PR description
requires: https://github.com/odoo/enterprise/pull/84124 --- In the control panel, any middle element (whether it's the search bar or control_panel_actions) tends to drop below the rest of the content…
requires: https://github.com/odoo/enterprise/pull/84124 --- In the control panel, any middle element (whether it's the search bar or control_panel_actions) tends to drop below the rest of the content under the `lg` breakpoint due to missing spacing. Under `md`, these elements collapse into dropdowns or toggle buttons as expected. Prior to this commit, there was an issue with the spacing applied between `md` and `lg`. This was either caused by the `mt-md-0` class on the search bar or the specific breakpoint use of `gap-lg-3` To resolve the spacing issue between `md` and `lg`, we now apply the correct gap (by adding a `gap-2` alongside the `gap-lg-3`) on the control panel’s main div, and remove unwanted margin/padding classes. | | Before (between md and lg) | After (between md and lg) | |--------|--------|--------| | w/ searchbar |  |  | | w/ actions |  |  | task-4568501 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209771 Forward-Port-Of: odoo/odoo#207461
Before this commit, clearing lines in the sanitize data cache used a forward iteration, which caused some lines to be skipped due to index shifting when deleting items. This could result in only half of the lines being removed and potentially lead to errors. After this commit, order lines are deleted using a backward iteration, ensuring that all lines are properly removed without skipping any. opw-4770945 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/
Original PR description
Before this commit, clearing lines in the sanitize data cache used a forward iteration, which caused some lines to be skipped due to index shifting when deleting items. This could result in only half of the lines being removed and potentially lead to errors. After this commit, order lines are deleted using a backward iteration, ensuring that all lines are properly removed without skipping any. opw-4770945 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208475 Forward-Port-Of: odoo/odoo#208391
Prior to this fix, the product configurator did not display the on-hand quantities of product variants as shown on the product page, when an attribute’s variant creation was set to 'never'. Steps to reproduce: 1. Create a product with variants. 2. Add multiple attributes and values. 3. Set the variant creation to 'never' for one attribute. 4. Add stock for the product and make it available in POS. 5. Open POS, select the product, and switch between variants. The quantity displayed was
Original PR description
Prior to this fix, the product configurator did not display the on-hand quantities of product variants as shown on the product page, when an attribute’s variant creation was set to 'never'. Steps to reproduce: 1. Create a product with variants. 2. Add multiple attributes and values. 3. Set the variant creation to 'never' for one attribute. 4. Add stock for the product and make it available in POS. 5. Open POS, select the product, and switch between variants. The quantity displayed was only for one variant. This commit ensures that the correct on-hand quantity is shown for each selected variant in POS. opw-4685882 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208195 Forward-Port-Of: odoo/odoo#206263
To reproduce: - Enable Stripe payment provider, and disable "Allow Saving Payment Methods" - Create a subscription and 'Sent' it - Click on "Preview" and try to paid using payment method provided by Stripe. An error is raised: ``` The provided setup_future_usage (null) does not match the expected setup_future_usage (off_session). Try confirming with a Payment Intent that is configured to use the same parameters as Stripe Elements. ``` This commit ensure we only request for token
Original PR description
To reproduce: - Enable Stripe payment provider, and disable "Allow Saving Payment Methods" - Create a subscription and 'Sent' it - Click on "Preview" and try to paid using payment method provided by Stripe. An error is raised: ``` The provided setup_future_usage (null) does not match the expected setup_future_usage (off_session). Try confirming with a Payment Intent that is configured to use the same parameters as Stripe Elements. ``` This commit ensure we only request for tokenization if it's required and both the provider and the payment method support it. opw-4605528 opw-4723230 Forward-Port-Of: odoo/odoo#209136 Forward-Port-Of: odoo/odoo#206231
- It's not auto-exported (for now...) - It was out of date - We forgot to include the industry modules Also update .tx/config with missing modules --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209818
Original PR description
- It's not auto-exported (for now...) - It was out of date - We forgot to include the industry modules Also update .tx/config with missing modules --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209818
Issue: ------------ The width of the "Upload and Set" button did not adjust based on its text, resulting in the text being clipped. Fix: ----------- This commit enables automatic width adjustment for the "Upload and Set" button to ensure both the button and its text are fully visible on the same line. Steps to Reproduce (mobile view): ------------------ - Install the project module - Open the task Kanban view - Click on Set Cover Image task-3761269 Forward-P
Original PR description
Issue: ------------ The width of the "Upload and Set" button did not adjust based on its text, resulting in the text being clipped. Fix: ----------- This commit enables automatic width adjustment for the "Upload and Set" button to ensure both the button and its text are fully visible on the same line. Steps to Reproduce (mobile view): ------------------ - Install the project module - Open the task Kanban view - Click on Set Cover Image task-3761269 Forward-Port-Of: odoo/odoo#160913
Before this commit, if the POS blackbox module was installed, the sale details report would display total price in price included because of an override. In this commit, we add the config id to the method computing this price so that the blackbox module can override this computation only if the config is a blackbox one. original commit: 90751dc3e9c4c19b98f3506160436cdf6e0763a0 Enterprise PR: https://github.com/odoo/enterprise/pull/85356 --- I confirm I have signed the CLA and read the
Original PR description
Before this commit, if the POS blackbox module was installed, the sale details report would display total price in price included because of an override. In this commit, we add the config id to the method computing this price so that the blackbox module can override this computation only if the config is a blackbox one. original commit: 90751dc3e9c4c19b98f3506160436cdf6e0763a0 Enterprise PR: https://github.com/odoo/enterprise/pull/85356 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209584
### Steps to reproduce: - In the settings enable Multi-Steps Rules - Inventory > Configuration > Warehouse Management > Warehouses - Put your warehouse in delivery in 2 steps and modify the rules to be in the old pull set up Stock 1-> Output 2-> Customer. - Enable the "Cancel next move" option of the pick rule. - Create an SO for 1 unit of a storable product > This should generate both a pick and a ship move. - Cancel the pick move #### > The ship move was not cancelled ### Cause of
Original PR description
### Steps to reproduce: - In the settings enable Multi-Steps Rules - Inventory > Configuration > Warehouse Management > Warehouses - Put your warehouse in delivery in 2 steps and modify the rules to…
### Steps to reproduce: - In the settings enable Multi-Steps Rules - Inventory > Configuration > Warehouse Management > Warehouses - Put your warehouse in delivery in 2 steps and modify the rules to be in the old pull set up Stock 1-> Output 2-> Customer. - Enable the "Cancel next move" option of the pick rule. - Create an SO for 1 unit of a storable product > This should generate both a pick and a ship move. - Cancel the pick move #### > The ship move was not cancelled ### Cause of the issue: While the moves of the chain are correctly linked and the `move_dest_ids` of the pick move is planed to be cancelled, it does not satisfy the filtering condition of moves that should be cancelled because as it is at the end of the chain it does not have a `move_dest_id` it self: https://github.com/odoo/odoo/blob/eb43cdbfeb3d141283dbd9274fae45bf0bf641db/addons/stock/models/stock_move.py#L1966-L1968 IMO, the condition on the locations should be set between the move we are cancelling and the move we plan to cancel rather than on next step of the chain that might not even exist. Note (fix sale_stock): The forward port of commit 853d9c46fc506564c5c40a2ce7cd14507109a923 has not been merged in 17.2 since its issue was not reproducible in that version. This is because the propagate cancel option was not working properly since the push pull refactor. To merge our change we therefore need to reintroduce the associated `sale_stock` fix. opw-4689175 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205120
to reproduce: =========== step 1 : change language to arab step 2 : go to dashboard app using mobile Problem: ======= overlapped text in the Dashboard module we forced direction to ltr on all languages in web and we didn't add this change in the mobile part Solution: ======= force ltr direction even on rtl languages in the mobile part opw-4586743 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of
Original PR description
to reproduce:
===========
step 1 : change language to arab
step 2 : go to dashboard app using mobile
Problem:
=======
overlapped text in the Dashboard module
we forced direction to ltr on all languages in web and we didn't add this change in the mobile part
Solution:
=======
force ltr direction even on rtl languages in the mobile part
opw-4586743
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#209154
Forward-Port-Of: odoo/odoo#208977Steps to reproduce: --------------------------------------------------------------------------------------------------------------------- - Install the point_of_sale module. - Enable Loyalty from configuration - 1. Open Session and add a gift card product to the order. Enter a gift card number using a past suggestion (autocomplete). - 2. Create a new partner from the frontend using autofill Issue: ------------------------------------------------------------------------------------
Original PR description
Steps to reproduce: --------------------------------------------------------------------------------------------------------------------- - Install the point_of_sale module. - Enable Loyalty from…
Steps to reproduce:
---------------------------------------------------------------------------------------------------------------------
- Install the point_of_sale module.
- Enable Loyalty from configuration
- 1. Open Session and add a gift card product to the order.
Enter a gift card number using a past suggestion (autocomplete).
- 2. Create a new partner from the frontend using autofill
Issue:
----------------------------------------------------------------------------------------------------------------------
- A traceback occurs when the gift card number is selected from the suggestion
list & create partner using autofill
Cause:
----------------------------------------------------------------------------------------------------------------------
- The event key value is undefined when selecting from autocomplete
suggestions, causing a crash in the keydown event handler.
Fix:
---------------------------------------------------------------------------------------------------------------------
- Gift card number field suggestion is unnecessary, so remove suggestion and
safely handled cases where event key is undefined during keydown events to
prevent crashes.
Task:4743765
Forward-Port-Of: odoo/odoo#207186The outdated page watcher checks whether bus notifications were missed when the bus reconnects after an unexpected disconnection. To do so, it checks if the last known notification id is still in the bus table. When the bus disconnects, the last notification id is saved. However, disconnect event is not correctly sent when switching from online to offline. This commit fixes this issue. follow up of https://github.com/odoo/odoo/pull/208625 Description of the issue/feature this PR address
Original PR description
The outdated page watcher checks whether bus notifications were missed when the bus reconnects after an unexpected disconnection. To do so, it checks if the last known notification id is still in the bus table. When the bus disconnects, the last notification id is saved. However, disconnect event is not correctly sent when switching from online to offline. This commit fixes this issue. follow up of https://github.com/odoo/odoo/pull/208625 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#209472
user_lang was missing as it was not set in the test setup, which caused an error in the setup because when creating a company it needed a user_lang to be set in this function `_create_dashboard_notes` build_error-161173 Forward-Port-Of: odoo/enterprise#84249
Original PR description
user_lang was missing as it was not set in the test setup, which caused an error in the setup because when creating a company it needed a user_lang to be set in this function `_create_dashboard_notes` build_error-161173 Forward-Port-Of: odoo/enterprise#84249
Forgotten in c632b843 / task 4491333. Task-4703626 Forward-Port-Of: odoo/enterprise#82907
Original PR description
Forgotten in c632b843 / task 4491333. Task-4703626 Forward-Port-Of: odoo/enterprise#82907
### Steps to reproduce: - Create a recurring service (product) with invoicing policy set as 'Based on Timesheets' - Create a subscription using the created product - Create a task and link it to this subscription order - Timesheet 3 line in the task one in the past one on the same date of creation and one in the future. - Create an invoice for this order - Notice the quantity has been invoiced is the present timesheet line only - Notice that the 3 timesheet lines have all been
Original PR description
### Steps to reproduce: - Create a recurring service (product) with invoicing policy set as 'Based on Timesheets' - Create a subscription using the created product - Create a task and link it to this…
### Steps to reproduce: - Create a recurring service (product) with invoicing policy set as 'Based on Timesheets' - Create a subscription using the created product - Create a task and link it to this subscription order - Timesheet 3 line in the task one in the past one on the same date of creation and one in the future. - Create an invoice for this order - Notice the quantity has been invoiced is the present timesheet line only - Notice that the 3 timesheet lines have all been validated ### Cause: This is happening because when trying to link the lines to the invoice we consider the timesheets within the date range that the user might have set in the create invoice wizard. https://github.com/odoo/odoo/blob/9a4ec08b9a6b07470747923d09adcf51f7e4cd6a/addons/sale_timesheet/wizard/sale_make_invoice_advance.py#L33-L51 https://github.com/odoo/odoo/blob/9a4ec08b9a6b07470747923d09adcf51f7e4cd6a/addons/sale_timesheet/models/sale_order.py#L153 ### Fix: In subscription we can use the last and next invoice dates if the user hasn't set a period for the invoice. opw-4523727 Forward-Port-Of: odoo/enterprise#83333 Forward-Port-Of: odoo/enterprise#80582
The error was caused by the ability to `quick-create` digital certificates from the settings screen without providing the actual certificate file. This results in False being stored in the certificate content fields, ultimately triggering a `TypeError` during PDF signing. Steps to reproduce: - Go to Settings > Search for `Cryptographic signature` > Quick create a Certificate with random name and save. - Now sign and validate any file, you will encounter the error. Error: `TypeError: exp
Original PR description
The error was caused by the ability to `quick-create` digital certificates from the settings screen without providing the actual certificate file. This results in False being stored in the certificate content fields, ultimately triggering a `TypeError` during PDF signing. Steps to reproduce: - Go to Settings > Search for `Cryptographic signature` > Quick create a Certificate with random name and save. - Now sign and validate any file, you will encounter the error. Error: `TypeError: expected bytes-like object, not bool` Solution: - Removed being able to quick create certificates. sentry-6545302218 Forward-Port-Of: odoo/enterprise#85276
This commit fixes the thick dashed border on the requested document in kanban view. Task-4721026 Forward-Port-Of: odoo/enterprise#83308
Original PR description
This commit fixes the thick dashed border on the requested document in kanban view. Task-4721026 Forward-Port-Of: odoo/enterprise#83308
- When closing the session from the tour, the `total_due` of the partner was not updated yet. Now when closing the session, the test waits for the `total_due` to be updated before evaluating its value. runbot error: 182096 Forward-Port-Of: odoo/enterprise#84693
Original PR description
- When closing the session from the tour, the `total_due` of the partner was not updated yet. Now when closing the session, the test waits for the `total_due` to be updated before evaluating its value. runbot error: 182096 Forward-Port-Of: odoo/enterprise#84693
Currently the "resend" mechanism relies on `_send`; marking messages to resend as "outgoing". However when used in batch mode `_send` only sends template messages. We enable `_send_cron` to send discuss messages too and to process these in priority. As these have a fixed time limit to be sent. We also do some filtering on resend to avoid marking messages that we know will fail as outgoing. Including "unrecoverable" errors and messages on outdated channel. Methods that use crons are a
Original PR description
Currently the "resend" mechanism relies on `_send`; marking messages to resend as "outgoing". However when used in batch mode `_send` only sends template messages. We enable `_send_cron` to send discuss messages too and to process these in priority. As these have a fixed time limit to be sent. We also do some filtering on resend to avoid marking messages that we know will fail as outgoing. Including "unrecoverable" errors and messages on outdated channel. Methods that use crons are also updated to use direct method trigger and prevent commits during tests to avoid having to patch them every time. task-3547088 Forward-Port-Of: odoo/enterprise#85014 Forward-Port-Of: odoo/enterprise#79050
Steps to reproduce - Install Accounting - Go to settings and activate Analytic Accounting - Go to Configuration and create two analytic plans without any analytic accounts - Go to the Profit and Loss report - Activate the two new analytic plans -> the report is messed up in its columns Cause of the issue: When two analytic plans without any analytic account are present, they have the exact same forced_options, leading to the same column_group_key. task-4675686 Forward-Po
Original PR description
Steps to reproduce - Install Accounting - Go to settings and activate Analytic Accounting - Go to Configuration and create two analytic plans without any analytic accounts - Go to the Profit and Loss report - Activate the two new analytic plans -> the report is messed up in its columns Cause of the issue: When two analytic plans without any analytic account are present, they have the exact same forced_options, leading to the same column_group_key. task-4675686 Forward-Port-Of: odoo/enterprise#82231
**Problem** When purchasing items, then refunding them in PoS with a Peruvian company, a traceback appears, making the refund impossible. **Steps to reproduce** - Install "l10n_pe_edi_pos" - Change to the Peruvian Company - Create an order from PoS - Create a refund for that order - A traceback appears **Why the fix** A previous fix (8af3821) was done to make sure we could select multiple orders in the case of a global invoice. This fix did not take into account the fact that the *l
Original PR description
**Problem** When purchasing items, then refunding them in PoS with a Peruvian company, a traceback appears, making the refund impossible. **Steps to reproduce** - Install "l10n_pe_edi_pos" - Change to the Peruvian Company - Create an order from PoS - Create a refund for that order - A traceback appears **Why the fix** A previous fix (8af3821) was done to make sure we could select multiple orders in the case of a global invoice. This fix did not take into account the fact that the *l10n_pe_edi_refund_reason* could be not set, and get it's default value being False. So when trying to use the join() method on a boolean instead of a string, the traceback appeared. With this fix, we only use the join method if the *l10n_pe_edi_refund_reason* is set, and keeping the join() method to handle the case where multiple *l10n_pe_edi_refund_reason* are set. opw-4761685 Forward-Port-Of: odoo/enterprise#84598
Since f82f9ab7b0351d0c1239c4cafa772bea8c17c6ff, the unreconciled aml domain includes payable accounts, which leads to issue when processing followup. Since we need to get the total value including payable accounts, we add `account_id` to the group by, this way we can conditionnally set the computed values regarding the type of account, but also get the total due/overdue amounts, by adding two computed fields. Steps to reproduce new issue: - create a vendor bill for Demo (Joel Willis), with du
Original PR description
Since f82f9ab7b0351d0c1239c4cafa772bea8c17c6ff, the unreconciled aml domain includes payable accounts, which leads to issue when processing followup. Since we need to get the total value including payable accounts, we add `account_id` to the group by, this way we can conditionnally set the computed values regarding the type of account, but also get the total due/overdue amounts, by adding two computed fields. Steps to reproduce new issue: - create a vendor bill for Demo (Joel Willis), with due date 15 days ago - confirm the bill, print the PDF and attach it to the bill (as if we received it from the vendor) - now open the follow-up wizard from the partner form, and notice that the Vendor bill is attached opw-4664402 Forward-Port-Of: odoo/enterprise#85371 Forward-Port-Of: odoo/enterprise#85296
When user quickly presses the ``Enter`` key multiple times to record a timesheet, A traceback will appear. Steps to reproduce the error: - Go to Timesheets > My Timesheets - Now, Quickly press the ``Enter`` key multiple times to record a timesheet Traceback: ``` ValueError: Expected singleton: timer.timer(1, 2) File "home/odoo/src/enterprise/18.0/timesheet_grid/models/analytic.py", line 433, in action_start_new_timesheet_timer timesheet.action_timer_start() File "home/odoo/
Original PR description
When user quickly presses the ``Enter`` key multiple times to record a timesheet, A traceback will appear. Steps to reproduce the error: - Go to Timesheets > My Timesheets - Now, Quickly press the…
When user quickly presses the ``Enter`` key multiple times to record a timesheet,
A traceback will appear.
Steps to reproduce the error:
- Go to Timesheets > My Timesheets
- Now, Quickly press the ``Enter`` key multiple times to record a timesheet
Traceback:
```
ValueError: Expected singleton: timer.timer(1, 2)
File "home/odoo/src/enterprise/18.0/timesheet_grid/models/analytic.py", line 433, in action_start_new_timesheet_timer
timesheet.action_timer_start()
File "home/odoo/src/enterprise/18.0/timesheet_grid/models/analytic.py", line 460, in action_timer_start
super().action_timer_start()
File "home/odoo/src/enterprise/18.0/timer/models/timer_mixin.py", line 86, in action_timer_start
self._stop_timer_in_progress()
File "home/odoo/src/enterprise/18.0/timer/models/timer_mixin.py", line 140, in _stop_timer_in_progress
model = self.env[timer.res_model].browse(timer.res_id)
File "odoo/fields.py", line 1228, in __get__
record.ensure_one()
File "odoo/models.py", line 6196, in ensure_one
raise ValueError("Expected singleton: %s" % self)
```
https://github.com/odoo/enterprise/blob/58348c5f9276e5cb4397f0f73d23b41f5a454868/timer/models/timer_mixin.py#L128-L131 When a user quickly presses the ``Enter`` key,
``timer`` will have multiple records,
So, It will lead to the above traceback.
sentry-6557099219
Forward-Port-Of: odoo/enterprise#73984…d not CLOC Before this commit, when approvals created action servers, there were part of the CLOC After this commit, they are not. opw-4784181 Forward-Port-Of: odoo/enterprise#85390
Original PR description
…d not CLOC Before this commit, when approvals created action servers, there were part of the CLOC After this commit, they are not. opw-4784181 Forward-Port-Of: odoo/enterprise#85390
- In the check report, the amount in numbers are now moved leftward so that it is closer to the beginning of the line 4720121 Forward-Port-Of: odoo/enterprise#85342
Original PR description
- In the check report, the amount in numbers are now moved leftward so that it is closer to the beginning of the line 4720121 Forward-Port-Of: odoo/enterprise#85342
Description of the issue this commit addresses: When multiple lines that are in budget on their own are above budget when summed together, neither the lines nor the budget button show that the budget will be exceeded. This leads to making purchase orders that shouldn't be made. --- Desired behavior after this commit is merged: This commit makes it so that when the lines together will exceed the budget, the budget smart button and all the lines become red as a single line would.
Original PR description
Description of the issue this commit addresses: When multiple lines that are in budget on their own are above budget when summed together, neither the lines nor the budget button show that the budget will be exceeded. This leads to making purchase orders that shouldn't be made. --- Desired behavior after this commit is merged: This commit makes it so that when the lines together will exceed the budget, the budget smart button and all the lines become red as a single line would. --- task-4710838 Forward-Port-Of: odoo/enterprise#84653
During uninstall, fields (columns) bound to the module get deleted first, so the columns used for the search don't exist anymore and the search fails, which leads to the tables not being properly dropped, which can then lead to the module reinstallation not being clean e.g. because there are rows left in the table which can lead to constraints not being addable on install. This has been the cause of `resource` failing forever in the uninstall nightly test: it's most likely been failing since
Original PR description
During uninstall, fields (columns) bound to the module get deleted first, so the columns used for the search don't exist anymore and the search fails, which leads to the tables not being properly dropped, which can then lead to the module reinstallation not being clean e.g. because there are rows left in the table which can lead to constraints not being addable on install. This has been the cause of `resource` failing forever in the uninstall nightly test: it's most likely been failing since this hook was introduced. Forward-Port-Of: odoo/enterprise#85439
### Before this PR Try to do a receipt with a product, then a full discount of this product. You can't do a receipt with 0.0 as the amount because it is missing printRecTotal ### After this PR: You can do receipt with an amount of 0.0 This PR depends from odoo/enterprise#80951 (i can't create draft PR, but when that PR will be merged i will rebase) Forward-Port-Of: odoo/enterprise#81376
Original PR description
### Before this PR Try to do a receipt with a product, then a full discount of this product. You can't do a receipt with 0.0 as the amount because it is missing printRecTotal ### After this PR: You can do receipt with an amount of 0.0 This PR depends from odoo/enterprise#80951 (i can't create draft PR, but when that PR will be merged i will rebase) Forward-Port-Of: odoo/enterprise#81376
### Before this PR - Go on point of sale (with pos_discount installed) - Click on Action - Click on Discount - Write a discount percentage - Click OK - Validate POS An error appear because the negative price should be a printRecItemAdjustment with type 3 ### After this PR the right printRecitemAdjustiment is sent to printer Forward-Port-Of: odoo/enterprise#83452 Forward-Port-Of: odoo/enterprise#80951
Original PR description
### Before this PR - Go on point of sale (with pos_discount installed) - Click on Action - Click on Discount - Write a discount percentage - Click OK - Validate POS An error appear because the negative price should be a printRecItemAdjustment with type 3 ### After this PR the right printRecitemAdjustiment is sent to printer Forward-Port-Of: odoo/enterprise#83452 Forward-Port-Of: odoo/enterprise#80951
Add in missing modules to tx/config where their pots were auto-added by the pot export sync.
Original PR description
Add in missing modules to tx/config where their pots were auto-added by the pot export sync.
Before this commit, when pos_blackbox_be was installed, the pos tests were failing because most pos test called `_run_test` which is calling `_satrt_pos_session` which is calling `open_new_session` which is calling `set_opening_control`. This makes that when calling `set_opening_control`, the request is not bound and we cannot do `request.geoip.ip`. We now check that the request is bound in `_log_ip`: if it is not, we return, if it is, we resolve the ip on the fly. We also add a check to t
Original PR description
Before this commit, when pos_blackbox_be was installed, the pos tests were failing because most pos test called `_run_test` which is calling `_satrt_pos_session` which is calling `open_new_session` which is calling `set_opening_control`. This makes that when calling `set_opening_control`, the request is not bound and we cannot do `request.geoip.ip`. We now check that the request is bound in `_log_ip`: if it is not, we return, if it is, we resolve the ip on the fly. We also add a check to the sale details data computation method `get_sale_details` override in pos_blackbox_be to check if the config is a blackbox one. original commit: df796f3770ff2fdaf553cdfb4206f65c7b371189 Community PR: https://github.com/odoo/odoo/pull/209584 Forward-Port-Of: odoo/enterprise#85356
**Steps to reproduce:** - Install Accounting - Activate "Analytic Accounting" in Accounting settings - Go to "Accounting / Accounting / Journal Entries" - Create an entry with some analytic distribution - Go to "Accounting / Reporting / Audit Reports / Trial Balance" - Activate "Analytic Group By" in the settings of the report - Add the plan used in the analytic distribution in "Analytic" group option **Issue:** In the "End Balance" column, all the amounts are summed in the total colu
Original PR description
**Steps to reproduce:** - Install Accounting - Activate "Analytic Accounting" in Accounting settings - Go to "Accounting / Accounting / Journal Entries" - Create an entry with some analytic distribution - Go to "Accounting / Reporting / Audit Reports / Trial Balance" - Activate "Analytic Group By" in the settings of the report - Add the plan used in the analytic distribution in "Analytic" group option **Issue:** In the "End Balance" column, all the amounts are summed in the total column instead of being grouped by analytic plan. It results on a total amount being twice what it should be as the total column of each period is also included in the sum. This is a complement to previous fix for the grouping by analytic account where the analytic plan groupby case was forgotten: https://github.com/odoo/enterprise/commit/05bbab713c749b7d7450d5dbaf2eda1ba4f68712 opw-4648009 Forward-Port-Of: odoo/enterprise#85372 Forward-Port-Of: odoo/enterprise#85344