Daily updates from Odoo
Wednesday, November 19, 2025
41 changes
4 changes
Enhancements to existing features
The Point of Sale sales report now includes a more detailed view of payments grouped by payment method. This helps teams understand how customers pay and makes sales analysis and reconciliation easier.
Original PR description
In this commit: ----------- - Enhances the PoS sales report by adding detailed breakdowns of payments grouped by payment method. task-5184319 Forward-Port-Of: odoo/odoo#234486
The mail plugin now includes a way to identify the Odoo version it is connected to. This lets Odoo warn users when the new add-in is not supported on their version, avoiding confusion and failed usage.
Original PR description
Purpose ======= The new addin has been refactored and doesn't work with older Odoo version, and so we add an endpoint to be able to show a message if we don't support that Odoo version. Task-4727609 Forward-Port-Of: odoo/odoo#236286 Forward-Port-Of: odoo/odoo#236047
The IoT Box now turns its displayed build hash into a clickable link that opens the matching commit on GitHub. This makes it easier for teams to verify exactly which software version is running during support or troubleshooting.
Original PR description
To ease checking the HEAD commit on the IoT Box, we now compute the github url to the commit, and redirect to it clicking on the hash in the technical information tab. Forward-Port-Of: odoo/enterprise#99673 Forward-Port-Of: odoo/enterprise#99422
IoT Box information is now loaded ahead of time, so IoT requests can continue working even when the connection is unstable or temporarily offline. This also reduces the number of database requests, which should improve overall performance for connected point of sale and self-order flows.
Original PR description
In order to allow iot requests to work offline, and also reduce the amount of orm requests sent to the db, we now preload IoT Box records in the `iot_http` service. Task: 5258886
4 changes
Enhancements to existing features
The Point of Sale sales report now includes a more detailed view of payments, grouped by payment method. This makes it easier for teams to understand how customers paid and to review sales performance more clearly.
Original PR description
In this commit: ----------- - Enhances the PoS sales report by adding detailed breakdowns of payments grouped by payment method. task-5184319 Forward-Port-Of: odoo/odoo#234486
The mail plugin now includes a way to identify the Odoo version it is connecting to. This lets Odoo display a clear message when the add-in is used with an older, unsupported version instead of failing without explanation.
Original PR description
Purpose ======= The new addin has been refactored and doesn't work with older Odoo version, and so we add an endpoint to be able to show a message if we don't support that Odoo version. Task-4727609 Forward-Port-Of: odoo/odoo#236286 Forward-Port-Of: odoo/odoo#236047
Invoice delivery to customers and government EDI systems is now deferred until after the payment transaction is fully committed. This reduces the risk of invoices being sent and then lost due to a rollback, helping keep Odoo records aligned with external government numbering and customer communications.
Original PR description
When the payment transactions trigger the creation of invoices and then the sending of those invoices by mail and through the EDI to the government, any concurrent update can make that entire process…
When the payment transactions trigger the creation of invoices and then the sending of those invoices by mail and through the EDI to the government, any concurrent update can make that entire process fail all at once. This mainly happens when the user himself is paying through the portal as this will create the invoice from the payment. When invoices are sent to the government however, we want to be sure that when sent, it gets updated in Odoo as well, so we are aware what is happening. The problem we got is that invoice 1 is sent to the government (l10n_in_edi) as number 01 and then that transaction is totally rolled back that the invoice is not even there anymore, it risks that the government's numbers and your numbers do not correspond anymore. So, we should avoid that that invoice can be sent when before there is a concurrent update (on payment transaction in this case) waiting for destroying it when committing. So, the simple idea would be to only do the invoice sending through a post commit. As we are locking the invoice itself for the sending to the government that should be enough to avoid the invoice sending for not being registered in Odoo. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Finnish tax reporting now includes triangular taxes, which helps generate the EC Sales List more accurately. This improves compliance and reduces manual adjustments for businesses operating across EU borders.
Original PR description
The aim of this commit is adding the triangular taxes into the tax report to use it in EC Sales List report. task-5126664 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229269
23 changes
Enhancements to existing features
Jordan payroll now uses overtime amounts already calculated from work entries instead of relying on manual payslip inputs. This reduces manual payroll setup, improves consistency, and keeps overtime rules aligned with attendance records.
Original PR description
Before: - Overtime salary rules calculated amounts manually from payslip inputs After: - Link Jordan overtime rules to their respective work entry types in the hr_work_entry_attendance bridge module - Update overtime salary rules to read values directly from worked_days entries - Simplify salary rule logic: use pre-calculated amounts from work entries - Remove obsolete manual payslip input types Task-5103913
VoIP activity cards have been refined to show clearer, more useful information across calls, CRM leads, recruitment applicants, and SMS actions. This helps users understand and act on communication activities faster from the softphone interface.
Original PR description
Task-5207647
Bank reconciliation users can now choose to show transaction details as an optional column in the transaction list. The details are displayed in an easier-to-read format with a hover preview, helping users review bank entries more quickly without opening extra records.
Original PR description
This commit enhances the bank reconciliation widget by adding the transaction_details field as an optional column in the transaction list view. Changes: - Added transaction_details field to the optional hide/show configuration in bank statement list view - Implemented custom formatted_transaction_details widget to display JSON data in human-readable format with hover preview task-5121929
This update adds automated checks for the IoT connection messaging code, helping ensure messages are sent and received as expected. It reduces the risk of future changes breaking connected device communication without changing day-to-day user workflows.
Original PR description
This commit adds a suite of tests for the `IotWebsocket` class. The tests comprehensively cover the functionality of `sendMessage` and `onMessage`. Type hints are also added to these methods.
Appointment pages no longer allow users to edit placeholder images for staff or resources on the website. This avoids confusion because those placeholder edits were never saved and real profile images are not editable from the front end.
Original PR description
Remove the possibility to edit the user/resource image placeholders on the front-end. Editing the placeholders is useless as they won't be saved on page reload anyway. Also, the user/resource record images (displayed when Display Pictures option is set) aren't editable from the front-end. Meaning being able to edit the placeholders could be confusing for the users. Task-5079021
Payroll validation has been optimized to use far fewer database queries, reducing processing overhead when confirming payslips. This should make payroll runs faster and more efficient, especially for larger batches.
Original PR description
Before this changes the number of query needed to do the payslip validation was 274 and with this changes it's only 76 :sunglasses:
Saudi payroll now calculates end-of-service benefits more closely in line with legal wording, including an option to use actual calendar days or an annual approximation. Retirement is treated like contract completion, and payslip provisions better reflect each employee’s employment duration, improving accuracy for HR and payroll teams.
Original PR description
- added field `l10n_sa_use_actual_number_of_days` to mark if we use actual number of days in the year or an approximation. - adjusted the calculation of end of service benefit to be check if we want to use actual number of days or not and changed the calculations to use total years instead of total days to be compatible with how it's stated by the law - changed the case of retirement to be handled the same as the case of contract ending and not resignation - changed the way eos provision is calculated on the payslip to account for the duration of employment of the employee - added test for eos benefit calculation which checks using actual number of days and approximation for the cases of resignation and end of contract - changed the string and tooltip of `l10n_sa_number_of_days` to be more descriptive of what it does task-id: 4766060
Barcode-related automated tests now use dedicated test company and warehouse data instead of relying on default demo records. This makes test results more stable, fixes a known build failure, and slightly speeds up some barcode test runs without changing day-to-day user workflows.
Original PR description
*: stock_barcode_mrp, stock_barcode_mrp_subcontracting, stock_barcode_picking_batch Until now, the default warehouse (WH) was the warehouse used in the `stock_barcode` tests which means all the tests depends of it and are influenced by the changes done in this warehouse (like changes done by the demo data.) A better way to run the tests would be to use a warehouse created for this occasion, and what a chance, that's why this commit does! Incidentally, this commit also fixes [runbot built error 233274](https://runbot.odoo.com/odoo/runbot.build.error/233274) **Community PR:** odoo/odoo#234483 Forward-Port-Of: odoo/enterprise#96657
Employees can now view available VoIP providers and select the one they need without administrator help. Access remains limited to the necessary provider information, keeping sensitive configuration details protected.
Original PR description
We now allow base.group_user to have read access to voip.provider so that user can change provider by themselves. Note that the visible fields to base.group_user are still limited. Task-5262635 Forward-Port-Of: odoo/enterprise#99530
Belgian SODA payroll imports can now handle multiple files for the same accounting month, such as 13th-month payroll cases, by keeping entries uniquely identifiable. Entries are also dated at the end of the accounting period, or just after a locked period when needed, improving accounting accuracy and compliance with period controls.
Original PR description
in some cases it is needed to upload more than one soda files for the same month (i.e. 13th months), in this case we add _xx after the sequence number in the ref of the entry also we changed the date to the last day of the accounting period instead of the gendate and in the case the accounting period is locked it will be the first day after the locked period task-5270270
The Odoo Compliance Assistant now follows updated guidance and is restricted to using only its approved information sources. A sample question was also changed to use New Jersey instead of Japan so demo results are more relevant and useful.
Original PR description
Updated the system prompt for the `Odoo Compliance Assistant` as per the new proposition. Also previously, we were using the prompt `Do I have any customer in Japan?` which returned `I did not find any`. It has been changed to `Do I have any customer in New Jersey?` to get valid results. Task-5153818
UAE payroll benefits are now handled through salary rules instead of separate benefit setup. This makes payroll calculations more consistent and easier to maintain, with updated demo data and tests to reflect the new approach.
Original PR description
In this commit, we converted the payroll benefits into salary rules and adjusted the demo data. task-5122366
When reconnecting or retrying a bank account synchronization, Odoo now reuses the existing journal instead of creating a duplicate. This keeps accounting records cleaner and avoids confusion caused by expired or failed connection links.
Original PR description
[IMP] account_online_synchronization: avoid duplicate journal This commit prevents user to create duplicate journals when synchronizing a bank account. When a user tries to add a new bank account, a journal is created. But if the connection link expires or is in error, we don't want to create a new journal, we just want to replace the online_account (and so the online_link) in the existing journal. task-5042462
Odoo spreadsheets in the trash now behave like CSV and Excel files: users must restore them before opening. This creates a more consistent document experience and helps avoid accidental use of trashed files.
Original PR description
Current behavior before PR: - Trashed Odoo spreadsheets could be opened directly, unlike CSV/Excel files that required restoring first. Desired behavior after PR is merged: - Odoo spreadsheets now follow the same behavior as CSV/Excel files. Trashed files must be restored before they can be opened. Task: 5030282
Point of Sale settings can now be changed even when a session is already open. This reduces operational interruptions by letting businesses adjust enterprise and UrbanPiper-related configuration without waiting for sessions to close.
Original PR description
### in this commit: - Removed restriction preventing config changes during an open session. task-5187838
IoT devices can now be recognized by a stable backup identifier, such as a printer's MAC address, when their main identifier changes. This prevents duplicate device records and keeps existing POS configurations working without manual updates.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/235455 Before this commit, if a device such as a printer were to have its identifier change (usually because its IP changes) then a new device entry would be created, leaving the old device entry non-functional but still linked to e.g. a POS config. After this commit, a new `alternate_identifier` field is added, which a driver can provide for a device as a fallback. In the printer case, it sends the MAC address of the printer here. If we receive a device with an `alternate_identifier` that matches an existing device, we can update that existing device instead of creating a new entry. This way, the configuration of the POS using the device does not need to change. We also adapt the existing blackbox logic to handle this process to use this new `alternate_identifier` field. task-5059488
SendCloud delivery integration can now determine the warehouse name through a customizable process instead of relying only on a fixed name match. This helps businesses with more complex sender-address rules choose the right shipping origin more reliably.
Original PR description
As choosing the proper sender address in SendCloud can be more complex than matching a name to a fixed name in Odoo we open up the freedom to inherit the retrieval of the warehouse name. Info: @wt-io-it Forward-Port-Of: odoo/enterprise#97595
Improves the warnings and errors shown when generating Saudi WPS reports for validated payslips, making issues easier for payroll users to understand and resolve. It also renames the bank account field from Establishment ID to Establishment Code to better match its business meaning.
Original PR description
This commit improves the warning and error messages shown to the user when generating WPS reports for validated payslips in Saudi Arabia. task-5220230
New menus make it easier for accounting users to review sales and purchase order accruals, including viewing balances as of a chosen past date. The reports now open the related order directly from each line, helping teams investigate prepaid expenses, bills to receive, deferred revenue, and invoices to be issued more efficiently.
Original PR description
*: purchase_accountant,sale_account_accountant This commit adds new menu for SO and PO accruals. A custom list view (`js_class`) was created for those reports: `accrual_list_view`. AccrualListView…
*: purchase_accountant,sale_account_accountant This commit adds new menu for SO and PO accruals. A custom list view (`js_class`) was created for those reports: `accrual_list_view`. AccrualListView =============== This view is used both by `sale.order.line` and `purchase.order.line`. Its functionnalities are: - The user can choose a date to see records' values in the past; - If a line is clicked, instead of opening the line's form view, it will open its order form view instead. Technical notes about this view: - The chosen date is passed to the context but there is issue when the view is grouped (and it is by default): while the grouped lines uses the right context with the selected date, the contained lines sometime use an old version of this context with a previously selected date which means the grouped data are not the same than the single lines data. To fix that, we force the context on each group. - The "at_date" fields are non-stored computed fields. By default, there is no sum value for those fields. Server side, we override the `_read_group` method to "manually" compute those fields sum. To be able to do that, we tweak the aggregate config in this view. Boolean fields ============== Four boolean fields are created: - `prepaid_expense` and `bill_to_receive` for `purchase.order.line`; - `deferred_revenue` and `invoice_to_be_issued` for `sale.order.line`. Those fields are usefull to fetch right order lines for the right accrual and are always a balance between delivered/received quantity and invoiced quantity. [task-5075455](https://www.odoo.com/odoo/966/tasks/5075455) Community PR: odoo/odoo#231510 Forward-Port-Of: odoo/enterprise#97151
The Philippine reporting module’s automated tests were updated to match a recent change in report descriptions. This helps ensure reporting checks stay aligned with the latest expected wording and reduces the risk of false test failures.
Original PR description
Related PR: https://github.com/odoo/odoo/pull/235448 TaskID-5248240 Forward-Port-Of: odoo/enterprise#99354
Financial report lines now use consistent spacing between hierarchy levels. This makes nested report sections easier to scan and improves readability without changing the report data.
Original PR description
This commit ensures that indentation difference between reports lines on different levels is identical. Before this commit, a line at level 2 would have indentation of 4px, and for further levels, this number would increase by 8px. This commit makes indentation start at 8px for level 2 to make indentation differences consistent. task-5232821
The IoT Box technical information now links its displayed software commit hash directly to the related GitHub commit page. This makes it faster for support or administrators to confirm exactly which software version is running when diagnosing issues.
Original PR description
To ease checking the HEAD commit on the IoT Box, we now compute the github url to the commit, and redirect to it clicking on the hash in the technical information tab. Forward-Port-Of: odoo/enterprise#99673 Forward-Port-Of: odoo/enterprise#99422
This update makes it easier for Odoo features to remember user preferences in the browser and keep them consistent across tabs. It also adds a safer way to preserve those preferences when storage formats change during upgrades, reducing the risk that users lose settings after updates.
Original PR description
*: frontdesk Before this commit, having a record field saved in local storage and synced among browser tabs was cumbersome. Roughly this was defined as follow: ```js class Settings extends Record {…
*: frontdesk
Before this commit, having a record field saved in local storage and synced among browser tabs was cumbersome. Roughly this was defined as follow:
```js
class Settings extends Record {
static new(...args) {
const settings = super.new(...args);
settings.onStorage = settings.onStorage.bind(settings);
browser.addEventListener("storage", onStorage);
return settings;
}
delete() {
super.delete();
browser.removeEventListener("storage", onStorage);
}
onStorage(ev) {
if (ev.key === USE_BLUR_KEY) {
this.useBlur = ev.newValue === "true";
}
}
useBlur = fields.Attr(false, {
compute: () => browser.localStorage.getItem(USE_BLUR_KEY) === "true",
onUpdate: () =>
this.useBlur
? browser.localStorage.seItem(USE_BLUR_KEY, "true")
: browser.localStorage.removeItem(USE_BLUR_KEY),
});
}
```
This commit simplifies drastically how to define fields that are saved and synced to local storage:
```js
class Settings extends Record {
useBlur = fields.Attr(false, { localStorage: true });
}
```
The write in local storage is made only when the field value differs from default:
- if value is same as default value, then remove from local storage
- if value is different than default value, write current value in local storage
This commit also introduces local storage upgrade scripts. Since local storage keys and values are expected to change but we want to keep user preferences, these scripts help upgrade old local storage values to newer ones.
To define an upgrade script:
```js
import { addUpgrade } from "./upgrade_helpers";
addUpgrade({
version: NEW_VERSION,
key: OLD_KEY,
upgrade: ({ value: oldValue }) => ({
key: NEW_KEY,
value: NEW_VALUE,
}),
});
```
This upgrades `OLD_KEY` local storage entry to `NEW_KEY` local storage entry with `NEW_VALUE`.
Upgrades are executed from oldest to newest version. Range is based on version in local storage at bottom and curent odoo version at the top.
Part of Task-50030126 changes
Enhancements to existing features
Quality checks for repair orders are now created only after a repair is confirmed, instead of as soon as it is opened. This avoids generating checks for repairs that are never actually processed and keeps quality follow-up focused on active work.
Original PR description
- Generate quality checks when a repair order is confirmed rather than when it is created. This ensures that quality checks are only created for repair orders that are actually being processed. - Product and lot updates quality checks only after confirmation. Task [5227065](https://www.odoo.com/odoo/project/966/tasks/5227065)
The mail plugin can now detect which Odoo version is in use. This lets it display a clear message when the version is not supported, helping users understand why the add-in may not work.
Original PR description
Purpose ======= The new addin has been refactored and doesn't work with older Odoo version, and so we add an endpoint to be able to show a message if we don't support that Odoo version. Task-4727609 Forward-Port-Of: odoo/odoo#236286 Forward-Port-Of: odoo/odoo#236047
The Point of Sale sales report now includes a clearer breakdown of payments by method, making it easier to see how customers paid. This helps businesses review sales patterns and reconcile reports more quickly.
Original PR description
In this commit: ----------- - Enhances the PoS sales report by adding detailed breakdowns of payments grouped by payment method. task-5184319 Forward-Port-Of: odoo/odoo#234486
The IoT Box technical information now includes a clickable link from the image version hash to the exact GitHub commit. This makes it easier and faster to verify which software version is running on the device when troubleshooting or checking updates.
Original PR description
To ease checking the HEAD commit on the IoT Box, we now compute the github url to the commit, and redirect to it clicking on the hash in the technical information tab. Forward-Port-Of: odoo/enterprise#99673 Forward-Port-Of: odoo/enterprise#99422
The self-order attribute selection page now shows a clear “Required” badge next to mandatory attributes. This makes it easier for customers to spot what must be selected and reduces the chance of missing required options.
Original PR description
PURPOSE: --------- - Help users to easily identify which attributes are required in the POS self-order attribute selection page. Before this commit: ------ - Required attributes had no badge or clear visual indication. After this commit: ---------- - Added a Required badge next to attribute names so users can quickly identify and select them. Task-5079571
When a company installs a chart template from the SEPA region, the related ISO 20022 payment support is now installed automatically. This makes setup smoother and helps ensure the right payment features are available from the start.
Original PR description
This commit will allow to install account_iso20022 when installing a chart template from the SEPA zone. task-5163045
3 changes
Enhancements to existing features
This update makes it easier to adapt how Odoo identifies the warehouse name used for SendCloud sender details. It helps businesses match the correct sender address even when their naming setup does not follow a simple one-to-one rule.
Original PR description
As choosing the proper sender address in SendCloud can be more complex than matching a name to a fixed name in Odoo we open up the freedom to inherit the retrieval of the warehouse name. Info: @wt-io-it Forward-Port-Of: odoo/enterprise#97595
Financial reports now calculate much faster by reusing previously computed account totals instead of repeating the same work for every line. This reduces waiting time significantly for large reports while keeping the results the same.
Original PR description
### Issue Large financial reports are slow to compute due to repeated re-aggregation of account_move_line balances for each formula, even when most formulas share the same base domain (usually…
### Issue
Large financial reports are slow to compute due to repeated re-aggregation of account_move_line balances for each formula, even when most formulas share the same base domain (usually filtered by account_id fields).
### Analysis
Each report line formula independently aggregates balances from account_move_line, even when their domains only differ on account_id-related fields such as account_id.account_type or account_id.non_trade.
This leads to redundant scanning and aggregation of the same dataset multiple times within a single report execution.
### Solution
Introduce a lightweight in-memory caching layer for aggregated balances by account_id, stored in self.env.cr.cache.
For each (options, date_scope) pair:
The report engine now computes once the mapping
{account_id: {'amt': total_balance, 'count_aml_lines': count}}.
This mapping is stored in the cursor cache and reused across all formulas whose domains filter exclusively on account_id fields.
A small domain transformation step allows AML domains based on account_id.* fields to be evaluated directly against the cached account aggregates.
This approach avoids redundant SQL aggregation, remains fully read-only (no database writes), and is safe for execution on read replicas.
### Benchmarks
Profiling get_report_information_readonly on different reports. Database has ~11.6 million account_move_lines, 305 account_accounts, and 16 account_types
| Report Name | Before | After | % Speed Up |
| --- |---|---|---|
| Balance Sheet | 35s | 6.2s | ~550% |
| Profit and Loss | 7.2 | 2.1 | ~300% |
| Cash Flow Statement | 1.5s | 0.4s | ~300% |
| Executive Summary | 24s | 6.3 | ~400% |
### References
opw-5130725This update clears existing UrbanPiper menu links and rebuilds them with a fresh synchronization. It helps keep the menu data aligned between Odoo and UrbanPiper, reducing mismatches after changes.
Original PR description
Following this commit: - Flush out all existing UrbanPiper product menu linkages and performs a fresh menu sync. task-5231247
1 change
Enhancements to existing features
This update makes delivery lookup by lot much faster by changing how the system gathers the needed information. It reduces delays for users working with many lots, especially in large stock operations, so screens and processes complete more quickly.
Original PR description
### Description: This refactoring replaces the recursive calculation in `_find_delivery_ids_by_lot` with an iterative process. This change significantly reduces the amount of database queries by prefetching and batching all required lines in a single pass, and it also eliminates the overhead caused by repeated recursive function calls. ### Benchmark: | Total Lots | Before | After | |------------|--------|--------| | 69 | 1 sec | 106 ms | | 1152 | 1 min | 5 sec | ### Reference: opw-5096599