Wednesday, February 25, 2026
32 changes · saas-19.2
Enhancements to existing features
This update introduces a feature to temporarily 'snooze' products in the Point of Sale system. When a product is snoozed, it appears grayed out, but remains available for ordering. A countdown timer indicates when the product will become available again, managing inventory effectively.
Original PR description
The PR will add an extra availability section on the product info popup which shows whether a product is currently available. From that section the product can then be 'snoozed', which will make it unavailable for a specified period of time. (1, 2, 4 hours, or for the entire session). When the product is unavailable there's a countdown timer on the popup showing when the product will be available again. Products which are 'snoozed' still show up on the product screen, but grayed out. The effect is purely cosmetic, as they can still be added to new orders. Task-[5170696](https://www.odoo.com/odoo/project/1737/tasks/5170696) Previous discussion-[#232625](https://github.com/odoo/odoo/pull/232625) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245891
Resolved issues and error corrections
This update resolves an issue where helpdesk users with limited access were unable to view tickets due to a requirement for read access to stock records they didn't have permission to see. The fix adds the 'stock.group_stock_user' group to the relevant field, ensuring only authorized users can access ticket information. This improves usability for all helpdesk users.
Original PR description
To reproduce: ============= - install helpdesk_stock - with user having only User rights on helpdesk and nothing on other modules - try to access a ticket -> AccessError Problem: ======== when reading the ticket, the field `suitable_product_ids` is computed, and it requires read access to records the user doesn't have access to, which raises an AccessError. Solution: ========= Add the group `stock.group_stock_user` to the field, so that only users having access can read it. backport of https://github.com/odoo/enterprise/pull/59605 opw-5907657 Forward-Port-Of: odoo/enterprise#108139 Forward-Port-Of: odoo/enterprise#107291
This update resolves an issue where the search filter wasn't functioning correctly for users on iOS devices using the on-screen keyboard (IME). The fix reverts a previous change that caused this problem. This ensures that the search functionality works reliably for all Odoo users on iOS.
Original PR description
This reverts commit 2ff4e7b12b66a2d973f285006e6676e49087ca7d. Search filter doesn't work for iOS users. A new fix has to be found. opw-5966697 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#250494
This update fixes a potential issue in the website's page checking process. Removing the reliance on the `request` object within the `check_existing_page` function enhances stability and prevents errors. This change ensures the website operates more reliably.
Original PR description
The `request` global object should not be used from models, as it may be invalid. This commit remove its uses from the method `check_exsiting_page` that was introduced in commit 45e15673a70cf770d8e343a0a3b805eccdbed0d1. task-5888297 Forward-Port-Of: odoo/odoo#246153
This update resolves an error that occurred when employees had multiple leave types assigned. The fix ensures the holiday attest calculation accurately processes all allocated leave time, preventing errors during payroll computations. This improves the reliability of holiday pay reporting.
Original PR description
Bug : - allocate multiple leave types to an employee - lay off the employee -access the holiday attest wizard and try to compute holiday attest and you'll see a traceback Reason : - time_off_allocated and time_off_taken were expecting to find exactly one line of "Legal Time Off". Receiving multiple caused an Error. Fix : FIxing the logic by taking all the available lines and summing there values. task - 5461268 Forward-Port-Of: odoo/enterprise#107673
This update prevents users from attempting to edit applicant properties when a job isn't associated. Previously, a confusing error message would appear. This change ensures a smoother user experience by hiding the editing option when it's not applicable, improving data consistency.
Original PR description
# How to reproduce - Go to the Talen Pool sub-menu of the recuitment app - Create a new Talent - Click on the cog button, then on "Edit Properties" # The problem A not very descriptive error message…
# How to reproduce - Go to the Talen Pool sub-menu of the recuitment app - Create a new Talent - Click on the cog button, then on "Edit Properties" # The problem A not very descriptive error message is displayed # Why The hr.applicant model has a Properties field that allows the edition of its properties directly in the UI. This field needs to be linked to a PropertiesDefintion field in another model. In our case, that definition is in the hr.job model linked to the hr.applicant model via the field job_id. To be able to edit the properties of the hr.applicant model, it needs to be linked to a job, which is not always the case. A fix was made in master to allow the edition of properties even when there is no job_id (https://github.com/odoo/odoo/commit/99aa75bc64ee8898a0815163603e5861c35b0b94) but that fix is not applicable to a stable version. The fix I implemented instead hides the button when editing the properties would fail. opw-5932666 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248691
This update fixes a potential crash in Odoo's subscription invoicing process. Previously, invoices with mixed standard products and timesheet services could fail if the timesheet had zero delivered quantity. The fix adds a safeguard to skip invoice lines without sale order links, ensuring invoices can be generated correctly regardless of timesheet status.
Original PR description
…n invoicing **Issue:** When generating an invoice for a subscription that contains a mix of regular products (invoiced on order) and timesheet-based services (invoiced on delivery), a traceback can…
…n invoicing **Issue:** When generating an invoice for a subscription that contains a mix of regular products (invoiced on order) and timesheet-based services (invoiced on delivery), a traceback can occur if the timesheet service has 0 delivered quantity. **Cause:** During the invoice creation process, `_get_reinvoiced_analytic_lines_to_link` iterates over the newly created invoice lines to link analytic lines. It filters the linked sale order lines using `_is_line_reinvoicable()`. If the invoice only contains standard products (because the timesheet line was skipped due to 0 delivery), `so_lines` evaluates to an empty recordset. Passing an empty recordset into `_analytic_line_domain_get_invoiced_lines()` results in a traceback when evaluating the domain. **Fix:** Added a safeguard (`if not so_lines: continue`) inside the loop. If an invoice line does not contain any reinvoicable sale order lines, it is now safely skipped, allowing standard subscription lines to be invoiced alongside undelivered timesheet lines without crashing. task: 5966725
This update resolves a problem where products weren't loading correctly when switching between companies in the Point of Sale (POS) loyalty system. The fix prevents errors when a product is restricted to a specific company, ensuring all products are loaded as expected. This improves the reliability of the POS loyalty functionality.
Original PR description
Step to reproduce - install `pos_loyalty` and have two companies - for this record: `loyalty.gift_card_product_50` set company_id = company1 - switch to company b and start pos Observation: - no products are loaded Cause: - `browse()` was used to load records `gift_card_product_50` and `ewallet_product_50` - when any of them is restricted on one company it fails to load whole model Fix: - Instead of directly loading them, we use `search()` to avoid `AccessError` so that rest of the products can be loaded. - Gift card is still not shown as expected opw-5449466 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244912
This update resolves an issue where users with limited accounting access (read-only) were encountering errors when viewing invoices or partner details. The change ensures that certain data fields are only displayed to users who have the necessary permissions, improving stability and usability.
Original PR description
User with "read-only" access to accounting will trigger an error if they try to open an invoice or partner due to field addenda_ids. This commit aims to render this field only if the have the right to fetch it. opw-5931178 opw-5954244 Forward-Port-Of: odoo/enterprise#108332
This update prevents a crash in the payroll system that occurred when employee records lacked contract dates. The fix ensures that necessary contract date fields are populated before payroll warnings are calculated, improving the system's stability and reliability for employee data processing.
Original PR description
This commit fixes a traceback that occurred when an `hr.employee` record had no `contract_date_start` or `contract_date_end` defined, while payroll warnings depending on those fields were present. Since `warning_date` is computed based on the contract dates, the absence of the relevant field caused a crash. We now ensure that `contract_date_start` and `contract_date_end` are set before computing `warning_date` with either one. TaskID-5944876
This update resolves an issue preventing the demonstration of the new ‘planning_field_service_sale_timesheet’ feature within the Odoo Enterprise system. The change ensures the demo accurately reflects the functionality, allowing users to better understand and utilize this new tool for managing service-based sales timesheets. This improves the overall user experience and training materials.
This update corrects a technical issue where the IoT long polling process was failing due to incorrect parameter passing. The fix ensures all necessary parameters are correctly transmitted, resolving a potential disruption in receiving IoT event data. This improves the reliability of the IoT integration.
Original PR description
Before this commit, when the `_poll` method in the `iot_longpolling` called itself to listen for further events, it didn't pass in the `useLna` parameter. This caused the second call to `/event` to not use HTTP and therefore could fail. After this commit, the parameters are all passed through as expected.
This update removes outdated and unused translation files from our localization setup. Specifically, it addresses instances where translation files were left behind after previous builds, ensuring our software uses only the most current and relevant language resources. This improves the accuracy and efficiency of the Odoo platform.
Original PR description
Does 2 things: - removes obsolete modules from .weblate.json - removes phantom modules that only have .po files in it --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update removes outdated and unused translation files from our localization setup. Specifically, it addresses instances where translation files were left behind after previous updates, ensuring our software is localized correctly for a wider range of languages. This improves the quality and accuracy of the Odoo Enterprise application for international users.
Original PR description
Does 2 things: - removes obsolete modules from .weblate.json - removes phantom modules that only have .po files in it
This update corrects a bug in the invoice processing system. When internal users forward supplier bills through a specific email alias, the system incorrectly added the internal user as the vendor. This prevented proper OCR processing and auto-population of document fields, leading to errors. This fix ensures that the system only creates invoices with a registered supplier partner.
Original PR description
Currently we have an issue with OCR flow, where if internal users forward an email from an internal email address, the internal user is added as vendor Steps to reproduce: - Setup email alias for journal "Purchases" - From an internal user email, forward a supplier bill to the vendor bill alias Issue: If the supplier is not already a registered partner, the bill will be created with the internal user set as partner. This will break OCR flow where the missing document fields will be auto populated from the bill opw-5487368 Forward-Port-Of: odoo/odoo#246352
This update fixes a bug where users could accidentally create duplicate lines within Point of Sale orders. The change ensures that if a user attempts to create a line that already exists, it's updated instead, preventing data inconsistencies and improving order accuracy. This improves the overall reliability of the Point of Sale system.
Original PR description
Before this commit, it could happen that a user send a request to the backend to create a pos.order.line that already exists because it didn't know it was already synced for some reason (the page was reloaded before getting the response and the frontend was then relying on indexedDB for example). It would then send a create command and we would have multiple lines with the same values. We have a constraint that usually works but for people where the bug happened before the constraint was created, the constraint would not be created and so the bug could still happen We now prevent that by changing the create command into an update command if the line to create already exists by comparing its uuid to the uuids of the lines related to the order. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249109
This update ensures that essential products like 'settle due' and 'deposit' are automatically configured for all Point of Sale (POS) settings when the pos_settle_due module is installed. Previously, these products were only available in POS sessions without open sessions, causing potential issues. This change guarantees consistent product availability across all POS configurations.
Original PR description
Before this commit, when the module pos_settle_due was installed, the special products (settle due, deposit, settle invoice) were only set on the POS configurations that did not have any open session. This could lead to issues when trying to use these products in a POS session of a configuration that did not have them set. Now, the special products are set on all POS configurations when installing the module. Community PR: https://github.com/odoo/odoo/pull/229074 Forward-Port-Of: odoo/enterprise#96788 Forward-Port-Of: odoo/enterprise#95789
This update resolves an issue that prevented users from clicking the Work Entries button when an overtime record lacked a 'Stop' time. The fix corrects a technical error related to comparing date/time values, ensuring the button functionality is now consistently available. This improves the user experience when managing overtime attendance.
Original PR description
Clicking the Work Entries smart button raises a traceback when an overtime record has no Stop (time_stop). Steps to reproduce the error: - Install ``hr_work_entry_attendance`` module with demo data -…
Clicking the Work Entries smart button raises a traceback when an overtime record has no Stop (time_stop). Steps to reproduce the error: - Install ``hr_work_entry_attendance`` module with demo data - Activate developer mode - Create an Employee A > Settings > Set Default Ruleset in Overtime Ruleset In Payroll Tab, Work Entry Source: ``Attendances`` and set Contract - Create an overtime attendance > Save > Open the Overtime Details > Unset the ``Stop(time_stop)`` > Save - Open Employee A > Click on Work Entries smart button Traceback: ```py TypeError: '<' not supported between instances of 'bool' and 'datetime.datetime' ``` https://github.com/odoo/enterprise/blob/56c3723a925f718ba39d11cde12933542ebcd7c1/hr_work_entry_attendance/models/hr_version.py#L49-L52 When ``stop(time_stop)`` is unset in the overtime, ``ot.time_stop`` is False, causing ``min()`` to compare a ``datetime`` with ``False``, which raises the above traceback. sentry-7169332615 Forward-Port-Of: odoo/enterprise#103764
This update fixes a technical issue related to invoice generation when using BIS3 files for B2C transactions. Previously, certain checks were performed unnecessarily. Now, the system correctly handles B2C scenarios where the EndpointId might be missing, ensuring accurate invoice creation without impacting core functionality.
Original PR description
…peppol checked Some people are using BIS3 files even for B2C. They give the xml files to the accountant for him/her to import the file and generate the invoice in the accounting software. In that case, since it's a B2C transaction, the EndpointId might not be set but that's ok since it's only used to generate the invoice. opw-5952109 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249751
This update resolves an initial flicker in the live chat category within the messaging menu. Previously, the category would appear and disappear briefly when opened. The fix introduces a new field to ensure the category is reliably displayed, preventing users from being unexpectedly directed to a different chat category.
Original PR description
Before this PR, the live chat category in the messaging menu would flicker when opened initially. This occurs because the category is displayed only when users have live chats to show. However, this information is available only after the channels are fully fetched, which causes the flicker. This is problematic because users may accidentally click and end up in a different category. This commit fixes the issue by introducing the `show_livechat_category` field, which is initially returned by the server depending on whether the user has pinned live chats and is later updated by its compute function. task-5475290 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
This update corrects a display issue in the Timesheet grid view where the total overtime was incorrectly showing 'Weekly Overtime'. The fix renames this cell to 'Total Overtime' to accurately reflect overtime totals across all time periods (day, week, or month) viewed in the grid.
Original PR description
### Issue: When displaying the month in the grid view and hovering the bottom right cell, where the total overtime is displayed, it shows "Weekly overtime". ### Steps to reproduce: - Open Timesheet app - In "My Timesheet", display the grid in day or month - Hover the bottom right cell - It displays "Weekly Overtime" ### Solution: Rename it to "Total overtime" to handle all periods (day, week, month). opw-5502864 Forward-Port-Of: odoo/enterprise#108480 Forward-Port-Of: odoo/enterprise#107642
This update fixes a labeling error in Odoo invoices for Qatar. Previously, the invoice amount description used 'Rial' instead of the correct 'Riyal'. This change ensures accurate currency representation for Qatar-based transactions, improving financial reporting and compliance.
Original PR description
Steps to reproduce: 1- Install Accounting and 'l10n_qa' modules 2- Switch to Qatar company and enable "Total amount of invoice in letters" under accounting settings 3. Issue an invoice and preview it The issue: The description of the amount uses "Rial" Expected behavior: The amount should use "Riyal" opw-5919587 Forward-Port-Of: odoo/odoo#250299
This update prevents unnecessary performance updates (mutations) on website buttons, which can cause instability and errors. By ensuring the loading effect is only applied when needed, the website builder and related processes will run more smoothly and reliably. This improves the overall user experience and reduces potential issues with the design theme updates.
Original PR description
__Before commit__ When using `makeButtonHandler`, a loading effect is applied to the button if the handler takes more than 400ms to execute. However, if the handler finishes sooner, the effect is…
__Before commit__ When using `makeButtonHandler`, a loading effect is applied to the button if the handler takes more than 400ms to execute. However, if the handler finishes sooner, the effect is still briefly added and removed, triggering a DOM mutation. If a button is clicked and the website builder opens immediately after, this mutation may be recorded in the current history step despite being unnecessary. This causes the `design-themes` tour `theme_menu_hierarchies` to fail in a non-deterministic way with the following warning: "should not have any 'characterData', 'remove' or 'add' mutations in current step when you update the selection" __Fix__ Ensure the loading effect is never added if the handler execution time is shorter than the debounce duration. This fix is applied to both `makeButtonHandler` functions in the codebase. The test case is only added for the interaction use case, as the other instance resides in legacy code. runbot-229803 Forward-Port-Of: odoo/odoo#248242
This update resolves a test failure related to video calls within the Odoo platform. The fix ensures the system correctly handles video stream toggles, preventing unexpected behavior and improving the reliability of the call testing process. This contributes to a more stable and predictable user experience.
Original PR description
Before this commit, the following discuss call test may fail non-deterministically: ``` @mail/discuss/call/call/auto-focus participant video in one-to-one call in chat window ``` This happens at the…
Before this commit, the following discuss call test may fail non-deterministically: ``` @mail/discuss/call/call/auto-focus participant video in one-to-one call in chat window ``` This happens at the step where it checks that when inside the discuss meeting view, having another participant enable a video stream does not auto-focus the card. The test was failing and auto-focusing the card because the simulated toggling of enabling the video stream happens before the side-effect of rendering to toggle the flag that meeting view is on. So the handling of event that video stream is toggled on was mistakenly considering outside of meeting view. This commit fixes the issue by awaiting a `data-active` on the UI if meeting view, which ensures the rendering of meeting view is complete and store is aware of meeting view being open, before triggering the event that simulates toggling of video stream. This technique is borrowed from `DiscussApp` component that requires a similar technique to determine whether a chat window must auto-open or not, which also requires making sure the store knows precisely when `DiscussApp` is logically open. Fixes runbot-error-240554 Forward-Port-Of: odoo/odoo#250174
This update resolves an issue where the 'typing' indicator on chat channels remained visible indefinitely. The fix ensures that timeout registrations are directly tied to typing state updates, preventing incorrect expiration scheduling due to timestamp duplication. This improves the user experience by accurately reflecting when a user is actively typing.
Original PR description
Typing expiration was indirectly tied to typing timestamp updates. Typing timestamps are second-precision, so two consecutive typing events can carry the same timestamp value. In that case, the timestamp field may not be considered updated on the client. The expiration timeout is then not re-armed even though typing is set to true. When that happens, the typing indicator can remain visible indefinitely unless an explicit "stop typing" event is received. This change makes timeout registration depend on typing state updates directly. Expiration is always scheduled when typing becomes active, regardless of timestamp equality. [task-4922630](https://www.odoo.com/odoo/project/1519/tasks/4922630) Forward-Port-Of: odoo/odoo#250146 Forward-Port-Of: odoo/odoo#249796
This update resolves an issue where the "..." button in meeting chat was causing excessive spacing, making message bubbles appear too small. The fix adds the necessary padding to message actions, ensuring a cleaner and more comfortable user experience. This improves the overall readability and visual appeal of the chat interface.
Original PR description
Before this commit, message actions in meeting chat were taking too much space, reducing the size of message bubbles. This happens because the "..." button had no explicit padding and thus fall-backed to the default padding of a button, which is way too much. This commit fixes the issue by providing the proper padding to message actions in the inline presentation, which is necessarily with a tiny padding. Before / After <img width="297" height="565" alt="Screenshot 2026-02-20 at 18 38 05" src="https://github.com/user-attachments/assets/580bd0ff-ff3a-4830-bac4-6764e78863e2" /> <img width="296" height="562" alt="Screenshot 2026-02-20 at 18 37 41" src="https://github.com/user-attachments/assets/2f3eda5e-4016-402f-9450-157fe7be69bc" /> Forward-Port-Of: odoo/odoo#249880
This update addresses a critical maintenance task, ensuring our tax code data is current. The tax codes haven't been updated in four years, and this fix ensures continued accurate tax calculations within the Odoo Enterprise system. Future enhancements will allow users to initiate this update automatically.
Original PR description
It's been 4 years since the last update [1]. No codes were removed. At some point it would be nice to add this to the avatax_sync_company_params() method so it can be initiated by the user. But we need to update this file regardless, and the mechanism would need to be smart enough to not cause duplicates when e.g. the user has synced it themselves, we then update the csv and they then update the module. [1] https://github.com/odoo/enterprise/pull/30220 opw-5928245 Forward-Port-Of: odoo/enterprise#108209
This update resolves an issue where stock quantities were being rounded incorrectly when scanning barcodes on delivery orders. The fix ensures more accurate stock updates, preventing discrepancies in inventory levels. This improves the reliability of order fulfillment and reduces potential errors.
Original PR description
To reproduce the issue: - Create a stock quantity of product1 for example of 275.84 kg in PACK1 - Create a delivery order of 3.6 kg - Go to the delivery order on stock barcode - Scan PACK1 - The new line is created as 272.2399999999 Forward-Port-Of: odoo/enterprise#108366 Forward-Port-Of: odoo/enterprise#89300
This update fixes an issue where the appointment type form's time fields were cutting off content. The changes align the time field format with a recent update and remove unnecessary details like 'hour(s)' and seconds, resulting in a cleaner and more user-friendly appointment form.
Original PR description
Purpose ======= Fix the appointment type form view float time fields length to not crop content. Specification ============= Following odoo/odoo#240555 the float time field format has been updated. Adapting all the appointment form view float time fields length to match the new format and not crop the content. Removing useless "hour(s)" suffix as the time representation, whether it's hours or minutes, is now represented inside the field format. Hiding the seconds as it's not relevant for appointments. Task-5717052
This update fixes an issue where warehouse names with only numbers (e.g., '01') were displayed incorrectly in the barcode app. The fix removes a browser setting that was causing numerical warehouse codes to be reversed, ensuring accurate and consistent display of warehouse names for all users.
Original PR description
### Steps to detect the bug: - Download stock apps - Enable "storage locations" settings under warehouse index - Change name of warehouse with a name composed only of numbers (ex. 01) - Create a…
### Steps to detect the bug:
- Download stock apps
- Enable "storage locations" settings under warehouse index
- Change name of warehouse with a name composed only of numbers (ex. 01)
- Create a product (with barcode number)
- Insert a number of products available with smart button "on hand"
- Create a new delivery for that product
- Go to barcode app and search for the delivery you just created
- Click on it and see that the name of the warehouse will be stock/01 instead of the correct 01/stock
### The problem:
The previous configuration used direction: rtl; on the warehouse name
element in the barcode app. So if the string contains only letters the
standard visual order is maintained, however, when the string consists
entirely of numbers the rtl property forces the browser to reorder them
from right to left.
### The reson to introduce the fix:
By removing this property, it is ensured that numerical warehouse codes are displayed in their natural sequence without being flipped.
opw-5730199
Forward-Port-Of: odoo/enterprise#107920This update removes unnecessary HTML wrapping from article content. Previously, a 'div' tag was added during processing to handle parsing complexities, which increased the article's HTML depth. This change improves the overall structure and efficiency of article formatting without impacting functionality.
Original PR description
Prior to this commit, `_get_transformed_body_from` wrapped the source body in a `div` because `lxml.html.fragment_fromstring` is used with a `create_parent=True` argument. That argument is required because otherwise, the function throws an error if there are multiple root nodes in the parsed string, which is frequent in an article body. The final returned string still contained that additional `div` ancestor. This does not break an article per se, but repeated usage would increase the html structure depth by 1 every time, and that additional `div` was not part of the function desired transformations. task-5960616 Forward-Port-Of: odoo/enterprise#108310
This update fixes an issue where the 'Call Settings' header in chat windows was visually unclear due to a missing background color. The fix ensures the header remains properly positioned and readable, preventing text overlap when scrolling. This improves the user experience for chat interactions.
Original PR description
Before this commit, when opening the "Call Settings" in a chat window, the header of the action panel was missing a background color. Because of this, when scrolling down, the Action panel title was floating above the content and the text was overlapping, making it hard to read. This comes from `.bg-inherit` that requires the parented chain to rigorously have `.bg-inherit` too until reaching an actual bg color. In this case, one parent container lacked it, which is what this commit fixes. Task-5867464 (point 84) Before / After <img width="382" height="465" alt="Screenshot 2026-02-24 at 16 06 32" src="https://github.com/user-attachments/assets/f5c4a309-c60a-4e9b-bef0-06ee7ba731b8" /> <img width="386" height="468" alt="Screenshot 2026-02-24 at 16 06 18" src="https://github.com/user-attachments/assets/fea35f8f-2a76-4c40-b51e-28dbfce3a281" /> Forward-Port-Of: odoo/odoo#250481 Forward-Port-Of: odoo/odoo#250398