Daily updates from Odoo
Wednesday, July 8, 2026
20 changes · master
New functionality added to Odoo
Singapore companies can now use SFRS-compliant balance sheet and profit and loss reports directly in Odoo. This helps local businesses prepare financial statements aligned with Singapore reporting requirements with less manual setup.
Original PR description
Add the SFRS-compliant balance sheet and profit and loss reports for the Singapore localization. task-6159102
Enhancements to existing features
The Philippine payroll module now defines which payroll data should be kept up to date automatically. This helps ensure standard salary rules stay current through the scheduled payroll update process, reducing manual maintenance for customers.
Original PR description
Currently, the "Payroll: Update data" cron doesn't work for HK payroll as we never set up the _get_data_files_to_update. We can set up the list of data files to keep up to date to better support our users by automatically keeping non-edited salary rules up to date. task-6360470 Forward-Port-Of: odoo/enterprise#122781
Resolved issues and error corrections
Creating a worksheet template from Field Service and opening it in Studio now correctly links the new template back to the related task or project. This prevents users from losing the selected worksheet setup after closing Studio and returning to their work.
Original PR description
Steps to reproduce: - Open Field Service - Go to any task and create a work sheet on the fly - In the wizard click on Design Template - Close the studio and go back to task Issue: - You can see that…
Steps to reproduce: - Open Field Service - Go to any task and create a work sheet on the fly - In the wizard click on Design Template - Close the studio and go back to task Issue: - You can see that the newly created worksheet is not set Cause: - The reason for not getting set is due to fact that worksheet template is created after we click on Design Template which is a widget of view_widgets. - Therefore the field doesn't get dirty and doesn't get saved. Solution: - By sending a ORM write method that links the worksheet based on res_id and res_model. Technical: - The primary cause the problem occurs is that the worksheet template id is not getting created so worksheet_template_id in the respective model(i.e., project.task or project.project for now) is not getting dirty and the record (project.task or project.project) is not getting saved. - The worksheet template when clicked on "Design Template" button is created with in the widget which redirects to Studio for designing template. - We give the user/dev a chance to pass changed/tampered field name with in the context. - While trying to link worksheet template we check if we received field name from context or else go with default name "worksheet_template_id". - If the write(linnking fails) when throw a error notification as "The worksheet template field name seems to be tampered with, pass it in the context as <b>default_worksheet_template_field_name</b>" Also the only fly creation of worksheet is available only in industry_fsm_report but when it added in other modules such as maintenance this cause the same problem in all the other modules as well when we add Design Template Button. task-3871593
Creating a worksheet template from a service task now properly attaches it to the task after returning from the design screen. This prevents users from losing their newly created worksheet selection and helps the same flow work reliably in other worksheet-enabled areas such as maintenance.
Original PR description
Steps to reproduce: - Open Field Service - Go to any task and create a work sheet on the fly - In the wizard click on Design Template - Close the studio and go back to task Issue: - You can see that the newly created worksheet is not set Cause: - The reason for not getting set is due to fact that worksheet template is created after we click on Design Template which is a widget of view_widgets. - Therefore the field doesn't get dirty and doesn't get saved. Solution: - By sending a ORM write method that links the worksheet based on res_id and res_model. Also the only fly creation of worksheet is available only in industry_fsm_report but when it added in other modules such as maintenance this cause the same problem in all the other modules as well. task-3871593
The document selection window no longer shows document management actions that are not relevant when choosing files to attach or link. This reduces confusion and helps users focus on selecting the right documents.
Original PR description
When selecting documents for attachment/link, control panel actions were displayed upon selection. The document selection dialog uses the secondary documents view introduced in: https://github.com/odoo/enterprise/pull/89030/changes/f93c159c106d1dde70910ec590f8739e549b19cf Several document management actions were already hidden through the `documents_view_secondary` context, but `DocumentsAction` was still displayed upon selection. Hide `DocumentsAction` in the secondary view. Task-6236888 Forward-Port-Of: odoo/enterprise#122536 Forward-Port-Of: odoo/enterprise#119219
This fix ensures the recruitment reports feature includes the required component for cohort reporting. It prevents installation failures in specific setup scenarios, helping deployments complete smoothly.
Original PR description
installing hr_recruitment_reports with the --ski-auto-install flag causes an error. The error happens because it does not explicitly depend on web_cohort while displaying a cohort view. task-6352888 runbot_error-237854 Forward-Port-Of: odoo/enterprise#122432
The chatter now correctly shows the AI icon while an AI response is being prepared. This fixes a small visual issue so users can clearly recognize when the activity comes from the AI assistant.
Original PR description
This PR fixes an issue where the AI icon would not be shown on the thinking note of the chatter. The OWL3 migration added 'this.' prefixes to all template component references. This left 'isAiAgentChat' and 'props.channel' as bare context lookups (`ctx['isAiAgentChat']`, `ctx['props']`), both of which are undefined in the new rendering context. The fix adds 'this' in the xml to go through ctx['this'] to fetch each values correctly. task: 6346446 Forward-Port-Of: odoo/enterprise#122741
This update fixes an access problem affecting employee type handling in payroll tests. It helps keep payroll-related validation reliable and reduces the risk of incorrect test failures during development.
Original PR description
task-6348716 Forward-Port-Of: odoo/enterprise#122693 Forward-Port-Of: odoo/enterprise#122264
The invoice outstanding payments widget now displays payments in a consistent newest-first order using payment date and ID. This reduces confusion when users review available payments on invoices.
Original PR description
Before this commit: The invoice outstanding payments widget was not sorted by date globally, which could lead to confusion for users when viewing the widget. After this commit: This commit adds a sorting mechanism to ensure that the payments are displayed in descending order based on their date and ID. opw-6254080 Forward-Port-Of: odoo/enterprise#122964 Forward-Port-Of: odoo/enterprise#121642
Fixed an error that occurred when users clicked the AI button while preparing a signature request. This ensures the signature sending workflow remains usable and avoids disruption for users relying on AI assistance in the wizard.
Original PR description
Version: saas-19.3 Steps to Reproduce: 1. Open a sign template and click "Send" 2. Click the AI button in the wizard Issue: Clicking the AI button raises ValueError: "The record must inherit from 'mail.thread'". Cause: `sign.template` does not inherit `mail.thread`, but interfaceKey `mail_composer` requires it. Fix: Added `get interfaceKey()` to `MailComposerChatGPT` so subclasses can override it. `SignAIButton` in `sign_ai` overrides interfaceKey to `html_field_record`. Taskid: 6303226 Forward-Port-Of: odoo/enterprise#120659
Users can now audit Balance Sheet values when the report is grouped by analytic account without encountering an error. This keeps financial report drill-downs reliable and prevents interruptions during accounting analysis.
Original PR description
Currently an error occurs when user tries to audit a cell when Balance Sheet is grouped by an analytic acccount. Steps to replicate: - Install accountant with demo data and turn on Analytic…
Currently an error occurs when user tries to audit a cell when Balance Sheet is grouped by an analytic acccount.
Steps to replicate:
- Install accountant with demo data and turn on Analytic Accounting.
- Open Balance Sheet Report > Group By an Analytic Account > Click on Any Value under an Analytic Account Column.
Error:
```
File '/home/odoo/src/enterprise/saas-19.3/account_reports/models/account_report.py', line 2876, in dispatch_report_action
return report_method(model, *args)
File '/home/odoo/src/enterprise/saas-19.3/account_reports/models/balance_sheet.py', line 28, in action_audit_cell
action['context'].update({
AttributeError: 'str' object has no attribute 'update'
```
Cause:
- When clicking on a report cell, `dispatch_report_action()` calls `action_audit_cell()` of the corresponding report (Balance Sheet in this case) which in turn calls `action_audit_cell()` of `account.analytic.report`.
- When the flow reaches [1], the window action for analytic items is fetched, where its [context] is returned as a string instead of a dictionary.
- This action is then received [here] with `context` as a string, and attempting to update it results in an error.
Solution:
- Converted the string to dict using `literal_eval()`.
[1]: https://github.com/odoo/enterprise/blob/a26981667361839ad38f45da5a6f23ae8e6478f1/account_reports/models/account_analytic_report.py#L208
[context]: https://github.com/odoo/odoo/blob/824446b65cbe3850f88f56090f0473f0e94bf4f3/addons/account/views/account_analytic_line_views.xml#L88-L91
[here]: https://github.com/odoo/enterprise/blob/b5f884a49344aa097c20fc128e9d290b97970f1a/account_reports/models/balance_sheet.py#L28
opw-6311673
sentry-7513784149
Forward-Port-Of: odoo/enterprise#120734Order changes in Point of Sale are now sent to preparation displays, so kitchen or preparation teams see the latest order information without missing updates. This helps reduce confusion and keeps fulfillment aligned with what was changed at the register.
Original PR description
Before this commit, when an order change was updated, the pdis were not notified of the change. This commit adds a call to the `_send_load_orders_message` method of the pdis to notify them of the change. Forward-Port-Of: odoo/enterprise#122592
Restaurant preparation displays are now updated when a combo meal is split back into individual items, without printing duplicate kitchen tickets or triggering unnecessary alerts. The fix also ensures course labels appear on floating orders and that displays only receive items from their configured product categories.
Original PR description
Issue: Breaking a combo back into individual lines was not notifying the preparation display. Fix: breakCombo now go through sendOrderInPreparation (with byPassPrint) the preparation display is updated and no ticket is printed. To avoid triggering a sound and a kitchen ticket for a reorganization the kitchen already knows about, thread a `silent` context flag through sendOrderInPreparation down to _send_load_orders_message. Forward-Port-Of: odoo/enterprise#118690
EC Sales List returns are now generated for each company in a tax unit using that company's own VAT number, instead of combining all members under the tax unit VAT number. This helps businesses submit the correct declarations for each legal entity and avoid consolidated reporting where it is not expected.
Original PR description
Issue: The EC Sales List return is currently generated under the tax unit VAT number, consolidating all member entities into a single declaration. Expected: The EC Sales List return must be generated individually per member entity, each under their own VAT number, even when those entities belong to a tax Unit. Fix: Apply tax unit only if report's multi company filter is `tax_units`. Ref: https://github.com/odoo/enterprise/blob/07e8aba8604319747a5925c83576095ce9a63f9e/account_reports/models/account_return.py#L316-L317 task-6069402 Forward-Port-Of: odoo/enterprise#115974
Fixes Envia delivery insurance so insured shipments communicate the insurance service in the format Envia expects. This helps ensure customers using insured Envia delivery methods receive the correct insurance documentation when validating deliveries.
Original PR description
Issue ----- Insurance set on the delivery method is not correctly being communicated to Envia. Steps to reproduce ----- - Create a MX company - Set up Envia - Fedex Nacional Economico (ground) - 10% insurance - Create a MX client - Create a product (with some weight) - Create a SO using the delivery method & confirm - Validate the picking > No insurance pdf is being printed Cause ----- We are passing the insurance value as a `insurance` field on the shipment, which is not what the API expects. We should instead pass it in `additionalServices` as shown in the example of https://docs.envia.com/docs/additional-services#how-to-add-services-to-a-shipment ----- Ticket: opw-5254952 Forward-Port-Of: odoo/enterprise#121691 Forward-Port-Of: odoo/enterprise#118966
This fix prevents small rounding differences in attendance calculations from creating overlapping overtime entries. It helps ensure employee work entries remain accurate, especially for overnight shifts or shifts ending around midnight.
Original PR description
__Issue:__ `duration` is rounded to 3 decimals (~1.8s drift) while `time_stop` is exact, so the back-projected start could land before midnight on overnight overtime or middle of the day causing overlaps with the previous line Example: - time_start = 03/05 00:00:00 - time_stop = 03/05 07:07:14 actual duration 7h07m14s gets stored as `duration = 7.121` (= 7h07m15.6s) after `round(_, 3)`. Back-projection yields `datetime_start = 07:07:14 - 7.121h = 02/05 23:59:58`, overlapping by ~2s with the prior line ending at `02/05 23:59:59.999`. __Fix:__ Sort lines by `time_stop` within each date and clamp `datetime_start` to the previously emitted interval's stop when the two intervals genuinely intersect. opw-6170828 Forward-Port-Of: odoo/enterprise#122509 Forward-Port-Of: odoo/enterprise#116565
Swiss payroll now automatically computes the required 2050 salary rule value during ELM transmission. This reduces manual payroll corrections and helps ensure Swiss salary reporting is more accurate.
Original PR description
task-5166226 Forward-Port-Of: odoo/enterprise#108047 Forward-Port-Of: odoo/enterprise#103453
The payroll payrun chatter panel and button will no longer appear in unrelated payroll views such as Time Offs. This prevents confusion by keeping payrun-specific discussion tools limited to the correct payrun screens.
Original PR description
The global `PayRunChatterService` was leaking state across shared views, causing the chatter panel and button to appear on views accessed outside the PayRun layout (e.g., via the main Payroll > Time Offs menu). Fix this by introducing a `useEffect` hook in `PayRunLayout` that checks for a valid `payrun_id` or `payRunReactive` state on view render. If absent, the chatter service state is explicitly reset and closed. The control panel button is also wrapped in a contextual `t-if` check, fully isolating the feature to its intended screens. Task : 6347871
Code cleanup and technical improvements
The Swedish SIE import tool was adjusted internally so related behavior can be extended more easily in the future. This does not introduce a user-facing change, but it improves maintainability for businesses that rely on custom accounting import flows.
Original PR description
We changed some tools to be regular model method to allow inheritance. task-none Forward-Port-Of: odoo/enterprise#121862
This update keeps the Studio view editor working reliably as the underlying web framework evolves. It replaces an outdated internal mechanism with the supported approach while preserving behavior such as restoring selected elements, keeping the sidebar in sync, and unblocking the interface after edits.
Original PR description
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useEffect` (OWL3's reactive effect) was tried first but caused regressions: it runs eagerly…
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useEffect` (OWL3's reactive effect) was tried first but caused regressions: it runs eagerly during `setup()` before mount, so `updateActiveNode`'s call to `viewRenderer.el.querySelectorAll` hit a null element. `onMounted` + `onPatched` restore the exact post-DOM-patch timing of the former `useLayoutEffect`, making the behaviour correct without any reactive-subscription machinery. `activeNodeXpath` is read inside `onPatched` but that hook is not a reactive context, so reads are naturally untracked — matching the original `untrack` wrapper. The `isInEdition` reset is written through `toRaw(viewEditorModel)` so the setter side-effect (`ui.unblock()`) still fires while no re-render is scheduled, avoiding an infinite patch loop. 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 and element - @web_studio/view_editors/interactive_editor/blockUI not removed just after rename - @web_studio/view_editors/interactive_editor_sidebar/update sidebar after edition see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2602194/build/115250513