Daily updates from Odoo
Monday, July 20, 2026
19 changes · master
Enhancements to existing features
This update aligns the naming used for a Mexican electronic invoicing method in the website sales flow. It helps keep the checkout and invoicing experience consistent with related Odoo changes, with minimal visible impact for users.
Original PR description
see community for reference: https://github.com/odoo/odoo/pull/276851
Obox can now send service failure messages to the Odoo database, where they are stored as logs. This helps users in debug mode and support teams see when an Obox service has failed, making diagnosis easier.
Original PR description
This PR adds a controller which allows the obox to contact the db to send a message. The db then creates an `obox.log` record which is visible in debug mode to the user. This is currently used to notify the databse when a service fails on the obox Obox PR: https://github.com/odoo/obox/pull/192
Updated accounting-related test cases to reflect the current way invoice and bill due dates are calculated. This helps keep automated quality checks reliable by expecting due dates to follow invoice dates and payment terms instead of defaulting to today.
Original PR description
Before this commit: Several tests still relied on the previous behavior where the Due Date was automatically set to Today's Date by default. Since the due date computation was updated, these assumptions caused the tests to fail. With this change: Updated the affected test cases to match the new due date computation. Tests now expect the Due Date to be computed based on the Invoice/Bill Date and selected Payment Terms. Where no Payment Terms are configured, tests now expect the Due Date to match the Invoice/Bill Date. task-6309674 Related - [odoo/community](https://github.com/odoo/odoo/pull/271831/)
WhatsApp conversation threads now display their associated avatar in the discussion view. This makes it easier for users to recognize and distinguish WhatsApp channels at a glance.
Original PR description
Purpose of this commit: Show thread avatar for channel type whatsapp Before <img width="462" height="134" alt="image" src="https://github.com/user-attachments/assets/72bc9bab-877d-4a42-aa3e-a7cfb12c6065" /> After <img width="624" height="107" alt="image" src="https://github.com/user-attachments/assets/ba6fe94a-7751-42e9-a1cc-4976c3d5eaa5" /> task-6398499
The French balance sheet report now places establishment costs before fixed assets and includes additional impairment accounts for tangible fixed assets. This improves the accuracy and presentation of French financial statements for reporting users.
Original PR description
Move establishment costs before fixed assets in the French balance sheet, and include the missing 2912, 2913, 2914, and 2915 impairment accounts in the relevant tangible fixed asset amortization/provision lines. task-6226138 Forward-Port-Of: odoo/enterprise#124562 Forward-Port-Of: odoo/enterprise#117689
Resolved issues and error corrections
This fixes an error that could occur when opening a planning calendar popover in Field Service. The calendar now includes the needed user information so users can view planning details without hitting an unexpected crash.
Original PR description
add the user_ids field to the calendar view because its needed in a popover task: 6358644 Forward-Port-Of: odoo/enterprise#122684
Polish currency rate imports now avoid applying an extra one-day date shift. This prevents rates from being dated too far back now that the system already uses the previous day's rate as required.
Original PR description
In Poland, it is mandatory to use the previous day's currency rate. We used to achieve this by shifting the rate's date by one day. Since https://github.com/odoo/odoo/pull/231948, we already use the previous day's rate, so the shift is no longer needed. See: https://www.odoo.com/mail/message/1118975071 Forward-Port-Of: odoo/enterprise#123849
The Sendcloud delivery test suite was corrected so it runs in regular CI instead of only nightly checks. This helps catch delivery integration issues earlier, including corrected expectations for multi-package weight handling.
Original PR description
Test class was tagged as external although calls are mocked. This means errors were only caught in nightly and not by CI. Removing the tag requires fixing some of the tests. For `test_multicollo`, we send the average weight of packages instead of the total since 97f82442c9fee7dcb3e8c5e9bacddcd6bb864e11. Forward-Port-Of: odoo/enterprise#121665 Forward-Port-Of: odoo/enterprise#111660
VoIP call screens now hide related record shortcuts when a call is not linked to a customer or contact, preventing errors from unexpected clicks. Subscription shortcuts are also shown consistently with the customer page behavior.
Original PR description
Same as in [1], we don't show smart buttons when no partner to prevent unexpected errors. Also remove `invisible="subscription_count == 0"` to make it same as smart button on res.partner. [1]: 0fbb730e02de22b196a45455f801e96321a75167 Forward-Port-Of: odoo/enterprise#124925 Forward-Port-Of: odoo/enterprise#124579
Fixed an issue where using the Off-Cycle filter in the payslips list could trigger an error in debug mode. The payroll screen now handles payslips without a pay run correctly, improving reliability for payroll users.
Original PR description
Before this commit, when the user is in debug mode, goes to payslips list view and applies `Off-Cycle` filter, a traceback is occured saying `Invalid props for component 'PayslipActionHelper': 'payrunId' is not a number`.
The reason is because we search the id of the payrun by parsing the domain applied to fetch payslips displayed inside the list view but `Off-Cycle` filter will apply the following domain: `[('payslip_run_id', '=', False)]` and so False is given to PayslipActionHelper but it is not a number.
This commit makes sure to set undefined to payrunId prop of PayslipActionHelper when `payrun_id` found is falsy.
runbot-error-241053
Forward-Port-Of: odoo/enterprise#124897
Forward-Port-Of: odoo/enterprise#124854AI-generated answers with web citations now preserve their original line breaks and spacing. This prevents lists and paragraphs from being accidentally merged, making cited responses easier to read and understand.
Original PR description
AI responses containing web citations lost their original formatting when a citation appeared at the end of a line, causing lists and paragraphs to be merged together. This commit limits the citation parser to ignore only horizontal whitespace around citations, preserving line breaks in the rendered response. task-6391187 Forward-Port-Of: odoo/enterprise#124457
The timesheet grid now uses updated colors for attendance/work rule types. This makes it easier for users to quickly recognize different event types at a glance.
Original PR description
This commit updates the color of AW rule types to help the user to quickly recognize the type of events based on the color. task-6186073 Forward-Port-Of: odoo/enterprise#124838
Code cleanup and technical improvements
The Point of Sale code was updated as part of Odoo's OWL 3 migration, replacing older internal reference patterns with the newer approach. This is an internal modernization that helps keep PoS screens and related localizations maintainable without changing day-to-day user workflows.
Original PR description
pos*: pos_enterprise, l10n_at_pos, l10n_ke_edi_oscu_pos As part of the OWL 3 migration, this commit replaces `useRef` and `t-custom-ref` usages with `t-ref` and signal-based references across the PoS codebase. Task-6343663 Related Community PR: https://github.com/odoo/odoo/pull/272698
The grid view editing logic was updated to use newer platform APIs, replacing deprecated internals. This keeps spreadsheet-like grid inputs working reliably while reducing future maintenance risk as the web framework evolves.
Original PR description
Replaced two `useLayoutEffect` calls in `useInputHook` with OWL3 native APIs (`useListener`, `onMounted`, `onPatched`), since `useLayoutEffect` is deprecated in OWL3. The caller `GridCell` was…
Replaced two `useLayoutEffect` calls in `useInputHook` with OWL3 native APIs (`useListener`, `onMounted`, `onPatched`), since `useLayoutEffect` is deprecated in OWL3. The caller `GridCell` was updated to use `signal.ref()` instead of the compat `useRef`. The first effect attached `input`/`change`/`keydown` listeners to `inputRef.el` — a textbook `useListener` case. However, the compat `useRef` from `@web/owl2/utils` silently untracks the underlying signal on `.el` access, so `useListener(() => inputRef.el, ...)` never re-ran after mount and no listeners were attached. The fix passes the signal ref directly (`useListener(inputRef, ...)`) and upgrades the caller to use `signal.ref()` passed explicitly to the hook. The second effect (bare `useLayoutEffect` re-syncing the DOM value on every render) maps directly to `onMounted` + `onPatched`. The `useLayoutEffect` refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - `@web_grid/grid_view/grid_view_desktop/editing a value` - `@web_grid/grid_view/grid_view_desktop/Edition navigate with tab/shift+tab and enter key` - `@web_grid/grid_cells/float_time_grid_cell/FloatTimeGridCell in grid view` see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624595/build/116553684
This change modernizes how scrolling behavior is connected in the Gantt and grid views. It should help keep these views aligned with the latest web framework patterns without changing the visible user experience.
Original PR description
The web `virtual_grid_hook` now attaches its scroll listener via `useListener` on a signal ref instead of `useLayoutEffect` on a compat `useRef`. This PR feeds it a signal ref from both enterprise callers:
- **web_gantt**: `scrollRef` becomes a `signal.ref` bound with `t-ref`; its own scroll `useLayoutEffect` becomes a `useListener` and all `.el` reads become calls. Layout's `contentRef` (now a signal, per the community PR) is adapted to an `{ el }` object ref for the draggable hooks (`useGanttDraggable`/`useGanttSchedulable`), which require an object ref.
- **web_grid**: `contentRef` prop type is now a function (signal) ref.This change keeps Enterprise list views in Web Studio and Data Cleaning compatible with an underlying platform update. It is an internal refactor with no expected change to day-to-day user workflows, helping prevent display or interaction issues after the core update.
Original PR description
That PR migrates the base `web.ListRenderer` `table` ref from the OWL2 compat `useRef`/`t-custom-ref='table'` to a native OWL3 `signal(null)` bound with `t-ref="this.tableRef"`. This PR updates the enterprise modules that still consume the old compat surface: - **web_studio** `ListEditorRenderer`: retargeted both xpath inheritors `//*[@t-custom-ref='table']` → `//*[@t-ref='this.tableRef']`, and `onTableHover` reads `this.tableRef()` instead of `this.tableRef.el`. - **data_cleaning** `DataMergeListRenderer.onGroupRowMouseEnter`: reads `this.tableRef()` instead of `this.tableRef.el`. Companion PR to odoo/odoo#272009.
Spreadsheet autofill for list and pivot data has been reorganized to align with the underlying spreadsheet engine. This is an internal cleanup that should preserve existing behavior while making the feature easier to maintain and slightly more efficient.
Original PR description
### [MOV] spreadsheet_edition: move list/pivot autofill plugins to helpers The list/pivot plugins were transformed into helpers in the last commit, this commit renames the files. ### [REF] spreadsheet_edition: make autofill plugin into a store The o-spreadsheet commit transformed the autofill plugin into a store. This made the necessary adaptations in odoo. Moslty, the list/pivot autofill plugin were changed into helpers that can be called from the autofill process (they had no state nor command handling). Also changed a bit the autofill helpers so we don't re-compile the cell formula when we already have a compiled formula. Task: [6395361](https://www.odoo.com/web#id=6395361&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form)
This update modernizes part of the grid view code to stay compatible with the next version of Odoo's interface framework. It preserves the expected keyboard navigation behavior, including correctly focusing the toggle button when users enter edit mode.
Original PR description
Replaced `useLayoutEffect` with `signal.ref` + `useEffect` because `useLayoutEffect` is deprecated in OWL3. The commented-out effect focused the toggle button when its DOM element became available, using an explicit dep array `[this.buttonRef.el]`. That dep only worked because the compat `useRef().el` getter untracks its underlying signal. Converting `buttonRef` to a real `signal.ref(HTMLButtonElement)` makes `useEffect` auto-subscribe to the ref signal: when edit mode is entered (button rendered under `t-if`) the ref updates, the effect re-runs, and the button is focused — no explicit dep array needed. The useLayoutEffect refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - `@web_grid/grid_cells/float_toggle_grid_cell/FloatToggleGridCell: keyboard navigation` see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624596/build/116553766
The accounting reports code was updated to use the newer supported framework approach, reducing the risk of issues when Odoo moves to OWL3. A new automated test was added to confirm report filters continue to update correctly when switching reports.
Original PR description
Replaced `useLayoutEffect` with `useEffect` from `@odoo/owl` because `useLayoutEffect` is deprecated in OWL3. `useEffect` auto-tracks reactive reads inside the callback, so reading `this.controller.cachedFilterOptions?.report_id` directly in the effect body is sufficient to re-run when the report changes — no explicit dependency array is needed. When commenting out the useLayoutEffect there was no error, the code we refactored had NO TEST coverage. A test was written to ensure our fix was correct, and it was tested against the previous useLayoutEffect: - Passed with previous useLayoutEffect. - Failed with previous useLayoutEffect commented. - Passed with our OWL3 replacement.