Daily updates from Odoo
Wednesday, February 18, 2026
43 changes · master
New functionality added to Odoo
This update introduces new features for managing employee contracts in Saudi Arabia and the UAE. Specifically, it allows administrators to set probation periods and includes default annual leave accrual plans (non-transferable and monthly) for both countries. A notification is automatically triggered when a probation period ends.
Original PR description
Add probation period duration settings for Saudi & UAE employees. Once the probation period ends, a cron job schedules a notification for the employee’s HR responsible. In addition, Add default annual leave accrual plans for Saudi Arabia and UAE. The plans are non-carriable and accrued monthly: - 21 days per year for Saudi Arabia - 22 days per year for the UAE Task-5442242
This update adds a convenient button within the Odoo website builder to import products directly from an eCommerce platform. This simplifies the process of adding products to your online store, particularly within views like the shop page and product categories. The change also includes improvements to error handling and notification clarity.
Original PR description
Added buttons to import products through the website generator import tool. Below are pics for reference. odoo PR: odoo/odoo#240880 task-5436105
Enhancements to existing features
This update switches the GSP provider for Indian GST e-invoices to align with recent integration updates. This change ensures Odoo Enterprise continues to comply with evolving Indian tax regulations and utilizes the correct GST credentials for e-invoice generation.
Original PR description
Update the Indian localization to switch the GST e-invoice GSP (GST Suvidha Provider) configuration to a new provider as required by recent integration updates. This change ensures that GST credentials uses the new GSP configuration and aligns with updated operational requirements. Task: 5379879 Forward-Port-Of: odoo/enterprise#103984
This update ensures Odoo's US payroll system complies with the new OB3 legislation. It introduces a mechanism to deduct qualified overtime pay, capped at $12,500 for singles and $25,000 for married couples, aligning with new IRS regulations. This change impacts overtime calculations and employee payslips.
Original PR description
Purpose: In July 2025, the US Federal Government passed the "One Big Beautiful Bill Act" (OB3), which incurred policy changes around taxes, spending, and economic incentives. Odoo will need to adapt…
Purpose: In July 2025, the US Federal Government passed the "One Big Beautiful Bill Act" (OB3), which incurred policy changes around taxes, spending, and economic incentives. Odoo will need to adapt data and features to be compliant with the following changes: - No tax on overtime: Qualified overtime can be deducted, capped at $12,500 for singles and $25,000 if married filing jointly. The deduction is not avaiable if MAGI is over $150,000 for singles and $300,000 if married filing jointly. To adapt to the changes, the following salary rule and rule parameters were added: - l10n_us_hr_payroll_structure_us_employee_qualified_overtime (hr.salary.rule) - rule_parameter_federal_qualified_overtime_deduction_cap (hr.rule.parameter) - rule_parameter_federal_qualified_overtime_deduction_cap_2025 (hr.rule.parameter.value) The new salary rule is meant for informational purposes only. It will always show on the employee payslips if they inputted overtime work entries for the month and if the deduction cap has not been met yet. task-4964361 Forward-Port-Of: odoo/enterprise#107187
This update enhances the Sign module's ability to handle multilingual documents by allowing multiple fonts to be specified. This eliminates the previous limitation of only one font and ensures smoother rendering of documents with diverse writing systems like Arabic or Chinese, improving the overall user experience.
Original PR description
Support multiple named fonts for multilingual PDF rendering in Sign Previously, only one TTF font could be set via the sign.use_custom_font parameter. Now, multiple fonts can be defined in sign.document.fonts using the format: /path/to/font.ttf; /path/to/another.ttf Each font is automatically registered at runtime. Missing files are skipped with a warning. During PDF generation, the system selects the appropriate font for each character based on Unicode coverage, falling back to Helvetica when needed. This enables smooth rendering of documents containing multiple writing systems (e.g., Latin, Arabic, Chinese) without manual font changes. task-4731754
This update adds a convenient button to payruns that allows users to instantly print a test copy of their payslips. Previously, users had to manually select all payslips and navigate through the system to print a test. This streamlines the process and ensures accurate printing before generating final payslips.
Original PR description
-Originally, the user has to manually select all payslips and then navigate to cog menu to print the payslips. -Currently, a button has been added to allow for test printing at the payrun.
This update enhances project budgeting by adding a 'Budget Spent' stat directly to the project form. Clicking this stat now opens a detailed budget report. The old project dashboard right panel and associated code have been removed, streamlining the project overview.
Original PR description
- make `Budget Spent` stat button in project form view - make it open the `budget.report` window - move stat buttons from project dashboard to project form view - Remove the project dashboard right panel and all its related code --- task-5344612
This update adds a 'Planning Stat' button to the contact form in the Enterprise module. This allows sales teams to quickly see all planned shifts associated with a customer and their related child partners, streamlining shift management and improving efficiency. When creating new contacts, the system will automatically set the most recent SOL (Sales Order Line) as the default.
Original PR description
Add a Planning stat button to the contact form view to quickly access all planned shifts linked to the partner’s SOL, including child partners’ shifts. - Display the number of shifts linked to the partner and its children - Display the start date of today’s shift, otherwise the nearest future shift, otherwise the latest past shift - When creating a new record from this view, set the most recent SOL by default task-5138820
This update allows Ecuadorian businesses to add a custom legal legend (like 'Exportador Habitual') to their electronic invoices, credit notes, and other PDF documents. Previously, a duplicated header was appearing due to a technical issue with PDF rendering. This change resolves the duplication and ensures accurate legal compliance for Ecuadorian exports.
Original PR description
**Commit - 1** Add a new field “Extra Header Legend - RIDE” in the Ecuadorian localization settings to allow users to define a custom legal legend (e.g., "Exportador Habitual", "Fundación sin fines…
**Commit - 1** Add a new field “Extra Header Legend - RIDE” in the Ecuadorian localization settings to allow users to define a custom legal legend (e.g., "Exportador Habitual", "Fundación sin fines de lucro") to be displayed in the PDF header of all electronic documents (Invoices, Credit Notes, Debit Notes, Withholdings, and Delivery Guides). The legend is printed below the company information and RIMPE legend (if any). --- **Commit - 2** After the refactor (https://github.com/odoo/odoo/commit/bba2fc505f5d0b4770eacc6877155b1aeda6d772), layout_document_title is no longer injected directly in external_layout but passed as a variable (via t-call) to the web module, where it is rendered inside web.external_layout_body. In that flow, the variable is used in two heading tags (`<h3>` for PDF splitting and `<h2>` for the visible title), which means it is evaluated twice during PDF generation. Because the EDI header was provided as a table-based template through layout_document_title, both heading usages rendered it. Additionally, since block-level elements were injected inside heading tags, wkhtmltopdf normalizes the invalid HTML structure during PDF rendering, making both evaluations visible and resulting in a duplicated header in the final PDF. This change adapts to the refactor by moving the EDI header directly into external_layout and setting layout_document_title to False for Ecuadorian companies, thereby avoiding the duplicated rendering. --- **task**-5872859
This update simplifies the point-of-sale refund process by removing the refund button from the action menu. This change prevents unintended refund actions and streamlines the user experience. The change was driven by a community contribution and a related task.
Original PR description
Removed the refund button from the action menu, so this override will never be called Task-[5145135](https://www.odoo.com/odoo/project/1737/tasks/5145135) Community PR-[#230334](https://github.com/odoo/odoo/pull/230334)
Resolved issues and error corrections
This update simplifies the process for creating expense accounts by removing automated data pre-filling for KYC verification. This change addresses potential errors caused by inconsistent data formats in certain regions, like the Netherlands, and ensures a more reliable and accurate manual verification process.
Original PR description
Context:
When creating a livemode account, the data pre-sent by the database to stripe may cause issues in some localizations. e.g. the Netherland where people are forced to use a zip in the "\d{4} ?[A-Z]{2}" pattern, which they do not alway do
Solution:
Pre-filling KYC was deemed too error-prone and this would be switched to a fully manual KYC
OPW-5899276
Linked (but not depending on) https://github.com/odoo/iap-apps/pull/1431
Forward-Port-Of: odoo/enterprise#107115This update corrects a bug that occurred when KPIs with the same label but different identifiers were being sorted. The fix ensures accurate sorting by using a more efficient method within the system's data processing, preventing errors and improving data reliability.
Original PR description
When two KPIs have different identifiers but the same label, the call to `sorted` on a list of (priority, label, dict) tuples was wrong. As the two first criteria were the same, the comparison was made on the dict, which is not comparable, leading to the following error:
TypeError: '<' not supported between instances of 'dict' and 'dict'
With this commit, we instead use the `key=` argument to `sorted` in order to build the `(priority, label)` tuples, which is cleaner.
OPW-[5932549](https://www.odoo.com/odoo/project.task/5932549)
Forward-Port-Of: odoo/enterprise#107481This update resolves a problem where changing a bank account in the salary settings would incorrectly add multiple accounts to an employee's profile, leading to incorrect payment allocations. The fix now completely replaces existing bank accounts with the new one, ensuring accurate and consistent salary payments.
Original PR description
When changing a bank account in the salary configurator, the system was adding the new bank account to the employee's existing bank accounts list, ending up having multiple bank accounts where the first retained 100% allocation and subsequent ones had 0% allocation. The fix replaces all existing bank accounts with only the new one. task-5905542 Forward-Port-Of: odoo/enterprise#106333
This update resolves an issue related to how version numbers are tracked within the Belgian HR Payroll module. The fix ensures accurate identification and management of module versions, preventing potential errors during updates and deployments. This improves the stability and reliability of the payroll processing functionality.
Original PR description
Forward-Port-Of: odoo/enterprise#107482
This update corrects a display issue where percentage fields in employee contracts were showing decimal values (e.g., 0.25%) instead of the intended percentage format (e.g., 25%). The underlying calculations remain accurate, and this change ensures a more user-friendly presentation of percentage data within the HR contract module.
Original PR description
Percentage fields are stored as a decimal in the DB (0.25) but represent a percent value (25%) The calculations are correct but the display to the user shows 0.25%, this PR fixes that without modifying the values stored on the database task-5350196 Forward-Port-Of: odoo/enterprise#106989
This update fixes a problem where the system was creating multiple, empty pay runs when generating payslips. The change ensures that only one temporary pay run is created during the selection dialog process, preventing unnecessary database clutter and improving system stability. This resolves a potential performance issue and ensures accurate payroll data.
Original PR description
When generating payslips from the selection dialog the UI previously created a new hr.payslip.run on every attempt; server-side validation can fail and each failed attempt left an empty pay run in the database. Fixed by allowing the dialog to create at most one temporary pay run per dialog lifecycle, reuses it on retries, and removes it if generation fails or the dialog is closed. task-5920710 Forward-Port-Of: odoo/enterprise#106857
This update fixes a payment error related to work accident entries on employee payslips. Previously, a new entry type wasn't correctly linked, leading to accidental payments. The fix adds the necessary entry type to the payroll structure, ensuring accurate payment processing for work accident compensation.
Original PR description
The unpaid work accident work entry type was added, but not included in `unpaid_work_entry_type_ids`, causing it to be paid by mistake. Add it to `unpaid_work_entry_type_ids` for the following structures: - structure_type_employee_cp200 - structure_type_employee_cp200_pfi Task: 5484866 Forward-Port-Of: odoo/enterprise#106435
This update resolves an issue where FedEx freight requests were failing due to missing information required by the FedEx API. Specifically, the system was unable to send a crucial detail – a 'bookingConfirmationNumber' – which is necessary for the API to validate shipments. This fix ensures that rate calculations for FedEx freight can be retrieved, but delivery validation remains functional.
Original PR description
Issue ----- Fedex freights services require extra information not present in the db, so requests will not be accepted by the API. A rate can be retrieved but the delivery cannot by validated by users as they get a `SHIPMENT.LOADCOUNT.INVALID` error. This is due to the lack of a `expressFreightDetail` entry in the request sent to the Fedex API. This `expressFreightDetail` field should contain some information which Odoo does not have a way to retrieve, such as a `bookingConfirmationNumber`. API details: https://developer.fedex.com/api/en-us/catalog/ship/v1/docs.html#:~:text=expressFreightDetail Feedback 5913471 ----- Ticket: opw-5876616 Forward-Port-Of: odoo/enterprise#106590
This update corrects a minor issue in the calculation of payroll fees and deductions, specifically related to union and professional association fees. The change ensures more accurate processing of these deductions, improving the reliability of payroll reporting for Australian businesses using the Enterprise module.
Original PR description
. Update `Union and professional association fees` code in computations of `Fees and Deductions` rule task-5402666 Forward-Port-Of: odoo/enterprise#104911
This update resolves an error that occurred when generating timesheet reports grouped by employee, specifically when filtering by billing time. The fix corrects a data structure issue preventing the report from correctly displaying hours worked by each employee. This ensures accurate timesheet reporting functionality.
Original PR description
## Short functional explanation of the error In Timesheets, when reporting by billing time, if we try to group by employee, an error occurs. ## Reproduction Steps 1. Go to Timesheets. 2. Click on the…
## Short functional explanation of the error
In Timesheets, when reporting by billing time, if we try to group by employee, an error occurs.
## Reproduction Steps
1. Go to Timesheets.
2. Click on the Reporting tab > By Billing type.
3. Click on the search bar and click on Employee under the Group By section.
### Expected behavior
A report shows the different hours worked on billing time for each employee.
### Unexpected behavior
An error occurs:
```TypeError: data.forEach is not a function```
## Origin of the issue
When retrieving the data to show in the report after having grouped
it by employee, this piece of code is called:
https://github.com/odoo/enterprise/blob/42102423069c2cebbc01eb4d1d8f9b6215358639/sale_timesheet_enterprise/static/src/views/timesheet_analysis_pivot/timesheet_analysis_pivot_model.js#L23-L36
However, the variable (data) on which we perform the forEach isn't
an array: it's an object of structure:
```
{ "group": { "rowValues": [], "colValues": [] }, "rowGroupBy": [ "employee_id" ], "colGroupBy": [], "subGroupIndex": 2, "subGroups": [ { "employee_id": [ 1, "Administrator" ], "__extra_domain": [ [ "employee_id", "=", 1 ] ], "unit_amount:sum": 0, "__count": 2, "__domain": [ "&", [ "project_id", "!=", false ], [ "employee_id", "=", 1 ] ] } ] }
```
on which we can't perform a forEach. The data we want to access to
use in the report is actually the `subGroups` element of data.
__
opw-5864458
Forward-Port-Of: odoo/enterprise#106969This update resolves a technical issue that could have caused the payroll system to become stuck in an endless loop. The change ensures that data is fetched correctly, improving the stability and reliability of the HR payroll processing.
Original PR description
The new implementation uses a prefetch object that makes the union of prefetch ids. This commit fixes an infinite loop by imposing the prefetching with `records.with_prefetch()` Forward-Port-Of: odoo/enterprise#107480
This pull request addresses a critical issue (274XX) within the Belgian payroll module (l10n_be_hr_payroll). The fix corrects a problem impacting payroll calculations, ensuring accurate and compliant processing of employee wages. This update improves the reliability of the HR payroll functionality.
Original PR description
Forward-Port-Of: odoo/enterprise#107679
This update ensures that all rates displayed on printed payslips are formatted to a maximum of 4 decimal places. This improves the clarity and professionalism of the payslip document, aligning with standard reporting practices. The change was implemented to address a formatting issue.
Original PR description
This commit improves the payslip display by limiting all rates to 4 decimals max on the printed pdf payslip. Task: 5709739 Forward-Port-Of: odoo/enterprise#104915
This update resolves a bug preventing users from saving the CDI - Experienced Developer (BE) contract template. The change removes a default checkmark for an inventory car, which was causing a required field error. This ensures the template can be successfully saved and used.
Original PR description
Before this commit, when the CDI - Experienced Developer (BE) contract template is loaded, the inventory car is checked, but no car is selected, so you can't save. This commits unchecks the inventory car on the template to avoid this issue. Task: 5892344 Forward-Port-Of: odoo/enterprise#107584 Forward-Port-Of: odoo/enterprise#105992
This update corrects a data issue in the demo payroll system for Anita Oliver. Specifically, the first month's payslip data has been added, enabling the 'Time Off to Defer' functionality to work correctly. This ensures the demo data accurately reflects payroll processing.
Original PR description
Add first month's payslip in demo data for Anita Oliver, so that Time Off to Defer works correctly. task-5912512 Forward-Port-Of: odoo/enterprise#106685
This update resolves an issue where the header in the sign application was overlapping with a red color bar. The fix removed a styling tag that caused this overlap, ensuring the header is now displayed correctly and consistently. This improves the user experience for signing documents.
Original PR description
Remove `top` tag to prevent header overlap due to neutralize red color bar Before fix: <img width="1953" height="790" alt="image" src="https://github.com/user-attachments/assets/dd9f7a00-eaea-4304-a22d-d8df96203823" /> After fix: <img width="1892" height="639" alt="image" src="https://github.com/user-attachments/assets/247e6067-570a-4fcb-a0e9-6f2640940f21" /> opw-5900244 Forward-Port-Of: odoo/enterprise#106844
This update corrects a technical issue where the contract template was being unnecessarily created during salary configuration. This prevented certain calculations from running correctly. The fix ensures the template data is now correctly handled, resolving the problem and improving system performance.
Original PR description
Writing the contract template on the new version created by the salary configurator is not necessary and caused some computes to not trigger. The contract template values are already included in the `_get_version` method. task-5324222 Forward-Port-Of: odoo/enterprise#107582 Forward-Port-Of: odoo/enterprise#99781
This update resolves an issue where incoming calls were automatically rejected when Do Not Disturb (DND) mode was activated. The change restores the expected behavior, allowing calls to be accepted while still respecting DND by preventing the softphone from automatically opening or playing a ringtone. This ensures a smoother call experience for users.
Original PR description
Since https://github.com/odoo/enterprise/pull/104426, incoming calls were automatically rejected when Do Not Disturb (DND) mode was enabled. This commit restores the expected behavior: when DND is enabled, the incoming call is accepted and a session is created, but the softphone is not automatically opened (and no ringtone is played).
A recent update to the project timesheet forecasting module caused errors when accessing all timesheets. This fix addresses a technical issue where an outdated field reference was preventing proper grouping of timesheets by employee. The update ensures the timesheet functionality is stable and reliable.
Original PR description
Steps to reproduce: - install project_timesheet_forecast - open timesheets app - open all timesheets menu => error Source of the bug: - planning_slot has no more employee_id field, it was replaced by employee_ids - when trying to group planning slots by employee_id, the key "employee_id" doesn't exist. Fix: The group_expand based on planning when the section field in the grid view is employee_id. task-5945958
This update resolves an issue where the 'Mark as Paid' button was hidden for users in Mexico when the l10n_mx_hr_payroll_account module was installed. This change ensures the standard payment flow is clear and functional for Mexican users, improving their payroll processing experience.
Original PR description
The "Mark as Paid" (action_payslip_paid) button on the hr.payslip form view [is hidden](https://github.com/odoo/enterprise/blob/19.0/hr_payroll_account/views/hr_payslip_views.xml#L39) when the l10n_mx_hr_payroll_account module is installed, making the standard payment flow confusing for users in Mexico. target: 19.0 task-5434674 Forward-Port-Of: odoo/enterprise#104390
This update ensures that the SOL (Service of Logistics) is correctly displayed in the invoicing notebook for sales orders when the project is set to 'is_fsm' and the partner type is a delivery partner. Previously, this information was missing for delivery partners, leading to potential invoicing inaccuracies. This change improves the accuracy and completeness of invoices for delivery-based sales.
Original PR description
Before this commit: When the project `is_fsm`, the timesheet product is displayed in the invoicing notebook regardless of partner type. After this commit: When the project `is_fsm` and the partner is of type delivery, the SOL displays correctly in the invoicing notebook. task-4764834
This update removes automatic completion of document activities when an account move is created. Previously, activities were marked as done regardless of their purpose, which was causing confusion and potential errors. This change ensures activities are only marked complete when directly related to an account move action.
Original PR description
Purpose: Avoid closing document activities that may not be related to performing a document action. Specification: When an account move is created from a document, the current logic automatically marks all document activities as done. This behavior is removed because document activities can exist for purposes unrelated to the performed action, and should not be completed implicitly as a side effect of it. Task-5075307
This update strengthens the security of invoices by preventing the use of untrusted accounts when processing inbound invoices. The change addresses a vulnerability that could have allowed unauthorized access. Testing and related code updates were implemented to ensure proper functionality.
Original PR description
fixed some tests see odoo#247954 Forward-Port-Of: odoo/enterprise#106980
This update corrects a minor visual issue with the Gantt chart's side panel icon. The icon was previously displaying as if it should rotate, which was an unintended leftover setting. This change ensures the icon appears correctly, improving the overall user experience.
Original PR description
This commit removes the fa-flip-horizontal class from the gantt side panel icon which was mistakenly left as is in https://github.com/odoo/enterprise/pull/107520
Features or functions removed from Odoo
This update removes the 'New' button from the DIMONA Declaration List view in the odoo/enterprise module. This simplifies the process for users creating new DIMONA declarations, streamlining workflows and reducing potential confusion.
Original PR description
. Remove the New button on DIMONA Declaration List view task-5471873 Forward-Port-Of: odoo/enterprise#105783
This update streamlines the demo data for Odoo's Indian payroll module (l10n_in_hr_payroll) by removing redundant working schedules. The change consolidates to a standard 40-hour work week, improving data clarity and reducing complexity within the demo environment. This ensures a more accurate and easily understandable representation of payroll setup for Indian businesses.
Original PR description
### AIM - In the demo data, there is no need to create multiple working schedules for Indian locations. - We can use a single working schedule of 40 hours per week. Task: 5899739 Forward-Port-Of: odoo/enterprise#106151
This change removes the default root initialization file in Odoo Enterprise. This update disrupts existing setups that rely on the PYTHONPATH environment variable, requiring adjustments for those systems. This change ensures greater consistency and simplifies the Odoo environment.
Original PR description
Added by #101497, breaks PYTHONPATH setups.
This update streamlines the project_enterprise_hr_todo module by removing a redundant dependency on the 'test_mail' module. This simplifies the project's setup and reduces potential complexity, resulting in a more efficient system.
Original PR description
This commit removes `test_mail` in the dependencies of project_enterprise_hr_todo since it is not really needed to depend on that module.
This update removes a redundant check within the ai_fields module. A recent update to Odoo (odoo/odoo#249054) now supports the 'SET' command, making the previous special case handling obsolete. This change improves code efficiency and simplifies the module.
Original PR description
Since odoo/odoo#249054, the command SET is now supported by `_applyCommands`, which means that the specialcase here isn't useful anymore. This commit thus removes it.
This update removes a redundant view related to attachment storage within Odoo Enterprise. Previously, users had access to duplicate attachment information, which has now been consolidated into the standard Technical/Attachments menu. This streamlines the user experience and reduces complexity.
Original PR description
Before: A Storage view showed read-only attachment size information with no available actions and an unclear details view, duplicating data already accessible from Technical/Attachments. After: The Storage view, action, and model were removed. users now rely on the standard Technical/Attachments menu Taskid-5864785
This update removes a general SSN field across several Odoo payroll modules (for countries like Egypt, Mexico, South Africa, and the US). Previously, a single SSN field was used, leading to inconsistencies. This change introduces a more standardized approach, aligning with existing practices and improving data accuracy for each country's payroll processing.
Original PR description
xx: eg, mx, sa, us for each l10n we interduced `l10n_xx_ssn` to have this number with its constrains and usage unique for each l10n like the niss in the l10n_be Task: 4384436
This update removes unnecessary calculated fields from the contract templates. These fields, like reimbursed amounts, were previously copied but should be automatically computed. This simplifies the template and improves data accuracy.
Original PR description
Some fields such as the reimbursed amounts are computed and should not be copied from the template. This commit removes these fields from the contract template. task-5948571
Code cleanup and technical improvements
This update streamlines the creation of point-of-sale receipts by using backend templates, enabling generation from both the front and back ends. The system now generates receipts within iframes with optimized CSS, resulting in faster generation and reduced errors. This improves the overall POS experience.
Original PR description
*: l10n_at_pos, l10n_br_edi_pos, l10n_cl_edi_pos, l10n_de_pos_cert, l10n_de_pos_res_cert, l10n_eu_iot_scale_cert, l10n_it_pos, l10n_ke_edi_oscu_pos, l10n_se_pos, pos_blackbox_be, pos_iot, pos_iot_six, pos_self_order_iot, pos_settle_due, pos_tyro, pos_urban_piper All receipts in the PoS are now generated with backend templates, allowing them to be generated in both the frontend and backend. The generation system has also been changed to generate tickets in iframes with specific CSS. This reduces generation time and avoids CSS errors.