Tuesday, July 7, 2026
12 changes · saas-19.1
Enhancements to existing features
The VAT field now shows a cleaner placeholder and, when possible, the expected VAT format for the selected country. The help text was also simplified to make it easier for users to understand how to mark a customer without a Tax ID.
Original PR description
In this commit: - Remove 'or not applicable' and '/ if not applicable' from VAT placeholders. - Display the expected VAT format when available (e.g. BE0477472701). - Leave the placeholder empty when no format is known. - Simplify the tooltip to: 'You can use / to indicate that the customer has no Tax ID.' task-[5005896](https://www.odoo.com/odoo/project/967/tasks/5005896) Forward-Port-Of: odoo/odoo#273344
Resolved issues and error corrections
The Sales Commission Achievement report no longer crashes when users apply filters like Current Period that rely on relative dates such as today. This keeps commission reporting accessible and reliable without changing the intended reporting logic.
Original PR description
### Issue Applying a filter using relative date expressions (e.g. `today`) on the Sales Commission Achievement report raises a traceback. ### Steps to reproduce 1. Open **Sales > Commissions >…
### Issue Applying a filter using relative date expressions (e.g. `today`) on the Sales Commission Achievement report raises a traceback. ### Steps to reproduce 1. Open **Sales > Commissions > Achievements**. 2. Apply the **Current Period** filter. ### Current behavior The report crashes with: ```text ValueError: time data 'today' does not match format '%Y-%m-%d' ``` ### Cause The `_search` implementation extracts `date_to` values from the search domain and assumes they are literal `%Y-%m-%d` strings. However, search domains may contain relative date expressions such as `today`, `today +1d`, `today =1m`, etc., which cannot be parsed using `datetime.strptime()`. ### Fix Convert the incoming search domain to a `Domain` object and resolve it with `optimize_full()` before extracting the `date_to` values. This evaluates relative date expressions into actual `date` objects, preventing the traceback while preserving the existing currency conversion date logic. Forward-Port-Of: odoo/enterprise#122812
This fix prevents Hong Kong payroll payslips from crashing when a user clears the start or end date. The system now safely skips date-based wage and end-of-year pay calculations until valid dates are present, improving reliability during payslip editing.
Original PR description
Currently, an error occurs when a user removes the payslip date. **Steps to Reproduce:** - Install `l10n_hk_hr_payroll` with demo data. - Switch to the `Hong Kong` company. - Go to `Payroll` >…
Currently, an error occurs when a user removes the payslip date. **Steps to Reproduce:** - Install `l10n_hk_hr_payroll` with demo data. - Switch to the `Hong Kong` company. - Go to `Payroll` > `Payslips` > `Payslips`. - Create a `payslip` and remove the `start` or `end` period. **Error 1:** `TypeError: unsupported operand type(s) for +: 'bool' and 'relativedelta'` **Error2:** `AttributeError: 'bool' object has no attribute 'month'` When a user removes the start or end date of a payslip, the system computes the Average Daily Wage. Based on the payslip dates, it finds the previous year's payslips [1]. If the start or end date is not set, it raises an error [2]. For the second error, when computing whether to include EOY pay, it compares the company's EOY pay date with the end date's month. If the end date is not set, accessing its month raises an error [3]. This commit ensures that when retrieving previous-year payslips, if the start or end date is not set, it returns an empty payslip recordset. It also ensures that when computing whether to include EOY pay, if the end date is not set, `include_eoy_pay` is set to `False`. [1]: https://github.com/odoo/enterprise/blob/ec8a009794863090351d91650aff727e6fbeab7e/l10n_hk_hr_payroll/models/hr_payslip.py#L124 [2]- https://github.com/odoo/enterprise/blob/ec8a009794863090351d91650aff727e6fbeab7e/l10n_hk_hr_payroll/models/hr_payslip.py#L209-L215 [3]- https://github.com/odoo/enterprise/blob/ec8a009794863090351d91650aff727e6fbeab7e/l10n_hk_hr_payroll/models/hr_payslip.py#L141 Forward-Port-Of: odoo/enterprise#120586
This update fixes an error that could prevent Belgian CODA bank statement files from importing after a recent change added extra file information. Businesses using Belgian bank statement imports should see the process work reliably again without interruption.
Original PR description
in this commit: https://github.com/odoo/enterprise/commit/c66995fda83e19b28a38312af8efdc1601881cf0 we did a backport of the extension number. The backport adds the extension number to the return of the _parse_bank_statement_file. With that we have 4 args returned. Without the * we would have the "too many value to unpack" error opw-6362679 Forward-Port-Of: odoo/enterprise#123104
Unmatched Activity Watch events are now grouped consistently in Timesheets, even when project or task details are missing. This prevents duplicate unmatched groups and gives users a cleaner, more accurate timesheet review experience.
Original PR description
Before this commit, we could have 2 unmatched groups, one with `{project_id: false, task_id: false}` as key and another one with `{}` as key because the key events from AW do not always have `project_id` and `task_id` in their data.
This commit manages the case where `project_id` and `task_id` are not attributes of the activity watch event object to correctly set `{project_id: false, task_id: false}`.
task-6306218Helpdesk teams that limit automatic ticket closure to certain stages will now only send closure reminder emails for tickets in those stages. This prevents customers from receiving misleading warnings for tickets that are not scheduled to be closed.
Original PR description
**Problem:** When a team restricts automatic closing to specific stages (from_stage_ids), the closing-reminder email is still sent to every inactive ticket in the team, including tickets in stages…
**Problem:** When a team restricts automatic closing to specific stages (from_stage_ids), the closing-reminder email is still sent to every inactive ticket in the team, including tickets in stages that are never auto-closed. **Steps to reproduce:** 1. On a helpdesk team, enable Automatic Closing with a reminder and set "In Stages" (from_stage_ids) to one specific stage 2. Leave a ticket inactive in a different, non-folded stage until it reaches the reminder threshold (auto_close_day - reminder_delay) **Current behavior:** The ticket gets a "your ticket will be closed soon" reminder even though it is not in an auto-close stage and will never be closed. **Expected behavior:** Only tickets that would actually be auto-closed (those in from_stage_ids) should receive the reminder. **Cause of the issue:** The reminder selection filters on auto_close_ticket_reminder and the reminder date only; unlike the auto-close selection, it does not apply the team's from_stage_ids condition. **Fix:** Reuse the same stage condition used to select tickets for closing when selecting tickets for the reminder, so the reminded set stays consistent with the set that will be auto-closed. opw-6291237
Twitter/X reply counts are now saved for social stream posts when metrics are fetched from the API. This ensures comment counts appear alongside other engagement metrics, giving users a more complete view of tweet performance.
Original PR description
Twitter/X tweet metrics returned by the API include the number of replies in the `public_metrics.reply_count` field. This commit stores that value on social stream posts so the comments count can be displayed alongside other engagement metrics. API Documentation: https://docs.x.com/x-api/fundamentals/metrics#post-metrics Task-6251172 Forward-Port-Of: odoo/enterprise#120182
Previewing the “2Fa New Login” email template now works without triggering an error. This prevents interruptions for administrators who want to review or reset the template, while keeping the 2-factor login flow unchanged.
Original PR description
Issue: ---------------------------------------- Clicking "Preview" on the template "2Fa New Login" causes an error. Steps to reproduce: ---------------------------------------- - Search for the mail template "Settings: 2Fa New Login" - Click "Preview" - Error in terminal - From 17.0+ the error shows in UI - From saas-18.3+, a traceback occurs whe resetting the template Cause: ---------------------------------------- There is an assert the method `_get_totp_mail_code()` to ensure it's used during 2FA. But when passing by rendering this template in preview we aren't in sudo and the assert in `_get_totp_mail_code()` raises. Solution: ---------------------------------------- We replace the `assert` by a `if` which will return fake results. opw-6333887 Forward-Port-Of: odoo/odoo#273914 Forward-Port-Of: odoo/odoo#273125
This change corrects an automated test related to Italian e-invoicing withholding. It does not introduce new business behavior, but helps ensure the existing feature is verified correctly and stays reliable after related updates.
Original PR description
This commit just want to correct a test of a PR already merged. Original commit: 78ffb5a2e63401123e4506056493e52cf3e69953 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274062
This fix makes the system correctly detect links that point to local addresses such as localhost. As a result, these links will be handled like other web links instead of being ignored, which improves testing and local development workflows.
Original PR description
Before this commit, url like `http://localhost:8069` were ignored by the `urlRegexp` because it requires a Top-Level Domain. This commit makes the Top-Level Domain optional. Forward-Port-Of: odoo/odoo#274379
This update prevents URL autocomplete suggestions from spilling outside the screen on smaller devices. It improves the mobile editing experience by making the suggestion box fit the available width while still behaving normally on larger screens.
Original PR description
Step to reproduce: - Open Notes - Open the link popover - Type a URL in the URL input field Description of the issue/: - On mobile devices, URL autocomplete suggestions overflow the viewport. Cause: - The autocomplete suggestions container has a max-width of 600px. - On smaller screens, the container does not shrink to fit the available width, causing it to overflow the viewport. Solution: - Add width: 100% to the autocomplete suggestions container so it adapts to the available screen width on smaller devices while still respecting the existing max-width on larger screens. task-6201175 Forward-Port-Of: odoo/odoo#271925 Forward-Port-Of: odoo/odoo#269493
This update ensures that certain Odoo modules are correctly licensed as LGPL-3, aligning with their community module status. Previously, these modules were incorrectly marked with an enterprise license. This change clarifies licensing and avoids potential legal issues.
Original PR description
Before this commit, the license set on manifest of some modules uses the enterprise license instead of `LGPL-3` license since it is a community module. This commit changes the license to set `LGPL-3`. Fixes #205134 Forward-Port-Of: odoo/odoo#274123 Forward-Port-Of: odoo/odoo#273597