Daily updates from Odoo
Saturday, April 18, 2026
10 changes
1 change
Enhancements to existing features
This update simplifies the creation of Spanish tax reports (303 and 347) for users. Specifically, the 'exonerated from 390' field is now automatically displayed on the print wizard for recent periods, eliminating a manual step. Additionally, the annual report 347 now groups data by move type and date for enhanced audit capabilities.
Original PR description
In this PR: - In tax report 303, the 'exonerated from 390' boolean field is now visible on the print BOE wizard , when period is either last month or last quarter so that user does not have to enable it manually on the AEAT page. - In the annual tax report 347, when a user clicks to audit the operations of the entity, a new group by is added in context to group the reports by move type and date(quarter). task-5863744 Forward-Port-Of: odoo/enterprise#113948 Forward-Port-Of: odoo/enterprise#108057
9 changes
Enhancements to existing features
This update enhances the way invoice line information is displayed within Odoo's accounting modules (accountant, asset, and intrastat). Specifically, the layout of related fields has been streamlined for better clarity and usability, and key data like deferred dates and product countries are now more prominently positioned. This change improves the user experience for managing invoices and related financial data.
Original PR description
* Rename the widget from m2o_with_extra_m2o_fields to m2o_with_extra_fields. * Place the deferred date under the account, and required when the deferred checkbox is set on the account. * Stack Product Country under the Intrastat in the same column, with 'Product Country' visible when Intrastat is set. * Remove 'Depreciation Model' and 'Product Country' from optional check boxes. task-5376190
This update introduces a system for setting closing dates for employee types within payroll. It now alerts administrators when payrun closing dates are not configured for specific employee types, ensuring accurate payroll processing. This enhancement improves payroll compliance and reporting.
Original PR description
In this commit, we added a payroll_closing_date for the employee type model. We added a warning to notify the user when the payrun closing date for that employee type. task-5922782
This update streamlines project reporting by refining how time data is tracked and displayed. Specifically, the 'Timesheets and Planning' stat button has been removed and replaced with a focus on 'Planned' time, providing a more accurate view of project margins. This change enhances the clarity and reliability of project performance insights.
Original PR description
- remove `Timesheets and Planning` stat button from project form view - repositioned the `Planned` stat button - modify the `Timesheets` stat button value to be measured with planned instead of allocated time --- task-6085988
This update enhances the speed of key financial reports (like Balance Sheets) by pre-calculating and storing their results. This avoids slow, full-history calculations, especially for large databases, and ensures consistent reporting. It achieves this through a new caching mechanism, making reports faster and more reliable.
Original PR description
**1) Context** Some reports (typically Balance Sheets) compute themselves over the whole accounting history, up to a certain date. On big databases, this is a problem, as the more the accounting…
**1) Context** Some reports (typically Balance Sheets) compute themselves over the whole accounting history, up to a certain date. On big databases, this is a problem, as the more the accounting grows, the slower those reports get. To handle that, a lot of softwares (as well as Odoo, before 9.0) require creating opening entries at the beginning of every fiscal year, to just carry the balance of each account from period to period. The report would then only consider the entries of the current year, which would include the initial balance. The problem with opening entries is that they can very easily get desynchronized from actual accounting history. You can't modify something coming before them without needing to fix them as well, and it's very error-prone. Moreover, they do have an existence into the accounting itself, cause noise, and are far from ideal for handling customer accounts. For all those reasons, they were removed in Odoo 9.0, and we are not reintroducing them. What this commit does, however, is introducing a new mechanism that precomputes and somehow caches those parts of the reports that consider the entire history. This new mechanism is designed to be at the same time completely invisible to the users (outside of the obvious performance gains, that is), resilient, and not too technically complex (I promise). **2) How it works** The key idea is to cache the results of the calls to report engines. For this, we introduce a new model: account.report.snapshot. An instance of this object corresponds to the result of a single engine call. - Snapshot generation Snapshots are generated asynchronously, via a cron. This cron does not run periodically by itself (to avoid useless server load). Instead, it is only called via explicit triggers, when snapshots need to be refreshed. It is made to be as lightweight as possible, and will create only one snapshot at a time, retriggering itself if needed, so that other crons' execution can easily be interleaved with it. The cron is typically triggered when modifying the lock date: a new snapshot is then created for the appropiate engine calls at that new lock date. If no snapshots were done before, we basically generate them on the last 5 years, so that period comparisons can also benefit largely from it. Snapshots are incremental: when a new snapshot is taken, it uses the previous snapshot made for the same parameters on an earlier date, and only calls the report engine on the period that's not already covered. - Impact on engines A report engine (custom or standard) can be made snapshotable using a dedicated decorator. When it's declared like that, its call will be wrapped in another function that will make sure to only call the engine on the period that's not already covered by a snapshot. If the period is fully covered, the engine will simply not be called, and we hence will run no additional SQL. This makes for tremendous performance gains. **3) Requirements and limitations** - Not all engines are snapshotable The computation of an engine needs to be dividable into summable "partitions" in order to allow snapshots. I other words, computing all the parts separately and then putting them together must give the same result as directly computing the full thing. These partition will be created by the cron, splitting the data by date and company (a snpashot is always made for a single company, at a given date). If an engine's computation can be partition, but requires some post-processing using the global results, it's possible to snapshot a single subfunction instead of the engine itself. We call that a subengine. See what account_codes standard engine is doing for an example. - Snapshots are generated for default options only The cron only generate snapshots for the default values of the report's filters. So, if the user changes the value of one of those filters (except the date, of course), the recomputation of the report will not find any snapshot. This is deemed acceptable : the goal is not to make every single possible case super fast. We just want the basic and most common flows to be seamless. - No multi-currency consolidation As it is, multi-currency consolidation is not supported by snapshots. **4) Partners, read this** Snapshots can of course be generated by custom code as well. This could be the key to long-going performance issues in specific flows : just make an additional snapshot for the specific options dict involved in that flow. We'll refine the feature a little more in the future to give even more flexibility to those cases. **5) Additional changes made by this commit** - Record Rules don't impact report computation anymore Before this commit, and since the dawn of times (AKA, version 9), the computation of the report applied custom-made record rules created for account.move.line. This was an old implementation choice that we kept for years because we had no need of removing it, despite the fact we saw no use for it. This has now been removed: if we kept it, snapshots would have been impossible, since using them on a database with such record rules could have given wrong results (because different users could technically have needed to see different amounts for the same report, with the exact same filters). - Custom engine signatures All custom engine signatures change: they now use exactly the same parameters as standard engines, and not a simplified version of it anymore. The format of their return values changes in the same way. This is done so that the @snapshotable_engine decorator can be used indistinctly on both standard and custom engines. - Engine function names Engine functions used to require different prefixes in their names for standard and custom engine ; not anymore. Everything is now prefixed _report_engine_. It's clearer and makes the computation of snapshots easier. task-5891829
This update improves the demo data for Odoo's voip applications, ensuring a more comprehensive and accurate representation of call scenarios. It adds diverse call definitions, statuses, and user types to the demo data, and fixes rendering issues for call status displays. This improves the demo's usefulness for training and understanding the voip features.
Original PR description
*: voip_ai, voip_crm, voip_helpdesk, voip_project This PR reviews all the demo data in voip apps to have most (all?) possible call definition, with different status, different users, etc. And fixes things along the way. task-5499027
This update allows users to customize their timesheet assistant rules, providing greater flexibility in how time tracking is managed. Timesheet administrators can now share these rules with specific teams or make them globally available, streamlining time tracking processes and improving team efficiency.
Original PR description
This PR adds the ability for user to configure their own assistant rules. Timesheet admins can also share rules with a subset of users, or with no one, making them global rules. Task-6116548
This update allows each company within Odoo Enterprise to manage its own WhatsApp templates and settings independently. Previously, all companies shared the same templates, limiting flexibility. Now, companies can tailor their WhatsApp communications for better customer engagement.
Original PR description
Previously, WhatsApp templates were linked globally via config parameters, so all companies shared the same templates and new companies could not access the default templates. This update moves template fields to res.company and exposes them in res.config.settings, allowing each company to configure its own WhatsApp settings and templates independently. task-5439257
This update introduces the ability for users to seamlessly transfer ongoing VoIP calls to another device, such as a different computer or mobile phone. This improves collaboration and flexibility by allowing users to continue conversations without disruption, regardless of their location or device. The transfer process is automated and reliable, ensuring a smooth user experience.
Original PR description
Introduce a VoIP feature that allows users to transfer an ongoing call from one tab/device to another (e.g., from desktop Chrome to desktop Firefox or a mobile device). The transfer follows a pull…
Introduce a VoIP feature that allows users to transfer an ongoing call from one tab/device to another (e.g., from desktop Chrome to desktop Firefox or a mobile device).
The transfer follows a pull model: the target device (Device B) initiates the process via "Switch here". It requests the source device (Device A) to send a SIP REFER to its own AOR (Address of Record). The PBX then issues a new INVITE to the AOR, which Device B automatically accepts, completing the transfer.
Task-4417476
```mermaid
sequenceDiagram
participant A as Device A
participant PBX
participant B as Device B
participant C as Device C
Note over B: create pull
B->>A: bus: voip.call.pull/initiate
Note over A: create push
A->>C: bus: voip.call.pull/suppress_invite
Note over C: _ignorePhoneNumbers(phone_numbers)
A->>B: bus: voip.call.pull/pending_entries
Note over B: store pendingEntries on pull
B->>A: bus: voip.call.pull/pending_entries_received
Note over A: _ignorePhoneNumbers(phone_numbers)
A->>PBX: REFER (own AOR)
par Invitation sent
PBX->>A: INVITE (new call)
Note over A: phone_number in _ignoredPhoneNumbers <br/> not shown + no ringing
PBX->>C: INVITE (new call)
Note over C: phone_number in _ignoredPhoneNumbers <br/> not shown + no ringing
PBX->>B: INVITE (new call)
Note over B: pendingEntries matches phone_number <br/>auto-accept + no ringing
end
B->>PBX: 200 OK
PBX->>A: REFER 202 Accepted
Note over A: onAccept -> hangup()
A->>PBX: BYE
B->>A: bus: voip.call.pull/result
Note over B: display stats + delete pull
Note over A: display stats + delete push
```
Task-4417476This update enhances Canadian financial reports by moving away from reliance on account codes. The new reports now use account type and tax account distinctions, making them more adaptable to different Canadian chart of accounts configurations and ensuring accurate reporting.
Original PR description
the old reports were based on account codes. Since Canada doesn't have a standardized chart of accounts, users that modified their CoA would end up with incorrect BS and P&L reports. These new reports are inspired by the US ones and are based on account_type and non_trade (to distinguish tax accounts) and are therefore much more flexible. task-6024424