Tuesday, April 21, 2026
7 changes · 19.0
Enhancements to existing features
This change speeds up the validation of large stock transfers by processing many item updates in batches instead of one by one. It reduces database round-trips and prevents slowdowns or timeouts for deliveries with many lines, improving reliability for busy operations.
Original PR description
Before this PR, `button_validate` was using a `write()` call per matched stock move. On every `write()` there is a Command.create and Command.delete which is resulting in N database round-trips for…
Before this PR, `button_validate` was using a `write()` call per matched stock move. On every `write()` there is a Command.create and Command.delete which is resulting in N database round-trips for the unlinks and N for the creates, followed by N separate `_apply_putaway_strategy()` calls. This is problematic for pickings with many move_ids. This PR attempts to accumulates all move lines to delete and to create. Then performs a single `unlink()` and `create()`, followed by a single `_apply_putaway_strategy()` for all pickings. Unlink is done using `.sudo()` to preserve the superuser context that was previously inherited implicitly through the `purchase_order.sudo().search` that produced the recordset used to obtain the `receipt_move`(s). Benchmarks: | No. move lines in delivery | Before | After | | -------------------------- | ------- | ----- | | 7579 | Timeout | < 200 s | opw-5826905 Forward-Port-Of: odoo/enterprise#110587 Forward-Port-Of: odoo/enterprise#110153
Resolved issues and error corrections
Opening a Peppol XML file that contains an embedded PDF now displays the PDF preview instead of showing raw XML or an error. This makes invoice documents easier to review in Documents and prevents the thumbnail generation from failing for this common file type.
Original PR description
**Steps To Reproduce** - Go to Documents app - Upload a Peppol XML file containing an embedded PDF (e.g., invoice with attached PDF) - Open the document **Issue** Opening a Peppol XML document with…
**Steps To Reproduce** - Go to Documents app - Upload a Peppol XML file containing an embedded PDF (e.g., invoice with attached PDF) - Open the document **Issue** Opening a Peppol XML document with an embedded PDF causes: `UserError: Only PDF files can have a thumbnail` The kanban view also shows raw XML code instead of the PDF preview. **Cause** Since this commit: https://github.com/odoo/odoo/commit/37e38b8cd34e The mail module's `mail_attachement_update_thumbnail` route has a strict mimetype check that rejects thumbnail updates for XML files: https://github.com/odoo/odoo/blob/c350592b85001b5f36ea6aaf803ee3974e5ebfc1/addons/mail/controllers/attachment.py#L146-L147 Additionally, the documents thumbnail service only generates thumbnails for files where `isPdf()` returns true: https://github.com/odoo/enterprise/blob/60881b65991cbd2594492b25900ab4bb8c166250/documents/static/src/views/helper/documents_client_thumbnail_service.js#L27-L35 **Solution** Add `_allow_thumbnail()` hook to allow overriding the mimetype check And from this PR, I see that a proper thumbnail is the proper behavior: https://github.com/odoo/enterprise/pull/49111 Which required the thumbnail generation flow multiple overrides: 1. **`isPdf()` check**: The documents thumbnail service only generates thumbnails for files where `isPdf()` returns true. XML files return false, so thumbnail generation is never triggered: https://github.com/odoo/enterprise/blob/60881b65991cbd2594492b25900ab4bb8c166250/documents/static/src/views/helper/documents_client_thumbnail_service.js#L28-L35 2. **`pdf_first_page`**: When thumbnail generation runs, it fetches the first page of the PDF via these routes. For XML with embedded PDFs, the routes must extract and return the embedded PDF bytes instead of the raw XML content: https://github.com/odoo/odoo/blob/c350592b85001b5f36ea6aaf803ee3974e5ebfc1/addons/mail/controllers/attachment.py#L120-L127 https://github.com/odoo/enterprise/blob/60881b65991cbd2594492b25900ab4bb8c166250/documents/controllers/documents.py#L515-L528 3. **`isTextualDocument` in kanban**: XML files are treated as textual documents and displayed showing raw XML code, even when they contain an embedded PDF that should be previewed instead: https://github.com/odoo/enterprise/blob/60881b65991cbd2594492b25900ab4bb8c166250/documents/views/documents_document_views.xml#L106 opw-5252946 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A typo in the quality module prevented newly created quality alerts from being assigned to the correct stage, causing them to appear under "None". This fix restores the proper grouping so records are shown where users expect them.
Original PR description
Issue: ------- While adapting the 'Domain' in the PR https://github.com/odoo/enterprise/commit/07b34a2e927347ca5c839ec632808adb02703e1f there occurred a typo where '|' got replaced with the '&' and causing the records getting grouped in 'None' when creating. Solution: ------------ To replace '&' with '|' to get the records grouped under the correct stage. Steps to reproduce: ----------------------- 1. In v19.0, in quality module try to create a quality alert record. 2. Just like that the newly created record will be under 'None'. Reference Image: <img width="1105" height="407" alt="image" src="https://github.com/user-attachments/assets/4c9c33be-ec06-4f06-8245-54dbe4473bc0" /> OPW - [6074016](https://www.odoo.com/odoo/project/70/tasks/6074016)
Companies that use Belgian taxes through a Belgian fiscal position can now see the Intervat settings in the configuration screen. This fixes a blocker where the settings could not be reviewed or turned off even though Belgian tax rules were active.
Original PR description
### Issue: When demo data is disabled, creating a Belgian fiscal position installs the Belgian taxes and enables BE accounting Starting from 19.0, Intervat redirection is enabled automatically, but the Intervat settings are not available because the company itself is not Belgian As a result, the Intervat configuration cannot be changed or disabled ### Cause: The Intervat settings were only shown when the company country was Belgium However, companies using Belgian taxes through `account_enabled_tax_country_ids` must also be considered ### Steps to reproduce: - Disable demo data and install `accountant` - Create a Fiscal Position "Belgium" (Country: Belgium, Foreign Tax ID: BE010203040) - Click the alert to install the Belgian taxes - Open Settings Before the fix: The Intervat settings are not available opw-6068480
This fix restores document uploads for portal users on mobile devices when sharing folders with edit access. It keeps the upload menu open long enough for the file selection to complete, so uploads start reliably after choosing a file.
Original PR description
Steps to reproduce: 1. Install `documents` 2. Create a portal user and share a document folder with edit access 3. Log in as the portal user on a mobile device 4. Try to upload a document inside the…
Steps to reproduce:
1. Install `documents`
2. Create a portal user and share a document folder with edit access
3. Log in as the portal user on a mobile device
4. Try to upload a document inside the shared folder
Issue:
- After selecting a file from the file picker, the document is not uploaded.
Cause:
- On mobile in the portal flow, Upload is triggered from a nested dropdown (inside New) inside the adaptive control-panel dropdown (bottom sheet). By default, DropdownItem uses closingMode="all", so tapping Upload closes parent dropdowns immediately. That unmounts the hidden <input type="file"> before the OS file picker returns. When the user comes back, the input no longer exists, so change never fires and upload does not start.
- Admin/internal users do not hit the same nested adaptive-dropdown path in this view
Solution:
- Set closingMode="'none'" on the Upload DropdownItem so the menu stays mounted while the native picker is open. After a file is selected and onFileInputChange starts upload, close the bottom sheet programmatically with: `window.dispatchEvent(new Event("popstate"))`
opw-5937105When a packed product is scanned with its lot and due date information, the system now correctly keeps the expiration date instead of replacing it with today’s date. This ensures lots created during barcode operations retain the right expiry information, which helps avoid inventory and delivery errors.
Original PR description
Issue
-----
Scanning a GS1 barcode containing:
- packaging
- lot
- due date
disregards the due date when creating the new lot.
Steps to reproduce
-----
- Enable GS1 nomenclature & packagings
- Create a product
- barcode 23456789012344
- packaging with barcode 01234567890128
- some on hand quantity
- Create a delivery for a full packaging of the product
- Open the delivery in barcode
- Scan 02 01234567890128 15 270101 10 LOT1
- Validate
- Open the lot
> Expiration date is set to today
Cause
-----
The code expects the product be scanned, there is no logic to retrieve it from the packaging when missing.
-----
Ticket:
opw-6073489
Forward-Port-Of: odoo/enterprise#114123
Forward-Port-Of: odoo/enterprise#112490This update fixes two issues affecting project creation from sales orders. It now correctly uses the delivery address for the project customer and avoids a conflict that could block creating FSM projects from a template. This makes the sales-to-project flow more reliable for users.
Original PR description
FIX 1: industry_fsm_sale: set delivery address on project customer] ----------------------- **Steps to reproduce:** - Create a product: - Product Type: Service - Service Tracking: Create on Order…
FIX 1: industry_fsm_sale: set delivery address on project customer] ----------------------- **Steps to reproduce:** - Create a product: - Product Type: Service - Service Tracking: Create on Order (project) - Project Template: FSM type project template - Confirm a sale order with this product - Check the generated project customer **Issue:** The customer's delivery address is not set on the generated project. **Fix:** Set the delivery address as the project customer when creating the project. [FIX] industry_fsm_sale: remove default sale line in fsm projects ------------ **Steps to reproduce:** - Install industry_fsm_sale - Create a project template of fsm type - Create a sale order (service-type product) - Confirm the sale order - Create a project and select the fsm-type project template - Create the project **Issue:** - SQL constraint is triggered, preventing project creation. **Fix:** - If the project template is of fsm type, remove the default sale line from the context. task-5074893