Daily updates from Odoo
Tuesday, August 4, 2026
18 changes · master
Enhancements to existing features
The website builder now shows a proper preview image for the AI live chat snippet, even when live chat is not installed. Users can also preview the fallback contact button on hover, making the editing experience clearer and more consistent.
Original PR description
*:ai_website_livechat Problems: 1) There's no preview of the livechat snippet in the website builder. If ai_website is installed but not livechat, there's no preview image for the snippet resulting in a cluttered and inconsistent UX. 2) There is no preview on hover for the livechat preview button. Unlike other odoo builder options, the user cannot see what the livechat preview button would look like if hovered over. Solutions: 1) An image has been added `ai_livechat.png` which is shown on preview 2) The AI livechat fallback is previewable and defaults to "Contact Us" linking to the /contactus page. Task-5248712
This updates internal tests for the rental website planning feature to match recent Google Analytics 4 tracking behavior. It helps keep automated checks reliable when analytics tracking is enabled, with no expected change for day-to-day users.
Original PR description
`tracking_info` is now only computed when `google_analytics_key` is set, and `item_id` now uses the template id as a string rather than the variant id as an integer. Set the key in `setUpClass` and update assertions accordingly. See : - https://github.com/odoo/odoo/pull/253856
The manufacturing work order display was slightly simplified by moving an internal setting to the main screen component instead of sharing it more broadly. This reduces unnecessary internal complexity without changing how users interact with the feature.
Original PR description
This commit removes localStorageName from env. It was added in the env but never used in child components so it can be set on the root component.
Resolved issues and error corrections
Restored automated checks for online payment flows in self-order and kiosk preparation display scenarios. This helps ensure payment journeys continue to work correctly and reduces the risk of regressions reaching customers.
Original PR description
The four online payment preparation display tests were skipped because their tour never reached the online payment step. - Register the tour, and the `pos_self_order` tour utils it imports, in `web.assets_tests`. The tour leaves the self-order SPA for the `/pos/pay/<id>` payment portal page, where only the frontend bundle is loaded, so without this the tour is gone from the registry as soon as the page is unloaded. - Make the "Pay" step use `expectUnloadPage: true` and wait for the payment portal submit button, so the tour actually reaches the payment page instead of ending on the self-order page. - Use the `test_online_payment_kiosk_qr_code` tour for the two kiosk tests, which stay in the kiosk and check the QR code. - Unskip the four tests and move their duplicated setup into a kiosk and a self-order helper. task-id: 6244255
The Timesheet Assistant no longer suggests calendar events marked as available. This keeps recommendations focused on events that may need timesheet entries and reduces distractions for users.
Original PR description
## Previous Behavior In the Timesheet Assistant view, calendar events marked as *available* were still being suggested. These events are not intended to be timesheeted and should not appear in the assistant’s recommendations. Their presence could also obscure more relevant events that require user attention. ## New Expected Behavior Calendar events marked as *available* are now excluded from Timesheet Assistant suggestions. task-[6431591](https://www.odoo.com/odoo/project/4105/tasks/6431591) Forward-Port-Of: odoo/enterprise#126183
The expense Stripe cardholder field now uses the standard setup for selection fields, ensuring filters defined in the view are applied correctly. This prevents users from seeing or choosing inappropriate cardholder records when managing expense card details.
Original PR description
After https://github.com/odoo/odoo/issues/196785; the standard way to build a custom m2o field in JS is to call a method from the Many2one module, instead of extending an object from it. This commit solves issues regarding domain in the view not being passed to the widget opw-6399906 Forward-Port-Of: odoo/enterprise#125346
This change corrects how Timesheet Grid recognizes Discuss-related rules so notification count badges do not interfere with matching. It helps ensure the intended automation or guidance continues to work reliably when users have unread notifications.
Original PR description
task: 6416889 Forward-Port-Of: odoo/enterprise#125877 Forward-Port-Of: odoo/enterprise#125519
The Field Service planning map now checks assignments more reliably before showing the routing popup. This prevents errors when planning groups contain unassigned work or translated labels, improving stability for schedulers.
Original PR description
This commit fixes an issue where we search the resources' types in a group's records, possibly not having any resource. Prior to this commit, a condition filtered out the "None" group. However, this causes three issues: 1. The condition does not consider translations (so this would fail for the "None" group in French for instance); 2. If there is any other group than Open Shifts not having resources, this would fail. 3. If there is another group that does not belong to a resource or to Open Shifts that has some records without resources, we should not display the popup. Instead, we dynamically check whether the groupId is part of the resource_ids of *every* group's record in order to display the popup. no-task Forward-Port-Of: odoo/enterprise#126394
The printer selection popup now correctly limits choices to printers assigned for the report. This helps users choose the right printer and avoids accidental printing to unrelated devices.
Original PR description
This commit fixes the domain for the printer selection popup when printing a report. The assigned printers were not taken into account. task-6332442 Forward-Port-Of: odoo/enterprise#122404
The timesheet assistant now keeps its suggestions aligned with the date the user most recently selected, even when switching dates quickly. This prevents outdated suggestions from another day appearing due to delayed background requests.
Original PR description
Before this commit, when the user hits multiple times the arrow button to change the date displayed in timesheet assistant, the suggestions displayed could be the suggestions from another day because a rpc is made each time the user changes the date and amoung all rpcs call, the one which takes more time then the one will be taken but it is not necessary the date shown in the view. This commit uses `KeepLast` class to avoid the concurrency issue with those rpcs to be able to always take the last rpc call to get the data. Forward-Port-Of: odoo/enterprise#126323 Forward-Port-Of: odoo/enterprise#126283
This fix prevents an error when creating a Hong Kong payslip for an employee whose contract start date is missing. Payroll users can now select the employee and continue payslip preparation without the system crashing, while existing handling for missing dates remains in place.
Original PR description
Currently, an error occurs when a user sets an employee on a payslip. **Steps to Reproduce:** - Install `l10n_hk_hr_payroll` with demo data. - Switch to the `Hong Kong` company. - Create an…
Currently, an error occurs when a user sets an employee on a payslip. **Steps to Reproduce:** - Install `l10n_hk_hr_payroll` with demo data. - Switch to the `Hong Kong` company. - Create an `employee` and make sure that the employee's version has no `contract start date`. - Go to `Payroll` > `Payslips` > `Payslips`. - Create a `payslip` and set that employee. `TypeError: '<' not supported between instances of 'datetime.date' and 'bool'` When a user sets an employee on a payslip, the system computes the worked day lines [1]. If the salary structure uses worked day lines, it creates the corresponding records [2] and calculates out days and out hours based on the contract dates. During this process, the payslip dates are compared with the version's contract start date. If the version does not have a contract start date, it raises an error [3]. This commit ensures that the payslip dates are compared with the version's contract start date, and that out days and out hours are calculated only when the contract start date exists. Cases where no contract start date is defined are already handled in payslip [4]. [1]: https://github.com/odoo/enterprise/blob/03787659236cbcb46c27acebf410ee3d1e9eb15c/hr_payroll/models/hr_payslip.py#L1964 [2]: https://github.com/odoo/enterprise/blob/03787659236cbcb46c27acebf410ee3d1e9eb15c/hr_payroll/models/hr_payslip.py#L1985-L1988 [3]- https://github.com/odoo/enterprise/blob/03787659236cbcb46c27acebf410ee3d1e9eb15c/l10n_hk_hr_payroll/models/hr_payslip.py#L309 [4]- https://github.com/odoo/enterprise/blob/03787659236cbcb46c27acebf410ee3d1e9eb15c/hr_payroll/models/hr_payslip.py#L1092-L1096 sentry-7632216317 Forward-Port-Of: odoo/enterprise#120234
The Argentine electronic invoicing test setup was adjusted so a live currency-rate check is not run during daily builds that block external web requests. This prevents avoidable build failures while still allowing the check to run in nightly testing with the right access.
Original PR description
Description of the issue this commit addresses: The live ARCA currency rate test keeps the inherited `standard` tag. It is therefore selected by daily builds whose HTTP guard blocks the request. The guard also blocks it when selected by the external localization suite. --- Desired behavior after this commit is merged: This commit removes the `standard` tag from the live ARCA test. Daily builds skip the test while nightlies still run it with HTTP access. --- runbot-[238857](https://runbot.odoo.com/odoo/error/238857) Forward-Port-Of: odoo/enterprise#125692
Date and date-time fields are now hidden from the column selection popover once they have already been added, just like other fields. This prevents duplicate columns from being created and avoids inconsistent spreadsheet behavior for users configuring list views.
Original PR description
Current behavior before PR: - Date and datetime fields remained visible in the popover after being added as columns, allowing the same field to be added multiple times. - Since column fields do not consider granularity, allowing duplicate date fields could create duplicate IDs and inconsistent behavior. Desired behavior after PR is merged: - Treat date and datetime fields the same as other column fields when determining which fields to display in the popover. - Once a date or datetime field is added as a column, it is no longer shown in the popover to prevent duplicate IDs. Task: [6295794](https://www.odoo.com/odoo/project/2328/tasks/6295794) Forward-Port-Of: odoo/enterprise#123463
This fix makes automated tests for assigning planning resources more stable by avoiding timing-related selection mistakes. It helps reduce false test failures, supporting smoother validation and delivery of Planning field service changes.
Original PR description
This commit fixes undeterministic failures in the `many2many_avatar_resource` tests. Previously, resources were added by typing its name, waiting for the list to update and clicking on the resource. However, `edit` auto-completes with some delay, thereby resulting in random errors where the first resource from the list was added. Instead, we let the `edit` autocomplete to run in order to add a resource, ensuring the first resource from the list is not added as a consequence. runbot-error-941174 Forward-Port-Of: odoo/enterprise#126482
This fix makes Dominican Republic 606 report tests use a consistent document setup instead of depending on which optional modules happen to be installed. It also stabilizes reversal dates, reducing false test failures and helping keep report behavior reliable for customers using either configuration.
Original PR description
Whether DO journals use LATAM fiscal documents depends on `l10n_do_edi` being installed: it is what supplies the `_localization_use_documents` override for DO. l10n_do_reports doesn't depend on it, so the tests inherited whichever configuration the build happened to install, and only went red on the per-module build. Without the EDI module the reversal's `ecf_34` document type produced the name "E34 B0400000001", which the yearly sequence regex reads as year 34; checked against a 2024 date, the sequence constraint rejects it on post. Pin the flag explicitly instead, and run the assertions against both configurations, since customers run both: the NCF is read off the fiscal document number with e-CF, and off the reference without it. Also pin the reversal's accounting date. Left out, `_get_accounting_date` pushes it to the end of the month once the invoice date is in the past, which made the test depend on the date it ran. runbot-error-944488
Code cleanup and technical improvements
The VOIP audio manager now tracks changes to call and audio settings in a cleaner way, ensuring observers are properly cleaned up when no longer needed. This reduces the risk of hidden background work building up over time without changing the user-facing calling experience.
Original PR description
Enterprise counterpart of "[REF] mail: drop the onChange queue for owl effects", which explains the API. Before this commit, the audio manager observes three fields by name and drops the dispose function each observer returns, so nothing ever stops those observers. This commit turns the three observers into dependency lists on the rtc and settings records, keeping `initialRun: false`: the refresh at the end of setup does the initial sync. The records dispose these observers. The audio manager tests take the real store: a fake store has no record to observe. One of them counted the calls to `enumerateDevices` to know that the status was refreshed, and with the real store there are two audio managers, the one of the voip service and the one the test builds, both enumerating the devices. That test counts the refreshes of its own manager instead. https://github.com/odoo/odoo/pull/279818
This update renames internal enrollment-related campaign fields to make their purpose clearer and easier to maintain. It also adds safeguards around the enrollment uniqueness field so future campaign setup is more reliable, with no intended change to user-facing behavior.
Original PR description
In order to ease understanding, prepare future changes and ease grep through code, rename enroll-specific fields on campaign model * domain -> enroll_domain * unique_field_id -> enroll_unique_field_id No functional change should come with this PR. Task- Prepares Task-
VoIP configuration such as credentials, device number, and do-not-disturb timing is now read from the dedicated user settings record instead of a mixed local settings area. This aligns VoIP with the newer settings structure, making preferences clearer and easier to maintain without changing the visible user experience.
Original PR description
Before this commit, the voip columns of res.users.settings were read off store.settings, the record that mixed the server row with the local preferences of the device. Reminder that the mail counterpart of this commit splits the two: res.users.settings becomes a record of its own, reached from its owner, store.self_user.res_users_settings_id, and store.settings keeps only the local preferences. This commit declares the voip columns on that record, sends them through _store_settings_fields, and reads a credential, the device number and the do-not-disturb time off it. Note that the field declarations sit in core/common, reachable from every bundle, while the behavior stays in core/web. https://github.com/odoo/odoo/pull/279128