Friday, October 24, 2025
17 changes · saas-18.4
Enhancements to existing features
Finnish accounting reports can now generate an export file for tax reporting, making it easier for customers to submit required tax information to the administration. The update also improves automated report export testing to ensure the correct report options are used.
Original PR description
The aim of this commit is adding the tax report export file to allow our customers to send their tax reports to their administration. task-5135868 Forward-Port-Of: odoo/enterprise#97867 Forward-Port-Of: odoo/enterprise#96256
Belgian Point of Sale blackbox messages can now be queued, making interactions faster and more reliable. This helps sales workflows continue smoothly when an immediate blackbox response is not required, such as for pro forma sales messages.
Original PR description
In this commit, we introduce a queuing mechanism for blackbox messages to make all interactions with the blackbox faster and more reliable. This is particularly useful for messages that do not require the response from the blackbox to continue the workflow such as pro forma sales messages. Forward-Port-Of: odoo/enterprise#90747
Resolved issues and error corrections
The China ASBE balance sheet report now includes the correct lines and account mappings so liabilities and totals are balanced accurately. This helps businesses relying on Chinese financial reports get more reliable balance sheet results and reduces the risk of reporting discrepancies.
Original PR description
Fixes the balance_sheet_balanced test for asbe where the wrong line was set as liability. Also fixes the report itself that was ignoring one line, and missing one account. task-5175789 Forward-Port-Of: odoo/enterprise#97720 Forward-Port-Of: odoo/enterprise#97460
Expense users no longer lose selected analytic distributions when they click "Save & Close" on a new expense line. This prevents reporting and allocation errors by ensuring the chosen distribution is retained consistently.
Original PR description
**Issue** When creating an expense line, if the user selects an analytic distribution and clicks "Save & Close", the selected distribution is not saved. However, closing the popup with the "X" icon…
**Issue** When creating an expense line, if the user selects an analytic distribution and clicks "Save & Close", the selected distribution is not saved. However, closing the popup with the "X" icon does trigger the save. **Steps to Reproduce** 1. Go to Expenses > Expense Reports 2. Select an employee (e.g., Ronnie Hart) 3. Add a new expense line 4. Set an Analytic Distribution 5. Click Save & Close 6. Observe that the analytic distribution is not retained **Root Cause** The save behavior is triggered by a window click event, but clicks inside modals (like the analytic distribution popup) do not propagate as expected. Because everything within the popup is modal, the click does not satisfy the criteria to trigger saving the data. **Fix** Refine the modal detection logic in the `onWindowClick` handler. Specifically, allow modals that contain `this.widgetRef.el` to trigger the closing (and thus saving) behavior, ensuring that selections made in such modals are not lost when clicking Save & Close. Opw-4765799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213996
This fix updates the Vietnam localization migration so only the required tax records are refreshed. It helps protect company-specific accounting settings from being accidentally overwritten during an upgrade.
Original PR description
Problem The previous implementation used try_loading() which would reload the entire chart template, potentially overwriting user-customized configurations settings. Solution Replaced try_loading() with a more targeted approach usin _load_data for account.tax.group and account.tax 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#229476 Forward-Port-Of: odoo/odoo#227918
This fix ensures users working with Brazilian AvaTax errors see the tailored product list again instead of a generic product view. The restored view includes Brazil-specific tax fields, inline editing, and a direct button to open the full product form, helping users resolve issues faster and with the right information.
Original PR description
The actionable_errors widget was changed to ignore views if a view_mode key is present in the action [1]. It caused the standard product.product list view to pop up, which doesn't work in this case. The custom views have the relevant Brazilian fields (SPED type etc), can be edited inline, and have a "View" button allowing the user to go to the product form view. The standard view has none of these. [1] odoo/odoo@3bd833c73ea654d8558e3d9701ad41e4d75ddd6 opw-5154766
Failed email campaigns with hundreds of thousands of recipients can now be retried in smaller batches. This prevents memory errors during resend attempts, helping larger customers recover campaign delivery without manual intervention.
Original PR description
Steps to reproduce the issue: 1. Have 100s of thousands of recipients on a campaign 2. Disconnect your outgoing server and send 3. Reconnect the mailing server and retry sending. Current behavior before PR: A `MemoryError` is raised due to the large number of emails processed to `unlink()` Desired behavior after PR is merged: Larger-scale clients would be able to resend 100s of thousands of emails if they fail opw-5091567 Forward-Port-Of: odoo/odoo#228446
Printing landscape PDF reports through a Virtual IoT Box no longer produces cropped portrait pages. The print process now fits the PDF to the page so the report keeps its intended orientation, reducing wasted paper and reprints.
Original PR description
When printing a landscape report using a Virtual IoT Box, we end up printing a portrait page cropped. This commit adds the "pdf fit page" argument to ensure the page printed follows the report orientation. opw-5051809 Task: 5149706 Forward-Port-Of: odoo/odoo#232866
Landed costs now use the quantity from the affected inventory movement rather than the full remaining quantity of the lot. This prevents costs from being overstated when only part of a lot is included, keeping inventory values accurate.
Original PR description
## Issue: When a lot has remaining quantity not included in the landed cost’s moves, the resulting `stock.valuation.layer` amounts are incorrect Even though `compute_landed_cost()` provides the…
## Issue: When a lot has remaining quantity not included in the landed cost’s moves, the resulting `stock.valuation.layer` amounts are incorrect Even though `compute_landed_cost()` provides the correct base values ## Cause: The cost repartition used `lot_id.quantity_svl` that's the total quantity of the lot , which leads to an incorrect ratio when only part of the lot is impacted As a result, the landed cost amount can be overstated, depending on the difference between the lot's total remaining_qty and the move's remaining_qty This logic only works when all `stock.valuation.layer` of the lot are involved, which is not always the case https://github.com/odoo/odoo/blob/e72b25fffc8f07c51e9a72fe6310e8dd046da793/addons/stock_landed_costs/models/stock_landed_cost.py#L125-L142 ## Steps to reproduce: - Enable Lots & Serial Numbers in Settings - Create a product (Tracked by lot + Valuated by Lot + AVCO) - Create and validate two receipts for the same product and lot - Open Inventory > Products > Lots / Serial Numbers page of Inventory and select your lot (The cost should be 0) - Add Landed Costs for the first receipt - Add a line for a cost of 100$ and compute (You’ll see that one line with 100$ should be added) - Confirm the Landed Cost and click Valuation (The value of the line is doubled to 200$) - On the Lot/Serial Number page of your lot, the cost is also double that the expected value opw-5128570 Forward-Port-Of: odoo/odoo#232740 Forward-Port-Of: odoo/odoo#231936
This fixes a Point of Sale issue where the cash drawer would not open if an unreachable IoT box was also configured. Shops using an ePOS printer can now open the cash drawer reliably, even when another connected device is unavailable.
Original PR description
Steps to reproduce: 1. Configure a POS to use an ePOS printer with the cashdrawer enabled. 2. Also configure the POS to use an IoT box with a dummy device, e.g. '[Shop] Scale'. The important thing is that the IoT box is not reachable when the POS opens, so the dummy devices work well for this. 3. Open the POS, make an order and go to payment, then click 'Open cashbox'. Expected behaviour: The cashdrawer opens Actual behaviour: Nothing happens task-5059502 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232852 Forward-Port-Of: odoo/odoo#232797
This fix prevents Saudi electronic invoice generation from crashing when expected tax information is unavailable. It helps businesses continue invoice processing more reliably and avoids disruption from a missing data edge case.
Original PR description
Before this commit, if the tax_data was missing, it would raise a traceback during the electronic invoice generation. opw-5193614 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The POS Six payment flow now uses the currently logged-in POS user when starting a terminal payment. This prevents payment startup failures when a different employee uses an already-open POS session.
Original PR description
This commit fixes an undefined `user_id` on the pos session when trying to start a payment with a Six terminal from another user than the one that started the session. Before this commit: - open a pos session with Mitchell Admin, - check the value of `pos.session.user_id` (it will be `2`), - open another tab and connect as Marc Demo, - check the value of `pos.session.user_id` again: it should be `6`, but instead is `undefined`. After this commit: We use `pos.user.id` instead of `pos.session.user_id.id` to get the user ID. opw-5055977 Forward-Port-Of: odoo/enterprise#98021 Forward-Port-Of: odoo/enterprise#97975
This fix prevents shared accounting accounts from being deleted when they are still used by journal entries in another company. It helps multi-company organizations preserve accounting data integrity and avoid accidental loss of financial links.
Original PR description
In a multi-company environment, accounts can be shared. A Python constraint prevents deleting an account if it has journal items in the current company. However, this check was missing when an account only contained journal items belonging to other shared companies. This commit fixes the issue by: 1. Updating the `ondelete` attribute of the `account_id` field on `account.move.line` to cascade the restriction at the database level. 2. Updating the existing Python constraint on `account.account` to enforce this logic in stable versions without a module update (this will be removed in the master branch). task-5158966 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232957 Forward-Port-Of: odoo/odoo#232530
Sales commission achievement reports now return the expected grouped results instead of often appearing empty. This helps teams review commission performance more reliably without missing data caused by incorrect report paging.
Original PR description
Before this commit, grouping achievements would result in empty list most of the time. It happened because offset and limit were switched by mistake in the override. As a result an offset of 80 was applied in the request during group by. Forward-Port-Of: odoo/enterprise#97959
Fixed an accounting issue where fixed taxes on invoices with negative-priced products could appear as positive amounts. This ensures refunds, discounts, or other negative invoice lines show tax totals with the correct sign, improving invoice accuracy.
Original PR description
Steps to reproduce: 1. Create a fixed tax 2. Create a invoice with a product with negative price Problem: The amount of the tax is positive while the line is negative. opw-5128767 Forward-Port-Of: odoo/odoo#232394 Forward-Port-Of: odoo/odoo#232084
This fix corrects how fixed taxes are calculated when an invoice line has a negative price, such as refunds or adjustments. It helps ensure accounting totals remain accurate and avoids incorrect tax amounts in financial records.
Original PR description
opw-5128767 Forward-Port-Of: odoo/enterprise#97980
Payment terminals connected through IoT Boxes now remain compatible after the latest service update, even if the box has not been restarted. This avoids disruption for customers and removes the need for a manual restart to refresh terminal drivers.
Original PR description
We previously backported the `iot_http` service to saas-18.4 in odoo/odoo#232282. This fw port included changes to the payment terminals drivers. For them to work correctly with the update of the database, IoT Boxes would have required a restart, in order to get the new drivers version. To avoid clients to do this, we ensure the service is able to understand the old version.