Monday, August 25, 2025
20 changes · saas-18.3
Enhancements to existing features
This update adds automated test coverage for point-of-sale IoT device setup and core device workflows. It also validates Six payment terminal integration, helping reduce regressions in connected payment and hardware scenarios.
Original PR description
*: pos_iot, pos_iot_six In this commit: ------------------ - Loaded data for `iot.box`, `iot.device`, and `iot.channel` to test the complete IoT flow from setup to core device functionalities. - Added payment method records and validated the payment terminal integration using Six. task- 4945645 Related PR: https://github.com/odoo/odoo/pull/220801
The scale certification screen now displays the Point of Sale version instead of the IoT device version. This helps users and auditors see the relevant software version for certification checks and avoids confusion during compliance reviews.
Original PR description
We need to display the PoS Version, not the IoT version. Forward-Port-Of: odoo/enterprise#91682
OCR result fetching was streamlined by removing extra transaction checkpoints that could slow processing when many documents were handled at once. This should improve performance in document extraction workflows, with only a minor tradeoff in rare cases where a user edits a document at the same time OCR updates it.
Original PR description
Very similar to commit 7f7ff8d, see full explanation in that commit message. This savepoint was also initiated in a loop which could cause performances issues when too many of them are active at the same time. This one is much less critical and can be removed without much trouble. It was only allowing to recover from a serialization failure, in the case where a user was concurrently editing a document while it was being updated by the OCR.
Resolved issues and error corrections
The Unsplash image picker now handles cases where Unsplash returns the same image more than once in a search result. This prevents users from seeing a crash when browsing image search results, such as searches for “Inventory”.
Original PR description
This commit fixes an OwlError when we try to render the images received from Unsplash after a search. The issue is that Unsplash can send duplicate images in the same batch of images. When we render those in a `t-foreach` and use the image `id`s as the keys, we get a duplicate key error. This is fixed by expanding on the previous filtering code, which ignored duplicates over multiple batches. We now ignore duplicates within batches as well. At the time of writing, Unsplash is sending us duplicate images on a search for "Inventory". opw-5027032 Forward-Port-Of: odoo/odoo#223789
Code cleanup and technical improvements
This update reuses a shared check for early payment discounts in the Accounting reconciliation flow instead of duplicating the same logic. It reduces maintenance risk and helps keep bank reconciliation behavior consistent with the core Accounting app.
Original PR description
Supersedes: - https://github.com/odoo/enterprise/pull/88374 (fix branch name to align with community PR) This is repeated code from what already exists in odoo community. OPW-4895365 See: [odoo/odoo#215615](https://github.com/odoo/odoo/pull/215615) Forward-Port-Of: odoo/enterprise#90875 Forward-Port-Of: odoo/enterprise#90210
This fix prevents the multi-employee time off and allocation wizard from carrying over navigation details from an unrelated leave request. Users will now see clearer breadcrumbs and URLs when generating time off or allocations for multiple employees.
Original PR description
Task ID: 5004005 **Description of the issue this PR addresses:** When generating time off or allocations for multiple employees using the wizard, the resulting breadcrumb and navigation incorrectly inherit the active_id from the parent view (a specific leave request) appearing as a child of a specific leave record in the breadcrumb and URL. Forward-Port-Of: odoo/odoo#222764
Product pages no longer show a delivery truck or delivery status when the only available option is in-store pickup. This avoids confusing shoppers by only showing delivery information when home delivery is actually supported.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Disable all delivery methods except for "Pick up in store"; 2. go to a product page. Issue ----- A delivery truck is shown with its delivery status, even though delivery is not supported. Cause ----- The `delivery_stock_data` info looks for all published "delivery" carriers, including `in_store` types, which is already covered by `in_store_stock_data`. Solution -------- - Exclude `in_store` delivery types when looking for delivery carriers. - If the `deliveryStockData` object is empty, don't render the truck. opw-5010081
This fixes a Point of Sale startup error that could occur when the default sales preset required a customer to be selected. Stores using this setup can now open POS sessions normally, reducing disruption at checkout.
Original PR description
Before this commit, if the POS default preset required a partner, an error would occur during initialization. opw-5023987 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix adjusts where action buttons appear on log notes written by the current user. It makes the message layout more consistent and easier to use by placing actions on the correct side of the timestamp.
Original PR description
**Purpose of this PR:** Fix the position of message actions on log notes authored by the current user. Messages authored by self appear on the right side of the thread. This PR mirrors the action placement logic so that, like messages from others (which show actions to the right of the date), self-authored messages show actions to the left of the date. Before: <img width="392" height="638" alt="image" src="https://github.com/user-attachments/assets/8b66c98f-3e00-47c8-abf3-ee62169ed499" /> After: <img width="392" height="638" alt="image" src="https://github.com/user-attachments/assets/d1a425da-fb0c-4793-a080-735286bc2bb9" /> task-[4689357](https://www.odoo.com/odoo/project/1519/tasks/4689357) Forward-Port-Of: odoo/odoo#223788 Forward-Port-Of: odoo/odoo#216520
Leads without a valid email will now only be sent for enrichment once. This prevents repeated failed attempts and avoids ongoing error loops, keeping CRM enrichment activity cleaner and more reliable.
Original PR description
If a lead has no valid email, try to enrich it only once This will avoid infinite loop of errors of "Enrichment could not be done because…" Forward-Port-Of: odoo/odoo#223874
This fixes how order dates are sent for online payments in Point of Sale so they use the expected UTC time. It helps prevent incorrect order timestamps caused by local time zone conversion.
Original PR description
In 2a5f1abf2e98ee09fa7a912b87d71879b5ff260b, we formatted the `order_date` with `toFormat(...)`, however, that transforms the date into local, while the backend expects it to be in UTC. In this commit, we set the date tz back to UTC before formatting it. opw-4942697
Fixed a website header display issue where certain navigation link styles made the sign-in button appear larger than intended. This keeps the header layout consistent after editing link style options, improving the visual polish for visitors and users.
Original PR description
Before this commit, using the "outline" or "border bottom" options for the Link Style (active page link in the header) would make the sign in button bigger. This was due to the fact the selector was not precise enough and would also include the button. This commit improves the selector to avoid impacting the sign in button. Steps to reproduce: - Go to Edit mode - Click on the header - Set the Navbar > Links Style option to "Border Bottom" - Save - Log Out Forward-Port-Of: odoo/odoo#223441
Installing the Belgium Accounting localization no longer fails when a referenced demo account tag was previously deleted. This makes setup more reliable for demo or test environments where sample accounting data may have been changed.
Original PR description
Currently, installing the Belgium Accounting localization fails with an error, if the user has deleted referenced demo account tags. **Steps to reproduce:** - Install the Accounting app. - Delete the "Demo Capital Account" account tag. - Install the Belgium Accounting localization (`l10n_be`). **Error:** `ValueError - External ID not found in the system: account.demo_capital_account` At [1], if the `account.demo_capital_account` is not found, it raises an error if the external ID is missing. This commit prevents the error by explicitly passing `raise_if_not_found=False` and skipping the tag if not found. [1] - https://github.com/odoo/odoo/blob/71d1c9a4bef1c29485e3b0390713a9301ad6db4f/addons/l10n_be/demo/account_demo.py#L13-L19 sentry-6776341713 Forward-Port-Of: odoo/odoo#221227
This update corrects the help link in Timesheets settings after the related documentation page was moved. Users clicking the information icon for time off settings will now be taken to the right documentation instead of a broken or outdated page.
Original PR description
**Description:** - In a recent documentation commit, the overview section was removed from the timesheets path. commit: odoo/documentation@3bceee836fa8b8edfd8a35c20b21867354f6c078 **Steps to reproduce:** - In a `v18` runbot - open settings > Timesheets settings > under Time off - click on the info icon <img width="1905" height="944" alt="2025-08-21_18-25" src="https://github.com/user-attachments/assets/34ec76ed-46f7-4b08-8c23-10269e105b43" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223711
Creating a bank statement now works even when the Bank journal has no outstanding receipt or payment account configured. This prevents an error screen and lets accounting users continue their workflow in setups where those accounts are intentionally left blank.
Original PR description
**Steps to reproduce:** - Install Accounting - Make sure that no outstanding receipt/payment account is configured on the Bank journal - Go to the Bank journal - Create a new statement **Issue:** A traceback is raised while executing a SQL query. **Cause:** A IN condition is evaluated with an empty tuple: `AND aml.account_id IN ()` This is due to the fact that there is no outstanding account. **Solution:** Only execute the SQL query if there is an outstanding account. opw-5039931
Planning calendar invites can now be exported even when a shift has no assigned employee. The system uses a safe default timezone instead of failing, reducing interruptions when publishing or sharing open shifts.
Original PR description
Currently, an error occurs when a user tries to export a calendar invite (ICS) for a planning shift that has no assigned resource. **Steps to reproduce:** - Install the `planning` module. - Go to `Planning > New`, and click `Publish & Send`. - Enable developer mode and go to `Settings > Technical > Email > Emails`. - Open the latest email record and click `iCal/Outlook`. **Error:** `AttributeError: 'bool' object has no attribute 'upper'` **Root Cause:** At [1], when no employee is assigned to the shift, `slot.employee_id` is `empty`, so `slot.employee_id.tz` is `False`, which leads to an error. This commit ensures a valid timezone is always used by selecting the current user's timezone or 'UTC' when the shift has no assigned employee. [1] https://github.com/odoo/enterprise/blob/13ce65b8ca61f9a825f2876e2727cddfae83f894/planning/controllers/main.py#L355 sentry-6781639319 Forward-Port-Of: odoo/enterprise#91889
Purchase bills matched by their IRN number no longer trigger an error during processing. This improves reliability for Indian GST reporting workflows by ensuring bill matching can complete successfully.
Original PR description
Before this IR: - When a purchase document was matched using the IRN number, the variable `matching_keys` was not defined. - This led to an `UnboundLocalError` during bill matching. After this PR: - `matching_keys` is now set together with the IRN number. - This ensures `matching_keys` is always available and prevents runtime errors when IRN matches bills. opw-5037128
The Indian Payroll yearly salary report now handles translated salary structure names correctly. This prevents an error when users print the report after creating and paying payslips, helping payroll teams access annual salary details reliably.
Original PR description
Steps to Reproduce:
- Install Indian Payroll Localization
- create a payslip of any employee and mark as paid
- try to print yearly salary report from reporting menu
Issue:
- A traceback error occurs when printing the yearly salary report.
Reason:
- the sturcture name is translatable field, which gives the value in a dict with the key as languages like {'en_US': 'India: Regular Pay'}.
- The error occurs because the code attempts to use this dictionary with setdefault, which expects a string.
Solution:
- Get the structure name corresponding to the appropriate language from the dictionary before passing it to setdefault.
task-5002518Payroll configuration screens now show Python code correctly for salary rules and rule parameters. This helps payroll administrators review and maintain calculation logic more reliably, reducing confusion when checking payroll setup.
Original PR description
Forward-Port-Of: odoo/enterprise#92960 Forward-Port-Of: odoo/enterprise#91811
Helpdesk ticket portal pages no longer show an unrelated Timesheets breadcrumb when a ticket includes logged time. This keeps customer navigation clearer and avoids confusion when viewing support tickets online.
Original PR description
**Steps to reproduce:** 1. Install 'Helpdesk Sale Timesheet' and 'Website' modules. 2. Create a helpdesk ticket and add timesheets to it. 3. Go to the portal view of helpdesk tickets. **Issue:** If the ticket contains timesheets, the "Timesheets" breadcrumb appears in the portal ticket view. **Cause:** The reason the timesheet variable is used in the hr_timesheet portal template is because it makes the condition evaluate to true, which is why the breadcrumb for Timesheets is displayed. **Fix:** Renamed the loop variable in `t-foreach` to avoid shadowing the `timesheet` variable from the outer context. task-4744294 Forward-Port-Of: odoo/enterprise#85411