Daily updates from Odoo
Tuesday, August 18, 2026
18 changes · master
New functionality added to Odoo
The Chinese reports module now includes the required VAT return type configuration. This helps businesses using Odoo in China prepare VAT returns with the correct report setup available in the system.
Original PR description
Declare the account.return.type for the Chinese VAT return. task-6012279
Enhancements to existing features
The Dutch reporting module now uses the shared Dutch SBR tax identifier stored on partner records instead of its older company-specific field. This reduces duplicate data entry and keeps Dutch tax reporting aligned with the standard identifier setup.
Original PR description
After adding l10n_nl_sbr_ob_nummer to partner identifiers l10n_nl_reports_sbr_ob_nummer needs to be deleted. - Replacing l10n_nl_reports_sbr_ob_nummer with l10n_nl_sbr_ob_nummer - Removing res company view task: [6349626](https://www.odoo.com/odoo/project/967/tasks/6349626)
Accrual-related settings in accounting reports have been moved to the newer plugin-based approach. This keeps the reporting feature aligned with the platform’s current architecture and helps reduce future maintenance risk without changing the user workflow.
Original PR description
In account reports, accrual context is defined in the env but the env is deprecated. The correct way to do it now is to define a plugin.
Date fields in the Marketing Automation dashboard are now aligned to the left, making them easier to read and consistent with the intended layout. This is a small visual improvement that helps users interpret dashboard information more clearly.
Original PR description
…e fields This commit adapts the alignment of the date fields in the marketing automation dashboard to ensure they are displayed correctly (aligned to left). Task: 6474652
The spreadsheet action button has been renamed from "Insert in spreadsheet" to "Spreadsheet". This makes the interface clearer and more concise for users working with spreadsheet-related views.
Original PR description
This commit renames the old `Insert in spreadsheet` button to `Spreadsheet` to keep it simple. Task: 6477436
Belgian payroll users can now see the monthly taxable benefit amount directly in the tooltip for internet, mobile, laptop, and tablet benefits. This makes it easier to understand what will appear on the payslip without checking payroll rule parameters separately, while keeping amounts aligned with indexed values.
Original PR description
[IMP] l10n_be_hr_payroll: display the BIK amount in the field tooltips
The internet, mobile, mobile_amount, laptop and tablet fields hold what
the subscription or the device actually costs the employer, and feed the
employer cost computation.
What the employee is taxed on is a different, flat monthly amount coming
from the bik_* rule parameters. Nothing in the interface showed it, so
the only way to know what would land on the payslip was to go and open
the rule parameter itself.
That amount is now appended to the tooltip of each of those fields:
The employee's internet subscription will be paid up to this amount.
Benefit in kind: 5.00 € / month.
It is resolved in fields_get instead of being written into the field
definitions, so it keeps following the indexation of the rule parameters.
task-6447748Resolved issues and error corrections
The timesheet assistant display now keeps durations readable, adds clearer spacing, and prevents long titles from overlapping with time information. This makes timesheet entries easier to scan and reduces visual confusion for users.
Original PR description
- enforce duration in one line - add a gap between the title and duration - wrap title if so long - adapt flex direction of chronological view to avoid overlapping of title and start time --- task-6432434 Forward-Port-Of: odoo/enterprise#128037 Forward-Port-Of: odoo/enterprise#126236
The Belgian payroll accounting test demo data now defines employee working schedules correctly. This helps keep payroll-related tests and sample scenarios reliable, reducing confusion from incorrect demo setup.
Original PR description
The way calendar attendances were defined for the working schedules demo data was incorrect. task-6466997
The accounting reports comparison dropdown now keeps a consistent width when users hover over the “Percentage of” selector. This prevents a small visual jump, making the reporting interface feel smoother and more polished.
Original PR description
In the comparison dropdown, the "Percentage of" RecordSelector shows its caret only on hover. Since the caret was not accounted for before hover, the selector slightly resized when the caret appeared. Reserve a small, fixed slot for the caret and toggle its visibility so the dropdown keeps a stable width. task-6268556
Users can now select multiple bank journal lines in the kanban view without triggering an error. This restores a smoother bank reconciliation workflow for teams handling multiple statement lines at once.
Original PR description
Fix a bug where an error is raised when the user tries to multi-select lines (with alt) in the kanban view of bank journals. The view for BankRecStatementLine class was using an other object than rootRef defined in the KanbanRecord class as a t-ref. This made every call to rootRef crash in the parent class. This commit fixes it by using the parent rootRef in the BankRecStatementLine class. task-6462758
This update adds a missing dependency so barcode batch quality control loads the related batch picking components reliably. It prevents test and module loading failures without changing day-to-day user workflows.
Original PR description
Before this commit, this bridge patches the barcode picking batch model of stock_barcode_picking_batch while not depending on it. This goes unnoticed in the backend, where every installed module lands in the same bundle, but a Hoot test file only loads the modules of the dependency closure of its addon, so the first test suite added here dies on "error while registering suite". This commit adds the missing dependency. stock_barcode_picking_batch is auto installed on top of stock_barcode and stock_picking_batch, both already required here, so it comes along with this module anyway.
The payroll attendance module now explicitly includes a related attendance planning component it already relies on. This prevents automated tests from failing when they load only the module's declared dependencies, improving reliability without changing day-to-day user behavior.
Original PR description
Before this commit, hr_payroll_attendance patches the gantt view of hr_attendance_gantt while not depending on it. This goes unnoticed in the backend, where every installed module lands in the same bundle, but a Hoot test file only loads the modules of the dependency closure of its addon, so the first test suite added here dies on "error while registering suite". This commit adds the missing dependency. hr_attendance_gantt is auto installed on top of hr_attendance and hr_gantt, both already required here, so it comes along with this module anyway.
The Time Type form now hides the Validity label for companies outside Hong Kong when the related field is not shown. This prevents misaligned fields and makes the payroll configuration screen clearer for users in non-HK companies.
Original PR description
Steps to reproduce: 1. Go to Payroll > Configuration > Time Types. 2. Open a Time Type form for a non-HK company (e.g. Belgium). 3. The "Validity" label appears without its field, misaligning "Selectable in Time Off". Reason: The "Validity" label had no visibility condition. Solution: Hide the "Validity" label when the company is non-HK. Task-6448696
This update adds a missing dependency needed by the Time Off Gantt module so its related test suites load correctly. It prevents registration failures during automated testing without changing day-to-day user functionality.
Original PR description
Before this commit, every Hoot suite of hr_holidays_gantt, hr_payroll and planning_holidays dies while being registered:
HootError: error while registering suite "avatar_card" (in parent
suite "@hr_holidays_gantt")
This happens because the gantt cog menu imports @base_import/import_records/import_records while the module does not depend on base_import. A test file only loads the modules of the dependency closure of its addon, so the import resolves to undefined and the file throws as soon as it is loaded.
This commit adds the missing dependency. base_import is auto installed and depends only on web, so it is already there in every database.This fixes a display issue in Referrals where the x icon was missing from job positions when sharing jobs. The change helps users clearly see and use the expected close or remove action in that workflow.
Original PR description
Since https://github.com/odoo/enterprise/pull/112607, the x icon is not displayed on job positions. Steps to reproduce: - Referrals - View Jobs - Share Expected behavior: The x icon should be displayed on job positions. <img width="213" height="188" alt="image" src="https://github.com/user-attachments/assets/14d1e75b-f419-4315-93b3-ef0642351079" /> Current Behavior: The x icon is not displayed on job positions. <img width="558" height="374" alt="image" src="https://github.com/user-attachments/assets/52bffb8b-b7ba-43df-8a44-c507966d5073" /> task-6469820
The Timesheet Assistant now combines selected suggestions that come from the same rule template into one clearer description. This avoids repetitive text separated by semicolons, making generated timesheet entries easier to read and edit.
Original PR description
In this task, we improved the Timesheet Assistant by merging descriptions generated from the same rule templates. When multiple suggestions are selected that use the same rule template, the assistant now combines them into a single timesheet description instead of joining with ';' Example: Rule template: `Discussing with $1` Before: Discussing with A; Discussing with B After: Discussing with A and B Task-6348575 Forward-Port-Of: odoo/enterprise#127358 Forward-Port-Of: odoo/enterprise#126157
Code cleanup and technical improvements
The Point of Sale enterprise code was updated to use the newer supported framework behavior, replacing a deprecated internal mechanism. This keeps the module aligned with the latest platform standards and reduces future maintenance risk without introducing intended user-facing changes.
Original PR description
Replaced `useLayoutEffect` in `useDelayedValueChange` with native OWL3 `useEffect` because `useLayoutEffect` is deprecated in OWL3. The hook has no DOM/ref access — it arms a `setTimeout` to snapshot a reactive value after a delay. This is a pure side-effect-on-dep-change, making native `useEffect` the correct fit. A `void getCurrentValue()` call at the top of the effect restores the tracking the old dependency array provided, ensuring the timer resets whenever the tracked value changes. When commenting out the useLayoutEffect there was no error, the code we refactored had NO TEST coverage. The only build failure when commented was a lint error (unused-var from the comment pattern) — no functional tests failed. see runbot build with useLayoutEffect commented out: https://runbot.odoo.com/runbot/batch/2622063/build/116410184
This change updates several Enterprise screens to use newer internal lifecycle hooks while keeping the same visible behavior. It reduces reliance on compatibility code, making future maintenance easier without changing how users interact with reports, data cleaning, marketing automation, planning, navigation, or maps.
Original PR description
Enterprise half of odoo/odoo#282760 — same mechanical change, same reasoning. 7 call-sites called the owl2-compat `useLayoutEffect` **with no dependency array**, which makes it an alias for "run on…
Enterprise half of odoo/odoo#282760 — same mechanical change, same reasoning. 7 call-sites called the owl2-compat `useLayoutEffect` **with no dependency array**, which makes it an alias for "run on mount, re-run on every patch". They are translated to `onMounted` + `onPatched`. | site | effect | | --- | --- | | `account_reports/account_return_check_kanban_controller.js` | restore the renderer scroll position | | `data_cleaning/data_cleaning_list_view.js` | toggle control-panel buttons from the selection | | `data_cleaning/data_merge_list_view.js` | idem | | `marketing_automation/marketing_automation_one2many.js` | `applyTabPanelVisibility()` | | `planning/planning_gantt_renderer.js` | add `o_planning_gantt` on the grid | | `web_enterprise/navbar.js` | `_updateMenuAppsIcon()` | | `web_map/map_renderer.js` | `updateMap()` + deferred marker popover | ### Why this is behaviour-preserving Called without a dependency array, the compat `useLayoutEffect` defaults `computeDependencies` to `() => [NaN]`. `NaN !== NaN`, so the diff in its `onPatched` always succeeds and the effect already re-ran on **every** patch. `onMounted` + `onPatched` is therefore an exact translation. Two incidental parts of the shim fall away, both no-ops here: `onWillRender(() => computeDependencies())` reads nothing when there is no dependency array, and `onWillUnmount(() => cleanup && cleanup())` never fires because none of these 7 effects return a cleanup function. Note this argument is specific to the no-dependency-array sites and does *not* generalise to `useLayoutEffect` calls that pass real dependencies. ### One judgement call `account_return_check_kanban_controller` keeps `onPatched`. Its `rendererScrollPositions = null` latch reads like a run-once guard, but it sits inside `if (renderer)`: when the scroll container is not in the DOM yet at mount, the latch stays set and a later patch retries the restore. Keeping both hooks preserves that. ### Conflicts with `web_map/map_renderer.js` is also touched by odoo/enterprise#127921, which converts the *empty*-dependency-array site (`() => []`) in the same `setup()` and deliberately leaves this one alone. The two changes are disjoint but adjacent, so whichever lands second needs a trivial rebase — and once both are in, `useLayoutEffect` is no longer used in that file and its import should go. ### Not in this PR - The no-dependency-array sites whose effect **does** return a cleanup function need the full `onMounted`/`onPatched`/`onWillUnmount` triple and are handled separately (`sale_commission` by the `useChart` hook in odoo/enterprise#128100). - `spreadsheet_edition` is owned by another team and is left alone. - `web_gantt/static/tests/gantt_view_other.test.js` has one more, kept out of a production-code PR. ### Testing Static only: every remaining `useLayoutEffect` call in the tree was re-parsed with balanced-paren argument splitting to confirm no no-dependency-array site is left outside the exclusions above, and every touched file was checked for a missing or newly-unused `useLayoutEffect`/`onMounted`/`onPatched` import. No behaviour change is intended, so no test was added or updated. Part of the `useLayoutEffect` -> OWL3 migration.