Monday, June 8, 2026
17 changes · saas-19.2
Enhancements to existing features
This update changes the format of the DEP7 export from PDF to JSON, aligning with regulatory requirements for German tax reporting (BMF/RKSV). The new JSON format is machine-readable and optimized for compatibility with official tax tools, ensuring accurate and compliant data submissions.
Original PR description
In this commit: ------------------- - Updated the DEP7 export to generate a zip with JSON files instead of PDF, in compliance with BMF (RKSV) requirements. - The export now produces a valid JSON document containing the machine-readable data expected by the official BMF tools. - The filename format has also been adjusted to follow common conventions (e.g. `Name_Duration_DEP_KassenID.json`). Task: 6071034 Forward-Port-Of: odoo/enterprise#112276
Resolved issues and error corrections
This update resolves an issue where partner names with '&' characters were being incorrectly formatted for SEPA bank exports, leading to file rejections. The fix ensures '&' is preserved in name and address fields, aligning with banking standards and preventing export failures. This improves data accuracy and streamlines payment processing.
Original PR description
Problem: The previous fix (replacing '&' with '+' in _replace_characters_SEPA) was applied globally, affecting both reference/identifier fields and human-readable fields such as <Nm> (partner name)…
Problem:
The previous fix (replacing '&' with '+' in _replace_characters_SEPA) was applied globally, affecting both reference/identifier fields and human-readable fields such as <Nm> (partner name) and address lines.
As a result, a partner named "test & test GMBH" was exported as:
<Nm>test + test GMBH</Nm>
instead of the expected:
<Nm>test & test GMBH</Nm>
This caused bank file rejections because '&' is the correct XML encoding of '&' and is accepted by banks in human-readable fields.
Root cause:
ISO 20022 / EPC217-08 distinguishes two categories of data elements:
- Reference/identifier fields (InstrId, Ustrd, etc.): must use the restricted basic Latin character set — '&' is not allowed and must be replaced with '+'.
- Human-readable fields (Nm, AdrLine, etc.): may contain the extended Latin character set — '&' is valid and must be preserved so lxml can XML-escape it to '&' in the output.
Fix:
Revert the global '&' → '+' replacement in _replace_characters_SEPA so that '&' is preserved for name/address fields. The replacement of '&' with '+' for reference/identifier fields is already handled explicitly at the call sites in _get_CdtTrfTxInf (InstrId, Ustrd) via .replace('&', '+') before sanitize_communication is called.
ref commit : https://github.com/odoo/enterprise/pull/110809/changes/9e698e4ac9fdf66189ff6712f90a144560a1b484
documentation https://www.europeanpaymentscouncil.eu/sites/default/files/KB/files/EPC217-08%20Draft%20Best%20Practices%20SEPA%20Requirements%20for%20Character%20Set%20v1.1.pdf:
Forward-Port-Of: odoo/enterprise#118604
Forward-Port-Of: odoo/enterprise#115409This update fixes an issue where downpayments made in the Sale module weren't correctly reflected when processed through Point of Sale (PoS). The fix ensures that downpayments are calculated as a percentage of the remaining balance, improving the accuracy of PoS transactions. This prevents overcharging and ensures proper accounting for customer payments.
Original PR description
**Steps to reproduce:** - Make a quotation - Make a downpayment of 50% for it - Go to PoS, make a downpayment of 50% for it - It will be a downpayment for 50% of the total price, even though it should be 50% of what's left **Why the fix:** Since 2736cf99f8f5e42b294366252d903111764ec352 the amount is now calcultated with the account helpers. But the flow with a downpayment that was already added to the SO in the Sale module was not implemented, meaning the full price will be displayed in the case of a % downpayment in POS. The issue is that the price of a downpayment in the baseLines will be 0, because the qty of a downpayment is 0 in the Sale module, and it's imported as is. So we first set it to -1 to make sure we subtract the price from what's left to pay. opw-6087777 Forward-Port-Of: odoo/odoo#268235 Forward-Port-Of: odoo/odoo#259215
This update resolves an issue where kit products were incorrectly inflating inventory valuation reports. The fix ensures that kit products are accurately reflected in inventory history, preventing overestimation of total inventory value by excluding their total value calculation. This improves the accuracy of stock reporting.
Original PR description
Currently, when the user views the quantity history report, kit products are still visible, which leads to an incorrect stock valuation report. ## Steps to produce: * Install mrp_account without demo…
Currently, when the user views the quantity history report, kit products are still visible, which leads to an incorrect stock valuation report. ## Steps to produce: * Install mrp_account without demo data. * Create a product with inventory tracking enabled. * Create a BoM of type kit for that product. * Add component products with a defined cost and on-hand quantity greater than 0 to the BoM. * Recompute the kit product’s cost from its BoM on the product page. * Go to Inventory > Reporting > Stock > Inventory at date > Confirm ## Observed Behavior: Even though kits do not appear on stock valuation they still do appear the inventory history report. **Why kits should not appear on inventory history** For example, consider a kit product called 'Computer' that is composed of the following components: | Product | Quantity | Cost | |--------|--------|--------| | CPU | 1 | $300 | | Motherboard | 1 | $300 | The total cost of the Computer kit is therefore $600. Since the Computer is made up of the CPU and Motherboard, the total inventory value should be $600. However, the system is currently calculating the total inventory value at that particular date as $1,200, which is incorrect because it is counting both the kit and its components ## Root cause: This issue occurs when a user opens the inventory history for a specific date using the `Inventory at Date` option and clicks confirm. At that point, the `open_at_date` function is triggered, which filters products based on the `domain` defined in [1]. Since this domain only checks for tracking-enabled products and does not exclude kit products, kit products still appear. **Why doesn’t this issue occur in the normal stock view?** Because the domain is overridden at [2] to explicitly exclude kit products from the stock view. However, the quantity history report does not apply this same domain override, so kit products continue to appear there. [1]: https://github.com/odoo/odoo/blob/e2281b56d835d510903c6e6a6f84f67077fce99b/addons/stock/wizard/stock_quantity_history.py#L16-L38 [2]: https://github.com/odoo/odoo/blob/e2281b56d835d510903c6e6a6f84f67077fce99b/addons/mrp/views/product_views.xml#L164-L166 ## Solution: To ensure accurate total inventory valuation, kit products should be excluded from the valuation, and only their individual components should be considered. This can be achieved by modifying and overriding the domain to explicitly exclude kit products. This PR can be considered an extension of [3](https://github.com/odoo/odoo/commit/6d9c7165ec60ed0b871ac46d8d85ebbf082e8835). opw-6164547 Forward-Port-Of: odoo/odoo#262185
The configurator was incorrectly inflating the extra price of products, causing inaccurate sales order calculations. This fix prevents the configuration from repeatedly modifying the product price by cloning the relevant array, ensuring accurate price updates. This ensures correct pricing for customized products.
Original PR description
Steps to produce: --- - Install the `Sales` module, enable `Variants` in settings. - Create a product with an attribute, set the name as `Customization`, click `Create and Edit`, add value as…
Steps to produce: --- - Install the `Sales` module, enable `Variants` in settings. - Create a product with an attribute, set the name as `Customization`, click `Create and Edit`, add value as `Custom`, enable `Free Text`, set extra price to `25`, set variant creation to `Never`, and save. - Create a sales order, add the product > configurator opens. - Without saving, open and close the configurator repeatedly (using the pencil icon). Issue: --- - Product price keeps increasing on every open. Root cause: --- - After this [commit], `_getVariantPtavIds()` returns a direct reference to the live `currentIds` array. In edit mode, pushing `_getNoVariantPtavIds()` into it mutates the actual field value, so no-variant PTAV ids accumulate on every reopen, causing duplicate IDs and inflated price computation. Fix: --- - Clone the array to avoid mutating the live `currentIds`. [commit]: https://github.com/odoo/odoo/commit/bd4b6d02fed5fdc5ce628cb7d76df4cfdd2d1b3b opw-6267273 --- **Note:** Not adding a test because only tour test is possible here in this scenario with makes the execution process slow. I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#267991
This change reverts a recent update that was causing missing information (like order details) on the DIN 5008 delivery slip. The fix ensures the delivery slip prints correctly with all necessary data. This resolves an issue impacting multiple customers.
Original PR description
This reverts [1] since it breaks the delivery slip To reproduce the issue: (Need `stock`) 1. Configure the document layout as DIN 5008 2. Create and validate a delivery order 3. Print the delivery slip Error: Some information have disappeared (order, shipping date, and so on) Reverting [1] since it's a recent commit, its use case is neither important nor urgent, and it impacts several customers. [1] 8d588f8198d9057311304e596c009a0795ca6ec7 OPW-6250072 OPW-6260066 OPW-6249926 OPW-6264966 Forward-Port-Of: odoo/odoo#268475
This update resolves an issue where the VAT record books generated for Spanish invoices with 'No Sujeto por reglas de localización' taxes (like PT VAT) incorrectly displayed '01' in the 'Clave de Operación' column. The fix ensures the correct '17' code is used, aligning with Spanish VAT regulations and SII reporting requirements. This improves the accuracy of VAT reporting.
Original PR description
**Steps to reproduce:** * Install the **l10n_es_edi_sii** module. * Create a **Portuguese customer**. * Go to **Settings** and enable **EU Intra-community Distance Selling**, then refresh the tax…
**Steps to reproduce:** * Install the **l10n_es_edi_sii** module. * Create a **Portuguese customer**. * Go to **Settings** and enable **EU Intra-community Distance Selling**, then refresh the tax mapping. * Create a customer invoice with a **"No Sujeto por reglas de localización"** tax (e.g. **23.0% PT VAT**). * Go to **Accounting → Reporting → Tax Report → OSS Sales**. * Export the **VAT Record Books (XLSX)** file and open it. **Observed behavior:** * The "Clave de Operación" column shows "01" for lines with no_sujeto_loc taxes instead of "17". * The SII JSON for the same invoice correctly shows "ClaveRegimenEspecialOTrascendencia": "17". **Cause:** * In `_l10n_es_libros_get_common_line_vals()`, `operation_code` was computed manually as `'02' if exempt_reason else '01'`, which only handled the E2 exempt case and defaulted everything else to "01". * This missed OSS/no_sujeto_loc taxes (e.g. FR VAT, PT VAT) that should produce "17" per the Spanish VAT regime code table. **Fix:** * Extract operation code computation into a new dedicated method `_l10n_es_libros_get_operation_code()`. * For customer invoices, delegate to the existing `_l10n_es_get_regime_code()` method already used by SII, which correctly returns "17" for OSS-tagged taxes, "02" for E2 exempt, and "01" otherwise. * For vendor bills, mirror the SII logic by checking whether the invoice taxes include tags from `mod_303_casilla_10_balance` or `mod_303_casilla_11_balance` (intra-community indicators), returning "09" if so and "01" otherwise. opw-6197141,6216485 Forward-Port-Of: odoo/enterprise#119467 Forward-Port-Of: odoo/enterprise#117236
This update ensures that Cashdro payments are automatically cancelled when a payment is manually 'forced' to complete. Previously, a forced payment would leave the Cashdro machine stuck waiting for a payment that could no longer be cancelled, causing delays and potential issues. This change prevents this scenario and streamlines the payment process.
Original PR description
Since the Cashdro machine has no way for the user to cancel the payment through its interface, if a payment was forced the machine would remain waiting for a payment that could no longer be cancelled from the POS. To fix this, we now send a cancel request whenever a payment is forced. task-6276665 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268496
This update resolves an issue preventing billing users from completing payment registrations for invoices in the Polish localization. The fix adjusts access permissions to allow standard billing users to correctly register payments and compute VAT verification information, improving the payment process for all users.
Original PR description
### Description of the issue/feature this PR addresses: This PR addresses an access control restriction where invoicing/billing users are blocked from completing payment registrations on Polish…
### Description of the issue/feature this PR addresses: This PR addresses an access control restriction where invoicing/billing users are blocked from completing payment registrations on Polish localization databases. Because the Access Control List (ACL) rule for l10n_pl.bank.account.verification was limited only to the "Show Full Accounting Features" group (account.group_account_user ), standard billing users who do not have full accounting features could not access or read verification records during payment registration. This PR modifies the read access rules to grant permissions to the Invoicing group ( account.group_account_invoice ). ### Current behavior before PR: • Users belonging only to the "Invoicing" group (without "Show Full Accounting Features" rights) receive an Access Denied error when attempting to register a payment for a confirmed invoice: │ You are not allowed to access 'PL Bank Account Verification' (l10n_pl.bank.account.verification) records. • This triggers a failure to write/compute the transient field account.payment.register.l10n_pl_bank_verification_ids during the payment wizard load, completely blocking billing users from processing payments. ### Desired behavior after PR is merged: • Standard Billing/Invoicing users ( account.group_account_invoice ) can successfully register payments for invoices. • The payment register wizard computes the l10n_pl_bank_verification_ids and displays warning banners regarding VAT verification without throwing security exceptions. • Full Accounting users ( account.group_account_user ) retain read access as they inherit all privileges from the Invoicing group. Closes #263938 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#267992
This update fixes a bug that prevented payroll calculations from correctly generating worked day lines for employees using attendance-based work schedules. The change ensures that all employees, regardless of their flexible working arrangement, receive accurate wage calculations based on their attendance records. This improves payroll accuracy and reporting.
Original PR description
### **Steps to reproduce:** - Install Payroll and Attendance apps. - Create an employee with a flexible working schedule and work entry source as attendance. - Create an attendance record for this…
### **Steps to reproduce:** - Install Payroll and Attendance apps. - Create an employee with a flexible working schedule and work entry source as attendance. - Create an attendance record for this employee. - Create and compute a payslip for this employee. ### **Observed Behavior:** Worked Day lines are not generated, and Basic Wage is calculated as 0. ### **Expected Behavior:** Worked Day lines should be populated based on attendance records. ### **Root Cause:** During payslip computation, [_compute_worked_days_line_ids](https://github.com/odoo/enterprise/blob/4339010eb1e1633a67573d08e032f3922b0bec49/hr_payroll/models/hr_payslip.py#L1846) only generated work entries for versions having a `resource_calendar_id` at [1]. As a result, fully flexible employees without a working schedule were excluded from work entry generation, preventing worked day lines from being computed. [1]- https://github.com/odoo/enterprise/blob/4339010eb1e1633a67573d08e032f3922b0bec49/hr_payroll/models/hr_payslip.py#L1890-L1898 ### **Fix:** Remove the `resource_calendar_id` filter when calling `generate_work_entries` in `_compute_worked_days_line_ids` so work entries are also generated for fully flexible employees using attendance-based work entries. **opw-6146452**
This update resolves a payment issue that occurred in self-order mode within the Viva POS system. The previous change introduced an error because a required method wasn't available in self-order. This fix simply adds a fallback mechanism to ensure payments continue to process correctly.
Original PR description
The PR odoo/odoo#267280 changed the Viva class to use the `getCashier` method to determine the `cashRegisterId`, however this method does not exist in self order, so an error is always thrown. This commit fixes the issue by simply adding a `?` so that it falls back to the POS config name. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268548
This update corrects an issue in the l10n_lu_reports module that caused incorrect balance sheet reports. Specifically, fields 2955 and 2956 must always be set to zero, as required by Luxembourg's eCDF reporting standards. Fixing this ensures reports are accepted by the eCDF, preventing rejection and guaranteeing accurate financial reporting.
Original PR description
Before this commit, fields 2955 and 2956 in the balance sheet could be incorrect. 2955 must always be blank (not exist) and 2956 must always be 0 per: https://ecdf-developer.b2g.etat.lu/ecdf/forms/popup/CA_PLANCOMPTA/2020/en/2/rules page 116 + 117 If they are not these values specifically, submitting the XML to eCDF results in the report being rejected. Steps to reproduce: - Install l10n_lu_reports - Create a journal entry for a closed year (2025) that debits account 142000 and credits another account that starts with a 1 - Go to the balance sheet for 2025 - Download the XML for the report - 2955 is present and 2956 is either not present or is not 0 (behavior varies between versions) Ticket [link](https://www.odoo.com/odoo/project.task/6246564) opw-6246564 Forward-Port-Of: odoo/enterprise#119193
This update resolves an issue where the IRN (Invoice Reference Number) wasn't being saved when sending invoices via e-invoicing with email in the Indian localization. The fix ensures the IRN is correctly recorded on the invoice after sending, improving compliance and reporting accuracy. This impacts users utilizing the e-invoicing feature for Indian businesses.
Original PR description
**Issue**: Sending invoice through e-invoicing with email in Indian localization will not save the IRN number on the invoice because of a cache issue on the attachment id. **Steps to reproduce**: Install l10n_in_edi_gstr module. Create an invoice and send it through e-invoicing with email option. The IRN number will not be saved on the invoice. **Causes**: When sending the invoice through e-invoicing with email option, the attachment id is not saved on the invoice before calling the method _l10n_in_edi_send_invoice(). This causes a cache issue and the IRN number is not saved on the invoice. **Fix**: Save the attachment id on the invoice after the creation of the attachement. opw-6243256 Forward-Port-Of: odoo/odoo#268595 Forward-Port-Of: odoo/odoo#268285
This update resolves an issue where applying discounts on products with different taxes caused an endless checkout reload. The fix ensures discount lines are grouped correctly, synchronizing the backend and frontend to prevent this frustrating user experience. It improves checkout stability and reliability for customers using varied product tax configurations.
Original PR description
**Step to reproduce :** 1. Create a deliverable product with a sales tax. 2. Create another product with a different sales tax. 3. Publish both products on the eCommerce website. 4. Create a discount…
**Step to reproduce :**
1. Create a deliverable product with a sales tax.
2. Create another product with a different sales tax.
3. Publish both products on the eCommerce website.
4. Create a discount program.
5. Add both products to the shopping cart.
6. Apply the discount code.
7. Proceed to checkout.
**Issue :**
Applying a discount on multiple products with different taxes causes an infinite reload cycle during checkout.
**Reason :**
The reload is supposed to sync the discount lines in the back-end with the discount lines displayed during checkout. If the number of lines don't match, a reload is triggered.
https://github.com/odoo/odoo/blob/18.0/addons/website_sale_loyalty/static/src/js/checkout.js#L22-L24
After the fix introduced in:
https://github.com/odoo/odoo/pull/248215
However, when a discount is applied to products with different taxes, the corresponding reward lines are still categorized as `discounted_lines` instead of `groupable_lines`. As a result, they continue to be processed individually rather than being grouped by reward.
This leads to a mismatch between the backend, which generates one discount line per tax combination, and the frontend, which expects a single discount entry per reward. Consequently, the checkout page continuously reloads while attempting to synchronize both states.
**Solution:**
When a discount applies to products with different tax configurations, the corresponding reward lines should be included in `groupable_lines` rather than `discounted_lines`. This ensures that discount lines are grouped by
`reward_id` consistently on both the frontend and backend, preventing the checkout reload loop.
opw-6210411
Forward-Port-Of: odoo/odoo#265740This update fixes an issue in the Swiss payroll module (l10n_ch_hr_payroll) where the activity rate was incorrectly based on individual employee details. Now, the rate is determined by the Odoo version, ensuring accurate calculations and compliance with Swiss tax regulations. This change improves the reliability of payroll reporting.
Original PR description
…ployee Forward-Port-Of: odoo/enterprise#119658
This update strengthens security by restricting access to sensitive financial data within Odoo. Specifically, it prevents unauthorized users from viewing detailed expense information through reinvoicing and analytic distribution searches. Access to these views is now limited to users with appropriate sales, accounting, or invoicing permissions.
Original PR description
Some financial data were visible to users with no access rights through the customer to reinvoice advanced search and analytic distribution search when creating an expense. This commit ensures that these fields in customer to reinvoice advanced search are invisible if the user doesn't have sales nor accounting nor invoicing access rights, it also modifies the debit/credit/balance columns in the analytic distr bution to be visible to users with accounting or invoicing access rights only. task-5993099 Forward-Port-Of: odoo/odoo#262986
This update fixes an issue where the ICP export generated inconsistent XML reports by potentially using values from multiple company contexts. The change ensures a single, consistent company context is used for identifier values, improving the accuracy and reliability of the reports. This resolves potential confusion and ensures compliance with Dutch tax regulations.
Original PR description
Description of the issue this commit addresses: The ICP export could mix values from different company contexts. In some cases, the main identifier and the fiscal entity division value did not come from the same source, which could create confusing or inconsistent XML output. --- Desired behavior after this commit is merged: This commit makes the ICP export use one consistent company context for identifier values, reuses precomputed values when available, and avoids overwriting them with unrelated defaults. --- task-6065382 Forward-Port-Of: odoo/enterprise#119549 Forward-Port-Of: odoo/enterprise#112995