Daily updates from Odoo
Tuesday, July 14, 2026
26 changes · master
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
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-6043990Belgian 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.
Original 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
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
This update adds support for temporary economic unemployment leave handling for Belgian worker employees. It helps payroll teams apply the correct leave codes for workers versus other employee types, improving payroll compliance and reducing manual correction risks.
Original PR description
[IMP] l10n_be: economic unemployement for workers
adding new work entry type Temporary economic unemployment for employee
. add a constraint to hr.leave that if employee is worker then he should use LEAVE6665 else LEAVE13720
task - 6358912Payroll users can now access Import and Export options directly from the time off Gantt view in the pay run time step. This removes the need to switch to list or kanban views when moving time off records in or out of Odoo.
Original PR description
The pay run "time" step shows time off (hr.leave) records in a gantt, list and kanban view. The standard "Import" and "Export" cog menu entries only show up on list/kanban views, so they were missing from the gantt, even though they are available on the very same records in the list. Surface both entries on the hr.leave gantt as well: - the base "Import" and "Export" cog items are reused, scoped to the hr.leave gantt via their isDisplayed; - since gantt controllers do not wire the direct xlsx export (only list and kanban do), install useExportRecords on the gantt controller, backed by a minimal list-like root built from the gantt search params so no state has to be added to the model. task-6348558
HR teams can now set Christmas bonus day counts for each employee version instead of using one company-wide value. This better supports Mexican payroll cases where bonus entitlements differ by agreement, seniority, or bargaining terms, and ensures related payroll calculations use the employee-specific value.
Original PR description
Previously, the Christmas bonus days parameter (l10n_mx_christmas_bonus) was configured at the company settings level, imposing a uniform value across all employees. In Mexico, Christmas bonus entitlements often vary based on individual negotiations, seniority, or collective bargaining agreements. Moving this parameter to the employee version level allows HR managers to specify custom bonus day counts per individual **what:** - Added the l10n_mx_christmas_bonus float field to the employee versioning model with a default value of 15.0. - Updated the XML view to expose the field within the version context of the employee form. - Refactored the calculation logic inside the BASIC (Basic Christmas Bonus) and PROVISIONS_CHRISTMAS_BONUS salary rules to retrieve the bonus days dynamically from the active employee version. - Updated the l10n_mx_integration_factor processing logic to respect the version-specific value. task-6371803
Belgian payroll now recognizes three additional leave types for salary processing, declarations, and payslip workflows. This helps ensure payroll treatment and reporting align with Belgian leave rules, including correct handling of reorganization measures for eligible leave types.
Original PR description
- Add LEAVE14704, LEAVE14708, and LEAVE14713 to the relevant salary structures, DMFA calculations, and payslip workflows. - Map salary categories and DMFA configurations for the new leaves following the existing MEDIC01 baseline. - Configure LEAVE14704 (palliative care) and LEAVE14708 (informal carer) to open reorganization measures, while explicitly excluding LEAVE14713 (time credit not equated) from triggering them. Task: 6361609
VoIP softphone contact lists now show more relevant people first when searching, such as internal colleagues during transfers and recently called contacts in other searches. The update also reduces confusing gaps, scrolling issues, and misleading “more results” counts, making it easier to find the right contact quickly.
Original PR description
Review the order contacts are listed in the softphone, trying to show the most meaningful ones first, and fix a few issues along the way. [FIX] voip: mitigate loading/scrolling softphone bugs The…
Review the order contacts are listed in the softphone, trying to show the most meaningful ones first, and fix a few issues along the way.
[FIX] voip: mitigate loading/scrolling softphone bugs
The VoIP softphone basically loads contact data in two cases: when
browsing/searching for contacts and when scrolling a contact list to
browse more. The way it works is currently performant rpc-wise... but
very wrong: each time a contact is loaded, it ends up in the client
Store and when the user later browses/searches for contacts, that Store
is used before allowing to "browse more" by scrolling.
This leads to many bug variants, like this one:
- Have a "long" (e.g. 50) list of contacts
- Search for the contact name "Z", the last one
- You find maybe 10, likely at the end, then remove the search
=> You now see 13+X contacts, 13 first of the DB alphabetically then X
"Z" loaded previously. It's already a visual bug: you see a lot of
missing contacts between the 13 first and "Z".
- Scroll
=> Contacts appears only once you reach the last "Z" but they might
appear at the very top (e.g. a "B" not yet loaded).
Now another bug:
- Have a "long" list of contacts, including 15 with last name "Smith"
- Open the contacts list (e.g. transfer view), type "Smith"
=> You see 13 Smith, good
- Try to scroll to load the last 2
=> You probably can't... because you already loaded more than 15
contacts just by opening the contact list
... there are many variants of this bug. Basically, with or without
search, you see a list of contacts with "gaps" and you can't expect to
be able to find all contacts (matching a search or not) by scrolling.
The only certainty you have is that if you enter the *exact* name of a
contact, you will find it (if there are no more than 13 with the same
exact full name).
This would require a deeper VoIP changes to fix properly keeping good
perfs, which is not the focus at the moment. This commit however tries
to mitigate the issue when scrolling a list with a new search.
Note that the following commits kinda worsen this mitigated issue, but not by much.
[IMP] voip: show internal users first in transfer view while searching
The softphone displays searched contacts ordered alphabetically. This
commit now also first display internal users of the database, only when
a search is performed, only while searching for a contact to which a
call has to be transferred. Indeed, when transferring, it is likely you
want to transfer to one of your colleague, and after a 2-3 letters
search, it should be enough for your colleague to be nearly alone at the
top, while searching for "James" could lead to 100 "James" regrouping
all the contacts your company is dealing with.
[IMP] voip: show 3 most recently called contacts first when searching
The parent commit introduced transfer search sorting that puts internal
users first, as those are the most likely people you want to transfer a
call to.
With a similar idea in mind, this commit puts the 3 user's most recently
called matching contacts first in the other contact search contexts.
[IMP] voip: review keypad suggestion "more" button label
The keypad fetches 30 contacts once a search is performed. It then
shows only one and shows a "more" button indicating the remaining
amount. In case 30 contacts were fetched (matching the search), it
showed "29 others"... although there might be more unloaded in the
database.
We now show 1, 2, 3, ..., 30 "others" if that is the exact amount in
the database. Otherwise we show the amount we already have loaded client
side, minus 1, with a "+". E.g. if 75 were loaded previously, matching
the search, we show 1 suggestion + "73+ others" as button, knowing there
could be more than 75.
To achieve this, we load 32 contacts at the first search, instead of 30:
1 suggestion + a potential exact "30 others" + 1 to show "30+" if needed
[IMP] voip: improve consistency of softphone interactions
The softphone mostly consists of "tab entries" which can be opened or
scrolled through. This commit makes it tab entries are closed and the
scroll reset consistently.
For example: if you search for a contact, open its entry, call it then
come back later to the contact entry, it will be closed instead of still
opened. The scroll might also have jumped to the contact entry that was
previously opened... now each search properly shows the tab entries from
the start.
task-6326451This update improves the payroll user experience by refining payroll batch handling and Belgian payroll work entry type views. These changes help HR teams work more smoothly and reduce friction in day-to-day payroll administration.
Original PR description
task-id: 6360832
The Payroll employee type screens were adjusted to make them easier to use and more consistent, including related Belgian payroll views. This helps HR and payroll teams manage employee classifications with less friction and clearer navigation.
Original PR description
task-6357922
Obox device forms now include a Test button so users can quickly verify printers, scales, and cameras from the device page. Printer testing now lets users choose the print format, making setup and troubleshooting easier.
Original PR description
This commit adds a Test button to the Obox device form, similar to the IoT device form. It is supported for all three device types (printer, scale, camera). For printers, the user must select which type of test print to perform (PDF, receipt, ZPL). task-6332378