Thursday, August 20, 2026
30 changes · saas-19.4
Enhancements to existing features
This update adds automated checks for the Mollie payment option in Point of Sale. These tests help catch payment-related issues earlier, improving reliability for businesses using Mollie at checkout.
Original PR description
This commit adds both Python and JS unit tests for the Mollie POS payment method. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282259 Forward-Port-Of: odoo/odoo#281742
The IoT drivers now ignore harmless startup errors caused by stale Bluetooth device records. This reduces unnecessary log and monitoring alerts without changing normal device behavior.
Original PR description
We now ignore stale BlueZ device objects errors (`DBus.Error.UnknownObject`) when checking is_connected() at startup, as they spam logs and Sentry without being an actual issue. sentry-7682046372
Resolved issues and error corrections
This fixes an issue in self-ordering where combo items could be checked against the wrong parent combo line. It helps ensure customers' combo selections stay linked to the correct meal or product bundle, reducing ordering mistakes.
Original PR description
Be sure that combo product of the current line belong to its combo parent line. Forward-Port-Of: odoo/odoo#283114 Forward-Port-Of: odoo/odoo#281741
The website theme preset preview now shows title text at the intended size. This corrects a small visual regression introduced during an earlier update, helping users preview themes more accurately before applying them.
Original PR description
When the conflict of the forward port [1] was resolved, an error was introduced when the class `fs-4` was replaced by `fs-h4`. This commit fixes the class. [1] https://github.com/odoo/odoo/pull/279324 Forward-Port-Of: odoo/odoo#281995
The link preview popover now gives the magic wand icon a larger clickable area and clearer hover feedback. This makes the editor easier to use and better aligned with accessibility recommendations.
Original PR description
According to accessibility recommendations, the magic wand icon link inside the link preview popover is too small. This commit makes it clickable on an area of 24px x 24px, and adds the missing effect to provide feedback on hover. task-6373506 Forward-Port-Of: odoo/odoo#283050 Forward-Port-Of: odoo/odoo#276929
Point of Sale-only installations now show the product variant setting that was previously missing. This lets businesses on the OAF plan configure product variants without needing other apps installed.
Original PR description
If only PoS is installed (if you are on the OAF plan). The variants settings is unavailable and cannot be activated. Steps to reproduce: ------------------- * Install only PoS * Look for variant in settings > Observation: The option is not showing up Why the fix: ------------ The setting is just a copy of the other places where the settings is available. opw-6378568 Forward-Port-Of: odoo/odoo#276179
This fix prevents repeated cancellation attempts when a printer job has already been cancelled. It reduces avoidable errors in IoT printing workflows and helps keep job tracking consistent.
Original PR description
Before this commit, if the status of a CUPS job was checked when that job was already cancelled, we would treat it as a generic error and then try to cancel the job again. This would result in an error from CUPS ('client-error-not-possible'). There would then be a secondary exception caused by trying to remove the job ID from the list a second time in the exception handler.
After this commit, we avoid trying to cancel the job again. We also use a set instead of a list to keep track of the job IDs, which prevents duplicates and allows us to discard IDs without causing an error if they are already removed.
sentry-IOT-1J
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe attendance kiosk view no longer loads a presence status script that is not used there. This reduces unnecessary resource loading and helps keep the kiosk experience lighter without changing employee-facing functionality.
Original PR description
This commit removes the hr_attendance_presence_status.js file from the kiosk bundle, as it is not needed in the kiosk view and can cause unnecessary loading of resources. task-6468972 Forward-Port-Of: odoo/odoo#282987 Forward-Port-Of: odoo/odoo#282410
Kiosk receipts no longer print the table tracker number twice. This makes receipts clearer for customers and staff while keeping the existing table number display in place.
Original PR description
This removes the duplicate table tracker number on the receipt when ordering on kiosk. There is already a floating_order_name field that shows the table tracker number on the receipt when ordering on kiosk. task-6439063 Forward-Port-Of: odoo/odoo#280309
The website editor now shows dynamic snippet filter names in the editor user's preferred language instead of the website's default language. This avoids confusion for teams managing websites in languages different from their own interface language.
Original PR description
Steps to reproduce: 1. In an `en_US` database, install the Arabic (`ar_001`) language and set it as the website's default language. 2. Add a `blog.post` dynamic snippet to a page and select it. 3. Open the snippet options. 4. Notice that the Filter dropdown is displayed in Arabic instead of English. The RPC fetching the available snippet filters targets the `website=True` `/website/snippet/options_filters` route. During the request initialization, website routes inherit the frontend request language (see: `frontend_pre_dispatch()`), so the ORM context lang is set to the website language. As a result, translated fields such as name are read in that language. Force `request.env.user.lang` in the context when fetching the filters since their names should be displayed in the editor's preferred language. task-5979540 Forward-Port-Of: odoo/odoo#282804 Forward-Port-Of: odoo/odoo#275390
This update fixes an issue in the guided tour for creating a missing page, helping ensure the onboarding or testing flow runs reliably. It is a minor correction that reduces friction for users and testers without changing business workflows.
Original PR description
runbot-944311 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#278652
Sales orders now calculate delivery status using only products that can actually be delivered. This prevents orders with services, delivery fees, or other non-deliverable lines from incorrectly appearing as only partially delivered after the shippable goods are sent.
Original PR description
Delivery status considered every order line, including service, delivery and etc. When we ship products without stock, we deliver only consumable products, leaving the order wrongly partially delivered when there are other types of products included. Filter to consu lines when computing the order's delivery status.
When users choose the 'withhold only' option in the payment wizard, Odoo now limits journal choices to the appropriate miscellaneous journals. This prevents the system from switching to a journal type that users could not later select or change, making withholding-only payments more consistent and easier to complete.
Original PR description
Previously, when the user selected the 'withhold only' option in the payment wizard, the journal was automatically changed to a miscellaneous journal. However, when the user tried to change the journal, no miscellaneous journals were available. With this commit, only miscellaneous journals are available when 'withhold only' is selected. task-6461688
This fixes an issue where printer status was not shown during IoT device pairing because the connection manager used an outdated method name. It helps users confirm printer readiness more reliably when setting up IoT printers.
Original PR description
In odoo/odoo#244530, the method `print_status` in the linux printer driver was renamed to `status`, however it was not changed in the connection manager. This commit fixes the issue, and also removes redundant checks for the printer type (as these are already performed in the `status` method). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Clicking a table of contents entry in the HTML editor now scrolls to place the target heading in a more readable position. This prevents users from thinking the navigation failed when headings only appear at the edge of the screen.
Original PR description
When clicking on a title in the TOC, we auto-scroll to that section of the HTML, allowing users to read that part. Since [1], scrollIntoView is replaced to consider top-aligned sticky elements. As a result, instead of scrolling to make it comfortable to read the section, it stops as soon as the title is visible. Unless you are really attentive at the bottom of the screen, it can look like the scrolling did not work. This commit computes the appropriate offset to make the TOC heading more visible after scrolling. [1]: https://github.com/odoo/odoo/commit/f5cf8565e7d09edd3a29fd95537381fb70d75785 Task-6394193 Forward-Port-Of: odoo/odoo#278304
Regular sales users can now see the three-dot menu on product cards in the Product Catalog, matching the access they already have elsewhere. This removes an unnecessary administrator-only restriction and helps sales teams use catalog actions without elevated permissions.
Original PR description
**Steps to Reproduce:** 1. Give the logged in user "Sales / User: Own Documents Only" access rights 2. Open the Product Catalog (from a Sales Order line) 3. The three-dot menu on a product card is not visible when you hover over it 4. Change user rights with "Sales Administrator" access rights, the three-dot menu appears as expected **Issue:** The three-dot menu on the Product Catalog kanban card is restricted to the Sales Administrator group, even though the actions it exposes (edit product, availability, etc) are already accessible to regular Sales users through other menus/views. **Why this happens:** The view `product.view.kanban.catalog.inherit.sale` sets the `groups` attribute to `sales_team.group_sale_manager`, restricting the menu behind Administrator rights instead of the base Sales access group opw-6416629 Forward-Port-Of: odoo/odoo#279400
Swiss payroll payment files now include the beneficiary name when required for Revolut payments. This helps ensure salary payments are accepted and processed correctly by the bank, reducing payment failures or manual follow-up.
Original PR description
Forward-Port-Of: odoo/enterprise#126632
A new automated check was added for the Italian tax report to confirm VP7 carryover amounts are handled correctly. This helps prevent regressions in VAT reporting behavior and supports more reliable compliance reporting.
Original PR description
Add test for https://github.com/odoo/odoo/pull/279471 opw-6354509 Forward-Port-Of: odoo/enterprise#127429
Resetting a bank statement line to draft no longer triggers an error. This keeps accounting users from being blocked when correcting or reopening bank transactions.
Original PR description
Currently, an error occurs when resetting a **bank** statement line to draft. **Steps to Reproduce:** - Install the `Accounting` module. - Go to `Accounting Dashboard` and click the `three-dot` on…
Currently, an error occurs when resetting a **bank** statement line to draft. **Steps to Reproduce:** - Install the `Accounting` module. - Go to `Accounting Dashboard` and click the `three-dot` on bank journal. - Open `Transactions`. - Create a new `statement line`. - Select the `statement line`, click the `gear action`, and click `Reset to Draft`. `AttributeError: 'bool' object has no attribute 'setdefault'` After the [recent commit], when resetting the statement line to draft, the server action run [1] and the linked move is going reset to draft, and the method returns the result [2]. After the mentioned commit, the method returns True [3]. When the result from [4] is passed to clean_action, it raises an error [5]. This commit ensures that it returns None after resetting the statement line linked to the invoice to draft, as it previously returned None and same as like [6]. [recent commit]: https://github.com/odoo/odoo/commit/712718d9df0fd5044ac57fdd9ec58e64bece36c0 [1]- https://github.com/odoo/enterprise/blob/7ca28a1c079d22b60e3756ca9b4f404771f214e8/account_accountant/views/bank_rec_widget_views.xml#L541-L551 [2]- https://github.com/odoo/enterprise/blob/eae51e3ca155ca29e1de54f4bd223e7540b2aa7f/account_accountant/models/account_bank_statement.py#L112-L114 [3]: https://github.com/odoo/odoo/blob/b3444e4bd421a30229b0dc7c8d5eb6c78b8b51ed/addons/account/models/account_move.py#L6236-L6251 [4]: https://github.com/odoo/odoo/blob/a6f99706c6a62fc65666a0ff5e58fa465b41a6fb/addons/web/controllers/action.py#L53-L59 [5]: https://github.com/odoo/odoo/blob/b3444e4bd421a30229b0dc7c8d5eb6c78b8b51ed/addons/web/controllers/utils.py#L24 [6]: https://github.com/odoo/odoo/blob/d7df2e8acff9eb7066993fa6a0b0c6d7c85baabc/addons/account/models/account_payment.py#L1206-L1208 sentry-7354160052 Forward-Port-Of: odoo/enterprise#127189
The project forecast button has been moved back to its earlier position after a recent change. This helps users find the action where they previously expected it, reducing confusion in project planning workflows.
Original PR description
Reverting the position of the project forecast button to the previous one, which was changed in the recent changes. Apply changes up to saas-19.4 Forward-Port-Of: odoo/enterprise#128506
File downloads now continue even when the user cannot access the custom filename field. In that case, the system uses a default filename instead of blocking the download, reducing failed downloads for users with limited access rights.
Original PR description
The `create_calendar_meeting` field on `hr.leave.type` allows users to choose if leave requests created with a given time off type generate a corresponding entry in the Calendar app. However, this field was not displayed on the form view. This commit adds `create_calendar_meeting` to the `hr.leave.type` form view inside the configuration section, along with dedicated help text explaining its behavior. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282698 Forward-Port-Of: odoo/odoo#280593
Database neutralization for TikTok Shop now keeps each shop record unique while removing real shop references. This prevents cleanup failures when multiple active TikTok shops exist, making test or sanitized database preparation more reliable.
Original PR description
Steps to produce: --- - Install sale_tiktok module. - Create two active tiktok.shop records. - Run the database neutralization command. Issue: --- - Neutralization fails with a PostgreSQL error:…
Steps to produce: --- - Install sale_tiktok module. - Create two active tiktok.shop records. - Run the database neutralization command. Issue: --- - Neutralization fails with a PostgreSQL error: ```py duplicate key value violates unique constraint tiktok_shop_unique_active_shop` DETAIL: Key (tiktok_shop_ref)=(1) already exists. ``` Root cause: --- - At [1], we are setting `tiktok_shop_ref = 1` for all `tiktok_shop` records. Because `tiktok_shop` enforces a partial unique constraint on `tiktok_shop_ref` for active shops [2], setting the same reference value `1` on multiple active shops violates this constraint. Solution: --- - Update sql to assign a row-unique string to each shop. This strips the real shop reference while maintaining uniqueness across active shop records so neutralization completes cleanly. [1]https://github.com/odoo/enterprise/blob/85754b0354b76da8b4d87a3a81dd19679ed35d15/sale_tiktok/data/neutralize.sql#L1-L8 [2]https://github.com/odoo/enterprise/blob/85754b0354b76da8b4d87a3a81dd19679ed35d15/sale_tiktok/models/tiktok_shop.py#L136-L139 opw-6451715 --- Forward-Port-Of: odoo/enterprise#127532
The product catalog opened from Field Service tasks now gives more space to the unit of measure column. This improves readability and keeps the Enterprise interface aligned with the related Community update.
Original PR description
Steps to produce: --- - Install `Field service` module. - Create a task and open it. - From the task open the catalog from smart button. Update the Product Catalog UI to match the Community PR changes. community PR: https://github.com/odoo/odoo/pull/267118 opw-6253382 --- Forward-Port-Of: odoo/enterprise#128146 Forward-Port-Of: odoo/enterprise#121139
Users now see a clear message if the required Belgian POS Blackbox self-order module is missing. The message explains what needs to be installed, helping staff resolve the opening issue without needing technical troubleshooting.
Original PR description
Replace the bare ValidationError with a user-friendly UserError that explains how to install the required 'l10n_be_pos_blackbox_self_order' module. Task-6388185 Forward-Port-Of: odoo/enterprise#124513
The Indian payroll contract validation message now reflects the employee's actual pay schedule instead of always referring to monthly wages. This reduces confusion when allowances exceed wages and helps users understand the issue in the right payroll context.
Original PR description
**Steps to reproduce:** - Create an indian employee. - Put total allowance `(basic salary + HRA + standard ALW + Perf bonus + travel ALW) > wage` - We will get validation error in employee stating that allowance sum can't be greater than wage. **Before:** - We were always showing monthly wage in the validation error, which was confusing to the end user. **After:** - We will use field `version.shedule_pay` to show dynamic validation error message. Task: [6449791](https://www.odoo.com/odoo/project/1251/tasks/6449791) Forward-Port-Of: odoo/enterprise#127477
The SEPA Direct Debit export now includes a required scheme name field in the initiating party information. This helps ensure payment files are accepted by banks that require it, such as Nordea in Sweden, reducing failed or rejected direct debit submissions.
Original PR description
We are missing a SchmeNm node in the InitgPty node. This is mandatory for Nordea in Sweden at least. Such as: ```xml <SchmeNm> <Cd>CUST</Cd> </SchmeNm> ``` task-6385960 Forward-Port-Of: odoo/enterprise#124693
This fix prevents Mexican payroll processing from failing when a company does not have a VAT/tax ID recorded. Payslip warning checks now handle missing company tax information safely, improving reliability for affected payroll users.
Original PR description
`res.company.vat` is not required and can be `False`. Guard the `len()` call so `_issue_mx_warnings` doesn't crash on payslips for companies without a VAT set.
```py
File "/home/odoo/src/enterprise/saas-19.3/hr_payroll/models/hr_payslip.py", line 1936, in _compute_issues
issues = generate_issue(slip, context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/enterprise/saas-19.3/l10n_mx_hr_payroll_account_edi/models/hr_payslip.py", line 235, in _issue_mx_warnings
if not slip.company_id.l10n_mx_curp and slip._l10n_mx_is_curp_needed():
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/enterprise/saas-19.3/l10n_mx_hr_payroll_account_edi/models/hr_payslip.py", line 325, in _l10n_mx_is_curp_needed
or len(self.company_id.vat) == 13
^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: object of type 'bool' has no len()
```
Forward-Port-Of: odoo/enterprise#128216Users now receive a clear notification if they try to add or edit a dynamic field before choosing where it applies. The editor also avoids crashing when a previously saved field is no longer valid for the selected model, improving reliability while editing content.
Original PR description
The dynamic field editor assumes that an `Applies To` model is always selected and that existing dynamic fields are always valid for the current model. As a result, trying to insert or edit a dynamic field without selecting a model raised an error. Editing an existing dynamic field after changing the selected model could also crash the field selector when the stored field path was no longer valid. Show a notification when users try to insert or edit a dynamic field without selecting a model, and handle invalid field paths when initializing the field selector to avoid UI crashes. Task-6365420 Forward-Port-Of: odoo/odoo#278544
This fix restores the missing delete option on employee records in the Timesheets area. It helps users manage employee records as expected and removes a small workflow blocker.
Original PR description
task-6468432 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 Forward-Port-Of: odoo/odoo#282781
This fix improves how long unit of measure names are displayed when adding products from the catalog. Users can now see the quantity selector and unit name more clearly, reducing confusion during sales order entry.
Original PR description
Steps to produce: --- - Install `sales` module. - Go to Settings and enable `Units of Measure and Packaging`. - Set a long name for `units` UoM. - Create a Sale Order and add a product via the…
Steps to produce: --- - Install `sales` module. - Go to Settings and enable `Units of Measure and Packaging`. - Set a long name for `units` UoM. - Create a Sale Order and add a product via the catalog. Issue: --- - Long UoM names are not fully visible in the catalog view. Root cause: --- - The outer `<div>` has `d-flex` but lacks `w-100`, causing it to overflow its container. Solution: --- - Added `w-100` to the outer `<div>` to prevent overflow. - Adjusted the quantity selector layout for better visibility. Before: --- <img width="388" height="141" alt="image" src="https://github.com/user-attachments/assets/dafae08a-3c9d-4163-8894-daa2e4d26f62" /> After: --- <img width="382" height="154" alt="image" src="https://github.com/user-attachments/assets/abd6f034-be4b-49bf-be9c-c9779de0f30d" /> Enterprise PR: https://github.com/odoo/enterprise/pull/121139 opw-6253382 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282821 Forward-Port-Of: odoo/odoo#267118