Daily updates from Odoo
Tuesday, July 7, 2026
106 changes
19 changes
Enhancements to existing features
This update adds automated checks to ensure emails can be properly traced when a new coupon is generated from a helpdesk ticket. It helps protect customer service workflows by reducing the risk of unnoticed regressions in coupon-related communication tracking.
Original PR description
Added tests for email traceability when generating a new coupon in a ticket --- task-6341030
Desktop notifications will no longer be forced onto a single line, so longer messages can display more of their content. This makes important alerts, such as style compilation errors, easier to read and understand at a glance.
Original PR description
Before this commit, on screens wider than the medium breakpoint, notification messages were force-clamped to a single line via a `--lines-clamp: 1` override, hiding the rest of the text for longer messages, such as the "Style error" notification shown when SCSS compilation fails. After this commit, the single-line override is removed so notifications fall back to the default 2-line clamp. task-6037796
The mailing form now places the Exclusion List option inline with the Recipients and Dynamic Lists fields for a more consistent layout. It also hides the Dynamic Lists section when no dynamic list has been set, reducing visual clutter and making the form easier to use.
Original PR description
This commit moves the Exclusion List checkbox to be inline with the Recipients and Dynamic Lists fields. This commit also hides the Dynamic Lists div if the mailing is sent while no dynamic list has been set. task-6321624
Odoo now shows cleaner VAT/Tax ID placeholders and a clearer tooltip when editing customer details. When the expected VAT format is known, users will see an example format; otherwise the field stays empty, reducing confusion and making the guidance easier to understand.
Original PR description
In this commit: - Remove 'or not applicable' and '/ if not applicable' from VAT placeholders. - Display the expected VAT format when available (e.g. BE0477472701). - Leave the placeholder empty when no format is known. - Simplify the tooltip to: 'You can use / to indicate that the customer has no Tax ID.' task-[5005896](https://www.odoo.com/odoo/project/967/tasks/5005896) Forward-Port-Of: odoo/odoo#274578 Forward-Port-Of: odoo/odoo#273344
Resolved issues and error corrections
The planning test flow now closes a side panel that could hide split shift items and cause unreliable results. This keeps the weekly planning checks stable, including when they run on Sundays, helping prevent false failures during quality checks.
Studio's XML editor no longer applies website default-language translations when editing non-website views. This prevents business documents and other views from unexpectedly showing translated XML content just because Website is installed.
Original PR description
Problem: When opening the Studio XML editor when Website is installed, the translation terms corresponding to the Default Language of the first website in the database are used. This behavior should…
Problem: When opening the Studio XML editor when Website is installed, the translation terms corresponding to the Default Language of the first website in the database are used. This behavior should only be applied to the HTML/CSS Editor in Website. Purpose: Modify Website's override of get_related_views to only return translated views when called with a specific website in context. This is done here by adding a context flag, as to not interfere with customizations made in stable versions. This will be changed for master. Steps to Reproduce in Runbot: 1. Activate a non-English (US) language. 2. Add this language to the Website with the lowest ID in the database, then set it to the Default Language of the Website. 3. While in debug mode, enter Studio and navigate to a view that has translation terms (ex. Sale Order Form view), then open the XML editor. opw-5136124 Foward Port of https://github.com/odoo/enterprise/pull/110418 Forward-Port-Of: odoo/enterprise#116771
Fixed an error that appeared when users clicked the AI button while sending a signature request. The AI helper now uses the right interaction mode for Sign templates, so users can continue preparing and sending documents without interruption.
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
The outstanding payments widget on invoices now lists payments consistently by the most recent date and related record first. This reduces confusion for accounting users when reviewing open invoices and matching payments.
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
IoT device logs sent to the server are now recorded at a lower severity level. This reduces unnecessary alerts and Sentry usage from noisy device connection issues, helping teams focus on meaningful problems.
Original PR description
Each time IoT box sends its logs to the server (route `/iot/log`), we then print them with the same log level. However, IoT box logs can be quite noisy (for instance when there are some connection issues), which affects the logs. Sentry side, it also implies a huge wave of useless events that reach the limits of our subscription. The logs management have been improved on next versions. In the meantime, we should at least decrease the logger level so we can keep working on Sentry Forward-Port-Of: odoo/enterprise#122426
The Journal Audit PDF report no longer adds an empty final page when the global tax summary section is not included. This prevents confusing or unprofessional-looking report output for accounting users.
Original PR description
Steps to reproduce: 1. Set the active company as My Company (san francisco) 2. Navigate to Accounting > Review > Journal Audit 3. Remove all journals from the report except Bank and Misc. 4. Use the PDF action button to print the report. 5. The last page of the report is completely empty. https://drive.google.com/file/d/1otpniJgt1UNCe2hrUBwqIK58dGuXpu8T/view?usp=sharing This commit ensures that the Journal Audit report does not have blank pages when the global tax summary section is not present. It uses some features of QWeb outlined in the following docs article: https://www.odoo.com/documentation/19.0/developer/reference/frontend/qweb.html#loops opw-6224670 Forward-Port-Of: odoo/enterprise#122704 Forward-Port-Of: odoo/enterprise#121068
The webhook URL field is now constrained so it no longer stretches beyond its container in the form view. This prevents the nearby renew button from being covered or difficult to click, improving the usability of the page.
Original PR description
Before this commit, the webhook URL field could overflow in the form view, causing the adjacent renew button to become partially or fully unclickable. This commit fixes the issue by allowing the copy clipboard URL field container to shrink properly within layout, so the URL is truncated as intended and the renew button remains accessible. task:6317827 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#272019
The Timesheets kanban cards now keep the year in the date display on a single line, even when the card contains a long project, task, or description. This improves readability and prevents the date from breaking awkwardly on crowded cards.
Original PR description
Steps to reproduce:
-
1. Open the Timesheets app and display "All Timesheets" in kanban view.
2. Use a record whose project, task, or description is long enough to take up most of the card's width.
3. Look at the date shown on the left side of the kanban card.
Issue:
-
The year is split over two lines (e.g. "202" / "6") instead of staying on a single line.
Cause:
-
On the kanban card, the date is rendered in a small left-hand column split into two lines ("MMM d" and "yyyy"). That column has no `flex-shrink-0`, so when the description and the hours/avatar footer compete for space, the flex layout shrinks the date column until the year no longer fits and wraps.
Fix:
-
Add `flex-shrink-0` to the date column so it keeps its natural width.
task-6330852
Forward-Port-Of: odoo/odoo#271992This change fixes an unreliable test in the dropshipping stock flow that could pass or fail for the wrong reason. It makes the validation timing consistent so product cost updates are checked against the intended values, reducing false build failures and improving confidence in stock valuation behavior.
Original PR description
The below test sometimes fail for an incorrect reason and leads to a false positive:…
The below test sometimes fail for an incorrect reason and leads to a false
positive:
https://github.com/odoo/odoo/blob/6dbeac3a42f46b42c638c05aea8285452c944c3f/addons/stock_dropshipping/tests/test_purchase_order.py#L21
Here is another way to reproduce the issue with a higher probability of
false positive (and it is actually easier to read and understand what the
test is doing and what's wrong). It needs to edit the following test:
https://github.com/odoo/odoo/blob/ec58c5e12987401659ea0d75d3be2905ad1d807d/addons/purchase_stock/tests/test_create_picking.py#L953
With the below diff:
```diff
--- a/addons/purchase_stock/tests/test_create_picking.py
+++ b/addons/purchase_stock/tests/test_create_picking.py
@@ -965,6 +965,7 @@ class TestCreatePicking(ProductVariantsCommon):
'price': 500.0,
'discount': 10,
})]
+ self.product_id_1.standard_price = 1.0
po = self.env['purchase.order'].create(self.po_vals) # create a PO for 5 units
po.button_confirm()
with Form(po) as po_form:
```
It will lead to:
```
Traceback (most recent call last):
File ".../test_create_picking.py", line 976, in test_average_cost_updated_after_po_with_discount
self.assertEqual(self.product_id_1.standard_price, 450.0)
AssertionError: 1.0 != 450.0
```
Here are the explanations: when receiving an AVCO product, at some point, we
recompute its standard price. To do so, among several operations, we take
the last manual update, and we ignore all previous SM:
https://github.com/odoo/odoo/blob/2dbd88657395da965125c8f085da93e04c9c8f0a/addons/stock_account/models/product.py#L463-L465
This is an issue when things are done too quickly. See the pattern:
```py
self.product_a.standard_price = 5.0 # -> define valuation_from_date
po.confirm() # with another cost
receipt.button_validate() # -> define move.date
```
In case of a fast execution, both dates will be equal. We therefore ignore
the SM and rely on the manual update to define the standard price, which is
not expected. This explains the above `AssertionError`.
Fixing the codebase is quite tricky since the opposite use case could also
happen, aka first processing a receipt and only then modifiying the standard
price.
Tests side, a more important solution should probably be implemented to ease
their redaction and avoid this basic pattern. Yet, a WIP task is changing
the valo for Odoo 20, so the whole logic may change. Second, the current
issue is impacting a lot of builds, so we need to move forward. For both
reason, the commit only "fixes" the current test.
runbot-939955
Forward-Port-Of: odoo/odoo#273820
Forward-Port-Of: odoo/odoo#273078This change fixes an intermittent test failure in the messaging bus by making the subscription wait logic more reliable. It ensures the test only proceeds once the correct server-side response has been processed, avoiding false matches with unrelated background notifications.
Original PR description
`test_subscribe_to_new_channel_with_higher_id` sometimes fails. This happens because we only have one test cursor, with no lock preventing two threads from fighting over it: - `trigger_notification_dispatching` calls `precommit.run()`, which creates `bus.bus` records. - Processing an incoming `subscribe` message server-side also acquires a cursor. This means the test thread must always wait for those operations to complete before proceeding. `subscribe` already has a guard meant to wait until its own request has been processed. However, it's too naive: any dispatch that happens after we call `subscribe` is treated as the response to our request, while in practice it can be caused by an unrelated `NOTIFY` that was already in flight. runbot-243463 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
This fix corrects how the web profiler reads component data, preventing an error when the profiler is enabled. As a result, users can turn on profiling without the page failing due to missing values.
Original PR description
Enabling the profiler results in an error because the template attempts to access component values without `this`, which resolves to undefined. This commit fixes the issue by updating the problematic cases to use `this`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The work entries export wizard now closes correctly when users click Cancel or Discard. This makes the export flow behave as expected and avoids confusion when backing out of the action.
Original PR description
Version: - saas-19.4 Issue: - The Cancel (Discard) button in the work entries export wizard does not close the wizard as expected. Fix: - Added special="cancel" to ensure the wizard closes correctly when the Cancel button is clicked. Task-6365691
This update fixes a website logout problem that could trigger a session error when users clicked the logout button in the preview. It also adjusts an automated website signup test so it works reliably without requiring manual configuration, improving test stability.
Original PR description
### Commit 1: [FIX] website: prevent CSRF error by blocking duplicate form submission Before this commit: Clicking the logout button from the website preview triggered two simultaneous logout…
### Commit 1:
[FIX] website: prevent CSRF error by blocking duplicate form submission
Before this commit: Clicking the logout button from the website
preview triggered two simultaneous logout requests:
1. The browser performed the default form submission with a valid
`csrf_token`, destroying the session afterward.
2. During the same click event, `setupClickListener()` intercepted
the click using `closest('[action]')`, found the parent
`/web/session/logout` form, and triggered a second POST request
using `odoo.csrf_token`.
Since the session was already destroyed by the first request, the
second request resulted in a "CSRF validation failed" error.
This commit prevents the default form submission before triggering
the manual POST request, ensuring that only one request is sent.
Runbot-940403
--------------------------------------------------------------------------------------------------------------------------------
### Commit 2:
[FIX] website: enable free sign up setting in test_auth_forms_warning
Steps to reproduce:
1. Install any website related module (e.g. `website`, `website_event`).
2. Keep the default configuration and do not manually enable
'Free sign up' in Settings.
3. Run `test_auth_forms_warning`.
Before this commit: The test did not programmatically enable the
'Free sign up' setting. As a result, it failed unless a developer
manually navigated to the setting and enabled it beforehand.
After this commit: This commit explicitly enables the "Free sign up"
configuration during test execution, allowing public access to the
`/web/signup` page and ensuring the test passes without any manual
setup.
runbot-940394
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#274115
Forward-Port-Of: odoo/odoo#272020This update corrects an automated test for the QFpay payment terminal so it matches the current payment flow. It helps keep the test suite reliable and prevents false failures after recent changes to terminal behavior.
Original PR description
In odoo/odoo#270240 we removed the automated "send" call on payment terminals, but the test for pos_qfpay wasn't updated in the fw port. This commit fixes by adding a call to "send" in the test. Forward-Port-Of: odoo/odoo#274316
This update prevents link suggestion boxes from overflowing the screen when users type a URL on mobile devices. It improves the link editing experience by keeping the suggestions within the visible area, making the interface easier to use on smaller screens.
Original PR description
Step to reproduce: - Open Notes - Open the link popover - Type a URL in the URL input field Description of the issue/: - On mobile devices, URL autocomplete suggestions overflow the viewport. Cause: - The autocomplete suggestions container has a max-width of 600px. - On smaller screens, the container does not shrink to fit the available width, causing it to overflow the viewport. Solution: - Add width: 100% to the autocomplete suggestions container so it adapts to the available screen width on smaller devices while still respecting the existing max-width on larger screens. task-6201175 Forward-Port-Of: odoo/odoo#271925 Forward-Port-Of: odoo/odoo#269493
11 changes
Enhancements to existing features
This update simplifies the VAT input field in the accounting system, making it easier for users to enter tax ID information. It removes confusing phrases and displays the expected VAT format when available, ensuring accurate data entry. The tooltip has also been streamlined for clarity.
Original PR description
In this commit: - Remove 'or not applicable' and '/ if not applicable' from VAT placeholders. - Display the expected VAT format when available (e.g. BE0477472701). - Leave the placeholder empty when no format is known. - Simplify the tooltip to: 'You can use / to indicate that the customer has no Tax ID.' task-[5005896](https://www.odoo.com/odoo/project/967/tasks/5005896) Forward-Port-Of: odoo/odoo#273344
Resolved issues and error corrections
The invoice outstanding payments widget now lists payments in descending order by date, with a secondary ordering by ID. This makes the payment list easier to understand and reduces confusion when users review 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
Users without Payroll access can now open employee working schedules without encountering an error. The change adds an access check so Belgian payroll-only information is only read when the user has the right permissions.
Original PR description
**Steps to Reproduce:** 1)Create a database in v19.2. 2)Install the l10n_be_hr_payroll module. 3)Open the login user's profile and set the Payroll access rights to No (null). 4)Navigate to Employees…
**Steps to Reproduce:** 1)Create a database in v19.2. 2)Install the l10n_be_hr_payroll module. 3)Open the login user's profile and set the Payroll access rights to No (null). 4)Navigate to Employees → Configuration → Working Schedules. **Actual Result:** A traceback is triggered after opening the record. ```python Failed to read field resource.calendar.l10n_be_reorganisation_measure_ids You are not allowed to access 'BE: Reorganisation Measure.' (l10n.be.reorganisation.measure) records. This operation is allowed for the following groups: - Payroll/Assistant Contact your administrator to request access if necessary. ``` **Issue:-** The traceback is caused by the following commit introduced in v19.2 [here](https://github.com/odoo/enterprise/commit/e1092393ff99e9dad84ea8b9d6066e0bc61d6312) In this commit, a new computed field `l10n_be_reorganisation_measure_ids` was added on `resource.calendar`. The field is computed and store=true when the read function is called, and reads the data from the database at that time; The payroll doesn't have any access rights due to the error **Solution:** To fix this issue, a group access check is added inside the field Ticket:- 6245936 Forward-Port-Of: odoo/enterprise#119518
The timesheet assistant no longer shows an empty Unmatched section when all items in that group are filtered out as away-from-keyboard events. This avoids confusing users with section headings that have no visible entries.
Original PR description
The Unmatched group's header renders even when its only entries are afk events, since those are filtered out at display time but still counted when checking if the group has content. With this PR, we first check if a group has visible content before displaying the header Task-6348666 Forward-Port-Of: odoo/enterprise#122858
Twitter/X reply counts are now saved with social stream posts, allowing comment totals to appear alongside other engagement metrics. This gives users a more complete view of how their posts are performing without needing to check Twitter/X separately.
Original PR description
Twitter/X tweet metrics returned by the API include the number of replies in the `public_metrics.reply_count` field. This commit stores that value on social stream posts so the comments count can be displayed alongside other engagement metrics. API Documentation: https://docs.x.com/x-api/fundamentals/metrics#post-metrics Task-6251172 Forward-Port-Of: odoo/enterprise#120182
The Timesheet Assistant now checks whether a project allows timesheets before suggesting time entry actions. This prevents users from seeing an Add option or opening prefilled timesheet forms for projects where timesheets are disabled, reducing confusion and invalid entries.
Original PR description
Before this commit, the Timesheet Assistant would display the "Add" button and attempt to prefill timesheet forms for activities matched to projects where the `allow_timesheets` setting was set to `False`. This commit updates the Timesheet Assistant logic to evaluate the project's configuration. When an activity is matched to a project that has `allow_timesheets=False`: - The "Add" button is hidden from the suggestion list. - The system prevents prefilling the timesheet creation form. Task: 6306203 Forward-Port-Of: odoo/enterprise#122727 Forward-Port-Of: odoo/enterprise#120890
This change fixes a test in the Italian e-invoicing withholding area after a previously merged update. It does not change business behavior, but it helps ensure the related functionality is checked correctly and future updates remain stable.
Original PR description
This commit just want to correct a test of a PR already merged. Original commit: 78ffb5a2e63401123e4506056493e52cf3e69953 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274262 Forward-Port-Of: odoo/odoo#274062
This change corrects a small typo that was preventing a responsive design class from being applied properly in the chat meeting interface. It helps the page adapt more reliably on different screen sizes, improving the user experience on mobile and smaller displays.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274435 Forward-Port-Of: odoo/odoo#274343
Odoo now recognizes links that point to local addresses such as http://localhost:8069. This makes it easier for users and developers to share or click local environment URLs in messages instead of having them ignored.
Original PR description
Before this commit, url like `http://localhost:8069` were ignored by the `urlRegexp` because it requires a Top-Level Domain. This commit makes the Top-Level Domain optional. Forward-Port-Of: odoo/odoo#274379
The link editor now keeps URL autocomplete suggestions within the screen on smaller devices. This prevents the suggestion box from spilling off the viewport, making it easier to use on mobile and improving the overall editing experience.
Original PR description
Step to reproduce: - Open Notes - Open the link popover - Type a URL in the URL input field Description of the issue/: - On mobile devices, URL autocomplete suggestions overflow the viewport. Cause: - The autocomplete suggestions container has a max-width of 600px. - On smaller screens, the container does not shrink to fit the available width, causing it to overflow the viewport. Solution: - Add width: 100% to the autocomplete suggestions container so it adapts to the available screen width on smaller devices while still respecting the existing max-width on larger screens. task-6201175 Forward-Port-Of: odoo/odoo#271925 Forward-Port-Of: odoo/odoo#269493
A technical issue prevented users from previewing the '2Fa New Login' template. This was caused by an assertion error triggered when the preview environment wasn't running with elevated privileges. The fix replaces the assertion with a conditional check that returns placeholder data, allowing the preview to function correctly.
Original PR description
Issue: ---------------------------------------- Clicking "Preview" on the template "2Fa New Login" causes an error. Steps to reproduce: ---------------------------------------- - Search for the mail template "Settings: 2Fa New Login" - Click "Preview" - Error in terminal - From 17.0+ the error shows in UI - From saas-18.3+, a traceback occurs whe resetting the template Cause: ---------------------------------------- There is an assert the method `_get_totp_mail_code()` to ensure it's used during 2FA. But when passing by rendering this template in preview we aren't in sudo and the assert in `_get_totp_mail_code()` raises. Solution: ---------------------------------------- We replace the `assert` by a `if` which will return fake results. opw-6333887 Forward-Port-Of: odoo/odoo#273914 Forward-Port-Of: odoo/odoo#273125
13 changes
Enhancements to existing features
This update simplifies the VAT input field in the accounting module, making it easier for users to enter tax ID information. The system now displays the expected VAT format when available and provides a clearer tooltip explaining how to indicate a customer without a tax ID. This improves data accuracy and user experience.
Original PR description
In this commit: - Remove 'or not applicable' and '/ if not applicable' from VAT placeholders. - Display the expected VAT format when available (e.g. BE0477472701). - Leave the placeholder empty when no format is known. - Simplify the tooltip to: 'You can use / to indicate that the customer has no Tax ID.' task-[5005896](https://www.odoo.com/odoo/project/967/tasks/5005896) Forward-Port-Of: odoo/odoo#273344
Resolved issues and error corrections
This fix prevents an error when importing Belgian CODA bank statement files after an update added extra file information. Businesses using Belgian bank statement imports can continue processing statements without interruption.
Original PR description
in this commit: https://github.com/odoo/enterprise/commit/c66995fda83e19b28a38312af8efdc1601881cf0 we did a backport of the extension number. The backport adds the extension number to the return of the _parse_bank_statement_file. With that we have 4 args returned. Without the * we would have the "too many value to unpack" error opw-6362679 Forward-Port-Of: odoo/enterprise#123104
New planning shifts now default to 8 AM to 4 PM in the user's own timezone instead of being shifted by UTC conversion. This prevents employees in places like Belgium from seeing incorrect default shift times, making schedule creation more accurate and predictable.
Original PR description
Before: When creating a new shift, we set 8 AM - 4 PM as the default hours in UTC. With the timezone in Belgium, this becomes 10 AM - 6 PM. After: Change the timezone of the new shift to match the user's timezone. This will make the hours always be from 8 to 4 (working hours) --- task-6285596
Hong Kong payroll now handles payslips with missing start or end dates without crashing. This prevents interruptions when users edit payslip periods and keeps wage 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#120586
The Timesheets assistant now opens the chronological suggestion view reliably, even when timeline items are not linked to a project. This prevents an error and lets users continue reviewing and taking timesheet suggestions as expected.
Original PR description
Steps to reproduce: - Open the assistant in the Timesheets app. - Click on the chronological view in the suggestion section. Cause: Timeline activity records do not always have a project_id, but the template attempted to access it to determine whether the Take button should be displayed. Fix: Use the record-level allow_timesheets flag instead of accessing project_id, preventing crashes for timeline activity records without a project. issue-https://github.com/odoo/enterprise/pull/122727 task-6368279
Twitter/X social stream posts now store the reply count provided by the platform. This lets users see comment activity alongside other engagement metrics, giving a more complete view of post performance.
Original PR description
Twitter/X tweet metrics returned by the API include the number of replies in the `public_metrics.reply_count` field. This commit stores that value on social stream posts so the comments count can be displayed alongside other engagement metrics. API Documentation: https://docs.x.com/x-api/fundamentals/metrics#post-metrics Task-6251172 Forward-Port-Of: odoo/enterprise#120182
This update changes when certain internal tests run so they avoid accounting setup warnings during installation checks. It helps keep automated validation stable without changing day-to-day business features.
Original PR description
Before this commit, the `TestFsmFlowSaleAtInstall.test_fsm_flow` test throws a warning because of chart template in accounting, the reason is because all tests using accounting test class have to be executed in post_install to avoid having unexpected issue. This commit moves the test in post_install and skip the test is `planning_field_service_sale_stock` module is installed because the behavior tested is altered when that module is installed. runbot-error-240998
A small typo in a user interface class was fixed so the meeting/call screen adapts correctly on smaller displays. This helps keep the layout consistent and improves the experience for users on different screen sizes.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274435 Forward-Port-Of: odoo/odoo#274343
This update fixes a display issue where URL autocomplete suggestions could extend beyond the screen on mobile devices. The suggestions now fit the available width, making it easier to use the link editor without layout problems on smaller screens.
Original PR description
Step to reproduce: - Open Notes - Open the link popover - Type a URL in the URL input field Description of the issue/: - On mobile devices, URL autocomplete suggestions overflow the viewport. Cause: - The autocomplete suggestions container has a max-width of 600px. - On smaller screens, the container does not shrink to fit the available width, causing it to overflow the viewport. Solution: - Add width: 100% to the autocomplete suggestions container so it adapts to the available screen width on smaller devices while still respecting the existing max-width on larger screens. task-6201175 Forward-Port-Of: odoo/odoo#271925 Forward-Port-Of: odoo/odoo#269493
This update fixes how the system recognizes URLs that point to local services, such as "http://localhost:8069". As a result, these links will now be handled consistently instead of being skipped, which improves testing and local setup workflows.
Original PR description
Before this commit, url like `http://localhost:8069` were ignored by the `urlRegexp` because it requires a Top-Level Domain. This commit makes the Top-Level Domain optional. Forward-Port-Of: odoo/odoo#274379
This update improves the speed of finding tasks in timesheets when the holidays extension is installed. It helps users get search results more quickly, making time entry and task lookup smoother.
Original PR description
This commit adds an index to speed up the task name_search in timesheets when project_timesheet_holidays is installed.
A technical issue prevented users from previewing the '2Fa New Login' template. This was caused by an assertion that triggered when the preview environment lacked the necessary permissions. The fix replaces the assertion with a conditional check that returns placeholder data, allowing the preview to function correctly.
Original PR description
Issue: ---------------------------------------- Clicking "Preview" on the template "2Fa New Login" causes an error. Steps to reproduce: ---------------------------------------- - Search for the mail template "Settings: 2Fa New Login" - Click "Preview" - Error in terminal - From 17.0+ the error shows in UI - From saas-18.3+, a traceback occurs whe resetting the template Cause: ---------------------------------------- There is an assert the method `_get_totp_mail_code()` to ensure it's used during 2FA. But when passing by rendering this template in preview we aren't in sudo and the assert in `_get_totp_mail_code()` raises. Solution: ---------------------------------------- We replace the `assert` by a `if` which will return fake results. opw-6333887 Forward-Port-Of: odoo/odoo#273914 Forward-Port-Of: odoo/odoo#273125
Features or functions removed from Odoo
Due to Paymob unexpectedly ceasing operations in Pakistan, we've removed support for this payment provider within Odoo. This change ensures continued functionality and avoids disruptions for users who no longer rely on Paymob in that region.
Original PR description
Paymob stopped their operations in Pakistan unexpectedly. Domain was dropped so none of the APIs work for Pakistan. Therefore we are removing the support of Pakistan in the Paymob provider. See Also: https://github.com/odoo/documentation/pull/18768 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273935
12 changes
Enhancements to existing features
The VAT field now shows a cleaner placeholder and, when possible, the expected VAT format for the selected country. The help text was also simplified to make it easier for users to understand how to mark a customer without a Tax ID.
Original PR description
In this commit: - Remove 'or not applicable' and '/ if not applicable' from VAT placeholders. - Display the expected VAT format when available (e.g. BE0477472701). - Leave the placeholder empty when no format is known. - Simplify the tooltip to: 'You can use / to indicate that the customer has no Tax ID.' task-[5005896](https://www.odoo.com/odoo/project/967/tasks/5005896) Forward-Port-Of: odoo/odoo#273344
Resolved issues and error corrections
The Sales Commission Achievement report no longer crashes when users apply filters like Current Period that rely on relative dates such as today. This keeps commission reporting accessible and reliable without changing the intended reporting logic.
Original PR description
### Issue Applying a filter using relative date expressions (e.g. `today`) on the Sales Commission Achievement report raises a traceback. ### Steps to reproduce 1. Open **Sales > Commissions >…
### Issue Applying a filter using relative date expressions (e.g. `today`) on the Sales Commission Achievement report raises a traceback. ### Steps to reproduce 1. Open **Sales > Commissions > Achievements**. 2. Apply the **Current Period** filter. ### Current behavior The report crashes with: ```text ValueError: time data 'today' does not match format '%Y-%m-%d' ``` ### Cause The `_search` implementation extracts `date_to` values from the search domain and assumes they are literal `%Y-%m-%d` strings. However, search domains may contain relative date expressions such as `today`, `today +1d`, `today =1m`, etc., which cannot be parsed using `datetime.strptime()`. ### Fix Convert the incoming search domain to a `Domain` object and resolve it with `optimize_full()` before extracting the `date_to` values. This evaluates relative date expressions into actual `date` objects, preventing the traceback while preserving the existing currency conversion date logic. Forward-Port-Of: odoo/enterprise#122812
This fix prevents Hong Kong payroll payslips from crashing when a user clears the start or end date. The system now safely skips date-based wage and end-of-year pay calculations until valid dates are present, improving reliability during payslip editing.
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#120586
This update fixes an error that could prevent Belgian CODA bank statement files from importing after a recent change added extra file information. Businesses using Belgian bank statement imports should see the process work reliably again without interruption.
Original PR description
in this commit: https://github.com/odoo/enterprise/commit/c66995fda83e19b28a38312af8efdc1601881cf0 we did a backport of the extension number. The backport adds the extension number to the return of the _parse_bank_statement_file. With that we have 4 args returned. Without the * we would have the "too many value to unpack" error opw-6362679 Forward-Port-Of: odoo/enterprise#123104
Unmatched Activity Watch events are now grouped consistently in Timesheets, even when project or task details are missing. This prevents duplicate unmatched groups and gives users a cleaner, more accurate timesheet review experience.
Original PR description
Before this commit, we could have 2 unmatched groups, one with `{project_id: false, task_id: false}` as key and another one with `{}` as key because the key events from AW do not always have `project_id` and `task_id` in their data.
This commit manages the case where `project_id` and `task_id` are not attributes of the activity watch event object to correctly set `{project_id: false, task_id: false}`.
task-6306218Helpdesk teams that limit automatic ticket closure to certain stages will now only send closure reminder emails for tickets in those stages. This prevents customers from receiving misleading warnings for tickets that are not scheduled to be closed.
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
Twitter/X reply counts are now saved for social stream posts when metrics are fetched from the API. This ensures comment counts appear alongside other engagement metrics, giving users a more complete view of tweet performance.
Original PR description
Twitter/X tweet metrics returned by the API include the number of replies in the `public_metrics.reply_count` field. This commit stores that value on social stream posts so the comments count can be displayed alongside other engagement metrics. API Documentation: https://docs.x.com/x-api/fundamentals/metrics#post-metrics Task-6251172 Forward-Port-Of: odoo/enterprise#120182
Previewing the “2Fa New Login” email template now works without triggering an error. This prevents interruptions for administrators who want to review or reset the template, while keeping the 2-factor login flow unchanged.
Original PR description
Issue: ---------------------------------------- Clicking "Preview" on the template "2Fa New Login" causes an error. Steps to reproduce: ---------------------------------------- - Search for the mail template "Settings: 2Fa New Login" - Click "Preview" - Error in terminal - From 17.0+ the error shows in UI - From saas-18.3+, a traceback occurs whe resetting the template Cause: ---------------------------------------- There is an assert the method `_get_totp_mail_code()` to ensure it's used during 2FA. But when passing by rendering this template in preview we aren't in sudo and the assert in `_get_totp_mail_code()` raises. Solution: ---------------------------------------- We replace the `assert` by a `if` which will return fake results. opw-6333887 Forward-Port-Of: odoo/odoo#273914 Forward-Port-Of: odoo/odoo#273125
This change corrects an automated test related to Italian e-invoicing withholding. It does not introduce new business behavior, but helps ensure the existing feature is verified correctly and stays reliable after related updates.
Original PR description
This commit just want to correct a test of a PR already merged. Original commit: 78ffb5a2e63401123e4506056493e52cf3e69953 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274062
This fix makes the system correctly detect links that point to local addresses such as localhost. As a result, these links will be handled like other web links instead of being ignored, which improves testing and local development workflows.
Original PR description
Before this commit, url like `http://localhost:8069` were ignored by the `urlRegexp` because it requires a Top-Level Domain. This commit makes the Top-Level Domain optional. Forward-Port-Of: odoo/odoo#274379
This update prevents URL autocomplete suggestions from spilling outside the screen on smaller devices. It improves the mobile editing experience by making the suggestion box fit the available width while still behaving normally on larger screens.
Original PR description
Step to reproduce: - Open Notes - Open the link popover - Type a URL in the URL input field Description of the issue/: - On mobile devices, URL autocomplete suggestions overflow the viewport. Cause: - The autocomplete suggestions container has a max-width of 600px. - On smaller screens, the container does not shrink to fit the available width, causing it to overflow the viewport. Solution: - Add width: 100% to the autocomplete suggestions container so it adapts to the available screen width on smaller devices while still respecting the existing max-width on larger screens. task-6201175 Forward-Port-Of: odoo/odoo#271925 Forward-Port-Of: odoo/odoo#269493
This update ensures that certain Odoo modules are correctly licensed as LGPL-3, aligning with their community module status. Previously, these modules were incorrectly marked with an enterprise license. This change clarifies licensing and avoids potential legal issues.
Original PR description
Before this commit, the license set on manifest of some modules uses the enterprise license instead of `LGPL-3` license since it is a community module. This commit changes the license to set `LGPL-3`. Fixes #205134 Forward-Port-Of: odoo/odoo#274123 Forward-Port-Of: odoo/odoo#273597
2 changes
Resolved issues and error corrections
The Planning kanban card now shows allocated time in a cleaner format and removes the percentage value that was causing uneven spacing. This makes planning information easier to read at a glance and improves the visual consistency of the card.
Original PR description
Currently, the allocated hours and allocated percentage are misaligned in the planning kanban card, causing them to appear uneven or have inconsistent spacing. This fix removes the allocated percentage and formats the allocated hours to display like (4h30). task-5085363
Twitter/X posts now store the reply count provided by the platform. This ensures comment counts can be displayed alongside other engagement metrics, giving users a more complete view of post performance.
Original PR description
Twitter/X tweet metrics returned by the API include the number of replies in the `public_metrics.reply_count` field. This commit stores that value on social stream posts so the comments count can be displayed alongside other engagement metrics. API Documentation: https://docs.x.com/x-api/fundamentals/metrics#post-metrics Task-6251172 Forward-Port-Of: odoo/enterprise#120182
5 changes
Enhancements to existing features
The out-of-office banner now keeps the "Back on" status on a single line instead of letting it wrap. This makes the header look cleaner and more consistent for users.
Original PR description
Previously, the 'Back on' status in the out-of-office banner could wrap onto multiple lines, making the header appear misaligned. This PR keeps the status on a single line for a cleaner and more consistent layout. <table> <tr> <th>Before</th> <th>After</th> </tr> <tr> <td> <img width="378" height="630" alt="image" src="https://github.com/user-attachments/assets/e4c9f278-9a65-48ad-8841-6ed059bd766d" /> </td> <td> <img width="372" height="631" alt="image" src="https://github.com/user-attachments/assets/f3dd860b-eba5-4233-a4c0-f286eec95c63" /> </td> </tr> </table> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
Twitter/X posts in Odoo Social now store the reply count provided by the platform API. This fixes missing comment counts so users can see reply engagement alongside other post metrics.
Original PR description
Twitter/X tweet metrics returned by the API include the number of replies in the `public_metrics.reply_count` field. This commit stores that value on social stream posts so the comments count can be displayed alongside other engagement metrics. API Documentation: https://docs.x.com/x-api/fundamentals/metrics#post-metrics Task-6251172 Forward-Port-Of: odoo/enterprise#120182
This change updates an automated test for the Italian e-invoicing withholding feature. It does not change business behavior, but it helps ensure the previously merged fix is validated correctly and reduces the risk of future regressions.
Original PR description
This commit just want to correct a test of a PR already merged. Original commit: 78ffb5a2e63401123e4506056493e52cf3e69953 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274062
This update replaces an outdated Belgian VAT number in a test with a valid one. It helps ensure the invoice import checks behave consistently across different environments and library versions.
Original PR description
The previous Belgian VAT is rejected by newer versions of `python-stdnum`. Replace it with a valid VAT so the test behaves consistently across environments. Forward-Port-Of: odoo/odoo#274402
This update corrects a display issue in journal entry previews when currency information is missing. Previously, the credit column could incorrectly repeat the debit amount, which could confuse users reviewing entries.
Original PR description
In _move_dict_to_preview_vals(), when no currency is provided, the credit column falls back to the line's debit value, so any caller omitting currency_id would show the debit amount in both columns of the journal entry preview. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269335
1 change
Resolved issues and error corrections
This update corrects an issue in the Belgian salary contract offer process. It helps ensure HR teams and employees receive accurate salary offer information, reducing the risk of confusion during contract preparation.
Original PR description
Forward-Port-Of: odoo/enterprise#88918
19 changes
Enhancements to existing features
The payroll dashboard now shows a dedicated cancel button when a user starts deleting a to-do item. This makes the choice to back out of deletion more obvious and reduces confusion for users.
Original PR description
Small UX improvement adding a cancel button when deleting todos on the dashboard. While you can simply press the x to cancel, showing a button for it makes it clearer at no extra cost.
Printer setup now only shows the OBox IP address setting when it is relevant for ePOS printers. Less useful OBox service details are hidden from the regular view, reducing clutter and making configuration easier for 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 moves services installed on the obox to debug view only task-6330864
Cell hover tooltips were removed from selected list views because they were hard to discover and often duplicated visible content. This makes day-to-day navigation less intrusive, while still allowing helpful tooltips on clearer elements like buttons or icons when needed.
Original PR description
In this commit, we decided to remove tooltips from the `cell` in the `listview`. The reasons are: - It’s hard to discover that a tooltip exists on a cell. - Default tooltips are annoying because they appear whenever the user parks the mouse over a cell. - Most tooltips are useless because they simply display the cell content If the content is truncated, you should resize/enlarge the cell instead. Note: Tooltip isn't ban but if a tooltip is really needed, it should be attached to a button or an icon rather than appearing on hover with a delay. task-4504910
The subscription sales module has been adjusted to stay aligned with recent platform changes. This helps keep subscription pricing behavior consistent and reduces the risk of disruption after upgrades.
Route planning now checks the number of locations before contacting the map service, avoiding predictable failed requests. Users receive a clearer warning when too many stops are selected, making route planning feedback faster and easier to understand.
Original PR description
This commit adapts the geolocation `fetchRoutes` code to cancel requests with more than 25 coordinates (12 with optimized routing) instead of waiting for an error response from Mapbox. It also adapts the notification warning message in that usecase. task-6358624
Resolved issues and error corrections
This fixes a payroll issue that could affect generating payslips from pay runs after recent changes to work entry dates. The update helps ensure payroll batches select the correct work entries, reducing the risk of incomplete or incorrect payslip generation.
Original PR description
Fixes a small issue with the generation to adapt a domain to the new date system on work entries.
The HSBC autopay configuration option is now shown correctly under the Hong Kong payroll settings. This helps Hong Kong payroll administrators access the bank payment setup without workarounds.
Original PR description
A recent change in the parent view made the HSBC setting invisible in most cases. We update the view to add it under HK localization and make sure it is visible.
The AI helpdesk help page now uses the correct main page heading. This improves accessibility for screen reader users and helps search engines better understand the page content.
Original PR description
Problem: On every page, we should have one and only one \<h1>. On /help, the title is set as a heading 2. Having one h1 establishes a clear document hierarchy, allowing search engine crawlers to understand your primary topic and ensuring screen readers can accurately navigate the content. Solution: Change the title's heading of the AI helpdesk page Task-6284703
Code cleanup and technical improvements
Odoo Studio’s form editor now uses the current rendering approach so selected fields and labels are decorated at the right moment. This keeps sidebar updates and drag-and-drop editing behavior reliable while removing an outdated compatibility method.
Original PR description
Replaced `useLayoutEffect` in `InnerGroupItemComponent` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. The single effect decorated label/field DOM elements with…
Replaced `useLayoutEffect` in `InnerGroupItemComponent` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. The single effect decorated label/field DOM elements with studio CSS classes immediately after each render. A reactive `useEffect` (OWL3's signal-based scheduler) re-runs asynchronously, so `studio_view.updateActiveNode` — which reads `.o-web-studio-editor--element-clickable` via `el.closest()` right after the view re-renders — found the label without the class, and the `o-web-studio-editor--element-clicked` decoration was never applied. `onMounted` + `onPatched` run synchronously within the patch commit, matching the timing the compat `useLayoutEffect` provided (which is itself implemented via `onMounted`/`onPatched`). `labelRef` and `fieldRef` were converted from OWL2 compat `useRef` wrappers to plain `signal(null)` class fields so the template uses `t-ref="this.labelRef"` / `t-ref="this.fieldRef"` and the refs are read with `this.labelRef()` / `this.fieldRef()` inside `applyStudioClasses`. The unrelated `rootRef` in `OuterGroup`/`InnerGroup` is kept as `useRef` since those classes have not been migrated. 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/move a field in form - @web_studio/view_editors/form_editor/correctly display hook below group title - @web_studio/view_editors/interactive_editor_sidebar/update sidebar after edition see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2602198/build/115250548
The VoIP test environment now handles country data requests the same way the live application does. This prevents unnecessary warnings and missing mock responses during softphone testing, making automated tests more reliable without changing user-facing behavior.
Original PR description
The mock server now dispatches /mail/store requests through a store handler registry, mirroring the python controllers. Register voip's res.country store handler in the mock so it matches voip/controllers/webclient.py; otherwise the registry warns (and serves nothing) every time the softphone fetches res.country during tests. https://github.com/odoo/odoo/pull/273720
This update modernizes internal test setup across several enterprise apps to match the newer application-based testing approach. It helps keep automated tests aligned with the current platform architecture without changing end-user functionality.
Original PR description
* documents,iot,obox,pos_enterprise,room,spreadsheet_edition,timer, web_grid,web_studio This commit replaces every occurence of `makeMockEnv` by `makeTestApp`. An app is the minimum test unit since owl3 compared to owl2 where it was the env. The commit also changes a little bit some helpers the multi tab tests (bus, imlivechat, mail) to depend less on the env and more on the helpers.
The spreadsheet-related apps were updated to support Odoo's newer interface framework. This is an internal modernization that helps keep document spreadsheets and spreadsheet dialogs reliable as the platform evolves.
Original PR description
* = [spreadsheet_edition] As part of the migration from `owl 2` to `owl 3`, this commit replaces uses of `t-custom-model` with `t-model` or `t-model.proxy`.
The VoIP softphone was updated to use newer platform mechanisms while preserving the same user experience. This helps ensure the softphone opens correctly, keeps the right tab selected, and focuses the search bar when users reopen it.
Original PR description
Replaced `useLayoutEffect` with `onWillRender` + `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useEffect` was tried first but its microtask-deferred re-runs are…
Replaced `useLayoutEffect` with `onWillRender` + `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useEffect` was tried first but its microtask-deferred re-runs are decoupled from the render/patch cycle. On softphone reopen (hide → systray click), the batched re-run arrived after the click already set `isDisplayed = true`, so the effect read the already-true flag and called `hide()` a second time — leaving the softphone closed and the search-bar input unfocused. The fix reproduces the original render-coupled timing with three native hooks: `onWillRender` subscribes the component to the reactive proxy so state changes trigger re-renders; `onMounted` applies the initial show/hide/promote logic; `onPatched` applies it on every subsequent render — matching the behaviour of the original `useLayoutEffect` exactly. 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: - @voip/softphone/softphone/Opening the softphone selects the Recent tab. - @voip/softphone/softphone/Search bar is focused after reopen the softphone. - @voip/softphone/activity_tab/Call activities are displayed in the "Activities" tab. see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2596849/build/114857981
The payroll resource logic was simplified by replacing an older helper with direct working-period checks. This is an internal cleanup that should make future maintenance easier without changing day-to-day payroll behavior.
The Knowledge app was updated to keep its editor commands working correctly after a framework change. This preserves expected Knowledge and Helpdesk interactions, such as using articles, files, and templates, while reducing reliance on deprecated code.
Original PR description
Replaced `useLayoutEffect` in `FormControllerPatch.setup()` with `onMounted`/`onPatched` because `useLayoutEffect` is deprecated in OWL3. `useLayoutEffect` ran post-mount, after the chatter had…
Replaced `useLayoutEffect` in `FormControllerPatch.setup()` with `onMounted`/`onPatched` because `useLayoutEffect` is deprecated in OWL3. `useLayoutEffect` ran post-mount, after the chatter had registered its `__knowledgeUpdateCommandsRecordInfo__` callback. `useEffect` ran during `setup`, before the chatter was ready, so chatter access rights were never recorded. `onMounted`/`onPatched` with a `lastResId` guard restores the original post-mount timing and only re-evaluates on record navigation. The `useLayoutEffect` refactored in this PR has test coverage — below are some tests that failed when the effect was commented out, and are now passing: - TestKnowledgeEditorCommands.test_knowledge_article_commands_tour - TestHelpdeskKnowledgeCrossModuleFeatures.test_helpdesk_pick_file_as_attachment_from_knowledge - TestHelpdeskKnowledgeCrossModuleFeatures.test_helpdesk_pick_template_as_description_from_knowledge see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2604778/build/115379873
Several accounting-related screens were updated to use the newer interface framework required by the Owl 3 migration. This is an internal modernization that helps keep bank reconciliation, import guidance, and reporting views compatible and maintainable without changing business workflows.
Original PR description
*account_reports As part of the Owl 3 migration, replace deprecated onWillRender hooks with the appropriate Owl 3 alternatives.
The report editor was updated to use newer supported framework behavior, keeping breadcrumb updates working as before. This reduces technical debt and helps ensure the feature remains compatible with upcoming platform changes without changing the user experience.
Original PR description
Replaced `useLayoutEffect` with `onMounted` + `useEffect` because `useLayoutEffect` is deprecated in OWL3. The original effect had an empty dep array (run-once). Its body did two things: (1) pushed the crumb onto the editor breadcrumbs — a one-time side-effect that maps to `onMounted`, matching how `useEditorBreadcrumbs` pushes its own `initialCrumb`; (2) started a reactive `effect()` keeping `crumb.name` in sync with `rem.reportData?.name`, returning the dispose fn as cleanup — this was replaced by `useEffect`, which auto-tracks the reactive read and is auto-disposed on unmount. The use layoutEffect refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - TestReportEditorUIUnit.test_basic_report_edition - TestReportEditorUIUnit.test_basic_report_edition_discard - TestReportEditorUIUnit.test_xml_and_form_diff see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624594/build/116553758
This update replaces an outdated internal mechanism in the grid view with the newer supported approach. It helps keep the grid reliable and ready for the next version of the underlying interface framework, without changing how users work with it.
Original PR description
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. The single tracked dependency was `component.props.reactive.cell` — a reactive property…
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. The single tracked dependency was `component.props.reactive.cell` — a reactive property holding the cell's HTMLElement (or null). The effect body wrote `component.state.cell` and immediately re-read it (via `state.cell.row.isSection` and `component.isEditable()`). A native OWL3 `useEffect` subscription was tried first but failed: the signal effect runs eagerly during `setup()`, before mount, so `rootRef.el` is null on the first run when `props.reactive.cell` is truthy, crashing with `Cannot read properties of null (reading 'style')`. Since the component already re-renders whenever `reactive.cell` changes (the overlay root is `<div t-if="props.reactive.cell">`), plain `onMounted` + `onPatched` running the same body is sufficient: `rootRef.el` is guaranteed present whenever `cellEl` is truthy, no `untrack` is needed, and the lifecycle callbacks reproduce the original post-render timing exactly. The use of `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_grid/grid_view/grid_view_desktop/editing a value - @web_grid/grid_cells/float_toggle_grid_cell/FloatToggleGridCell: click to focus - @web_grid/grid_view/grid_view_desktop/Edition navigate with tab/shift+tab and enter key see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624597/build/116553714
This updates the Sign app’s internal upload handling to stay compatible with the next version of Odoo’s web framework. Drag-and-drop document uploads keep working as before, with tests confirming the behavior.
Original PR description
Replaced `useLayoutEffect` with `onMounted`/`onWillUnmount` because `useLayoutEffect` is deprecated in OWL3. `useListener` was considered first but cannot be used here: `.o_content` is an ancestor element owned by the layout component, not by `DocumentUploadMixin` itself, so there is no reactive signal or ref to give it. `onMounted` resolves `.o_content` once the component is in the DOM (guaranteed present), stores it, and attaches the three drag event listeners (dragover, dragleave, drop); `onWillUnmount` removes them — exactly reproducing the original post-mount timing and cleanup semantics. 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: - @sign/sign_kanban/Drop to upload file in kanban see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2596830/build/114857573
4 changes
Enhancements to existing features
Database KPI reporting now supports showing the status of the Know Your Client procedure. This helps business users quickly monitor customer verification progress directly from database information.
Original PR description
Add a new type kyc_status to display the status of the Know Your Client procedure in the databases. Task-id: [6348952](https://www.odoo.com/odoo/project.task/6348952)
Resolved issues and error corrections
This update lowers the severity of recurring IoT device log messages that were incorrectly treated as errors. It helps reduce unnecessary Sentry alerts so teams can focus on real issues without changing business workflows.
Original PR description
This PR adapts the necessary log levels to avoid spamming Sentry in a loop. Currently there is a lot of logs which can be avoided to be logged in error/exception level. see https://github.com/odoo/odoo/pull/273277
Shopfloor operators can now see their own and other operators' profile photos instead of generic placeholder images. This makes it easier to identify the right operator when using or editing the shopfloor operator view.
Original PR description
Currently when a shopfloor operator modifies the operator, operator images are not visible and only place holder images are visible. ## Steps to produce: - Install Manufacturing with demo data -…
Currently when a shopfloor operator modifies the operator, operator images are not visible and only place holder images are visible. ## Steps to produce: - Install Manufacturing with demo data - Login as Marc Demo - Open shopfloor ## Observed Behavior: Operator is unable to see their own profile picture and when you press the Edit Operator the operator is not able to see their as well as other operators images as well. ## Root cause: This issue occurs because by default an operator's user does not have access right for `Employees` in Human Resources section as they are not an HR officer nor an administrator. So when the user tries to access the image url that is meant for users with those access rights (HR officer / Administrator) at [1] and at [2]. The system returns a placeholder image instead of the employee image since the operator does not have access to hr employee model but does have access to hr employee public as per this [commit](https://github.com/odoo/odoo/commit/c9ca3761464413327d2beb697553a3ccd7eef4d1) [1]- https://github.com/odoo/enterprise/blob/5fe2fb44f4c8a938390343f7cdc90674cbf09391/mrp_workorder/static/src/mrp_display/dialog/mrp_employee_dialog.js#L16 [2]- https://github.com/odoo/enterprise/blob/5fe2fb44f4c8a938390343f7cdc90674cbf09391/mrp_workorder/static/src/mrp_display/employees_panel.xml#L9-L10 ## Solution: Allowing operators to see images can be done by modifying the links to use the public model instead of the private model. This will allow operators see other operators based on images and should improve user experience. | Before | |--------| | <img width="1865" height="844" alt="image" src="https://github.com/user-attachments/assets/c28f4209-0a60-486a-bfec-2a4db39cd946" /> | | <img width="995" height="899" alt="image" src="https://github.com/user-attachments/assets/7541edd9-6cc9-42d1-b5c5-39e0740d9a93" /> | | After | |--------| | <img width="1881" height="903" alt="image" src="https://github.com/user-attachments/assets/df3f8357-5cc2-4688-83dd-9a009fd56957" /> | | <img width="1221" height="862" alt="image" src="https://github.com/user-attachments/assets/c9d72b07-e1ad-43e4-85f5-00d8f1db9095" /> | opw-6321989
Correct a translation to australian English to better fit the expectations.
Original PR description
Correct a translation to australian English to better fit the expectations.
10 changes
Resolved issues and error corrections
Grid view list titles now show the friendly label for grouped selection values instead of internal codes. This makes drill-down results clearer for users, such as showing "Non Billable" rather than "non_billable".
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#120894
Fixes an issue where selecting restriction fields on appointment slots could crash the form. The broken filter was removed because it did not provide useful filtering and prevented users from editing slot restrictions reliably.
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-6349497The French Intrastat export wizard now opens only the journal entries related to missing required values. This prevents users from being sent to unrelated accounting entries, making it faster to review and correct export warnings.
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
This fix keeps Knowledge file previews and related navigation behaving consistently after a Chrome browser change. It prevents a behind-the-scenes browser update from altering how the app handles scrolling actions, reducing the risk of unexpected user interface issues.
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#123031
Blank US checks now include the same stub lines that already appeared on pre-printed checks, making payment details clearer and more consistent. The blank check bottom layout was also adjusted so it fits on one page instead of spilling onto a second page.
Original PR description
See individual commits. task-6359599
Users without an employee profile can now create expenses from documents, provided they already have permission to create expenses for another employee. This removes an unnecessary blocker while keeping existing access controls in place.
Original PR description
Removes the constraint saying a user has to be linked to an employee to create an expense from a document. In this case, the user still needs the rights to create an expense for another employee. task-6237021
This change corrects the way a hidden field is written in a view so Odoo no longer shows a warning about a missing "true" field. The behavior for users stays the same, but the edit experience is cleaner and less confusing.
Original PR description
There is a warning saying that there is no "true" field when editing the view. But in reality this is currently working as expected and the field is hidden. related to opw-5947987
This update fixes how long numbers are grouped for Portuguese (pt_PT) and Hindi (hi_IN), making them easier to read in the expected local format. It improves number display consistency for users in these languages, especially when viewing large values.
Original PR description
Currently the number grouping for Portuguese and Hindi is missing. Number grouping is used to separate long numbers in logical groups to make then easier to read. In Western countries, the grouping is usually done in groups of three digits (e.g. `1,000,000` instead of `1000000`), while in India, the grouping is done in groups of two digits after the first three digits (e.g. `10,00,000` instead of `1000000`). Source: https://www.unicode.org/cldr/charts/48/by_type/numbers.number_formatting_patterns.html#24a93b3d14ba17b2 All languages will be revised in a follow-up `master` PR. [task-6320391](https://www.odoo.com/odoo/project.task/6320391) Forward-Port-Of: odoo/odoo#274443
Fixed a display issue in journal entry previews where the credit amount could incorrectly repeat the debit amount when no currency was set. This makes the preview more accurate for users and avoids confusion when reviewing entries.
Original PR description
In _move_dict_to_preview_vals(), when no currency is provided, the credit column falls back to the line's debit value, so any caller omitting currency_id would show the debit amount in both columns of the journal entry preview. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269335
This update ensures that invoices sent to Nilvera are consistently checked for their final status, even if initially reported as 'Unknown'. Previously, the system wouldn't re-poll these invoices, leading to delays in accurate reporting. This fix resolves a technical issue impacting the reliable transmission of invoice data to Nilvera.
Original PR description
## Short fix summary:
Nilvera reports `Unknown` as a normal, transient `StatusCode` value (their own e-Archive API docs
list the enum as `unknown`/`waiting`/`succeed`/`error`) right after a document is sent, before their
daily batch resolves the final status. But `_cron_nilvera_get_invoice_status`'s search domain only
matches `l10n_tr_nilvera_send_status in ('waiting', 'sent')`, so once an invoice lands on `unknown` it
is never polled again — even after Nilvera later resolves the real status on their side. This adds
`unknown` to that domain so these invoices keep getting polled until Nilvera reports a final status.
task-6328589
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#2743114 changes
Enhancements to existing features
The Azerbaijani Manat (AZN) now uses its official currency symbol, ₼, instead of the previous symbol. This improves accuracy and consistency in currency display for users who work with Azerbaijani currency.
Original PR description
This commit updates the base currency symbol for the Azerbaijani Manat (AZN) to its official Unicode character '₼'. Related Upgrade PR: https://github.com/odoo/upgrade/pull/10107 Backport of: https://github.com/odoo/odoo/pull/262471 task-6112867
Resolved issues and error corrections
This fix preserves the expected behavior of file navigation in the Knowledge app after a Chrome browser change. It prevents newer Chrome versions from accidentally changing how scroll actions are handled, helping users keep a consistent experience.
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
When records are grouped by hour, the labels now use a 24-hour format instead of a 12-hour format without AM/PM. This removes ambiguity in grouped lists and ensures users can clearly distinguish afternoon and evening records.
Original PR description
Description of the issue/feature this PR addresses: When grouping datetime fields by hour, `read_group` formats the group display label using `hh:00 dd MMM`. In Babel/LDML formatting, `hh` represents…
Description of the issue/feature this PR addresses:
When grouping datetime fields by hour, `read_group` formats the group display label using `hh:00 dd MMM`.
In Babel/LDML formatting, `hh` represents a 12-hour clock. Since the format does not include an AM/PM marker, afternoon/evening hours are displayed ambiguously in grouped views.
Current behavior before PR:
A datetime value in the afternoon is grouped under a 12-hour label without AM/PM.
For example, records around `13:50` are displayed under:
01:00 20 Mar
Similarly, a datetime value around `16:20` may be grouped under:
04:00 26 Mar
This is ambiguous because the group header does not indicate whether the hour is AM or PM.
Example screenshot showing records around 13:xx grouped under `01:00`:
<img width="251" height="195" alt="image" src="https://github.com/user-attachments/assets/9c394063-f679-4faa-a045-2456cc452fb9" />
Desired behavior after PR is merged:
Hour-based datetime group labels should be unambiguous.
The hour grouping format now uses `HH:00 dd MMM`, so grouped datetime labels render using a 24-hour clock.
For example:
13:00 20 Mar
16:00 26 Mar
This fixes the datetime hour grouping label shown in grouped list views and other `read_group` consumers.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis change prevents invoices from showing amounts like “-0.00” when totals are effectively zero after rounding. It improves the appearance and clarity of PDF invoices so customers see a clean zero instead of a confusing negative value.
Original PR description
### Steps to Reproduce 1. Create SO with one line. Unit price $100 + 15% tax 2. Create a down payment for $100 and confirm 3. Create a down payment for the remaining $15 and confirm 4. Create an…
### Steps to Reproduce 1. Create SO with one line. Unit price $100 + 15% tax 2. Create a down payment for $100 and confirm 3. Create a down payment for the remaining $15 and confirm 4. Create an invoice for the original SO, the total is 0.00 5. Download the PDF and notice that the total is -0.00 ### Description of the issue/feature this PR addresses: **Issue:** There should not be a negative sign on the invoice PDF. Because of rounding to accommodate the limitations of binary memory, there is a negligible negative remainder sometimes, which gets shown as -0.00. **Solution:** Update the _compute_tax_totals method to check if the calculated totals and subtotals evaluate to zero using the currency's precision (is_zero()). If a value evaluates to zero, we explicitly force the amount to 0.0 and reformat it using formatLang, ensuring the PDF displays a clean 0.00 ### Current behavior before PR: Some cases cause there to be a negative zero on the invoice PDF. ### Desired behavior after PR: No negative zeroes on the invoice PDF. opw-6298712 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr