Tuesday, July 14, 2026
187 changes
20 changes
Enhancements to existing features
Adds warnings to help Belgian payroll teams identify ONSS payment issues when preparing DMFA declarations. This reduces the risk of missed or incorrect social security payments and improves visibility directly in the payroll workflow.
Original PR description
task-id: 6242053
Belgian payroll now includes a warning when an employee worker code needs attention. This helps payroll teams spot missing or incorrect worker-code information earlier, reducing the risk of payroll reporting issues.
Original PR description
task-6365107
Belgian payroll users can now generate a certificate of employment directly from an employee’s end-of-collaboration area. When electronic signing and document management are installed, the process also prepares a signing request, helping HR handle departures more efficiently.
Original PR description
When an employee is leaving, the employer should hand out a certificate of employment.
The certificate is genereate in the chatter if only l10n_be_hr_payroll is installed.
If sign and documents installed, a sign template and request is also created.
- In l10n_be_hr_payroll
- Add a button in employee "End of collaboration" tab.
- Add new action `action_report_employment_certificate`.
- Add 2 new templates `l10n_be_hr_payroll.employment_certificate` and `l10n_be_hr_payroll.employment_certificate_base` for translation.
- In a new bridge l10n_be_hr_payroll_sign
- Override action_report_employment_certificate to add sign feature.
- Inherit from `l10n_be_hr_payroll.employment_certificate` to add a flag div for the sign item.
Task: 6314717The AI module now avoids using a Google embedding model that is scheduled for deprecation. Existing AI data created with deprecated embedding models will be automatically refreshed, helping keep AI-powered features reliable without manual cleanup.
Original PR description
The model gemini-embedding-001 will be deprecated soon, so this commit is: - Deprecating that model. - Introducing an autovacuum to recompute embeddings that were done using embedding models that have been deprecated. task-6004597 Forward-Port-Of: odoo/enterprise#124095
Spreadsheet side panels now use Odoo's standard date picker for calendar fields. This makes choosing dates in conditional formatting and data validation more consistent and easier for users.
Original PR description
DateTimePickerPopover from Odoo is now used in the CalendarButton component of spreadsheet (CF and DV side panels) Task: 5395190
Belgian payroll can now calculate employee seniority using the start date of a future contract version instead of today. This helps payroll teams preview future payroll situations more accurately when preparing upcoming employee changes.
Original PR description
In this commit, it will be possible to compute seniority in future versions. When the version.date_start > today, we calculate the seniority until version.date_start instead of today (future version case). task-6375077
Eco voucher spreadsheet reports can now be generated in English and Dutch in addition to French, based on the user's language settings. The report layout is also improved with centered text, making the exported file easier to read and share.
Original PR description
Previously eco vouchers .xlsx report was only supported in French. This task adds English and Dutch according to the user's configuration. Additionally, text is aligned to the center task-6340788
Belgian payroll now automatically creates approved paid time off allocations for eligible employees when public holidays are added. New eligible employees also receive allocations for existing public holidays, reducing manual HR work and helping ensure consistent compensation handling.
Original PR description
In this commit, we automated the public holiday allocation. When a public holiday is created, each eligible employee (active and worker_code is set) will got a validated allocation automatically. Also, when a new employee is created, he will receive allocations for existing public holidays. The allocation date_from will be the first day of the public holiday date, and the date_to will be the last day of the current year. task-5480426
Gantt views now use a clearer popover structure so details shown in popups are loaded only when needed. This keeps view definitions tidier and can reduce unnecessary data loading across scheduling, planning, project, maintenance, events, rentals, rooms, and related workflows.
Financial reports can now be calculated in smaller time-based pieces and combined while still matching the result of a full-period calculation. This improves support for report snapshots and also fixes an issue where report lines could stay expanded even after they no longer had child lines.
Original PR description
In order to support snapshots, the domain engine must be composable. This means data must be computed in separate partitions, then merged to give the exact same result as a full period computation. The `sum_if_pos` and `sum_if_neg` formulas break this composability. Therefore, we are dropping these subformulas, replacing them with the `if_above` and `if_below` aggregations. task-6235251
Calendar popovers in several Odoo apps now use the updated card-based layout, keeping scheduling details consistent after the shared calendar interface was reworked. This improves the visual consistency of planning, field service, knowledge, VoIP, and related scheduling views without changing core business workflows.
Original PR description
This PR adapts the calendar extensions, especially those that customize the CalendarCommonPopover, which has been massively reworked. Task~5262907
Updates improve how users work with documents and comments in the Knowledge app. This should make collaboration smoother and more reliable when reviewing or discussing shared content.
The salary configurator and employee offer screens now present company car options in a simpler, more user-friendly way. This makes it easier for Belgian employees and HR teams to understand and select fleet-related benefits during salary package setup.
Original PR description
-Introducing some UX changes in salary configurator and employee's offer view to simplify car options.
This update makes notifications across several Odoo apps non-sticky, so they no longer remain on screen until manually dismissed. It improves day-to-day usability by reducing interruptions and keeping work screens cleaner for users.
Map popovers can now use the same flexible card-style layout system used elsewhere in Odoo, making their content easier to structure and customize. Existing map popovers continue to work for now, while related map view extensions and tests were updated to support the new approach.
Original PR description
*: web_studio,stock_enterprise
This PR if a followup of [1] and introduces the ability to use the card
API to declare map popover. The map archs now expects a
```xml
<popover>
<templates>
</templates>
</popover>
```
node which can declare `popover-header`, `popover-body` and
`popover-footer` templates. Those templates follow the same API as
cards (kanban). Moreover, a `card_id` attribute can be set on the
`popover` node to declare the card view to use as popover body.
Note: the previous API keeps working (temporarily).
This PR also adapts the various JS extensions of the map view.
[1]: https://github.com/odoo/odoo/pull/260098
task-6310630Payslip lines now show an information tooltip explaining how each amount was calculated, helping payroll users answer calculation questions directly in the payslip. Payroll teams can configure explanation text on salary rules, with an initial Belgian payroll example included.
Original PR description
Each salary line is the result of a computation. To help the end user understand how the amounts are derived and lower the number of "how is this computed?" questions, an info icon is now displayed on hover on the backend of the payslip line. This commit introduces the framework to support this: - Adds an `explanation_template` text field on the salary rule to configure the logic. - Safely evaluates the template during the payslip computation. - Introduces an `explanation_tooltip` widget to display the translated result on hover in the UI. - Implements a first test rule as an example in the Belgian payroll. Task Id: 6268188
Helpdesk teams can now create invoices for several solved tickets at once from the action menu. This reduces manual work and speeds up billing for completed support services.
Original PR description
Before this PR : - No available method to create invoices for multiple solved tickets in batch. After this PR: - A 'Create Invoices' action is added in the action menu to invoice multiple tickets in batch. Task id: 4243781
Resolved issues and error corrections
Belgian payroll DMFA reports now only include contribution entries that actually appear on the employee's validated payslips for the quarter. This prevents incorrect contribution codes from being reported, improving payroll declaration accuracy and reducing manual correction work.
Original PR description
Steps to reproduce: Setup an employee, then compute and validate 3 months of payslips to close a calendar quarter, then generate the quarterly DMFA report. Got: Contribution entries generated for codes 255, 256, 809, 810, 831, 856, and 859 even though these lines are not on the employee's payslips. Expected: Only real contributions from the quarter's payslips. Task 6352241
5 changes
Resolved issues and error corrections
The automatic bank reconciliation process now gives failed items one more attempt before removing them from processing. This helps avoid missed reconciliations caused by temporary system issues, improving reliability for accounting operations.
Original PR description
The auto reconcile cron drops the lines whenever they raise an error which is an issue for things like serialization errors. Now the code retries failed lines once before dropping them to make sure it's an issue with the lines. task-6273202
Payroll account setup now uses stable account references instead of account code patterns across many country-specific payroll modules. This makes payroll configuration more reliable for businesses with different chart of accounts structures and reduces setup warnings or failures.
Original PR description
{*} = {ae, au, bd, be, ch, eg, hk, id, in, iq, jo, ke, kw, lt, lu, ma, mx, my, nl, om, ph, pk, ro, sa, sk, tr, us} Following the core architecture change to standard payroll account configuration,…
{*} = {ae, au, bd, be, ch, eg, hk, id, in, iq, jo, ke, kw, lt, lu, ma, mx, my, nl, om, ph, pk, ro, sa, sk, tr, us}
Following the core architecture change to standard payroll account configuration, this refactors the account setup scripts across multiple localizations to migrate entirely away from raw account codes.
Previously, the payroll engine matched accounts dynamically via SQL 'LIKE' prefix matching on hardcoded strings (such as '6110'). This logic was structurally fragile: standard chart of accounts (CoA) codes can vary between businesses, are completely optional in certain jurisdictions (like the US), and frequently shift prefix lengths or masking structures between different localization templates.
By switching the logic to leverage distinct XML IDs via the new 'account_refs' parameter, the system now binds salary rules to explicit, unchanging database templates. This guarantees a safe 1:1 relationship, eliminates edge-case log warnings regarding missing accounts during template loading, and ensures configuration scripts run successfully across disparate localization structures.
All occurrences of the obsolete 'account_codes' parameter have consequently been dropped from these modules.
task-6043990Original PR description
This commit is a followup of [1] which revamped the popover API in gantt archs. The introduced API had a flaw though: one couldn't distinguish, in the arch, fields that were there because they were…
This commit is a followup of [1] which revamped the popover API in gantt archs. The introduced API had a flaw though: one couldn't distinguish, in the arch, fields that were there because they were used in the template, or because they were necessary for another reason. This impacts the how and when they are fetched: popover fields are fetched when we open the popover, for that record only. The other fields are fetched when opening the view, for all records matching the domain. The current API is a bit messy. We thus introduce a new `popover` node which allows to wrap fields used in the popover. It also offers the perfect spot to indicate the `card_id` to use as popover-body, instead of the root node. This implies another small change: that card isn't inlined in the arch anymore (which makes the resulting arch less messy), but is fetched the first time we open a popover. This API change follows what is done for the calendar [2] and map [3] views. [1] https://github.com/odoo/enterprise/pull/114328 [2] https://github.com/odoo/odoo/pull/272713 [3] https://github.com/odoo/enterprise/pull/122040 Task~6358615
This fix prevents Obox camera checks from breaking when the IoT module is installed. It also avoids showing an IoT action when no IoT device is configured, reducing confusion for users during quality checks.
Original PR description
Steps to reproduce: - Install `obox_quality_control` but do not install `iot`. - Configure a quality check to take a picture with an Obox camera. - Validate a receipt an confirm the camera works as expected. - Now install the `iot` module, and try to take a picture again. Expected behaviour: The camera still works as expected. Actual behaviour: There is a 'Camera not found' error. This issue is caused by both the Obox and IoT quality modules adding an `identifier` field to the quality control wizard. The fix is simply to use a different name for the Obox field. In addition, we now hide the IoT button in the wizard if the IoT device is not set. task-6329066
This fix ensures Saudi GOSI payroll contributions are calculated without unintended proration. It helps keep payroll amounts accurate for affected employees and reduces the risk of payroll accounting discrepancies.
Original PR description
task-id: 6380239
Regular employees can now open the Attendance Gantt view even when coworkers with fully flexible schedules have approved time off. This prevents an access error and keeps attendance planning visible without exposing restricted time-off records.
Original PR description
When a regular employee accesses the Attendance Gantt view, they encounter an AccessError if there are other employees with flexible schedules who have taken time off. ### **Steps to reproduce:** -…
When a regular employee accesses the Attendance Gantt view, they encounter an AccessError if there are other employees with flexible schedules who have taken time off. ### **Steps to reproduce:** - Install hr_holidays, hr_attendance with demo. - Create a time off and validate for an employee, and set the employee's contract to fully flexible - As demo user, go to the attendance app. ### **Error:** ``` odoo.exceptions.AccessError: Sorry, Marc Demo doesn't have 'read' access to: - Time Off (hr.leave) ``` ### **Root cause:** since [this commit](https://github.com/odoo/enterprise/pull/112482/changes/b326263d67dc0654a7d4b6d77dc4ad8de53bc1c1), `handle_flexible_leave_interval` accesses fields on `leave.holiday_id` at [1] to determine the bounds of flexible leave intervals. when the unavailability computation is performed by a regular employee, they may not have access to the corresponding `leave` record leading to access error. [1]- https://github.com/odoo/enterprise/blob/7a34c9a6a58df22fbef143d820a29106249e3af5/hr_holidays_gantt/models/resource_calendar.py#L17-L24 ### **Fix:** This commit allows regular employees to compute unavailability intervals for flexible employees. **opw-6243778**
This fix prevents VoIP call recordings made from Apple mobile devices from being saved as silent audio files. It improves reliability for users who rely on recorded phone calls for follow-up, compliance, or customer service review.
Original PR description
Before this commit, recording a VoIP phone call from an Apple mobile device generated a silent audio file. This issue happened because the configured 8000 `audioBitsPerSecond` value was too low. Apple mobile browsers strictly respect this value, while other browsers ignore it and default to a higher bitrate to 128000. Increasing `audioBitsPerSecond` to 32000 on WebKit browsers fixes the issue on Apple mobile devices. How to reproduce: - Set up a DIDWW user. - Enable call recording. - Make a call. - Open the call and play the recording. opw-6046534
This update adds the latest official Luxembourg salary index values for May 2025 and June 2026. It ensures employee contracts and related payroll calculations use the correct index instead of an outdated 2023 value, improving accuracy for Luxembourg payroll processing.
Original PR description
## Issue When creating or browsing an existing contract in a Luxembourgish company, the current index shown is the one from September 2023 (which was up-to-date until Mai 2025). If the contract is…
## Issue
When creating or browsing an existing contract in a Luxembourgish company, the current index shown is the one from September 2023 (which was up-to-date until Mai 2025). If the contract is created after Mai 2025, the "Index on Contract Signature" field is also wrong.
## Steps to reproduce
1. Install *Luxembourg - Payroll* (`l10n_lu_hr_payroll`)
2. Using a Luxembourgish company, create a new contract for an employee
- *Contract Start Date*: Any date after 05/01/2025 (Mai 1st 2025)
3. __The *Index on Contract Signature* shows `944.43`, which is the index from September 2023. It does not match with the most recent indices.__
## Cause
The two most recent indices are missing from the [`rule_parameter_lu_index`](https://github.com/odoo/enterprise/blob/885edbc270a86ab76e0a6eff4acb5767c0fe29d1/l10n_lu_hr_payroll/data/rule_parameters/general_rules_data.xml#L4-L58). These indices are:
- `968.04` from 2025-05-01 (Mai 1st 2025)
- `992.24` from 2026-06-01 (June 1st 2026)
These values were taken from [here](https://salary.lu/en/tools/social-parameters/indexation-of-salaries) and double-checked [here](https://lustat.statec.lu/?lc=en&tm=DF_C1201&pg=0&snb=1).
## Tests modification
Updating the latest index had an impact on the tests from the `l10n_lu_hr_payroll_account` (testing the salary rules). In fact, the current index (`l10n_lu_current_index`) is [used to compute the indexed wage](https://github.com/odoo/enterprise/blob/7892d035ddb968d67a3e8da0daf91292bd8fb499/l10n_lu_hr_payroll/models/hr_contract.py#L24-L33) (`l10n_lu_indexed_wage`), which is then used to compute most lines in the payslip (e.g., the `WAGE_SUPPLEMENT_70`).
https://github.com/odoo/enterprise/blob/7892d035ddb968d67a3e8da0daf91292bd8fb499/l10n_lu_hr_payroll/data/salary_rules/hr_salary_rule_data.xml#L70-L74
Since the latest index is not the same as when those tests were written, the values are not correct anymore. To prevent this, time was frozen to 01/01/2024 to use the expected index (944.43, from September 2023).
opw-6330790
Forward-Port-Of: odoo/enterprise#122147