Thursday, February 19, 2026
37 changes · 19.0
New functionality added to Odoo
Odoo apps now include new high-resolution icon formats for use on the odoo.com brand assets page. This helps keep public branding materials consistent and up to date across the app catalog.
Original PR description
Adding new icons formats to apps for the new /brand-assets page of odoo.com
This update adds a custom SVG icon for the AI app within Odoo. This ensures the app is consistently represented across all Odoo platforms, including the Odoo.com website. It's a small visual enhancement that improves brand consistency.
Original PR description
Adding svg icon to ai app in order to use it on odoo.com task-5431654
This update includes essential tests for the HR Expense Stripe module, addressing a previous oversight in the project's development. The tests ensure the module functions correctly and reliably, contributing to data integrity and accuracy within expense reporting. This addition improves overall module stability.
Original PR description
Add tests for the module, as it wasn't included in the original task
Enhancements to existing features
The self-ordering point of sale flow now keeps a Back button visible while customers configure combo product options. This makes navigation clearer and helps customers more easily return to the previous step if they need to change their selection.
Original PR description
The goal of this pr was to always have a Back button visible on the combo product configuration. I also change method name to be more readable. task: 5877219 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
Checklist items now use the same indentation as bullet and numbered lists in the editor. This makes to-do notes look consistent and easier to read when users create indented list items.
Original PR description
The checklist has different indents than bullet list and numbered list. It should not be the case. This commit removes the extra indent from checklist entries. Steps to reproduce: - Go to a "To do" note - Create a checklist with indented items - Create a bullet list with indented items => Both list were not aligned task-5916723 Forward-Port-Of: odoo/odoo#247568
This update adds high-resolution icons for various Odoo apps, improving the visual presentation of apps on the /brand-assets page of odoo.com. This enhances the overall user experience and strengthens the brand identity of Odoo apps.
Original PR description
Adding new icons formats to apps for the /brand-assets page on odoo.com
The Point of Sale product information popup now shows the proper tax name, such as VAT or IVA, instead of a country-specific tax ID label like RFC. This avoids confusion for staff reviewing product financial details in countries where the tax identification label differs from the tax name.
Original PR description
How to reproduce; - Use a company from a country with a different vat_label (Mexico for example) - Go to the frontend of POS - Select a product > ... > Info The problem: Under the "Financials" section, "RFC" is displayed instead of "VAT" or "IVA". RFC is the tax identification number, not the tax name Why: This commit (https://github.com/odoo/odoo/commit/4fa9f9b849016f312efcb73f9a76b223e429aec0) introduced the usage of vat_label to display the tax name in a dynamic way. However, the vat_label field is used to store the tax identification number, not the tax name opw-5915087 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The signature field now correctly sets up the notification feature it relies on. This prevents an error when users interact with signatures, improving reliability in the web interface.
Original PR description
The notification service is later used in this [method](https://github.com/odoo/odoo/blob/04f3473da52ec74f3955cadd58eb016537497d44/addons/web/static/src/views/fields/signature/signature_field.js#L120), but it was never declared so it was causing an error. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248602
Duplicated badge elements in the website editor now stay separate after saving instead of merging and overlapping. This prevents visual layout issues for users editing website pages and helps preserve the intended page design.
Original PR description
Steps to reproduce: - Go to Website > Edit a page - Add a badge using editor - Duplicate that badge more than once - Save -> badges intersect each other Cause: ====== When saving, `cleanForSave` will be triggered which then will call `mergeAdjacentInlines`, since badges are inline elements, they will be merged into one single badge causing that issue. Solution: ========= We add a predicate to `unsplittable_node_predicates` to prevent `mergeAdjacentInlines` from merging badges. opw-5790891 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247368
When a shopper creates a company from an Italian e-commerce contact, the Italian tax and public administration fields are now copied to the new company record. This prevents missing invoicing details and reduces manual correction for Italian businesses.
Original PR description
**STEP TO REPRODUCE** 1. Create a ecommerce order on a shop page of a italian company. 2. Goes to the checkout page, enter info (company_name, l10n_it_codice_fiscale, l10n_it_pa_index). 3. On the contact created, click on create company. 4. Notice l10n_it fields are not propagated to the company. opw-5477372 Forward-Port-Of: odoo/odoo#248524 Forward-Port-Of: odoo/odoo#246785
This update handles a specific USB printer error seen with POS80D devices, preventing it from causing failures in the connected hardware service. This helps keep point-of-sale printing more reliable for affected setups.
Original PR description
Seen on https://laloux-j.odoo.com/ 12/2 with a POS80D printer the printer triggers a core.USBError. This PR catches the corresponding exception 2026-02-12 04:21:12,496 1117 ERROR ? odoo.addons.iot_drivers.exception_logger: usb.core.USBError: [Errno None] Invalid descriptor task-5932720 Forward-Port-Of: odoo/odoo#248991
The document layout preview and generated documents now correctly show the company Tax ID when it is entered in settings. This fixes a missing display issue so invoices and preview documents reflect the company information users configured.
Original PR description
Steps to reproduce 1. Install `account`. 2. Go to Settings → Configure Document Layout. 3. Enter a value in the Tax ID field. 4. Generate a document (invoice / preview document). Issue Unlike other fields in the document layout, the `Tax ID` value is not updated and does not appear in the document preview. Cause The VAT (Tax ID) rendering logic was missing from the document layout template XML. Solution Add proper logic to display the Tax ID using the company VAT Before: <img width="1089" height="750" alt="image" src="https://github.com/user-attachments/assets/8d27808f-d605-447c-807a-d5f3450eef36" /> After: <img width="1080" height="722" alt="image" src="https://github.com/user-attachments/assets/0af04d77-a318-4e39-9a4b-0911f2446e60" /> opw-5373374 Forward-Port-Of: odoo/odoo#247087 Forward-Port-Of: odoo/odoo#240234
This fix makes an automated website editor test wait until the loading screen has finished before continuing. It helps prevent false test failures and supports smoother quality checks for website editing features.
Original PR description
When the iframe reloading starts, the builder can still have the class `editor_enable`, which breaks the flow of the tour, as the next step is waiting for that class, so we should wait for the loading screen to disappear first, and only then check for the `editor_enable` class. runbot-234504 Forward-Port-Of: odoo/odoo#245688
This fix ensures that point of sale order identifiers used during synchronization are removed when they are no longer needed. It helps prevent stale data from building up and reduces the chance of repeated or confusing synchronization behavior.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix keeps tooltips visible when users move from an element to one of its child elements and remain within the original area. It prevents helpful on-screen hints from disappearing unexpectedly, making the interface feel more reliable.
Original PR description
Have a tooltip on a parent. Hover on a child of that parent. Now, leave the child but stay in parent. Before this commit, the tooltip would be killed and never respawn. After this commit, the tooltip is not even killed if we stayed within the parent's physical space. task-5346498 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#248857
Project template tasks no longer appear in regular task views such as All Tasks and My Tasks. This prevents users from accidentally viewing or working on tasks that are meant only to serve as reusable project templates.
Original PR description
Steps to reproduce: ------------------- 1. Install Project. 2. Create a project with tasks (T1 and T2). 3. Convert the project into a template. 4. Go to All Tasks and search for these tasks. Issue: ------ Tasks belonging to a project template are still displayed in the All Tasks view. Cause: ------ After this commit 369407f, regular tasks were allowed in project templates. However, the task action domains were not updated accordingly, so template tasks were still included in All Tasks and My Tasks views. Solution: --------- Add an additional condition in the action domains to exclude tasks linked to project templates. opw-5905768 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes an automated Time Off calendar test skip inactive calendar cells and choose a real available Thursday. It helps prevent false test failures tied to certain calendar years, improving reliability without changing user-facing behavior.
Original PR description
Before, the tour attempted to click the “first Thursday” by selecting the first .fc-day-thu element in the DOM. The yearly calendar sometimes renders an initial “empty”/disabled weekday cell (when Jan 1 is Fri/Sat/Sun), so the first .fc-day-thu can be a disabled slot with no actionable element. That makes firstChild de-facto empty and the tour fails (seen reproducibly when the server date is set to years like 2027/2028, for example). Excluding .fc-day-disabled makes the selector target the first real Thursday cell task-5930501 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248275
The API documentation page now correctly bypasses the server-side cached index when users explicitly disable caching in their browser tools. This helps administrators and developers see freshly generated documentation instead of outdated cached content, reducing confusion during troubleshooting.
Original PR description
Access /doc/index.json with the "disable cache" checkbox from the devtools checked. To index is generated again (emitting warnings in the logs may some docstrings be broken) but it still uses the attachment that was cached by the server. It should not use the server attachment. Reference-to: c67f64d7025c ([FIX] api_doc: respect no-cache directive on index) 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
Point of Sale now separates the rule for rounding customer change so it can be adjusted for special settlement cases. This prevents amounts paid through non-cash methods, such as card deposits, from being rounded as if they were cash.
Original PR description
We extract the condition into a getter so we can override it elsewhere. For now, it is overriden in `pos_settle_order`. See below for explanation. `change` is the amount we return to the client, so it's in cash, and therefore, we always round it if `cash_rounding` is true. However, in pos_settle_order, when a client 'deposits money', the order `change` is what we get paid by that client, and he might choose a payment method different than cash (card for e.g.). We change the `shouldRoundChange` logic to count for such cases. opw-5222985
This fixes an internal test so it uses realistic data instead of a placeholder object. It helps ensure Odoo's web JSON request handling is tested accurately, reducing the chance of false test behavior in future changes.
Original PR description
The return value of the patched methods was a MagicMock and not a recordset, and make_json_response was doing funny stuff with that returned MagicMock 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 fix ensures Odoo uses the main database port when no separate replica port is configured. It prevents misleading connection warnings for businesses running PostgreSQL on a non-standard port while using the built-in replica simulation setup.
Original PR description
Start postgres on an alternative port (e.g. 5434), start odoo with `--db_port 5434 --db_replica_host=''`, access /web/database/manager, there's a warning in the logs that says it is not possible to connect to the replica database.
The empty string for the replica host is Odoo 18 way to tell Odoo to simulate a replica database by connecting to the same db as the primary one. It should use `--db_replica_port` and when not set fallback on the same port as `--db_port`. The problem is that in case no `--db_replica_port` is set, the option is set `None` in the config, i.e. `get('db_replica_port', cfg)` was retuning `None` as was not using the fallback.
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#249291This update resolves an issue where payroll warnings weren't being properly updated in the reporting dashboard. The fix ensures that warning messages are now accurately reflected, providing more reliable and up-to-date information for payroll reporting. This improves the accuracy of financial data.
This pull request reverts a previous change related to how contract templates were handled. The issue was a minor technical problem with how calculations were triggered, which wasn't a significant problem for users. This update ensures the contract template functionality is working correctly and will be addressed in the main version of Odoo.
Original PR description
This reverts commit 1d5e75900c0326f7b5293ad4cdafcc32d0f662fc. The problem was due to compute fields not triggered. It'll be fixed in master as this is not really a bug. task-5948571
This update resolves an issue where closing a POS session would trigger an error if the partner's address (street or postal code) was missing. Now, the system gracefully handles empty address fields, ensuring POS sessions can be completed without interruption. This improves the reliability of the German POS certification process.
Original PR description
Before this commit, if a POS order was created with a partner that had an empty street or postal code, the system would raise an error when closing the POS session. opw-5897334
This update addresses a technical adjustment to the checksum associated with the l10n_eu_iot_scale_cert module. A recent bugfix in the underlying code required an update to ensure data integrity. This change is a routine maintenance task to maintain the security and reliability of the module.
Original PR description
Checksum needs to be updated as the code of the scale changed for a bugfix Community PR: https://github.com/odoo/odoo/pull/249295
This update resolves a bug that was causing errors when creating payroll records. The fix prevents the system from relying on a temporary ID (NewId) in search queries, ensuring stable record creation. This improves the reliability of the Australian Payroll module.
Original PR description
The generic `TestEveryModel` fails because a virtual ID (NewId) is used in a search domain during record creation, causing a crash. This commit uses `.ids` with the `'in'` operator to idiomatically handle virtual records and prevent the framework error. runbot-115303 Forward-Port-Of: odoo/enterprise#107644
This update streamlines the AI Documents module by replacing a specific function call with a more efficient one. This change enhances the module's performance and stability, ensuring smoother operation for users. The update was made as part of a broader effort to optimize internal processes.
Original PR description
This commit replaces the uses of `self.env["bus.bus"]._sendone()` by `_bus_send()` in the `ai_documents` module. Following https://github.com/odoo/enterprise/pull/90124#discussion_r2822278385
A recent issue prevented the appointment module from being correctly reinstalled, resulting in installation errors. This update resolves the problem by temporarily skipping the generation of email invitation URLs during the installation process, preventing a key lookup error. This ensures a smoother and more reliable module reinstallation experience.
Original PR description
Reinstalling the appointment module fails during mail template validation. ### Reproduction Steps 1. Install the `appointment_hr_recruitment` module. 2. Uninstall `appointment`. 3. Reinstall…
Reinstalling the appointment module fails during mail template validation. ### Reproduction Steps 1. Install the `appointment_hr_recruitment` module. 2. Uninstall `appointment`. 3. Reinstall `appointment`. → A template parsing error appears. ### Cause The global `request.env` is bound to the registry active at the start of the request. When reinstalling a module, this registry becomes stale and does not include the models being re-added. During installation, the `mail.template` model performs a test render to validate its XML data. One of the templates calls `_get_interview_invite_url`, which invokes a controller that looks up the `appointment.type` model using `request.env`. Because the registry is stale and does not contain this model, the lookup raises a KeyError and the installation fails. ### Fix Rationale Skip invite URL generation when `install_mode` is set to avoid using the stale `request.env`. opw-5898780 Forward-Port-Of: odoo/enterprise#107650
This update enhances the accuracy of payment reference checks by tailoring the validation process to the bank account's country. Previously, a single check applied to all countries could lead to incorrect validation. Now, the system verifies the reference format against the specific country of the bank account, with a fallback for unsupported countries.
Original PR description
Currently, when initiating a payment, we check if the reference is a structured one by using `is_valid_structured_reference` which checks the validity of the structure accross all supported countries. This can lead to issues when it matches formats accepted by other countries but not the one of the bank account. With this commit, we replace this check by a call to a new function that checks the structure validity according to the country of the bank account, with a fallback to the generic check (ISO 11649) if the country is not supported. opw-5387269 Forward-Port-Of: odoo/enterprise#107721 Forward-Port-Of: odoo/enterprise#107116
This update resolves an issue where DHL shipping rate calculations failed when requested for dates outside of DHL's business hours. Adding a 'next business day' flag ensures rates are accurately calculated, preventing errors and ensuring reliable shipping options for customers. This addresses a previous technical problem impacting shipping functionality.
Original PR description
Before this commit, there was an issue when trying to get the rates for DHL shipping late in the day. The issue happened because `plannedShippingDate` fell outside of the working hours. This commit adds the nextBusinessDay flag for the rating request to avoid the error. Error: ``` Product not found 996: The requested product(s) not available for the requested pickup date. Process ID associated for this transaction') ``` opw-5393684 Forward-Port-Of: odoo/enterprise#107153
This update ensures payslips accurately reflect an employee's start date with the company, regardless of internal job changes. Previously, payslips used the contract start date, which was inaccurate for long-term employees. This change, primarily impacting payroll in Switzerland and the UAE, provides a more precise and reliable view of employee tenure.
Original PR description
In the payslip definition, the current contract's start date is used. But if a person changes job or contract internally we don't want this value to change and we want it fixed to when the person joined the company. Notably, if a person worked at the same company in two well distinct periods, we want to consider the beginning of this period and not of the previous one(s). Since Switzerland uses a custom report for the payslip, the same change is applied there. Task: 5909637 Community PR: https://github.com/odoo/odoo/pull/248598 Forward-Port-Of: odoo/enterprise#106692
This update resolves an issue where email generation for equity transactions would fail due to a mismatch in record identification. The fix corrects a configuration error in the email template, ensuring accurate email delivery when multiple equity transactions are processed. This prevents disruptions to communication regarding shareholder updates.
Original PR description
## Issue Before This Commit A missing record error occurred during email generation when the number of `equity.transaction` records exceeded the `res.partner` records. ## Cause of the Issue The issue was caused by an incorrect `model_id` configuration in the `equity_shareholder_email_template`. This created a mismatch between the template model and the record context passed to the mail compose wizard, leading to a missing record error during template rendering. ## With This Commit The template `model_id` has been corrected `equity.transaction`. This ensures that the mail compose wizard receives the correct model context and prevents missing record errors during email generation. Steps to reproduce : [Video](https://drive.google.com/file/d/19WXbjmYPKh0IjQHcEGU4FdUbGSF4GGlx/view?usp=drive_link) opw-5899070
This update resolves a technical issue where test runs were repeatedly generating assets, slowing down the testing process. By adding a specific asset bundle to the test preparation list, we've eliminated this redundant generation, improving test efficiency and stability. This change ensures tests run more smoothly and reliably.
Original PR description
During tests runs, lazy loaded assets are generated on the fly, and eventually multiple hundred of times (i.e. +/- 150 times on runbot). This commit adds the `web_studio.studio_assets` bundle to the pregeneration list to avoid regenerating during tests runs. Forward-Port-Of: odoo/enterprise#107147
This update corrects a display issue where archived employees were still visible in the attendance Gantt chart. The change ensures that only currently active employees appear in this view, improving data accuracy and clarity for HR reporting. This resolves a previous bug reported by our team.
Original PR description
Steps to reproduce: 1. install `hr_attendance_gantt` 2. create an employee 3. make attendance records for the employee in the previous months 4. archive the employee When opening the gantt view of the attendance, a row appears for the archived employee, with no attendance showing up. This commit adds a constraint to only show the active employees. opw-5490119 Forward-Port-Of: odoo/enterprise#106486
This update resolves a crash that occurred when using the pivot table autofill feature with invalid data. The fix ensures that the autofill process itself functions correctly, while preventing subsequent tooltips from causing a system error. This improves the reliability of pivot table data manipulation.
Original PR description
If you try to autofill a pivot cell that has an invalid relational id in its domain (eg. `=PIVOT.HEADER(1, "stage_id", 99999999)`), the autofill actually works but the tooltip make everything crash. Task: [5913754](https://www.odoo.com/web#id=5913754&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Forward-Port-Of: odoo/enterprise#107715 Forward-Port-Of: odoo/enterprise#106601
This update fixes an issue where cash rounding wasn't applied consistently when customers deposited money via card. The change now respects configured cash rounding settings, ensuring accurate calculations for deposits regardless of the payment method used. This improves the reliability of financial reporting.
Original PR description
Steps to reproduce: ------------------- 1. Enable cash rounding, only for cash payment method - Rounding method doesn't matter, I tested with 0.05 nearest rounding 2. Open PoS, select a customer, and…
Steps to reproduce: ------------------- 1. Enable cash rounding, only for cash payment method - Rounding method doesn't matter, I tested with 0.05 nearest rounding 2. Open PoS, select a customer, and select "Deposit Money". Choose "Card" 3. Enter an amount non divisible by 0.05, say 2.26 -> Notice that the change is rounded, and is -2.25 instead of -2.26. Why it's happening ------------------ It's a correct bahvior to always round the `change` when paying a normal order, since change is what we return to the customer, and it's usually in cash. However, when depositing money, `change` represents what the customer is paying us (depositing in his account). That amount could be deposited in any payment method not only cash. The fix ------- When depositing money, we check if we should round the change or not using the `orderIsRounded` getter. It takes into account the current chosen payment method, and if we should round for this payment method or not (could be cash, card, etc). opw-5222985 Forward-Port-Of: odoo/enterprise#105234 Forward-Port-Of: odoo/enterprise#100278
This pull request reverses a recent change to the spreadsheet's border styling. The change caused visual inconsistencies and disruptions in the user experience. This reversion restores the original, stable border appearance for the spreadsheet edition.