Monday, April 20, 2026
10 changes · master
Resolved issues and error corrections
The Dutch ICP report now rounds amounts down to whole numbers, matching the rounding already used in exports. This reduces confusion and helps businesses compare report and export values consistently for Dutch tax reporting.
Original PR description
Description of the issue this commit addresses: The Dutch tax authority lets ICP amounts be rounded down which is the behavior of the exports but not of the report itself meaning the values to not match and is quite confusing. --- Desired habevior after this commit is merged: The integer rounding DOWN is added on the ICP report to restore matching values --- task-6065382 Forward-Port-Of: odoo/enterprise#114277 Forward-Port-Of: odoo/enterprise#112953
A payroll employee field in Belgian localization was being checked too early, before the needed payslip data existed. This change prevents that premature check so holiday pay recovery values are calculated at the right time, improving reliability of payroll tests and results.
Original PR description
…ield The computed, non-stored field `l10n_be_holiday_pay_recovered_n1` had tracking enabled. When writing to any field on the employee, the `write` method calls `_track_prepare` for tracked fields if `mail_notrack` is not set in the context. `_track_prepare` reads the current value of tracked fields to store initial values. Because `l10n_be_holiday_pay_recovered_n1` is non-stored with no dependencies, this triggered a computation at the very beginning of the test, before payslips existed. Later, when payslips were created, the field was never recomputed, causing incorrect values and test failures. Previously, the `tracking_disable` context prevented early computation. The fix removes the tracking attribute entirely, so the field is only computed when accessed, avoiding premature reads and fixing the tests. task: 6095445 Forward-Port-Of: odoo/enterprise#114063 Forward-Port-Of: odoo/enterprise#113015
This update fixes an error that could block upgrades of the Accounting Reports module. It ensures required report grouping data is correctly set, helping upgrades complete smoothly without manual intervention.
Original PR description
Bug introduced by odoo/enterprise#113124, when trying to upgrade the module `account_reports`, traceback error: > psycopg2.errors.NotNullViolation: null value in column "horizontal_group_id" > of relation "account_report_horizontal_group_rule" violates not-null constraint.
The Time Off overview no longer crashes when a new company or localization has no time off records yet. This ensures users can open the dashboard normally even before any time off data has been created.
Original PR description
Steps to reproduce: 1. Create a new company or install a localization (resulting in 0 time off records). 2. Open the Time Off overview (defaults to the Dashboard Gantt view). -> OwlError: Cannot…
Steps to reproduce: 1. Create a new company or install a localization (resulting in 0 time off records). 2. Open the Time Off overview (defaults to the Dashboard Gantt view). -> OwlError: Cannot destructure property 'type' of 'fields[fieldName]' as it is undefined. Cause: Following the recent work entries refactoring, the JS function `_fetchUserFavoritesWorkEntries` was added to the base `HrHolidaysGanttModel` to fetch data from the `hr.leave` model. When the Dashboard (`hr.leave.report.calendar`) has 0 records, the frontend `SampleServer` is activated to generate fake background data. It builds its schema based on the Dashboard view. When the JS unconditionally fires the cross-model RPC call to `hr.leave` (grouping by `work_entry_type_id`), the `SampleServer` intercepts it. Because it doesn't have `work_entry_type_id` in its Dashboard schema, it fails to evaluate the field type and crashes the Owl lifecycle. Solution: Restrict the `_fetchUserFavoritesWorkEntries` call in `_fetchData` so it only runs when not using sample data (`!this.useSampleModel`). This prevents the `SampleServer` from intercepting unsupported cross-model queries to `hr.leave` when loading empty views on fresh databases. task-5969290 Forward-Port-Of: odoo/enterprise#108618
The rental duration test has been adjusted to avoid occasional failures caused by timezone differences around midnight. This helps keep automated validation stable without changing the customer-facing rental experience.
Original PR description
The rental test intermittently fails on Runbot due to timezone offsets. Near midnight, the start time can appear after the end time, causing the datepicker to auto-shift the end date by 24h. This commit uses `getFutureDate` to set full future datetimes, bypassing browser timezone and midnight crossover issues. Runbot Error: https://runbot.odoo.com/odoo/runbot.build.error/242000
Odoo now handles LinkedIn organization image data more safely when connecting an account. If LinkedIn omits an optional image link, the setup process skips that image instead of failing, helping users complete the connection reliably.
Original PR description
When importing a LinkedIn account, Odoo fetches the image metadata of the organization page and expects each returned image to contain `downloadUrl`. For some LinkedIn accounts this key is missing from the image response, which makes the callback crash with `KeyError: 'downloadUrl'` and prevents the account from being connected. LinkedIn's current Images API documentation describes `downloadUrl` as an optional field, so the import flow should not assume it is always present. This patch skips image entries without `downloadUrl` instead of crashing. opw-6099244 Forward-Port-Of: odoo/enterprise#113812
Australian payroll no longer crashes when an employee contract has a wage but no schedule pay selected. This keeps employee payroll records usable even when pay schedule information is temporarily missing or removed.
Original PR description
This error occurs when the schedule pay is removed from an employee contract with a defined wage. Steps to reproduce: - Install `l10n_au_hr_payroll` module with demo data - Switch to `My Australian…
This error occurs when the schedule pay is removed from an employee contract with a defined wage.
Steps to reproduce:
- Install `l10n_au_hr_payroll` module with demo data
- Switch to `My Australian Company`
- Open any Employee > Payroll > `Wage` remove `schedule pay`
Traceback:
```py
File "/home/odoo/src/enterprise/saas-19.2/l10n_au_hr_payroll/models/hr_version.py", line 549, in _compute_wage
version.wage = Payslip._l10n_au_convert_amount(daily_wage, "daily", version.schedule_pay)
File "/home/odoo/src/enterprise/saas-19.2/l10n_au_hr_payroll/models/hr_payslip.py", line 511, in _l10n_au_convert_amount
coefficient = PERIODS_PER_YEAR[period_from] / PERIODS_PER_YEAR[period_to]
KeyError: False
```
We are encountering this error because the `schedule pay` is removed, causing the field to become `False`. This False value is then passed to the `_l10n_au_convert_amount` [method], resulting in a `KeyError`.
[method]: https://github.com/odoo/enterprise/blob/92c584cc1426ac70f6f77aa8216c17004fa42d35/l10n_au_hr_payroll/models/hr_payslip.py#L500-L509
sentry-7401189447
Forward-Port-Of: odoo/enterprise#113623Users can now clear the scope on an ESG emission source without triggering an error. The change keeps related activity flow fields safely empty when no scope is selected, improving reliability while editing ESG records.
Original PR description
Currently, an error occurs when the user removes the scope of the emission source. **Steps to Reproduce:** - Install the `esg` module. - Create an `emission source` record or open an `existing one`.…
Currently, an error occurs when the user removes the scope of the emission source. **Steps to Reproduce:** - Install the `esg` module. - Create an `emission source` record or open an `existing one`. - Remove the `scope` value and click anywhere. `ValueError: Compute method failed to assign esg.emission.source(<NewId origin=1>,).activity_flow_direct_indirect` **Cause:** Error started occurring in 19.0 due to a change in selection field behavior. Since from [commit](https://github.com/odoo/odoo/pull/214422/commits/8d2a42ac419fdf7943a0c11beb8c5de6c6f85bef), selection fields no longer display an “empty” value. To remove a value from a selection field, the user must clear the field, similar to a many2one field. when the user removes the scope value, The system attempts to compute the activity flow, but since the scope is False, it does not match any case [1]. As a result, the method fails to assign a value to activity_flow_direct_indirect, raising an error. This commit ensures that the activity flow and activity flow direct indirect are initialized to False. If no condition matches, the field remains False, preventing the assignment failure. [1]: https://github.com/odoo/enterprise/blob/eaf4b7559b8eb6c538820d6e54f583a41077ac3d/esg/models/esg_emission_source.py#L79-L89 Forward-Port-Of: odoo/enterprise#114079
Code cleanup and technical improvements
This change updates internal screen templates across several Odoo apps so they are ready for the next version of Odoo's web interface technology. It should not change day-to-day behavior, but helps reduce upgrade risk and keeps affected features compatible with upcoming framework requirements.
Original PR description
In preparation for OWL3, where template variables will need to use .this to target component variables, we add .this to template variables that are targetting the component. Script PR: https://github.com/odoo/odoo/pull/247965 Community PR: odoo/odoo#259313 IF THIS SCRIPT ADDED A BAD MIGRATION REPORT TO (JESC), WE MIGHT NEED TO WHITELIST THE BUG task: OWL3 prep - add this. to template variables
This update removes obsolete instructions that suppressed change tracking in several business flows and test/demo data. It helps Odoo rely on its standard tracking behavior, reducing hidden side effects and making future changes easier to maintain without altering core user workflows.
Original PR description
Helpdesk: useless usage in demo data Sale connectors: action_lock writes on lock field, if people don't want to see any tracking of that field, better remove the tracking on the field. Otherwise let Odoo track changes. Sale_subscription: remove notrack around payment_exception update. That field is not tracked, and that could prevent any tracking at the next flush time.