Monday, September 28, 2026
5 changes · saas-19.1
Resolved issues and error corrections
Italian invoices using the Import/Export fiscal position now apply the correct single 0% tax instead of adding two 0% taxes at the same time. This prevents incorrect tax setup on invoice lines and helps keep Italian accounting and e-invoicing data accurate.
Original PR description
Upon Import/Export, the 0% EX N7 tax is added by default on each tax excluded line, as it incorrectly shares the same default Import/Export fiscal position with the standard 0% EX tax. This causes both to be applied simultaneously to a single invoice line. 1. Install Accounting and `l10n_it` 2. Switch to IT company 3. Go to Invoices and create a new one 4. Select the Import/Export fiscal position 5. Add a line with a new product (so it's clean of custom product taxes) 6. Both `0% EX` and `0% EX N7` taxes are applied, instead of just `0% EX` Ticket [link](https://www.odoo.com/odoo/project.task/6518926) opw-6518926 Forward-Port-Of: odoo/odoo#285586
Users can now download all files from a chatter message as a ZIP even when some attachments are stored in cloud storage. This prevents failed downloads and keeps the bulk file download action working consistently across local and cloud-hosted attachments.
Original PR description
Clicking "Download Files" on a chatter message fails when one of its attachments is stored in the cloud. Cloud attachments normally return a stream containing a signed URL. For individual downloads, Odoo redirects the browser to that URL, letting the cloud provider serve the file directly. The ZIP controller instead needs the file's bytes to build the archive on the server. It calls `Stream.read()`, which cannot read URL streams and raises `ValueError: Cannot read an URL`. Enable a `cloud_storage_force_download` context flag on the attachments when the cloud controller delegates ZIP creation to the mail controller. With this flag, the cloud attachment model fetches the file through the provider's signed URL and returns a data stream that the existing ZIP controller can read. opw-6570065 Forward-Port-Of: odoo/odoo#289819
Kenyan eTIMS submissions now exclude taxes that do not have a KRA tax code, such as levies paid to other authorities. This prevents over-reporting tax totals to the Kenya Revenue Authority and keeps invoice reporting aligned with the correct tax destination.
Original PR description
Issue: Non KRA taxes are sent in eTIMS tax total Steps to reproduce: - With l10n_ke_edi_oscu - Create a 2% Tax named CTL with no KRA Tax Code - Create an invoice - Add a line with 16% and CTL taxes - Confirm - Send to eTIMS Current behavior: - eTIMS JSON (unaccessible) is created with 'totAmt' (total_tax_included) including non-KRA Taxes Expected Behavior! - eTIMS JSON 'totAmt' doesn't incldue non-KRA Taxes Note: eTIMS is used to report to Tax Autority, however some "taxes" (e.g. Tourism levy) are paid to other authorities (e.g. Tourism Fund) and shouldn't be included in eTIMS. opw-6456478 Forward-Port-Of: odoo/enterprise#131577
This fixes formulas used in the Swiss balance sheet report so the report calculates figures correctly. It helps Swiss companies rely on more accurate financial statements for review and compliance purposes.
Original PR description
Change some formulas in the Swiss balance sheet task-6379692 Forward-Port-Of: odoo/enterprise#123895
Dropship operations that only create lots no longer show the misleading "Pick From" option. This ensures lot names and expiration dates entered by users are applied correctly, avoiding silent mistakes in delivered product traceability.
Original PR description
Steps to reproduce 1. In Inventory Settings, enable Lots & Serial Numbers and Expiration Dates. 2. Create a storable product tracked by lot with Expiration Date enabled. 3. Create and confirm a…
Steps to reproduce 1. In Inventory Settings, enable Lots & Serial Numbers and Expiration Dates. 2. Create a storable product tracked by lot with Expiration Date enabled. 3. Create and confirm a dropship of it, then open the move's Detailed Operations. 4. The pre-filled line works: typing a batch and an expiration date creates exactly that lot at validation. 5. To split the quantity, click "Add a line": it opens the "Pick From" popup, and choosing "Create" there creates the lot and attaches it to the line. 6. On that line, edit "Lot/Serial Number" and "Expiration Date", then Validate. -> Expected: the values entered on the line are used. -> Actual: they are ignored; the lot created through "Pick From" is delivered with its own expiration date, the name and date typed on the line have no effect. Issue --- On a create-lots-only non-incoming operation like `Dropship`, `show_quant` is derived from `picking_code` alone, so the "Pick From" quant picker is shown even though the operation only creates lots. Adding a line goes through "Pick From", which creates the lot and attaches its `lot_id` to the move line; from then on the line's `lot_name` and `expiration_date` stay editable but do nothing, since a set `lot_id` is used as-is at validation and the `expiration_date` is recomputed from the lot, so anything typed there is silently dropped. Such an operation has no existing stock to pick from, so `show_quant` is now gated on the lot settings too: "Pick From" is hidden and the line's `lot_name` and `expiration_date` become the only inputs, created into the lot at validation like receipts already do. https://github.com/odoo/odoo/blob/68dcb950df83d70ff2aea0e05c96cc9b57c1a8a9/addons/stock/models/stock_move.py#L646-L647 opw-6530563 Forward-Port-Of: odoo/odoo#290071 Forward-Port-Of: odoo/odoo#287474