Daily updates from Odoo
Thursday, July 9, 2026
20 changes · master
Enhancements to existing features
Expenses created from company card usage now generate an activity categorized as a document. This makes the follow-up clearer for employees and managers handling expense receipts and supporting paperwork.
Original PR description
Improvement of some UX about expense: - When an expense is created via a card use, the type of the created activity is now 'Document' task-6237021
The VoIP call screen now shows "Calling..." while an outgoing call is still connecting instead of displaying a timer at 00:00. This gives users a clearer indication of the call state and avoids confusion before the call is answered.
Original PR description
task-6361911
The self-ordering point of sale module now relies on the existing point of sale box module for printer box details instead of defining them again. This reduces duplication and helps keep configuration behavior consistent across related point of sale features.
Original PR description
Remove `proxy_obox_id` from `pos.printer` model, in `obox_pos_self_order` and change `obox_pos_self_order` dependency to `obox_point_of_sale` instead of `obox`. The field `proxy_obox_id` is defined in `obox_point_of_sale` module.
This update changes many accounting-related automated tests to run in a more realistic test environment instead of relying on elevated administrator access. This helps ensure future changes are validated under conditions closer to everyday use, reducing the risk of hidden permission-related issues.
Resolved issues and error corrections
IoT device logs sent to the server are now recorded at a lower severity level. This reduces unnecessary alert noise and helps prevent monitoring tools like Sentry from being overwhelmed, without changing user-facing IoT behavior.
Original PR description
Each time IoT box sends its logs to the server (route `/iot/log`), we then print them with the same log level. However, IoT box logs can be quite noisy (for instance when there are some connection issues), which affects the logs. Sentry side, it also implies a huge wave of useless events that reach the limits of our subscription. The logs management have been improved on next versions. In the meantime, we should at least decrease the logger level so we can keep working on Sentry Forward-Port-Of: odoo/enterprise#122426
The Avalara tax configuration screen now points users to the current documentation page. This prevents users from landing on an outdated help article when looking for setup guidance.
Original PR description
Documentation URL changed from `finance/accounting/taxes/avatax/avalara_included` to `finance/accounting/taxes/avalara`. task-6371352
The Journal Audit report PDF now avoids adding an empty final page when the global tax summary is not included. This improves report presentation and prevents users from receiving or sharing documents with unnecessary blank pages.
Original PR description
Steps to reproduce: 1. Set the active company as My Company (san francisco) 2. Navigate to Accounting > Review > Journal Audit 3. Remove all journals from the report except Bank and Misc. 4. Use the PDF action button to print the report. 5. The last page of the report is completely empty. https://drive.google.com/file/d/1otpniJgt1UNCe2hrUBwqIK58dGuXpu8T/view?usp=sharing This commit ensures that the Journal Audit report does not have blank pages when the global tax summary section is not present. It uses some features of QWeb outlined in the following docs article: https://www.odoo.com/documentation/19.0/developer/reference/frontend/qweb.html#loops opw-6224670 Forward-Port-Of: odoo/enterprise#122704 Forward-Port-Of: odoo/enterprise#121068
Twitter/X posts now save the reply count provided by the platform's API. This lets users see comment activity alongside other engagement metrics, giving a more complete view of post performance.
Original PR description
Twitter/X tweet metrics returned by the API include the number of replies in the `public_metrics.reply_count` field. This commit stores that value on social stream posts so the comments count can be displayed alongside other engagement metrics. API Documentation: https://docs.x.com/x-api/fundamentals/metrics#post-metrics Task-6251172 Forward-Port-Of: odoo/enterprise#120182
This fixes an issue in Planning tests where the schedule could open on the wrong week when run on Sundays. The change makes the split shift flow more reliable by avoiding a layout problem caused by the side panel, reducing false failures and improving confidence in planning updates.
Original PR description
Forward-Port-Of: odoo/enterprise#123069
Bank statement imports now show a specific error when a file contains only zero-amount transactions. This helps users understand the real issue instead of seeing a misleading duplicate-import message.
Original PR description
When importing bank statements, files containing only zero-amount transactions trigger the same generic "duplicate" UserError as files that have already been imported. We now explicitly check for zero-amount lines separately to raise a distinct UserError. opw-6237659
Users can now dismiss the installer and web watcher warning banners in the Timesheets Assistant without seeing an error. This keeps the assistant interface clean and avoids confusion from banners that previously stayed visible after closing them.
Original PR description
Issue: - Closing the installer banner or the web watcher warning banner in the Timesheets Assistant raises an Owl error and leaves the banner visible. Cause: - Both buttons bind their handler with a bare method name, e.g. `t-on-click="onDismissConnectionWarning"`. Bare identifiers are resolved against the template rendering context, which no longer exposes component methods. Fix: - Reference the handlers through `this`. task-6373382 Forward-Port-Of: odoo/enterprise#123527
This update corrects how accounting reports are extended and moves Luxembourg-specific export logic into the appropriate wizard. The change reduces maintenance risk and helps keep localization behavior isolated without changing day-to-day business workflows.
Original PR description
[FIX] account_reports: fix inheritance account.report is a Model, not an AbstractModel. Inheriting it as an AbstractModel had not effect so far, but this is the proper way. ---------------------------------- [FIX] l10n_lu_reports: no l10n-specific code on account.report Unless absolutely necessary, localizations should never inherit account.report and define all the custom code they need in custom handlers. In this case, this code was only used for an export through a wizard, so we moved it to that wizard.
Several automated tests were corrected so they use valid invoice, tax, product, and AI configurations. This helps prevent false test failures and keeps quality checks aligned with real business rules across support, expenses, manufacturing, purchasing, rentals, and localization flows.
Original PR description
https://github.com/odoo/odoo/pull/274672
Code cleanup and technical improvements
The product catalog integration was updated to match recent platform changes and simplify related customizations. This should make catalog behavior more consistent across manufacturing, field service, rentals, and subscriptions while reducing maintenance effort.
Original PR description
Adapt the catalog uses and overrides to the community changes Improve and clean catalog overrides as well. See odoo/odoo#271273
This change updates Odoo Studio's form editor internals to stay compatible with the next version of the web framework. It should not change day-to-day behavior, and existing tests confirm key form editor displays still work as expected.
Original PR description
Replaced 2 `useLayoutEffect` calls with `useEffect` and `onMounted` because `useLayoutEffect` is deprecated in OWL3. Effect #1 reacted to `viewEditorModel.showInvisible` (a reactive proxy field),…
Replaced 2 `useLayoutEffect` calls with `useEffect` and `onMounted` because
`useLayoutEffect` is deprecated in OWL3.
Effect #1 reacted to `viewEditorModel.showInvisible` (a reactive proxy field), using
the root DOM element only as a guard. Migrated to `useEffect`: reading
`this.viewEditorModel.showInvisible` inside the callback auto-subscribes the effect so
it re-runs on every toggle. To make the root element subscribe the effect on mount,
`useRef("compiled_view_root")` (owl2-compat, untracks the underlying ref signal) was
replaced with `this.rootRef = signal.ref()`, and `form_editor_compiler.js` was updated
to bind the compiled root's `t-ref` to `__comp__.rootRef` so the signal receives the
DOM element at mount time.
Effect #2's only dependency was `[rootRef.el]`; it ran a single time when the DOM was
ready, so `onMounted` is the faithful equivalent.
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_studio/view_editors/form_editor/correctly display hook in form sheet
- @web_studio/view_editors/form_editor/empty form editor
- @web_studio/view_editors/form_editor/invisible form editor
see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624601/build/116553774This change updates Odoo Studio's internal view-editing components to use the newer supported interface mechanisms. It helps keep Studio compatible with the next framework version while preserving existing editing behavior covered by tests.
Original PR description
Replaced `useLayoutEffect` with `onMounted`/`onPatched` (for the `data-studio-xpath` attribute) and `useListener` (for the click listener) because `useLayoutEffect` is deprecated in OWL3. The…
Replaced `useLayoutEffect` with `onMounted`/`onPatched` (for the `data-studio-xpath` attribute) and `useListener` (for the click listener) because `useLayoutEffect` is deprecated in OWL3. The `useStudioRef` hook previously used `useLayoutEffect` to both set a `data-studio-xpath` attribute on the element and attach a capture-phase click listener. The ref was a string-named compat `useRef`, so its `.el` getter untracks the signal — meaning a reactive `useEffect` would never re-subscribe when the element mounts. For `data-studio-xpath`, `onMounted`/`onPatched` reproduce the "set once el exists, re-apply on element recreation" semantics with synchronous layout timing, which Studio requires because it reads the attribute directly off the DOM. The click listener was initially migrated to `useListener(() => ref(), …)`, but was later converted to `onMounted`/`onPatched`/`onWillUnmount` element-tracking to properly handle the null ref at setup time. As a final step the ref itself was promoted to a native `signal.ref()`, returned by the hook and bound in each consumer template via `t-ref="this.<name>"`. `FieldStudio` reuses the inherited `this.fieldRef` signal (contributed by the companion odoo PR) rather than declaring its own. 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_studio/view_editors/form_editor/restore active notebook tab after adding/removing an element - @web_studio/view_editors/form_editor/label edition - @web_studio/view_editors/form_editor/many2one field edition see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624591/build/116553824 Community PR: https://github.com/odoo/odoo/pull/275094
The mobile integration has been reorganized internally while keeping the existing service available for compatibility. This prepares the mobile framework for newer technology changes without changing the expected user experience, including barcode-related mobile flows.
Original PR description
In this commit, we rewrite the mobile service as a plugin. For legacy purposes, we keep the mobile service (as a service). We also adapt the codebase to reflect the changes on the service.
This update modernizes how certain stored values are initialized across accounting, payroll, appointments, helpdesk, ESG, and localization features. It is mainly an internal improvement that should make module setup and upgrades more consistent without changing day-to-day workflows.
Original PR description
https://github.com/odoo/odoo/pull/256914
This update standardizes how internal record values are prepared before being saved, reducing the risk of inconsistent behavior when several records are updated together. It also adjusts related business apps so they continue to handle grouped updates reliably without changing visible workflows.
Original PR description
``Field.write`` calls ``convert_to_cache`` with ``records``, not with a single ``record``. Therefore, ``convert_to_cache`` must return the same value for all records in the recordset. The only exception is ``_RelationalMulti.write``, which does not call ``convert_to_cache``. In that case, ``_RelationalMulti.convert_to_cache`` may depend on each record's current value, so we explicitly assert that ``records`` contains at most one record.
This update reorganizes how relationship field details are defined internally, aligning Enterprise code with a related Community change. It should help keep reporting, AI field tools, and Studio customizations consistent without changing day-to-day user workflows.
Original PR description
Community: https://github.com/odoo/odoo/pull/196498