Daily updates from Odoo
Friday, July 10, 2026
35 changes · master
Enhancements to existing features
Point of Sale screens and related add-ons now include more complete translations for messages that staff may see during daily use. This improves clarity for users working in different languages, especially for dialogs, errors, alerts, and warnings.
Original PR description
pos* = All POS module In this commit: -------------------------------- Add missing translations for user-visible strings across POS modules. - Translated dialogs, errors, alerts, and other UI-visible messages - Updated Python-side UserError, ValidationError, and warning messages Task-5406947 Related PR-https://github.com/odoo/odoo/pull/239972 Forward-Port-Of: odoo/enterprise#122764 Forward-Port-Of: odoo/enterprise#102094
This update adds automated checks to ensure emails linked to newly generated coupons from helpdesk tickets remain traceable. It helps protect the reliability of customer communication history without changing day-to-day user workflows.
Original PR description
Added tests for email traceability when generating a new coupon in a ticket --- task-6341030 Forward-Port-Of: odoo/enterprise#122508
The printer setup screen now only shows the O-Box IP address setting when it is relevant for ePOS printers. It also hides technical service details from the O-Box view, making configuration clearer for business users.
Original PR description
This PR adapts the view to only allow the user to set obox ip if the type of printer used is epos as it doesnt matter otherwise It also hides the services installed on the obox as it's not useful for the user task-6330864 Forward-Port-Of: odoo/enterprise#123271
The Grid and Gantt views were updated to work with a newer internal rendering method. This helps keep these views reliable and easier to maintain, with no expected change to day-to-day workflows.
Original PR description
- community: https://github.com/odoo/odoo/pull/273956 This commit follows changes in the `useVirtualGrid` hook regarding reactivity. The users of this hook, namely: the Gantt and Grid views' renderers, have been adapted to use its new API.
The PLM document view has been adjusted to better match the updated document management layout. This removes an unnecessary “Variant” banner and helps documents display and integrate more cleanly for users.
Original PR description
The goal is to remove the “Variant” banner and ensure the XPath follows the new document view structure so it can integrate properly. PR: https://github.com/odoo/odoo/pull/259695 upgrade PR: https://github.com/odoo/upgrade/pull/9990 task-5946575
The subscription portal now shows the “Change Plan” option as a lighter, less prominent button. This better reflects that changing plans is optional and helps avoid nudging customers toward an unintended action.
Original PR description
When changing the plan is allowed from the portal, a "Change Plan" button is shown in the subscription sidebar. It was styled as a primary button, which wrongly suggests to the customer that this is an action they are expected to take. Make it a light button instead. task-6280700
The WhatsApp message status icon now appears before message actions, keeping it in a consistent spot. This makes message threads easier to scan and improves readability for users.
Original PR description
Display the WhatsApp message status icon before the message actions to keep it consistently positioned and improve message readability. **before:** <img width="581" height="108" alt="image" src="https://github.com/user-attachments/assets/3971d86d-6210-4d26-87ca-88f425dd090d" /> **after** <img width="341" height="164" alt="image" src="https://github.com/user-attachments/assets/503f2861-34bf-4371-8ccd-4e1c6bc3f874" /> task-6085748
The Knowledge options dropdown has been simplified by removing non-essential icons while keeping menu text neatly aligned. The “Move To” action label was also clarified as “Move To...”, making the menu easier to scan without changing its functionality.
Original PR description
This commit removes non-essential icons from the knowledge options dropdown. It adds an invisible icon class to keep text alignment consistent and updates the "Move To" label to "Move To...". Related: odoo/odoo#271256 Task~6279545
Resolved issues and error corrections
Marketing Automation now shows the correct reason when a participant is removed from a campaign. If a record still exists but no longer matches the campaign filter, users will see that explanation instead of the misleading “Record deleted” message.
Original PR description
`sync_participants` calls `action_set_unlink` on every participant whose record is no longer in the campaign domain, and `action_set_unlink` writes "Record deleted" on each scheduled trace. The…
`sync_participants` calls `action_set_unlink` on every participant whose record is no longer in the campaign domain, and `action_set_unlink` writes "Record deleted" on each scheduled trace. The removed bucket also contains records that still exist but no longer match the campaign filter, so the cancelled trace dialog shows "Record deleted" even when the record was only filtered out. In `sync_participants`, the to_remove participants are split between those whose record still exists in the database (filtered out by the campaign domain) and those whose record was actually deleted. `action_set_unlink` accepts an optional `trace_message` argument, defaulting to "Record deleted", and the filtered-out batch passes "Record no longer matches campaign filter" so the cancelled trace dialog reflects the real cause. Steps to reproduce: 1. Install Marketing Automation and CRM. 2. Open Marketing Automation, create a campaign on Lead with filter Stage = New. 3. Add a begin activity to the workflow. 4. Open CRM, create a Lead in the New stage. 5. Back in the campaign, click Generate Participants. 6. In the CRM pipeline, drag the Lead from New to Qualified. 7. Back in the campaign, click Generate Participants again. 8. Open the Participants smart button, click the participant for the moved Lead. 9. Click the cancelled activity in the workflow timeline. => The activity dialog shows "Error message: Record deleted" although the Lead still exists. Ticket [link](https://www.odoo.com/odoo/project/49/tasks/6251264) opw-6251264 Forward-Port-Of: odoo/enterprise#118692
This fix prevents delivery tracking from failing when EasyPost returns an empty tracker value. Users can continue working without seeing an error caused by incomplete carrier response data.
Original PR description
The PR https://github.com/odoo/enterprise/pull/111833 handled the specific case when the tracker data is missing from the EasyPost response, however in certain cases `tracker` key exists, but it has a `None` value, which leads to a traceback when trying to access the stock move:
```
File "/home/odoo/src/enterprise/18.0/delivery_easypost/models/easypost_request.py", line 392, in get_tracking_link
public_url = shipment.get('tracker', {}).get('public_url')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
```
This commit provides a fallback to avoid getting the error from the side of the user.
opw-6270242
Forward-Port-Of: odoo/enterprise#119400Hong Kong payroll payslips no longer crash when a user clears the start or end date. This helps payroll users safely edit draft payslips and keeps Average Daily Wage and end-of-year pay calculations from running on incomplete date information.
Original PR description
Currently, an error occurs when a user removes the payslip date. **Steps to Reproduce:** - Install `l10n_hk_hr_payroll` with demo data. - Switch to the `Hong Kong` company. - Go to `Payroll` >…
Currently, an error occurs when a user removes the payslip date. **Steps to Reproduce:** - Install `l10n_hk_hr_payroll` with demo data. - Switch to the `Hong Kong` company. - Go to `Payroll` > `Payslips` > `Payslips`. - Create a `payslip` and remove the `start` or `end` period. **Error 1:** `TypeError: unsupported operand type(s) for +: 'bool' and 'relativedelta'` **Error2:** `AttributeError: 'bool' object has no attribute 'month'` When a user removes the start or end date of a payslip, the system computes the Average Daily Wage. Based on the payslip dates, it finds the previous year's payslips [1]. If the start or end date is not set, it raises an error [2]. For the second error, when computing whether to include EOY pay, it compares the company's EOY pay date with the end date's month. If the end date is not set, accessing its month raises an error [3]. This commit ensures that when retrieving previous-year payslips, if the start or end date is not set, it returns an empty payslip recordset. It also ensures that when computing whether to include EOY pay, if the end date is not set, `include_eoy_pay` is set to `False`. [1]: https://github.com/odoo/enterprise/blob/ec8a009794863090351d91650aff727e6fbeab7e/l10n_hk_hr_payroll/models/hr_payslip.py#L124 [2]- https://github.com/odoo/enterprise/blob/ec8a009794863090351d91650aff727e6fbeab7e/l10n_hk_hr_payroll/models/hr_payslip.py#L209-L215 [3]- https://github.com/odoo/enterprise/blob/ec8a009794863090351d91650aff727e6fbeab7e/l10n_hk_hr_payroll/models/hr_payslip.py#L141 Forward-Port-Of: odoo/enterprise#123135 Forward-Port-Of: odoo/enterprise#120586
Popover content in dark mode now looks more consistent and easier to use. Secondary buttons stand out as clickable actions, and forms inside popovers better match the surrounding popover background.
Original PR description
Before this commit, content like form & secondary button rendered inside popovers had inconsistent styling in dark mode: - secondary buttons did not stand out properly from the popover background, making them look like plain text blocks rather than actionable buttons; - forms rendered inside popovers (such as the multi-create popover) kept their default background, which visually clashed with the popover background. This commit fixes these issues by: - adding dedicated secondary button background colors for popovers, including hover state; - aligning form backgrounds inside popovers with the popover background. task-6249985 Forward-Port-Of: odoo/enterprise#121631
The French Intrastat export wizard now opens warning links filtered to the specific journal entries with missing required Intrastat information. This prevents users from being sent to unrelated accounting entries, making correction of export issues faster and clearer.
Original PR description
Steps to reproduce: 1. Have a French company with intrastat report module installed 2. Create and validate a bill to another EU country, without filling out at least one of the required intrastat fields 3. Go to the intrastat report, and export it as XML DEBWEB2 4. In the export wizard, click on the internal links on the warning messages Issues: 1. In the Intrastat report in French localization, when there are missing values detected in the export, the Export Wizard shows internal links that lead to every journal entries - instead of showing only the relevant entries. The warning banner on the report uses the action action_invalid_code_moves which has a domain to limit what is shown on the view form. However in the method _fill_value_errors there was no domain. opw-6215339 Forward-Port-Of: odoo/enterprise#117997
Pasting document links into an empty message no longer adds an unnecessary blank line at the start. This keeps shared document messages tidier while still separating links from any existing text.
Original PR description
Before this commit, adding document links always prepended a line break before the generated links. When the composer was empty, this resulted in messages starting with an unnecessary blank line. This commit only inserts a line break when the composer already contains text, avoiding the extra spacing while preserving the separation between existing content and pasted links. task-[5947683](https://www.odoo.com/odoo/project/1519/tasks/5947683) Forward-Port-Of: odoo/enterprise#123201 Forward-Port-Of: odoo/enterprise#120952
A small compatibility fix keeps Knowledge file navigation behaving as expected in newer Chrome versions. This prevents browser changes from altering how scroll actions complete, reducing the risk of unexpected behavior for users.
Original PR description
Since Chrome 150, scrolling methods like `scrollIntoView()` return a Promise instead of `undefined`. This commit adds block braces to ensure the action returns `undefined` and keeps the same behavior as before. Reference: - https://chromestatus.com/feature/5082138340491264 - https://chromium.googlesource.com/chromium/src/+/50f3e3d0a9bc02aad8b8161dbdd59046991dd2c7 runbot-941309 Forward-Port-Of: odoo/enterprise#123231 Forward-Port-Of: odoo/enterprise#123031
Grid views now display the user-friendly label for grouped selection values when opening related records from the cell magnifier. This avoids confusing internal codes such as "non_billable" appearing in list titles, making the view easier to understand for users.
Original PR description
When grouping a grid view by a selection field and clicking on the cell magnifier, the list title showed the technical name (e.g. non_billable) instead of the display name (e.g. "Non Billable"). This commit adds a condition specifically for selection fields, ensuring that their display names are used. task-5980035 Forward-Port-Of: odoo/enterprise#122303 Forward-Port-Of: odoo/enterprise#120894
Fixed an issue in Accounting where choosing certain actions from the bank reconciliation control panel could fail with an error. Users can now use those actions reliably without being interrupted by a missing service problem.
Original PR description
Fixed an issue where selecting any action from the control panel that would use orm would result in an error because the orm service was undefined. no task id Forward-Port-Of: odoo/enterprise#123480
Payroll processing now evaluates only the warnings that apply to the payslips being computed, instead of checking every possible warning. This reduces unnecessary work and helps payroll calculations run more efficiently without changing the payroll results.
Original PR description
Ensure that we do not evaluate unnecessary warnings by only evaluating the warnings relevant to the payslips being computed; instead of evaluating all of them. task-6371828 Forward-Port-Of: odoo/enterprise#123401
The Swiss payroll time off request form now always shows the start date field. This prevents confusion and ensures employees can consistently enter the required date for any type of time off request.
Original PR description
The time off request view was showing the request_date_from field conditionally, which makes no sense as you would always need to pick a date for a time off no matter which unit the request uses. runbot-241099 Forward-Port-Of: odoo/enterprise#122278
This fix prevents AI markdown-related tests from failing when an optional markdown component is not installed. It keeps automated checks reliable without changing functionality for users.
Original PR description
markdown2 is an optional dependency, so `markdown_format` can fail to process markdown, in which case all the markdown tests fail. Skip the markdown rendering test if there's no markdown rendering to test. Forward-Port-Of: odoo/enterprise#123484 Forward-Port-Of: odoo/enterprise#123002
Downloading a Knowledge article as a PDF no longer includes unwanted scrollbars or an open menu overlay. This makes exported articles look cleaner and more professional, especially for longer content or when the browser is zoomed in.
Original PR description
The Download PDF option of an article prints the page with the browser. On screen, the article body is inside .o_scroll_view_lg, which scrolls when the content is longer than the screen:…
The Download PDF option of an article prints the page with the browser. On screen, the article body is inside .o_scroll_view_lg, which scrolls when the content is longer than the screen: https://github.com/odoo/enterprise/blob/79f8defa04476e1b939dc8bb5449a775137aed62/knowledge/static/src/scss/knowledge_views.scss#L170-L177 The print stylesheet used to force overflow: visible on every div, so this container did not scroll when printing. It also hid every child of the body except the action manager, so the navbar and open dropdowns were left out of the print. Commit https://github.com/odoo/enterprise/commit/69612c80ea0aec5ccf2c2857449da03e61273457 rewrote knowledge_print.scss to scope its rules to the Knowledge view and removed both rules. The scroll container now keeps its fixed height and its scrollbar when printing, so the scrollbar is drawn in the print preview and on every page of the PDF. The dropdown opened to reach Download PDF is printed on top of the article when it overlaps the page area, which happens when the browser is zoomed in. Add overflow: visible to the print rule of knowledge_print.scss that already targets .o_scroll_view and .o_scroll_view_lg with position: static. That rule exists to undo the screen positioning of the scroll containers when printing, so the overflow reset belongs there. Its selector is also more specific than the screen one, so the value applies without !important, like position: static already does. Restore the rule that hides the body children other than the action manager, scoped to the Knowledge view like the rest of the file since the print stylesheet is now loaded on every page. Before: <img width="497" height="703" alt="image" src="https://github.com/user-attachments/assets/44aa3366-3fc8-4382-8aa2-84625fa4b6d8" /> After: <img width="497" height="703" alt="image" src="https://github.com/user-attachments/assets/8b6eb2bc-37a3-4666-b871-0e6149c41fea" /> Steps to reproduce: 1. Open the Knowledge app and create an article 2. Paste enough text in the article to fill more than one PDF page 3. Zoom the browser to 200% 4. Click the three dots in the top right corner, then Download PDF 5. Check the print preview or the saved PDF => A scrollbar is drawn on the right edge of every page and the dropdown menu is printed on top of the article Ticket [link](https://www.odoo.com/odoo/project.task/6279174) opw-6279174 Forward-Port-Of: odoo/enterprise#120249
The website generator now links products to categories using unique identifiers instead of category names. This prevents products from being assigned to the wrong category when different categories share the same name, improving storefront accuracy.
Original PR description
Before we matched categories with products but names but this was less reliable in the case that we had multiple categories with the same name. e.g. Accessories (for men) and Accessories (for women). This new method allows for this and makes the matching more reliable. Forward-Port-Of: odoo/enterprise#122143
Employees with flexible or missing working schedules will no longer see misleading expected hours in the Timesheet Assistant or systray. The change keeps total logged hours visible while only showing expected hours when a fixed or average schedule makes them meaningful.
Original PR description
**Steps to reproduce:** 1. Create an employee without a fixed working schedule. 2. Configure the employee with variable hours per day, per week, or no working hours at all. 3. Open the Timesheet Assistant or the Timesheet systray. 4. Observe that expected hours are displayed (over 0h 00m or over 24h 00m). **Cause:** Expected working hours were always computed and displayed, even for resources without a fixed schedule. **Fix:** Only compute expected working hours when the employee has a fixed or average schedule, and rely on the computed working hours to control the display of expected hours while keeping total hours always visible. task-6321760 Forward-Port-Of: odoo/enterprise#123068 Forward-Port-Of: odoo/enterprise#122232
Helpdesk closing reminder emails are now sent only for tickets in stages that are actually configured for automatic closure. This prevents customers from receiving misleading warnings for tickets that will not be closed automatically.
Original PR description
**Problem:** When a team restricts automatic closing to specific stages (from_stage_ids), the closing-reminder email is still sent to every inactive ticket in the team, including tickets in stages…
**Problem:** When a team restricts automatic closing to specific stages (from_stage_ids), the closing-reminder email is still sent to every inactive ticket in the team, including tickets in stages that are never auto-closed. **Steps to reproduce:** 1. On a helpdesk team, enable Automatic Closing with a reminder and set "In Stages" (from_stage_ids) to one specific stage 2. Leave a ticket inactive in a different, non-folded stage until it reaches the reminder threshold (auto_close_day - reminder_delay) **Current behavior:** The ticket gets a "your ticket will be closed soon" reminder even though it is not in an auto-close stage and will never be closed. **Expected behavior:** Only tickets that would actually be auto-closed (those in from_stage_ids) should receive the reminder. **Cause of the issue:** The reminder selection filters on auto_close_ticket_reminder and the reminder date only; unlike the auto-close selection, it does not apply the team's from_stage_ids condition. **Fix:** Reuse the same stage condition used to select tickets for closing when selecting tickets for the reminder, so the reminded set stays consistent with the set that will be auto-closed. opw-6291237 Forward-Port-Of: odoo/enterprise#120732
GIFs in Facebook feed comments now show a preview image instead of appearing missing. Users can click the preview to open the animated version on Facebook, making comment content easier to review from Odoo.
Original PR description
Bug === When opening the comments modal of the feed view, the GIF images are not visible. Technical ========= The API does not return the GIF, it only returns the MP4 and the JPG. So we show the fixed image, and when clicking on it, it opens the video on Facebook. Task-6241607 Forward-Port-Of: odoo/enterprise#123181 Forward-Port-Of: odoo/enterprise#118619
The Sign template screen now adapts better when header text becomes longer, such as in translated interfaces. This prevents tag fields from visually overlapping the header, making the page easier to read and use.
Original PR description
Description: - The `.o_sign_template_tags_and_save` container relied on a hardcoded vertical offset (`top: 65px`) while being absolutely positioned. This assumed a fixed control panel height and…
Description: - The `.o_sign_template_tags_and_save` container relied on a hardcoded vertical offset (`top: 65px`) while being absolutely positioned. This assumed a fixed control panel height and caused the tags container to overlap with the header content when the neutralized red header bar expanded to multiple lines due to longer translated strings. - Replaced `top: 65px` with `top: auto` to remove the dependency on a fixed vertical offset and allow the element to be positioned according to its computed static position. - Reduced the height of `.o_field_widget.o_field_many2many_tags` from `50px` to `35px` to better fit the available space within the header area and prevent visual overlap between tag rows and surrounding elements. - This change preserves the existing positioning strategy while making the layout resilient to variable header heights caused by translations and other content-dependent UI variations. 19 - https://github.com/odoo/enterprise/blob/3db8db2eac3dff1485c6a1c977c80e573bfe6cab/sign/static/src/scss/sign_backend.scss#L486 Before fix: <img width="1874" height="443" alt="image" src="https://github.com/user-attachments/assets/196feab3-3460-4ed9-9f57-d7744e9c4e4b" /> After fix: <img width="1319" height="412" alt="image" src="https://github.com/user-attachments/assets/93ae5bcd-f0f0-4999-9cf7-f83b82d689ac" /> Forward-Port-Of: odoo/enterprise#120590 Forward-Port-Of: odoo/enterprise#118937
The point of sale payment screen now only runs India-specific invoice logic when the company is in India. This prevents unnecessary errors in other countries and keeps invoice toggling reliable for affected users.
Original PR description
Toggle invoice button was making a call in IN localization even when not in a IN country. This was causing an error in runbot 940146. This commit fixes the issue by checking if the country is IN before making the call. In `pos_settle_due` the method signature was not correct. Forward-Port-Of: odoo/enterprise#123539
Fixes an issue where selecting restricted users or resources on an appointment slot could crash the form. This keeps appointment slot setup usable and ensures choices are limited to the users and resources configured for the appointment type.
Original PR description
Clicking the "Restrict to User" or "Restrict to Resources" field on a slot crashed with:
invalid input syntax for type integer: "appointment_type_id.staff_user_ids"
The field domain was a quoted string instead of a list, so it was passed through as a literal value. Remove the domain: it never filtered anything and only broke the form.
opw-6349497
Forward-Port-Of: odoo/enterprise#122651The SEPA Direct Debit payment option no longer shows the backend-oriented “(provider)” label to customers. This keeps the checkout and payment experience clearer and more professional for end users.
Original PR description
Commit e90e1cd0 mistakenly suffixed the name of the SEPA Direct Debit `payment.method` record with "(provider)" while making payment methods provider-specific, aligning it with the `account.payment.method` record. However, `payment.method` records are customer-facing and should therefore not display hints intended for backend users. Forward-Port-Of: odoo/enterprise#123507
The Frontdesk app now correctly includes the component it needs to display scheduling information. This helps prevent errors when using Frontdesk features that rely on the planning timeline view.
Original PR description
runbot-237869 Forward-Port-Of: odoo/enterprise#123613 Forward-Port-Of: odoo/enterprise#122292
This fix prevents the grid view from crashing when a user hovers or edits a cell while the underlying data is refreshed. It improves reliability for users working with grid-based screens by safely ignoring outdated cell references and adds coverage to prevent the issue from returning.
Original PR description
Follow-up to PR https://github.com/odoo/enterprise/pull/122948, which
replaced the useGridCell useLayoutEffect with onMounted+onPatched. The
migration introduced an undeterministic bug, sometimes logging:
TypeError: Cannot read properties of undefined (reading 'row')
at updateGridCell -> onPatched
CAUSE: In the migration we dropped the dep-array: the effect now runs on
EVERY patch, not only when reactive.cell changes. When a cell is hovered
/edited and the model data is then rebuilt, reactive.cell still points at
the old cellEl whose dataset.row/column no longer resolve, so getCell()
returns undefined and `state.cell.row` throws the error above.
FIX: Introduce a new guard that was not required beofre
Link the underterministic error:
https://runbot.odoo.com/odoo/runbot.build.error/941501?menu_id=405Canadian check printing now hides check numbers on payment stubs when pre-numbered checks are used. This keeps the stub layout consistent with the actual check and avoids showing duplicate or unwanted numbering.
Original PR description
The check itself respected the check_manual_sequencing field, but the stubs did not. Hide the numbers on stubs as well, exactly like on US checks. task-6343701 Forward-Port-Of: odoo/enterprise#122565
Code cleanup and technical improvements
Spreadsheet-related screens were updated to use the newer Owl 3 framework patterns. This is an internal modernization that helps keep spreadsheet features maintainable and compatible without changing expected user workflows.
Original PR description
*=spreadsheet_sale_management As part of the Owl 3 migration, replace onWillUpdateProps hook with the appropriate Owl 3 alternatives.
This change updates several Odoo Enterprise apps to use a newer shared method for detecting small screens, preparing the product for the next version of its interface framework. It should not change day-to-day behavior, but helps keep mobile and responsive views reliable as the underlying technology evolves.
Original PR description
This commit is a step to remove the env. The env does not exist in owl3 anymore but still exists in odoo. In this commit, `isSmall` is removed from the env, we can get it from the ui service.
The web enterprise home menu was updated as part of the Owl 3 migration, replacing older internal update handling with the newer supported approach. This helps keep the interface maintainable and ready for future platform improvements without changing business workflows.
Original PR description
As part of the Owl 3 migration, replace onWillUpdateProps hook with the appropriate Owl 3 alternatives.