Daily updates from Odoo
Thursday, May 28, 2026
10 changes · 17.0
Resolved issues and error corrections
This update fixes an issue where upsell order lines weren't correctly calculating their invoiced quantity after a subscription was billed. The fix ensures that upsell quantities are accurately reflected in the sale order, resolving a discrepancy between order and invoice data. This improves the accuracy of subscription billing and reporting.
Original PR description
## **Issue:** When creating an upsell after a subscription is invoiced, the qty_invoiced field on the sale order line was showing 0.0, even though related invoice lines existed. ## **Steps to…
## **Issue:** When creating an upsell after a subscription is invoiced, the qty_invoiced field on the sale order line was showing 0.0, even though related invoice lines existed. ## **Steps to reproduce:** - Create and confirm a subscription. - Update the subscription `next_invoice_date` to a future date. - Generate an invoice for the subscription. - Create an upsell order from the subscription. - Confirm and invoice the upsell order. - Open the upsell sale order and check qty_invoiced. ## **Before Fix:** In _compute_qty_invoiced(), upsell lines have recurring_invoice=True and order_id.state='sale', so they are processed by _get_subscription_qty_invoiced(). The deferred date filter excludes their AMLs because of this condition, https://github.com/odoo/enterprise/blob/2ed34cc902d148fba7a88c159cd5c67a62112865/sale_subscription/models/sale_order_line.py#L189 returning 0.0 in the result dict. Since recurring_invoice=True, upsell lines never reach other_lines and super()._compute_qty_invoiced() is never called, causing qty_invoiced to fallback to its default value 0.0. After Fix 1 routes upsell lines to super()._compute_qty_invoiced(), a second issue is revealed. The _get_invoice_lines() overridden and applies a line.date > last_invoice_date filter. Since this condition fails and returns an empty recordset, leaving qty_invoiced at 0.0. ## **After Fix:** 1. In _compute_qty_invoiced(), upsell lines are routed to other_lines to bypass _get_subscription_qty_invoiced() and delegate to super()._compute_qty_invoiced(). 2. In _get_invoice_lines(), upsell lines are excluded from the date-based filtering and letting upsell lines use the base _get_invoice_lines method. OPW - 6213551 Steps to reproduce : [Video](https://drive.google.com/file/d/1px4J2oZJUtfBwIA_syQfdgXfRRg_6EBg/view?usp=drive_link) OPW - 6213551
This update fixes an issue where currency differences were incorrectly aggregated in hierarchical financial reports. Previously, the system was combining figures from different currencies, leading to inaccurate totals. This change ensures that reports accurately reflect the value of transactions in their original currency, improving the reliability of financial data.
Original PR description
opw-6015098
This update fixes an issue where returned sales orders with invoices were incorrectly marked as 'Nothing to Invoice'. The change ensures that sales orders with created invoices are accurately identified as 'Fully Invoiced', streamlining invoice processing and preventing reporting discrepancies. This improves data accuracy related to sales order invoicing.
Original PR description
A sale order with a product that has an invoice policy on delivered quantities is marked as "Nothing to Invoice" regardless of the potential invoices related to it Steps to reproduce: 1. Install Sales, Inventory and Invoicing 2. Go to Sales, create a new quotation for customer Acme Corporation with product Acoustic Bloc Screens and confirm it 3. Go to the delivery and validate it with quantity 1 4. Go back to the SO, create an invoice and confirm it 5. Open the delivery, return it and validate it 6. Go back to the SO, create an invoice and confirm it 7. Go to Sales > Orders > Orders 8. The SO has "Nothing to Invoice" as invoice status Issue: This PR https://github.com/odoo/odoo/pull/254871 changed the behavior to mark a SOL with delivered quantity as "Nothing to Invoice" but it can actually be "Fully Invoiced" if invoices have been created for the related SO Solution: Also mark sale orders that have invoices as "Fully Invoiced" opw-6159512
This update optimizes how Odoo determines putaway locations, significantly speeding up the process. Previously, the system repeatedly calculated weights for each location, leading to slow performance. The fix now batches these calculations, resulting in a much faster and more efficient system, especially when handling multiple products.
Original PR description
The _get_putaway_location() method tries to determine a location in which a product can be stored:…
The _get_putaway_location() method tries to determine a location in which a product can be stored: https://github.com/odoo/odoo/blob/441a6d1b928a44b9a760f926180a925159edff3e/addons/stock/models/product_strategy.py#L175-L181 When no location can be used, the loop iterates over the whole list to call _get_weight() method on each one. We propose to batch the call to _get_weight() method for all locations that will be used and store the result in a dictionnary passed in the context to avoid computing them several times during the same delivery preparation. Benchmarks -------------- For one product with no possible location: | No locations | Before PR | After PR | |------------|--------|-------| | 780 | 9 s | < 1 s | For 98 products that can be placed in various locations: | No locations | Before PR | After PR | |------------|--------|-------| | 6000 | 20 s | 8 s | For one product that could be placed in any of the indicated locations, we will compute the weights for every location while only the first one would have been computed without the fix: | No locations | Before PR | After PR | |--------------|-----------|----------| | 500 | 41 ms | 524 ms | | 2000 | 97 ms | 2.02 s | | 10000 | 513 ms | 10.83 s | opw-5949370 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where importing Peppol XML invoices through newly created purchase journals (using only the Invoicing app) fails due to a missing default account. The fix automatically assigns a default expense or income account, mirroring the behavior for bank/cash journals, ensuring successful invoice imports.
Original PR description
When a user installs only the Invoicing app and creates a new purchase journal, no default_account_id is set on the journal. The Invoicing app does not expose account configuration, so the user cannot fix this manually. As a result, importing a Peppol XML invoice through that journal fails with a database constraint error because the generated account.move.line has a null account_id. https://github.com/odoo/odoo/blob/16245530f0e3e9be21c8b96baaecd3a679420cac/addons/account/models/account_journal.py#L776-L805 This already auto-creates accounts for bank/cash journals, but does nothing for sale/purchase journals. Steps to reproduce: - Install the Invoicing app (no full Accounting) - Create a new purchase journal with type 'purchase' - Go to Vendors -> Bills and Upload a Peppol XML file - Error importing attachment as invoice (decoder=_import_invoice_ubl_cii) Ticket [link](https://www.odoo.com/odoo/action-4043/6014363) opw-6014363
This update resolves an issue in the Italian annual tax report where incorrect values (VL3/VL4 and VL32/VL33) were displayed simultaneously. The fix ensures that only the positive balance for each pair is shown, aligning with tax reporting logic and improving report accuracy.
Original PR description
### Issue In the Italian annual tax report, both VL3/VL4 and VL32/VL33 values could be displayed at the same time However, according to the report logic, only the positive balance should be shown for…
### Issue In the Italian annual tax report, both VL3/VL4 and VL32/VL33 values could be displayed at the same time However, according to the report logic, only the positive balance should be shown for each pair: - VL3 (Tax Due) or VL4 (Tax Credit) - VL32 (Tax Due) or VL33 (Tax Credit) The other one should stay 0 If the global balance is null, both can be 0 ### Cause The lines VL3, VL4, VL32, and VL33 were using the shortcut field `aggregation_formula` directly on the `account.report.line` record This shortcut format does not evaluate or support conditional subformulas like `if_above(EUR(0))` As a result, the report computed and displayed both lines of each pair without filtering out the negative or unwanted values ### Steps to reproduce - Install `l10n_it` and `accountant` and switch to IT Company - Create a balanced Journal Entry for any account - Add the Tax Grid v20 on one of the lines to impact the annual report - Open the `Annual Tax Report (IT)` - Go to the `VL` section - Check the value of VL3/VL4 and VL32/VL33 After the fix, only one value can be positive and the other 0 Ticket [link](https://www.odoo.com/odoo/project.task/6212694) opw-6212694
This update fixes an issue where the pension fund tax was incorrectly applied to all invoice lines with the same VAT rate, leading to inaccurate accounting. The fix now correctly identifies the tax exemption reason from the bill data, ensuring the pension fund tax is applied accurately to the first invoice line. This improves tax compliance and financial reporting.
Original PR description
In `l10n_it_edi` vendor bill import, the pension fund tax was incorrectly applied to all invoice lines sharing the same VAT rate, even though they have different `l10n_it_tax_exemption_reason`s, resulting in wrong entries and document total. We now extract the Tax Exemption reason from the `DatiCassaPrevidenziale` node, and use it to search the correct tax. Steps to reproduce: 1. Install `account` and `l10n_edi_it` 2. In the `4% INPS` tax, set `TC22` in pension fund type and `N2.2` in exoneration 3. Import bill from the ticket 4. See the pension fund tax is applied to all the lines. It should only be applied only to the first one. Ticket [link](https://www.odoo.com/odoo/project.task/6212975) opw-6212975
This update resolves an issue where Android 14 users couldn't access their device's camera when using file input fields. The fix adds support for taking photos directly through the image input type, ensuring consistent functionality across Android devices. This improves the user experience for mobile users.
Original PR description
Since Android 14 we don't have option to take a photo on clicking on file input in Chrome.
This for example will allow only images but no option "Camera"
```html
<input type="file" accept="image/*/>
```
A workaround is to use a dummy mimetype (`*/*`), example `dummy/allowAndroidCamera` The fix will be applied on image widget in addition to the original `acceptedFileExtensions` to not override the existing `accept` attribute
Linked url
- https://blog.addpipe.com/html-file-input-accept-video-camera-option-is-missing-android-14-15/
- https://stackoverflow.com/questions/77876374/html-input-type-file-not-working-to-pull-up-camera-for-pixel-android-14-comb/79163998#79163998
- https://issues.chromium.org/issues/40937303
opw-6040375
backport of https://github.com/odoo/odoo/pull/265750This update resolves an issue where Odoo failed to import Italian electronic invoices (TD08) consisting entirely of taxes, causing a crash. The fix prevents a division-by-zero error when calculating tax percentages, ensuring that valid tax-only EDI documents from the Agenzia delle Entrate can now be imported successfully. This improves the reliability of invoice processing for Italian businesses.
Original PR description
### Issue before this commit: Importing a simplified Italian electronic invoice or credit note (e.g., TD08) fails with a float division by 0 traceback if a document line consists entirely of taxes…
### Issue before this commit: Importing a simplified Italian electronic invoice or credit note (e.g., TD08) fails with a float division by 0 traceback if a document line consists entirely of taxes (where the total line amount equals the tax amount). ### Steps to reproduce the issue: 1. Download Accounting and l10n_it 2. Switch to IT company 3. Go to Vendors > Refunds 4. Try to import the xml from the ticket ### Cause of the issue: The XML parser attempts to dynamically calculate the tax percentage using the formula tax_amount / (amount - tax_amount). When a line is purely a tax adjustment, the taxable base (amount - tax_amount) evaluates to exactly zero, triggering the critical division by zero crash. https://github.com/odoo/odoo/blob/e3b0ca11d99b2ef819cdad68b169112cd73668b6/addons/l10n_it_edi/models/account_move.py#L1863-L1867 ### Reason to introduce the fix: To ensure Odoo successfully imports valid, tax-only EDI documents already accepted by the Agenzia delle Entrate. Ticket [link](https://www.odoo.com/odoo/project.task/6217373) opw-6217373
This update ensures that if a Stripe terminal payment capture fails, the payment status is correctly set to 'retry' instead of being marked as 'done' silently. This prevents incorrect payment statuses and ensures that POS users are immediately aware of payment issues, improving accuracy and preventing lost sales.
Original PR description
Before this commit, a Stripe terminal payment could still be marked as `done` even if the capture step failed. This happens when the card authorization succeeds, `processPayment` returns a payment…
Before this commit, a Stripe terminal payment could still be marked as `done` even if the capture step failed.
This happens when the card authorization succeeds, `processPayment` returns a payment intent, but the subsequent `stripe_capture_payment` RPC fails and `capturePaymentStripe()` returns `false`. The capture flow did not guard that return value and still fell through to `line.set_payment_status("done")`.
In practice, this can happen for example if the Odoo server cannot resolve `api.stripe.com` while capturing the payment intent. Stripe then keeps the payment in `requires_capture`, while the POS line is still synced as paid.
Guard the failed capture path and stop the flow before marking the line as done. In that case, the payment line is put back to `retry` so the failure is visible in the POS instead of silently creating a paid, uncaptured payment.
opw-6075384
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Backport of: https://github.com/odoo/odoo/pull/261521