Daily updates from Odoo
Thursday, May 28, 2026
231 changes
2 changes
Resolved issues and error corrections
This update fixes an issue where adding images to product pages in the editor mode was failing. The change updates how images are stored to align with recent Odoo updates, ensuring images are correctly saved and displayed. This improves the user experience for product customization.
Original PR description
Versions -------- - saas-19.3+ Steps ----- 1. Go to the product page in editor mode. 2. Press the "Add More" button next to "Extra Media" 3. Add an image by URL. 4. Select the new image and press…
Versions
--------
- saas-19.3+
Steps
-----
1. Go to the product page in editor mode.
2. Press the "Add More" button next to "Extra Media"
3. Add an image by URL.
4. Select the new image and press "Add".
Issue
-----
Traceback
```python
Traceback (most recent call last):
File "/data/build/odoo/odoo/http/router.py", line 432, in serve_db
return retrying(serve_func, env=request.env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
File "/data/build/odoo/addons/website_sale/controllers/main.py", line 757, in add_product_media
product_product.write({"product_variant_image_ids": media_create_data})
...
File "/data/build/odoo/odoo/orm/fields_binary.py", line 84, in convert_to_cache
raise TypeError(f'{self}: use BinaryValue instead of {value.__class__.__name__}')
TypeError: product.image.image_1920: use BinaryValue instead of bytes
```
Cause
-----
When saving the image, the remote URL is fetched and the raw `bytes` are stored in the `product.image.image_1920` field. However, since commit 41fe2ebdb9cc37341362d7af829c087a5f72f9f1, raw `bytes` cannot be directly assigned to `Binary` fields.
Solution
--------
Use the new `BinaryBytes` wrapper.
See also:
- https://github.com/odoo/enterprise/pull/116273This update corrects a technical issue in the Odoo versions timeline that was causing incorrect data display. The fix ensures the timeline accurately reflects version changes by directly pushing items instead of lists, resolving a previous data processing error. This improves the overall accuracy and reliability of version tracking.
Original PR description
The push function does not take a list of items but items. So when it was pushed into the fieldNames list it would create a list with ['display_name', [...]] which is not wanted. task-6072932 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#266767 Forward-Port-Of: odoo/odoo#256130
2 changes
Resolved issues and error corrections
This update resolves an issue where double-clicking images within the Media Dialog caused a technical error. The fix uses a flag to track processing clicks, preventing multiple actions from being triggered, ensuring a smoother user experience when editing website content.
Original PR description
Steps to reproduce: 1.Open the website in Edit mode. 2.Add a snippet with an image. 3.Replace the image. 4.After replacing image, double-click on it to open the Media Dialog. 5.Inside the Media…
Steps to reproduce: 1.Open the website in Edit mode. 2.Add a snippet with an image. 3.Replace the image. 4.After replacing image, double-click on it to open the Media Dialog. 5.Inside the Media Dialog, double-click on the same or any other image. 6.Traceback occurs. Before this commit: parentElement was becoming null because parentElement is a DOM position check.it requires the element to be physically attached in the DOM tree to find its parent.Since this.props.node is not yet in the DOM at that point, parentElement returns null. After this commit: 1.The issue is fixed using a boolean flag: isProcessingClick. Initially, the flag is set to false. When the first click starts, it is updated to true. If another click occurs during the same flow (e.g during a double click), isProcessingClick is already true, so the function immediately returns and prevents the action from being executed multiple times. 2.we now pass closestSnippetEl directly from replaceMedia() through params.this allows the dialog taken snippet reference using (closestElement(mediaEl , "[data-snippet]")) without depending on the media node being attached to the DOM. task-6033320 Forward-Port-Of: odoo/odoo#266664 Forward-Port-Of: odoo/odoo#254790
This update fixes an issue where new link previews displayed a technical ID in the breadcrumb instead of a user-friendly 'New' label. The change ensures that new previews show 'New' until saved, and then display the actual URL, improving the user experience and clarity.
Original PR description
**Problem:** Opening a new `mail.link.preview` record from the technical view shows the internal record reference (e.g. `mail.link.preview,NewId_0x...`) in the breadcrumb instead of the standard…
**Problem:**
Opening a new `mail.link.preview` record from the technical view shows the internal record reference (e.g. `mail.link.preview,NewId_0x...`) in the breadcrumb instead of the standard "New" label.
**Steps to reproduce:**
1. Settings / Technical / Discuss / Link Previews
2. New
3. Observe the breadcrumb
**Current behavior:**
The breadcrumb displays `mail.link.preview,<id>`.
**Expected behavior:**
The breadcrumb should display "New" until the record is saved, and the source URL once saved.
**Cause of the issue:**
The model defines no `name` field and does not set `_rec_name`, so the default `_compute_display_name` falls into its fallback branch and returns `f"{record._name},{record.id}"` — exposing the technical reference in the breadcrumb both for unsaved records (`NewId_...`) and saved ones.
**Fix:**
Setting `_rec_name = 'source_url'` lets the standard display name machinery compute a meaningful label from the existing required field. Unsaved records then surface the standard "New" placeholder via the web client and saved records surface their URL, without introducing a redundant `name` field or overriding the compute.
opw-6095012
Forward-Port-Of: odoo/odoo#2635776 changes
Enhancements to existing features
This update adds logging to the IoT drivers to help our support team quickly diagnose issues related to IoT boxes, specifically when they're stuck using a particular IP address or version. These logs will provide valuable insights for troubleshooting and resolving problems more efficiently. This is an internal improvement to enhance support processes.
Original PR description
This PR adds some minor logs to help identify issues around iot box hanging ip address and version See https://github.com/odoo/enterprise/pull/118377 Forward-Port-Of: odoo/odoo#266410
This update improves support for our IoT devices by adding more detailed logs regarding IP address and version changes, as well as websocket messages sent to the box. A small optimization was also implemented to prevent unnecessary searches, streamlining the process and providing better visibility for troubleshooting.
Original PR description
This PR adds some minor logs around ip/version change and websocket messages sent to the iot box. It also inverts a condition to avoid doing a useless search when sending websocket messages See https://github.com/odoo/odoo/pull/266410 Forward-Port-Of: odoo/enterprise#118377
Resolved issues and error corrections
This update resolves an issue preventing Belgian employees on flexible work schedules from requesting multi-day leave. The fix ensures that the system correctly handles flexible schedules by skipping attendance checks, which was previously causing errors. This enhancement ensures accurate leave calculations and functionality for our Belgian clients.
Original PR description
## Steps to reproduce: - Install l10n_be_hr_payroll module - Create a flexible working schedule and set the company to the Belgian company - Create an employee and assign the created schedule to him - Try to take a multi-day leave for this employee - Notice number of days is 0 - Try to validate the leave - An exception is raised 'The following employees are not supposed to work during that period' ## Cause: When fetching the work intervals for a belgian flexible employee we first fetch the normal work intervals then we call the same method but to filter the time credit attendance and since for the flexible employee there are not specific attendances we return the same normal work intervals and it will subtract those from the main work intervals which will result in an empty intervals to be returned ## Fix: Check if the working schedule is flexible and if so we don't check the time credit attendances at all. opw-6237642 Forward-Port-Of: odoo/enterprise#118528
This update fixes an issue where order names weren't correctly updated when a customer was changed on an order, particularly in scenarios like Delivery/Eat In. The change ensures order names accurately reflect the current customer, improving order clarity and data consistency.
Original PR description
When a partner is changed on an order that was previously named after another partner (e.g. in a Delivery/Eat In preset scenario), the order name was not updated. This was because once `floating_order_name` is set, the order is no longer considered a "direct sale", and the logic to update the name from the partner was bypassed. This commit updates `setPartner` to check if the current name matches the name of the previous partner. If so, it updates the name to the new partner's name. task-id: 6000287 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251811
This update optimizes the account report sheet by streamlining CSS styling to reduce performance bottlenecks. By using CSS variables and direct selectors, the system avoids unnecessary DOM traversal, resulting in smoother and faster loading times, especially for large reports. This improves the user experience and reduces potential lag.
Original PR description
Forward-Port-Of: odoo/enterprise#118490
This update fixes an issue where expected working hours displayed in the Attendances Gantt view were inaccurate for employees with flexible schedules, particularly when viewed through browsers using local timezones. The change ensures accurate hour calculations based on the user's timezone, improving the reliability of attendance tracking.
Original PR description
Steps to reproduce: 1. Ensure your browser is in a non-UTC timezone (e.g. Europe/Zurich) 2. Set an employee to have a flexible working schedule 3. Enter the Attendances app 4. When hovering over the employee in the gantt view, the expected hours do not match their working schedule When we calculate the expected hours for the Gantt view in attendances, we calculate this based on an incorrect number of attendance intervals given from _attendance_intervals_batch(). To ensure that we recieve accurate intervals, we need to ensure that we calculate intervals based on the correct date range with respect to the browsers timezone, instead of the UTC date range. [opw-6175441](https://www.odoo.com/odoo/my-tasks/6175441?debug=assets) Forward-Port-Of: odoo/enterprise#116807
2 changes
Resolved issues and error corrections
This update fixes a bug in the calculation of discounts and subtotals on invoices with both product and global discounts. The change ensures accurate financial reporting by correcting a discrepancy in the test case results. This improves the reliability of invoice totals.
Original PR description
Purpose: A bug was found in the calculation of the `raw_discount_amount` and `raw_gross_total_excluded` when `_add_and_round_raw_gross_total_excluded_and_discount` is called on an invoice that contains both product line discounts and global discounts. Therefore, the discount and subtotal amounts for the test case testing both line and global discounts need to be corrected to ensure accurate test coverage. opw-5412446 Forward-Port-Of: odoo/enterprise#115855
This update fixes an issue where the calculation of the gross total on invoices with both line and global discounts was incorrect. The change ensures that discounts are applied in the correct order, resulting in accurate gross total calculations for invoices, particularly when global discounts are involved. This improves the reliability of invoice totals.
Original PR description
Problem: When both line discounts and global discounts are applied on a product in an invoice, the method `_add_and_round_raw_gross_total_excluded_and_discount` does not return the exact…
Problem: When both line discounts and global discounts are applied on a product in an invoice, the method `_add_and_round_raw_gross_total_excluded_and_discount` does not return the exact raw_gross_total_excluded before the modification done by other AccountTax helper methods, such as dispatching and squashing global discount lines. Current Behavior: The calculation is done in the wrong order of operations. For example, there is an invoice for Product A valued at $100 with a discount of 10% and a global discount of $10. The raw_total_excluded will be $80 after the both discounts. The discount_factor is based on only the line discount of 10%. The formula of the current calculation for raw_gross_total_excluded is: (raw_total_excluded / (1 - (line_discount / 100))) - global_discount = (80 / 0.90) - (-10) = 98.889 This does not equal the expected outcome of $100. Expected Behavior: Based on the previous example, the formula for the calculation should be: (raw_total_excluded - global_discount) / (1 - (line_discount/100)) = (80 - (-10)) / 0.9 = 100 The global discount needs to be added back to the raw_total_excluded to get the line discounted amount in order to divide by the discount_factor to gain the expected raw_gross_total_excluded before taxes and discounts. Steps to reproduce the issue: - Bug was encountered when implementing a global discount solution for l10n_co_dian. - Create an invoice with a product line and in-line discount and another line for global discount - Setup the base lines for the invoice and attempt the following: - _dispatch_global_discount_lines - _squash_global_discount_lines - _add_and_round_raw_gross_total_excluded_and_discount opw-5412446 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262137
1 change
New functionality added to Odoo
This update expands the information sent to Pricer, including price before taxes, tax details, supplier product codes, and units of measure. These additions enable more accurate pricing calculations and address previously missing data required for key use cases. The update also improves code organization and ensures Pricer tags are automatically updated when related product information changes.
Original PR description
We are currently missing some fields which must be sent to Pricer for some basic use-case scenarios This PR adds - Price before taxes - Taxes name (ex: 21%) - Supplier product code - Supplier reference - Units of measure of the product The PR also triggers the update of the pricer tags when the models indirectly related to Pricer are modified (taxes name / supplier reference / supplier product code) + cleans up the code a bit task-4506260 Forward-Port-Of: odoo/enterprise#78009
3 changes
New functionality added to Odoo
This pull request updates the `.weblate.json` files used for translating Odoo's Belgium Point of Sale (POS) modules. It ensures that all necessary modules are included for accurate translation, improving the user experience for customers using the system in Belgium. This is a routine maintenance update to support localization efforts.
Original PR description
Add missing modules in `.weblate.json` for translations of (l10n_be_pos_blackbox, l10n_be_pos_blackbox_hr, l10n_be_pos_blackbox_loyalty, l10n_be_pos_blackbox_self_order, l10n_be_pos_blackbox_settle_due) These modules were added in this PR: https://github.com/odoo/enterprise/pull/96130
Resolved issues and error corrections
This update fixes a problem where bank statement KPIs weren't being updated correctly when no statements were processed. Now, if no KPIs are reported, the corresponding columns are emptied, ensuring accurate KPI tracking within the account module. This prevents potential reporting inaccuracies related to bank statement processing.
Original PR description
The aim of this commit is to update the integer kpis when those aren't received. ### Context: The account module report the bank statement in draft to process. When all bank statement have been processed, there isn't any and thus, the module send back an empty list. ### Before this commit: The bank statement kpi wasn't updated as we didn't received anything about that specific kpi. ### After this commit: Any kpi that wouldn't be reported would get it's column emptied. opw-6170973
This update ensures that payment notifications and receipts are sent to the correct contact – the invoice contact – when a partner has an invoice associated with them. This change aligns with existing practices and improves the accuracy of communication related to payments, while maintaining accounting integrity.
Original PR description
**Context:** Before this commit `account.payment.partner_id` was restricted (by domain) to commercial partners. When a partner has an invoice contact child (`type='invoice'`), checks, receipts and outgoing emails end up addressed to the parent partner instead of the intended invoicing contact. Accounting entries must still be linked to the commercial partner to preserve reporting & reconciliation integrity. **Solution:** The invoice model (`account.move`) already solves the same problem: `partner_id` stores the communication contact, `commercial_partner_id` is the stored compute used for accounting. This commit mirrors that architecture on `account.payment`. Since we are doing this change in stable, we cannot store the commercial partner yet, loosing some out-of-the-box features. We therefore add manual _search. task-6123823
5 changes
Enhancements to existing features
This update enhances the Point of Sale experience by ensuring that when a product is scanned with a barcode, the product configuration automatically preselects the variant details (like color) that match the scan. This mirrors the behavior of searching for a product by barcode, creating a more consistent and user-friendly experience for sales staff.
Original PR description
When a barcode scan matches a specific product variant, the product configurator now behaves the same as when the user searches by barcode: - The `always`-mode attribute (e.g. Color) is preselected from the matched variant instead of being hidden or left blank. - The `no_variant`-mode attributes (e.g. Size) are shown for user input. opw-6220883 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This update corrects a visual issue in the Odoo POS system. Previously, a split button was always displayed, even when bill splitting was disabled. This change ensures the button is hidden when bill splitting isn't enabled, improving the user experience and maintaining a cleaner interface.
Original PR description
The Split button in the POS control panel was rendered whenever the restaurant module was active, without checking the `iface_splitbill` config flag. opw-6248177 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where manually added analytic distributions on purchase orders were lost when the line's account was changed. Now, when a purchase order line's account is modified, the associated analytic distribution remains intact, ensuring accurate tracking of costs. This prevents data inconsistencies and simplifies reporting for users managing analytic accounting.
Original PR description
__ ## Short functional explanation of the error When confirming a Purchase Order holding lines with an analytic distribution that has been manually added, and creating a vendor bill out of this PO…
__ ## Short functional explanation of the error When confirming a Purchase Order holding lines with an analytic distribution that has been manually added, and creating a vendor bill out of this PO using the Auto-Complete field. When we change the account of that line, the line loses the manually added Analytic Distribution. ## Reproduction Steps 1. Go to Accounting. Click on the tab Configuration; under the Analytic Accounting section, click on Analytic Distribution Models. 2. Create an Analytic Distribution Model for a product. 3. Go to Purchase. Create a new PO, set a Vendor and select the product you created the Analytic Distribution Model for. On the right side of the form, click on the view menu and check Analytic Distribution to make it appear. 4. Click on the Analytic Distribution of the product and add a new one; for example, select Administrative in the Departments section. 5. Confirm order. 6. Go to Accounting and click on the Vendors tab > Bills. Create a new bill, and in the field Auto-Complete, select the PO you just created. 7. Change the account of the line. ### Expected behavior Only the account should be changed on the line. ### Unexpected behavior The manually added Analytic Distribution has disappeared. ## Origin of the issue When we change the `account_id` field, the compute method `_compute_analytic_distribution` is triggered. This method retrieves the related distributions of the line: https://github.com/odoo/odoo/blob/af32885ec5f07d492f3b8e8fff1785996a739f72/addons/account/models/account_move_line.py#L1154 which, in the context of Purchase, calls this method: https://github.com/odoo/odoo/blob/af32885ec5f07d492f3b8e8fff1785996a739f72/addons/purchase/models/account_invoice.py#L540-L545 We retrieve the distribution of the related line using `self.purchase_line_id.analytic_distribution`. However, this code isn't triggered when the move line has an analytic distribution, even though the related line `purchase_line_id` might have one! Therefore, we need to execute that code whether or not our move line has an analytic distribution. Note: the same behavior is to avoid when creating invoices for quotations. __ opw-6062466
This update resolves an issue where the PL VAT reporting XML (FA3) was incorrectly omitting a key date field. The fix ensures the system accurately compares the invoice issue date with the delivery date, aligning with Polish tax regulations. This prevents errors in VAT reporting and ensures compliance.
Original PR description
**Steps to reproduce** 1. Create a customer invoice with Invoice Date `2025-05-27` and accounting Date `2026-05-04`. 2. On the *Other Info* tab, set the Delivery Date to `2026-05-04` and post the…
**Steps to reproduce** 1. Create a customer invoice with Invoice Date `2025-05-27` and accounting Date `2026-05-04`. 2. On the *Other Info* tab, set the Delivery Date to `2026-05-04` and post the invoice. 3. Generate the FA(3) XML. **Issue** `P_6` is omitted from the payload even though the delivery date differs from the invoice issue date. The FA(3) information sheet (Warsaw, September 2025, binding from 1 February 2026) defines `P_6` as *"the date of delivery [...] if such date is specified and differs from the date of issue of the invoice"*, where the date of issue is `P_1` (Art. 106e sec. 1 item 1 of the VAT Act). In Odoo `P_1` maps to `invoice_date`, but the template at https://github.com/odoo/odoo/blob/4890b8021af2a5c025944220043d295bb7bbbb9b/addons/l10n_pl_edi/data/fa3_template.xml#L132 compares `delivery_date` against `invoice.date`, the accounting/entry date. When the invoice is posted on the delivery day the accounting date equals the delivery date, the guard evaluates to false, and `P_6` is wrongly dropped. Comparing against `invoice.invoice_date` aligns the guard with `P_1` as the spec requires. Ticket [link](https://www.odoo.com/odoo/project.task/6211119) opw-6211119
This update resolves an issue where Odoo failed to import simplified Italian electronic invoices (TD08) when a line item consisted entirely of taxes. The fix prevents a division-by-zero error, ensuring that valid tax-only invoices submitted by the Italian tax authority (Agenzia delle Entrate) can now be successfully imported. 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 Forward-Port-Of: odoo/odoo#266374
10 changes
Resolved issues and error corrections
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 resolves a test failure related to how data is processed for Italian tax reporting (l10n_it_edi). The fix corrects an issue where test data was incorrectly formatted, causing a base64 validation error. This ensures the test suite runs smoothly and maintains the functionality of the Italian tax reporting module.
Original PR description
This commit fixes an error when running the `test_edi_import` test on Python 3.14, which is stricter about base64 validation. Ultimately, the root issue was that raw test content was being passed to the `datas` field of an attachment when a base64 representation was actually expected (which is obviously invalid base64). Passing it via the `raw` field instead correctly handles the raw binary data. runbot-939133
This update resolves a technical issue causing errors when displaying the Instagram snippet on iOS Chrome browsers. The problem stemmed from a change in how Chrome communicated data, requiring a simple adjustment to our code to correctly handle the received information. This ensures the Instagram snippet displays correctly for all users.
Original PR description
Scenario:
- insert Instagram Page snippet
- using iOS chrome browser (reproduced in iOS 26.3, google chrome 146)
visit that page logged in as a internal user or in ?debug=assets (so
traceback are shown)
Result: 3 tracebacks errors are shown with error "Uncaught Promise >
JSON Parse error: Unexpeced identifier "object".
Cause: probably since this change:
https://chromium.googlesource.com/chromium/src/+/9629a16a7ab0b91c59ecaa9fc8934db3d6c83ba3%5E%21/
chrome on iOS is sending message with this object as data:
{ "command": "registerAsChildFrameAck", "remoteFrameId": "d905013d…" }
but the instagram code is expecting a stringified JSON.
Fix: ignore message data that are object.
opw-5930717This 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