Thursday, May 7, 2026
25 changes · 19.0
Resolved issues and error corrections
Creating a company from partner autocomplete fields now follows the same rules everywhere and no longer adds D&B industry data as partner tags. This prevents unwanted tags from being added to customer or vendor records created from invoices and keeps contact data cleaner.
Original PR description
Partner Autocomplete was updated so DnB industry data (UNSPSC) is no longer stored on Partner Tags. That behavior was applied to the name/VAT char widget, but creating a company from a Partner…
Partner Autocomplete was updated so DnB industry data (UNSPSC) is no longer stored on Partner Tags. That behavior was applied to the name/VAT char widget, but creating a company from a Partner many2one (e.g. customer/vendor on an invoice) still used the old path: calling an IAP suggestion `iap_partner_autocomplete_add_tags` Steps to reproduce: ------------------- * Open a customer invoice (draft). * On Customer, search a company name and pick a Partner Autocomplete line to create a new company. * Save the quick-create dialog. > Observation: The new contact still had Partner Tags populated from DnB industry data (UNSPSC), unlike contacts created or enriched from the contact form autocomplete. (see video on ticket to avoid using more IAP credits) Why the fix: ------------ Align `res_partner_many2one` with `field_partner_autocomplete`: do not call `iap_partner_autocomplete_add_tags`. From task-5373200, industries from DnB must no longer be added as Partner Tags. opw-5972360 Forward-Port-Of: odoo/odoo#262757 Forward-Port-Of: odoo/odoo#260078
Payment terminal configuration in Point of Sale now shows the expected field labels when the Safaricom payment integration is installed. This makes setup clearer for users and helps avoid confusion when configuring payment methods.
Original PR description
Steps to Reproduce: ------------------------ - Install the Point of Sale module and the pos_safaricom module. - Configure a payment terminal for any payment method. Issue: ------- - The labels of the payment method integration fields are not visible. Cause: --------- - In pos_safaricom, a `<group>` tag was inserted using an `<xpath>` after a field element. - This caused the fields at that level to lose their labels due to the altered view structure Fix: ---- - Updated the `<xpath>` to target the group level instead of inserting a `<group>` after a field. - This preserves the correct form view hierarchy and ensures that field labels are displayed properly task: 6030960
This fix prevents the editor from creating an invisible empty text element when shortcuts are used. Users can now type a list shortcut and immediately insert a code block without the cursor getting stuck in the wrong place.
Original PR description
#### Description of the issue this PR addresses: - In shortcut plugin, extractContent leaves an empty text node at block start - When converting to a code block, that invisible node is removed, so the editor cannot restore the cursor correctly #### Desired behavior after PR is merged: - Delete the selection directly instead of extracting text - This prevents creating the invisible empty node #### Steps to reproduce: - Type `1. ` to create a list - Immediately insert `/code` - Cursor does not move inside the code block task-6169180 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo now cleans up attachment file names before preparing downloads, preventing downloads from failing when a name starts or ends with hidden whitespace such as a tab. This helps users reliably download imported files from the chatter without browser errors.
Original PR description
**Steps to reproduce:** * Upload an XML file whose filename starts with a tab character (e.g. extracted from a ZIP that preserves the tab in the filename). * Go to Accounting > Vendor > Bills and…
**Steps to reproduce:** * Upload an XML file whose filename starts with a tab character (e.g. extracted from a ZIP that preserves the tab in the filename). * Go to Accounting > Vendor > Bills and import or drag and drop the XML file. * In the chatter, click the attached XML file to download it. **Observed behavior:** * A JavaScript error is raised in the browser console: `TypeError: invalid parameter format` * The file cannot be downloaded. **Cause:** * When an attachment name contains a leading tab character (`\t`), werkzeug's `Headers.set()` places it literally inside a quoted-string in the `Content-Disposition` header: `filename="\ttest.xml"`. * The tab (`\x09`) is not valid `qdtext` per RFC 2616, so the `PARAM_REGEXP` in `download.js` fails to match the parameter value and `parse()` throws `TypeError: invalid parameter format`. **Fix:** * In `Stream.get_response()` in `odoo/http.py`, call `.strip()` on `download_name` before passing it to `send_file`, removing any leading or trailing whitespace and control characters from the filename before it is encoded into the `Content-Disposition` header. opw-6052996
This fixes an issue in the HTML editor where using undo after deleting text could move the cursor and formatting toolbar to the wrong line. Users editing notes or formatted text should now see a more predictable undo experience.
Original PR description
Problem: In some cases, undo restores the selection to an incorrect position. Cause: The selection state was not staged before the deletion started, leading to an inconsistent selection being restored during undo. Solution: Stage the selection before performing the deletion to ensure it can be restored to the correct position. Steps to reproduce: - Go to To-Do → Create New. - Type something on the first line and press Enter. - Type something on the second line and apply styling to it. - Use the Up arrow key to move to the first line. - Remove a character. - Press Undo (Ctrl + Z). - Observe that the selection and toolbar appear on the second line. task-6142055 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262896 Forward-Port-Of: odoo/odoo#260630
This fix makes an automated point-of-sale self-ordering test independent of the time of day it runs. It prevents false test failures late on Mondays, helping keep release validation stable without changing customer-facing behavior.
Original PR description
Before this commit: = - The test test_slot_limit_orders created slots only for the first day of the week (Monday). - The test scenario includes a slot at "18:00". - On Mondays, the test fails between 18:01 and 23:59 because the "18:00" slot no longer exists for the current day. - On other days, the test passes since slots are generated for the upcoming Monday. After this commit: = - Freezed the time to current day at "00:00" so that slot list can have every slot for that day. task-6043739 runbot-241836 Forward-Port-Of: odoo/odoo#254775
This fix prevents an erroneous warning from appearing when a user merges a mailing list in Email Marketing. It ensures the merge screen uses the correct mailing list information, so users can complete the action without being blocked by a misleading missing-record message.
Original PR description
Currently, error occurs when user tries to merge a mailing list. Steps to replicate: - Install `mass_mailing`. - Open Email Marketing > Mailing Lists > Mailing Lists and switch to list view. - Select…
Currently, error occurs when user tries to merge a mailing list.
Steps to replicate:
- Install `mass_mailing`.
- Open Email Marketing > Mailing Lists > Mailing Lists and switch to list view.
- Select a single record, and from cog menu Click merge.
Warning:
```
odoo.http: Record does not exist or has been deleted.
(Record: mailing.list(6,), User: 2)
```
Cause:
- When the user clicks Merge, the `mailing.list.merge` form opens and `default_get()` is executed to populate defaults.
- At this point, `src_list_ids` is added to res in a structured format like `[(6, 0, ids)]` [1].
- Later, `res.get('src_list_ids')` is reused and assigned to `src_list_ids` [2].
- Taking `src_list_ids[0]` [3] returns `(6, 0, ids)`, and its first element `6` is incorrectly treated as a record ID and assigned to `dest_list_id`.
- This leads to an attempt to access a record with ID 6, which does not exist, causing the error.
Solution:
- Instead of reading `src_list_ids` back from `res` after it has been set, we initialize and reuse local variables (src_list_ids, active_ids) at the beginning of the method.
- This avoids relying on transformed values in `res` and ensures that `dest_list_id` is computed using a consistent and valid list record IDs.
[1]: https://github.com/odoo/odoo/blob/21877c09863222a237fe99334787ac46935dcca4/addons/mass_mailing/wizard/mailing_list_merge.py#L20-L22
[2]: https://github.com/odoo/odoo/blob/21877c09863222a237fe99334787ac46935dcca4/addons/mass_mailing/wizard/mailing_list_merge.py#L24
[3]: https://github.com/odoo/odoo/blob/21877c09863222a237fe99334787ac46935dcca4/addons/mass_mailing/wizard/mailing_list_merge.py#L26
sentry-7447326420
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#262466This fix ensures sales orders show consistent delivered and invoiced quantities when products are sold in packs and later partially returned or credited. It prevents small rounding differences from creating confusing quantity mismatches for users reviewing orders and invoices.
Original PR description
Steps to reproduce: --- - Install the `Sales and Inventory` modules. - Enable `Units of Measure & Packagings` from Settings. - Go to `Sales > Configuration > Products > Units & Packagings.` - Create…
Steps to reproduce: --- - Install the `Sales and Inventory` modules. - Enable `Units of Measure & Packagings` from Settings. - Go to `Sales > Configuration > Products > Units & Packagings.` - Create a new unit > Pack of 12 with quantity 12 and unit Units. - Create a new product > enable Track Inventory, set Quantity On Hand to 100, and in the `sales` tab, under `Upsell & Cross-Sell`, set `packaging` as` Pack of 12`. - Create a Sales Order > add the product and set the quantity to 3, with a unit Pack of 12. - Confirm the order and validate the delivery. - Create and confirm the invoice. - Return `1 unit` from the delivery and validate it. - From the invoice, create a `credit note` with quantity 1 unit and confirm it. - Go back to the Sales Order. Issue: --- - On the Sales Order: `Delivered Quantity` shows` 2.92` while `Invoiced Quantity` shows `2.91`. Root cause: --- - At [1] & [2], in `_compute_qty_invoiced`, the `_compute_quantity` method is called without specifying a `rounding_method`, so it defaults to `UP` (1/12 rounded to 0.09), while `_compute_qty_delivered` explicitly uses `HALF-UP` (1/12 rounded to 0.08), leading to inconsistent rounding. Solution: --- - In this PR, the same rounding method (HALF-UP) is applied when computing the invoiced quantity to ensure consistency with the delivered quantity. [1]https://github.com/odoo/odoo/blob/64c1f1a7d3b24ca613d0b29a2412f1094fea08d9/addons/sale/models/sale_order_line.py#L896-L912 [2]https://github.com/odoo/odoo/blob/64c1f1a7d3b24ca613d0b29a2412f1094fea08d9/addons/sale_stock/models/sale_order_line.py#L193-L209 opw-6073690 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258024
Push notifications for inbox users now show readable message text instead of escaped characters such as ". This makes notifications clearer when users receive updates like new project task alerts.
Original PR description
**Steps to reproduce:** Log in as admin and ensure notifications are handled in Odoo. Enable push notifications and the 'Task Created' subtype for a project. As a second user, create a new task in…
**Steps to reproduce:** Log in as admin and ensure notifications are handled in Odoo. Enable push notifications and the 'Task Created' subtype for a project. As a second user, create a new task in that project. **Current behavior before PR:** admin received escaped content in the push notification (e.g., `A new task has been created in the "Project Name" project`) **Cause:** For inbox users, we send a client-side push notification using `previewText` as the body. This field returns a markup object containing escaped characters, which are converted to a string when passed to the notification body. Since the notification body only accepts plain text, these characters are displayed literally to the user. **Desired behavior after PR is merged:** admin receives the unescaped content in the push notification. (e.g., `A new task has been created in the "Project Name" project`) task-5112810 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240331
This fixes an issue that could prevent the Subcontracting app from being installed on a demo database. The demo data now points to the correct product record, helping evaluations and test environments start cleanly.
Original PR description
Steps to reproduce: - Initialize an empty database with demo data enabled - Install mrp_subcontracting Problem: The product.product `product_delivery_02` record does not share the same #ID as the product.template `product_delivery_02_product_template` record. This leads to an error when loading the demo data. This errors only started with Odoo v19. Solution: Use the right product.template `product_delivery_02_product_template` record. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A small wording mistake on the IoT Box homepage was corrected to make the displayed token guidance clearer. This helps users understand the information shown without changing any functionality.
Original PR description
This PR fixes a small text error on iot box homepage as per https://github.com/odoo/documentation/pull/17630#issuecomment-4395686324
The LDAP authentication test has been updated so it no longer leaves unwanted data behind after running. This restores a previously disabled test and prepares the area for future bug-fix testing, with no expected impact on normal users.
Original PR description
The unit test is tagged `-standard` and `database_breaking` because it was leaving left overs in the database. Using an `HttpCase` over a `BaseCase` solves that issue in addition to make the code way simpler. We want to resurrect this unit test class because we plan to add another unit test in that class for a bug fix. Forward-Port-Of: odoo/odoo#261842 Forward-Port-Of: odoo/odoo#261743
The compact Discuss sidebar now shows the “Back on” date for colleagues who are out of office, matching the regular sidebar view. This helps users quickly understand when someone is expected back without needing to switch layouts or open the conversation.
Original PR description
Before this commit, the "Back on X" text below chats of people that are away was only displayed in non-compact sidebar. This comes from `xpath` that targets only the non-compact sidebar. This commit fixes the issue by adding the `xpath` for the compact sidebar. Task-6197362 Before / After <img width="247" height="254" alt="before" src="https://github.com/user-attachments/assets/da149668-7649-479a-baca-c3df9f6600b6" /> <img width="240" height="279" alt="after" src="https://github.com/user-attachments/assets/072405d1-b050-4314-933f-31f1c1c30ad4" />
Belgian Peppol participant checks no longer retry with an outdated endpoint format. This reduces unnecessary validation work and aligns checks with the currently used Belgian identifier standard.
Original PR description
When adding peppol, we didn't know if we needed to use the 9925:BE or 0208. Therefore, we switched between them if the endpoint was not found. This has no more use today as we use 0208. opw-5976574 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261307 Forward-Port-Of: odoo/odoo#258297
This update fixes an issue where the end date on payslip PDFs was displayed incorrectly. The problem stemmed from a formatting error in the XML file, which has now been corrected to ensure consistent date presentation. This ensures accurate and professional payslip generation for employees.
Original PR description
ٍSteps: - Go to the payslip tabs under payroll app - Create a payslip and preview the generated PDF - The end date format is messed up Cause: The format was different because the end date was being overriden in the xml file and being displayed in the xml through t-out tag instead of span and t-field tags. Solution: Matching the format of the start date and end date of the payslip template. Task: 6168607
This update resolves an error that prevented users from reconciling bank statements on smaller screens (like mobile devices). The issue stemmed from incorrect data passing within the Odoo application, specifically related to how the 'Reconcile' button was handled in the bank reconciliation dialog. This change ensures the application functions correctly across all screen sizes.
Original PR description
When clicking on the "Reconcile" button of a bank statement line on a small screen (ex: mobile) threw an OwlError "Invalid props for component 'KanbanController': unknown key 'bankRecInfo'". BankRecSelectCreateDialog injected `bankRecInfo` into `baseViewProps`, which is spread into the embedded view regardless of its type. On desktop the embedded view is a list (patched to accept `bankRecInfo`), but on small screens SelectCreateDialog falls back to a kanban view, whose controller does not declare that prop, triggering Owl's props validation. Only forward `bankRecInfo` when the inner view is a list by overriding `viewProps` instead of mutating `baseViewProps`. Steps to reproduce: - Enable the developer mode. - Open Bank Reconciliation. - Resize the window to a small/mobile width (or open from a mobile device). - On a statement line, click the "Reconcile" button to open the dialog. - OwlError is thrown opw-6070573
This update corrects a bug in the Mod 349 report for Spanish tax filings. Previously, transactions with amounts less than 1 EUR were not displayed. The fix ensures that all financial transactions, regardless of their value, are accurately included in the report, improving data accuracy for tax compliance.
Original PR description
Steps to reproduce: - Install l10n_es_reports. - Create a company from France. - Create and post a vendor bill for that company with an amount of 0.12 EUR. - Open the Tax Return report and switch to the Mod 349 report for the current year. - Click the 0.12 EUR amount line. Observed: - The journal items view opens with no records. Cause: - `_get_modelo349_audit_aml_domain()` calls `_custom_modelo349_common()`, which filters lines using: `float_compare(result_dict['value'], 0, precision_rounding=2)` - Using `precision_rounding=2` treats values below 1 as equal to 0, so those lines are excluded from the audit domain. Fix: - Replace `precision_rounding` with `precision_digits=2` so values are only treated as zero when they are effectively below 0.01. opw-6134339 Forward-Port-Of: odoo/enterprise#116102 Forward-Port-Of: odoo/enterprise#114776
This update addresses a minor issue in the Odoo Enterprise testing process related to email performance. The change optimizes how email counts are tracked, resulting in more accurate and reliable test results. This ensures that email functionality continues to perform efficiently.
Original PR description
task-6071789 PR community https://github.com/odoo/odoo/pull/260110
This update fixes an issue where public holidays without a defined working schedule were not appearing in SD worx reports. The change expands the search criteria to include all public holidays, regardless of whether they have a working schedule associated with them, ensuring accurate payroll reporting.
Original PR description
### Steps to reproduce: - Create a public holiday without working schedule - Generate a SD worx for the month of the public holiday - Notice the public holiday is not shown in the report ### Cause: When searching for the public holiday we don't take into condsideration the holidays without working schedule. ### Fix: Modify the domain to fetch those holidays as well opw-5500070 Forward-Port-Of: odoo/enterprise#114900
This update fixes an issue where payment reminders weren't being sent to newly created duplicate subscriptions. The root cause was a shared 'last_reminder_date' field preventing reminders from being triggered correctly. The fix sets this field to 'false' for copies, ensuring reminders are sent to all subscriptions, including duplicates.
Original PR description
Payment reminders are not sent to the duplicate of a subscription when a reminder has already been sent for the original subscription Steps to reproduce: 1. Install Subscriptions 2. Create a new…
Payment reminders are not sent to the duplicate of a subscription when a reminder has already been sent for the original subscription Steps to reproduce: 1. Install Subscriptions 2. Create a new subscription for customer Acme Corporation with product Office Cleaning Service (SUB), a Monthly recurring plan and in the Other Info tab, set the subscription Start Date to one week ago 3. Confirm the subscription 4. Go to Scheduled Actions and run the action "Sale Subscription: send reminder for subscriptions with no token" 5. Go back to the previously created subscription (see that a reminder email has been added in the chatter) 6. Duplicate the subscription and confirm the duplicate 7. Run the action "Sale Subscription: send reminder for subscriptions with no token" again 8. There are no reminder for the duplicate subscription Issue: The copy of a subscription uses the same `last_reminder_date`, preventing payment reminders to be sent here https://github.com/odoo/enterprise/blob/5a2ab62254cd5f684a3b1a0d7c0001b888c70d08/sale_subscription/models/sale_order.py#L2114-L2120 Solution: Set `copy=False` on the field `last_reminder_date` opw-6167356 Forward-Port-Of: odoo/enterprise#116335 Forward-Port-Of: odoo/enterprise#115509
This update fixes a minor error in the calculation of Swiss source tax (QST) reversals within the payroll system. Specifically, it corrects a miscalculation of the minimum IS amount, ensuring accurate tax reporting for Swiss businesses using this module. This ensures compliance with Swiss tax regulations.
Original PR description
opw 6133391 Fix for the source tax correction following PR #114463 Forward-Port-Of: odoo/enterprise#115585
This update resolves an issue where multiple documents with the same subject wouldn't all be included in the downloaded zip file. The fix ensures that all signed documents with identical subjects are correctly bundled together, improving the reliability of the download process. This prevents users from missing important documents.
Original PR description
## Issue In the *Sign* app, when attempting to download multiple documents with similar subjects, only one document appears in the resulting zip file. ## Steps to reproduce 1. Install *Sign* (`sign`)…
## Issue
In the *Sign* app, when attempting to download multiple documents with similar subjects, only one document appears in the resulting zip file.
## Steps to reproduce
1. Install *Sign* (`sign`)
2. Sign a same template twice, using the same subject S1. This gives us Documents D1 an D2.
3. (Optionally), sign the same template a third time, using a different subject S2, creating document D3.
4. In Sign > Documents, select the 2 (3) signed documents and click *Download*.
5. **In the resulting zip file, there's one folder S1 containing a single pdf document (D1) (and one folder S2 containing D3). Document D2 is missing from the zip file.**
## Cause
When generating the zip file, the path used for each document is `{subject}/{doc_name}`.
https://github.com/odoo/enterprise/blob/863abc99469c12acdebcab05788d566c370bb46f/sign/controllers/main.py#L276-L286
Neither of this attribute are unique, which means that two signed documents with the same name and subject can be downloaded simultaneously, but will then overwrite each other.
## Fix
Before version 18.3, the zip file would contain folders named with the (unique) request id, which would consistently make them distinct from one another. This behavior was changed by https://github.com/odoo/enterprise/commit/4254542e8fb4ce3b2b9b46c624d86f7fcac8df7b to use the `sign_request.subject` instead. This commit adds the `request.id` after the subject to keep the clarity of the subject, and add the uniqueness of the id.
opw-6143128
Forward-Port-Of: odoo/enterprise#116179
Forward-Port-Of: odoo/enterprise#116013This update resolves an issue where free FSM services with prepaid invoicing were not appearing on invoices. The change adjusts a calculation to ensure these services are correctly reflected when creating invoices, allowing for accurate billing and reporting. This improves the functionality for handling service-based sales.
Original PR description
Changed _compute_qty_to_invoice in industry_fsm_sale, SaleOrderLine to no longer set qty_to_invoice to 0 for free services with prepaid invoicing. Previous changes seem intended for goods. Steps to reproduce: - Create service product with 0 price, prepaid invoice policy, creates FSM task - Create/Confirm sales order with created product - Attempt to create invoice, get 0 quantity to invoice error Current Behavior: Free services linked to FSM tasks do not appear on invoices due to compute 0 qty_to_invoice Expected Behavior: Prepaid Invoice Services linked to FSM tasks appear on invoices. Other invoice policies can be invoiced through the generated sales order lines (timesheets, delivered quantity, etc.) opw-6047992 Forward-Port-Of: odoo/enterprise#116413 Forward-Port-Of: odoo/enterprise#113718
This update resolves a technical issue preventing users from correctly booking appointments with flexible scheduling and capacity limits. The fix addresses a problem where the system incorrectly processed boolean values during the appointment slot calculation, leading to a booking error. This ensures appointments with multiple participants and capacity management now function as expected.
Original PR description
### Steps to reproduce: - Download "Appointment" and "Website" - Configure an appointment to be booked by resource with multiple seats and manage capacity - Set the schedule to be flexible and configure valid time slots - Go to the booking page and select the number of participants > Traceback: cannot unpack non-iterable bool object ### Cause of Issue: The `_get_appointment_slots` method unpacks the `appointment_slots_force_month` directly: https://github.com/odoo/enterprise/blob/4ca3dddaeadeb6c937d555cc4da8fb4bb61fea35/appointment/models/appointment_type.py#L871 Since the `appointment_slots_force_month` value was explicitly set to `False` in https://github.com/odoo/enterprise/blob/4ca3dddaeadeb6c937d555cc4da8fb4bb61fea35/appointment/controllers/appointment.py#L1063-L1070 the unpacking operation failed because it tried to unpack a boolean instead of a tuple. opw-6197653
This update fixes a limitation in how Odoo updates its UNSPSC product codes. Previously, new codes weren't automatically added after module updates, requiring manual imports. Now, an upgrade script runs during module updates to add missing codes from a CSV file, ensuring the system always has the latest product classifications.
Original PR description
**Problem:** Periodically, the UNSPSC codes may be updated and they must be added to existing databases. Normally this is done by module update, however, since there are thousands of UNSPSC codes, a CSV imported via SQL is used instead of XML files. This import is only implemented on module install and not module update, so there is no way to update the UNSPSC codes in existing databases. **Solution:** An upgrade script based on the post-init hook has been added, which will add the new codes to the database, if any. Note that: - The version of this upgrade script should be bumped any time the codes list is updated. - Existing records will not be updated opw-5943366 Forward-Port-Of: odoo/enterprise#116063 Forward-Port-Of: odoo/enterprise#112652