Daily updates from Odoo
Friday, September 26, 2025
29 changes
6 changes
Enhancements to existing features
Bank reconciliation no longer uses a fixed matching tolerance for invoices. Instead, businesses can control the tolerance through a system setting, with existing and new databases defaulting to no tolerance unless enabled.
Original PR description
This commit: https://github.com/odoo/enterprise/commit/9bea3f2c517e77fdb822eb53b9648e9fc5478dac introduce a tolerance. If an invoice has a bigger amount than the bank line but within the tolerance of 3%, reconcile the invoice automatically and leave the difference in the suspense account. The statement line will be partially matched. This commit will change that tolerance to use a system parameter instead. For old DB the tolerance is at 0 and for new DB a system parameter (0 by default) will be put so that people that want to use it can. task-5106655 Forward-Port-Of: odoo/enterprise#95301
Employee version records now track changes to most business-relevant HR fields across payroll, contracts, salary, attendance, holidays, signing, and local payroll modules. This helps businesses keep a clearer history of employee data changes for compliance, review, and accountability.
Original PR description
Most fields in hr.version represent business-relevant employee data that should be tracked to ensure a complete audit trail. This commit adds `tracking=True` by default on hr.version fields across community and enterprise modules. task-5022109
Employee version records now automatically track changes to most business-relevant fields. This strengthens audit trails and makes it easier for HR teams to understand when important employee information changed.
Original PR description
Most fields in hr.version represent business-relevant employee data that should be tracked to ensure a complete audit trail. This commit adds `tracking=True` by default on hr.version fields across community and enterprise modules. task-5022109
This update makes internal web automation errors easier to diagnose by including the original technical trace when a run step fails. It helps support and development teams find the source of issues faster, reducing time spent investigating unclear browser error messages.
Original PR description
Because it only embeds the error message, and because it ultimately gets `console.error`-ed, an error during a `run()` function is currently extremely unhelpful e.g.
Cannot read properties of undefined (reading 'ownerDocument')
might be all you get. And despite what one might assume, browsers (or at least chrome) don't seem to chain stacktraces when using `{cause}`, so even printing stacktraces on `console.error` does not yield useful information, the stacktrace point to `performAction` instead of a useful location.
So use the `Error#stack` if it's available. In chrome that includes both the error message and the full stack, so a formatted error message is unnecessary. Fall back on a formatted error message if the error has no stack for some reason.
Forward-Port-Of: odoo/odoo#227169Point of Sale now avoids loading large sets of product attribute values until they are actually needed. This reduces unnecessary data loading and can improve startup performance for stores with many product options, without changing how products are linked or sold.
Original PR description
Before this commit, when loading PoS, all product template attribute value (ptav) IDs linked to a product attribute were loaded. This caused performance issues when attributes had a large number of values, even though they were not needed at that stage. With this commit, the values are no longer preloaded, since the reverse fields in ptav and ptal are fetched when needed, ensuring they can still be linked correctly without degrading performance. opw-5006818 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226999 Forward-Port-Of: odoo/odoo#224497
Payroll report views have been tightened so users can no longer edit payslip line or worked days report data from reporting screens. This helps preserve payroll data integrity while making the reports easier to browse and search.
Original PR description
-In payslip line report, some fields can be edited, which should not be allowed. -Views have been adjusted to prevent the navigation from pivot to list view. -Search view has been modified for easier data reaching. Forward-Port-Of: odoo/enterprise#94284
3 changes
Enhancements to existing features
Point of Sale now avoids loading large lists of product option values until they are actually needed. This reduces startup delays for stores with complex product catalogs while keeping product options linked correctly.
Original PR description
Before this commit, when loading PoS, all product template attribute value (ptav) IDs linked to a product attribute were loaded. This caused performance issues when attributes had a large number of values, even though they were not needed at that stage. With this commit, the values are no longer preloaded, since the reverse fields in ptav and ptal are fetched when needed, ensuring they can still be linked correctly without degrading performance. opw-5006818 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225600 Forward-Port-Of: odoo/odoo#224497
Restaurant point-of-sale users can now retry kitchen receipt printing when a printer issue causes a failure. The retry action only sends the receipt to printers that failed previously, avoiding duplicate prints on printers that already succeeded.
Original PR description
Before this commit: = - There was no option to retry printing kitchen receipts if a printer failed. After this commit: = - Users can now manually retry printing kitchen receipts that failed due to printer issues. - The `Retry` button targets only the printers that previously failed, ensuring other successful prints are not repeated. Task: 4717776
This update improves how the web interface reports certain automation errors by including the full error trace when available. This helps support and development teams find the root cause faster, reducing time spent diagnosing vague failure messages.
Original PR description
Because it only embeds the error message, and because it ultimately gets `console.error`-ed, an error during a `run()` function is currently extremely unhelpful e.g.
Cannot read properties of undefined (reading 'ownerDocument')
might be all you get. And despite what one might assume, browsers (or at least chrome) don't seem to chain stacktraces when using `{cause}`, so even printing stacktraces on `console.error` does not yield useful information, the stacktrace point to `performAction` instead of a useful location.
So use the `Error#stack` if it's available. In chrome that includes both the error message and the full stack, so a formatted error message is unnecessary. Fall back on a formatted error message if the error has no stack for some reason.
Forward-Port-Of: odoo/odoo#2271692 changes
Enhancements to existing features
Hong Kong Payroll users can now download the IR56B report as an XML file directly from the relevant payroll screens. This makes annual tax reporting preparation faster and reduces manual steps for payroll teams.
Original PR description
Add ir56b report download button for downloading .xml file in Hong Kong Payroll. task - 5081474 Forward-Port-Of: odoo/enterprise#95013
Creating repair orders is now much faster when the system has a large number of quality control rules. This reduces long delays or timeouts during repair creation, helping teams process repairs more reliably.
Original PR description
Description ----------- Creating a repair creates new `quality.check` based on `quality. point`s. When you have many matching points to explore, the `filtered_domain` can be pretty slow when…
Description ----------- Creating a repair creates new `quality.check` based on `quality. point`s. When you have many matching points to explore, the `filtered_domain` can be pretty slow when processing linear the records to compute the intersection between the all points and the points that should be associated with the repair. This commit rewrites `_create_quality_checks_for_repair` to use a `search` instead if necessary, to offload the intersection search in the database. We also split the ids to not inject a large list of ids in the query. Benchmark --------- For a database that will have 500k `quality.point` that satisfies the domain of `quality.point._get_domain`, the invocation of `_create_quality_checks_for_repair` for creating a Repair takes (excluding the `create` call time): | | Before | After | |---------|------------------|-------| | Timings | Timeout (15+min) | 1 min | Reference --------- opw-4980036 Forward-Port-Of: odoo/enterprise#91729
6 changes
Enhancements to existing features
The Equity app now has smoother screens and form flows for ownership and beneficial owner information, along with fixes for issues found during testing. Added test coverage helps make these workflows more reliable for companies managing equity records and compliance details.
Original PR description
1. Unit tests for UBO 2. UI/UX improvements 3. Fixes for detected issues task-5078906 Forward-Port-Of: odoo/enterprise#94736
Users can now duplicate documents directly from the All and My Drive folders, removing an extra step in document management. Drag-and-drop behavior into My Drive is also clearer: shortcuts are moved, documents create shortcuts, and items already rooted in My Drive are not duplicated unnecessarily.
Original PR description
**Before this PR:** - When the ALL folder is selected, the server action to duplicate the documents is absent. - Drag and drop to my drive creates a shortcut. **After this PR:** - Now we can easily duplicate the documents, even when we are present in the ALL folder. - Drag and drop shortcuts to MY Drive will move shortcuts. - Drag and drop documents to MY Drive will create shortcuts in MY Drive. - Drag and drop documents to MY Drive from All will do nothing if docuemnt root belongs to MY Drive. Task-4717535
Restaurant preparation displays now show clear course names such as “Starter” or “Main” instead of short codes like “C1” or “C2”. This makes orders easier for kitchen staff to understand at a glance, while very long course names are shortened to keep the display readable.
Original PR description
Before this commit: ======================= - Preparation display showed sort course names. (e.g., C1, C2). After this commit: ======================= - Full course name is displayed in preparation display. (e.g., Starter, Main). - Course names that are too long will be truncated. Task - 4982871 Related PR: - Community: https://github.com/odoo/odoo/pull/224147
Bank statement matching no longer uses a fixed 3% tolerance when an invoice amount is slightly higher than the bank line. The tolerance is now controlled by a system setting, defaulting to 0%, so businesses can choose whether to allow automatic partial matching and keep differences in suspense.
Original PR description
This commit: https://github.com/odoo/enterprise/commit/9bea3f2c517e77fdb822eb53b9648e9fc5478dac introduce a tolerance. If an invoice has a bigger amount than the bank line but within the tolerance of 3%, reconcile the invoice automatically and leave the difference in the suspense account. The statement line will be partially matched. This commit will change that tolerance to use a system parameter instead. For old DB the tolerance is at 0 and for new DB a system parameter (0 by default) will be put so that people that want to use it can. task-5106655 Forward-Port-Of: odoo/enterprise#95567 Forward-Port-Of: odoo/enterprise#95301
Payslips now hide the employee record field when it is not needed, such as when no employee is selected or only one record exists. This reduces clutter and makes payroll entry easier for users, while improving the related version search list for this context.
Original PR description
With this commit, the employee record on payslips is hidden if the employee is not selected or if the employee has only one record task-5082906
This update reorganizes how online sales pages handle customer interactions across rental, stock rental, and local invoicing flows. It should make the shopping and checkout experience easier to maintain and more reliable without changing the visible business process.
Original PR description
task-5089578 Community PR: https://github.com/odoo/odoo/pull/225568
5 changes
Enhancements to existing features
The Equity app receives improvements to beneficial ownership workflows, portal forms, valuation and cap table displays, and related communications. These changes make it easier for users to complete equity ownership requests accurately while addressing issues found during testing.
Original PR description
1. Unit tests for UBO 2. UI/UX improvements 3. Fixes for detected issues task-5078906
The default user group name has been changed back after feedback from use. This keeps terminology familiar for users and reduces confusion in access or role descriptions.
Original PR description
After using it, fp changed his mind.
The Indian reporting module now shows the IRN number in a more appropriate area of the vendor bill form instead of the title. This preserves the standard bill layout while making the number easier to copy when needed.
Original PR description
During testing in 19, I saw that the IRN field was in the title and that totally disturbs the standard layout of how a vendor bill form should look like in Odoo. In order to easily copy paste we add a class text-break (l10n_ec_edi has the same case for the authorization number)
Bank statement matching no longer uses a fixed tolerance when an invoice is slightly higher than the bank payment. The tolerance is now controlled by a system setting, defaulting to zero, so businesses can choose whether to allow automatic partial matching and keep differences in suspense.
Original PR description
This commit: https://github.com/odoo/enterprise/commit/9bea3f2c517e77fdb822eb53b9648e9fc5478dac introduce a tolerance. If an invoice has a bigger amount than the bank line but within the tolerance of 3%, reconcile the invoice automatically and leave the difference in the suspense account. The statement line will be partially matched. This commit will change that tolerance to use a system parameter instead. For old DB the tolerance is at 0 and for new DB a system parameter (0 by default) will be put so that people that want to use it can. task-5106655 Forward-Port-Of: odoo/enterprise#95567 Forward-Port-Of: odoo/enterprise#95301
This update improves how Odoo handles internal search and filtering rules, making common operations faster without changing user workflows. Businesses should see smoother performance in areas that rely heavily on filtering records, especially on larger databases.
Original PR description
Backport of #227808 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
7 changes
Enhancements to existing features
This change makes it easier for other Odoo modules to customize how analytic distribution information is prepared for accounting entries. It supports more flexible business-specific rules, such as basing analytic distributions on employee-related data, without changing core accounting behavior.
Original PR description
**Description of the issue/feature this PR addresses:** Add an inherit point to let others modules specify others/new values when the analytic distribution is build on the analytic distribution model. **Functional example:** If you wan to determine your analytic distribution on the employee (so the `employee_id` field is added into `account.analytic.distribution.model`), the specific module can not edit the dict (who is extracted by this PR). So I propose to extract the `dict` creation into a dedicated method. **Current behavior before PR:** It's not possible to edit the `dict` **Desired behavior after PR is merged:** Update the `dict` (and let it as a `frozendict` to use it as a key). ✅ I don't find any duplicates PR --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Discuss calls can now automatically fall back to a server-assisted connection when direct peer-to-peer connections do not work. This improves call reliability for users on restrictive networks or in situations where direct connections are unstable.
Original PR description
This commit makes it so that in the case of unsuccessful peer-to-peer connections, the client will request to the Odoo server to upgrade the channel with a SFU. backport of: odoo/odoo#200122 and odoo/odoo#206411
The self-ordering interface has been simplified by removing visual clutter from the desktop QR code button and moving mobile QR code access into the menu. Settings are also clearer, with a renamed Settings action and a new option for free metal or wood stand references.
Original PR description
In this commit: ------------------- - Removed the QR code icon from the desktop view of the `Get QR Code` button. - Moved the QR code button from the navbar into the burger menu for mobile view. - Added a new reference option `Free Metal / Wood Stands` in settings. - Renamed the `Edit` menu item to `Settings`, to make the button functionality clear from the label as it leads the user to the settings page for the selected config. task:5003448
Peppol configuration now handles service lookup errors gracefully, so temporary service endpoint problems no longer block access to the setup wizard. This ensures users can still perform important actions such as unregistering even when non-critical service information is unavailable.
Original PR description
Handle `api/peppol/2/get_services` errors gracefully, without blocking critical section of peppol functionnal flow (deletion). If the API endpoint for services returns an error (which should not be affecting any users), the whole peppol config wizard is no longer accessible. The users will therefore not be able to unregister. no-task 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
Creating repair orders is now much faster when the system has a very large number of quality rules to evaluate. This reduces long waits or timeouts for businesses using quality checks in repair workflows.
Original PR description
Description ----------- Creating a repair creates new `quality.check` based on `quality. point`s. When you have many matching points to explore, the `filtered_domain` can be pretty slow when processing linear the records to compute the intersection between the all points and the points that should be associated with the repair. This commit rewrites `_create_quality_checks_for_repair` to use a `search` instead if necessary, to offload the intersection search in the database. We also split the ids to not inject a large list of ids in the query. Benchmark --------- For a database that will have 500k `quality.point` that satisfies the domain of `quality.point._get_domain`, the invocation of `_create_quality_checks_for_repair` for creating a Repair takes (excluding the `create` call time): | | Before | After | |---------|------------------|-------| | Timings | Timeout (15+min) | 1 min | Reference --------- opw-4980036
Point of Sale configurations can now use an Epson printer serial number to automatically determine the secure certificate domain. This reduces manual setup work and helps stores connect to supported Epson receipt printers over HTTPS more reliably.
Original PR description
On EPSON printers, we can enable an option ('Automatic Certificate Update') to get a certified (https) url resolving to the ip address of the printer. This domain is computed based on the serial number of the printer.
We updated the configuration to compute the domain if a serial number has been provided instead of an IP address or an url.
Task: 4384790Italian e-invoice imports now keep the document type from supplier bill XML files without relying on whether the invoice is incoming or outgoing. This reduces duplicate document type records and helps invoices map to the correct official document classification more consistently.
Original PR description
In the FatturaPA XML, the Document Type (Tipo Documento) doesn't indicate the direction of the journal entry. A `TD01` can be an `in_invoice` or `out_invoice` depending on whether the company is set to be the seller or the buyer. That's what we consider when importing invoices from the EDI. - saved the `l10n_it_document_type` from the imported bills' XML - removed the filter in the view - removed the `l10n_it_document_type` duplicates that just differed by `l10n_it_document_type.type` - updated the invoices to point to the original `l10n_it_document_type` if there were duplicates We will have to remove the field in `master` See odoo/upgrade#8484 Forward-Port-Of: odoo/odoo#225425