Wednesday, March 25, 2026
16 changes · saas-18.3
Resolved issues and error corrections
This update resolves an issue where fields weren't being populated correctly during Odoo record creation. The fix ensures that fields are properly filled in when new records are generated, improving data accuracy and reliability. This impacts several core Odoo modules.
Original PR description
See https://github.com/odoo/odoo/pull/199647. Forward-Port-Of: odoo/enterprise#109725
This update resolves an issue where the AEAT tax report file was being rejected due to an incorrect date format. The fix ensures the file includes a default date ('00000000') when the procuration date is not specified, meeting AEAT’s requirements and allowing successful file uploads.
Original PR description
Steps to reproduce: - Install the `l10n_es_reports` module and switch to the `ES company`. - Go to Invoices and create an invoice with taxes, then confirm it. - Navigate to Accounting > Reporting >…
Steps to reproduce: - Install the `l10n_es_reports` module and switch to the `ES company`. - Go to Invoices and create an invoice with taxes, then confirm it. - Navigate to Accounting > Reporting > Tax Report. - From the smart button, select `Report: Tax Report (Mod 390) (ES)` and choose the year as `This Financial Year`. - Download the `BOE` file using the dropdown and fill the wizard fields (e.g., Natural Person – Name: Test, Principal activity: Test, Activity Code: 12345). - Upload the generated .txt file to the AEAT portal. (AEAT credentials are required) **Observation:** AEAT rejects the file with: `Caracteres no válidos '4. Representante - Personas Jurídicas - Represent. 1 - Fecha Poder (DDMMAAAA)'` **Root cause:** At [1], when `judicial_person_procuration_date` is `false`, an empty string is written to the BOE file, resulting in blank spaces in the exported file. This does not comply with AEAT’s required numeric format and causes the file to be rejected. **Fix:** This commit ensures the file contains '00000000' when `judicial_person_procuration_date` is false, complying with AEAT numeric format requirements. [1]: https://github.com/odoo/enterprise/blob/45d3a537c3b2eaccee425d959e89d26229e376cd/l10n_es_reports/models/aeat_tax_reports.py#L1696 opw-5995290 Forward-Port-Of: odoo/enterprise#109652
This update resolves an issue where employees with extra hours weren't showing up on their time off dashboard. The fix adjusts how extra hours are calculated and displayed, ensuring accurate reporting of available time off allocations. This improves the visibility of employee overtime for better workforce management.
Original PR description
### Issue: When an employee has Extra Hours, they are not shown in the dashboard. ### Steps to reproduce: - Install Attendance and Time off apps - Create some attendance with extra hours for the employee - Go to the employee's time off dashboard - Notice Extra Hours allocation is not shown ## Cause: The extra hours are added in [`get_allocation_data()`](https://github.com/odoo/odoo/blob/5c3deb11627f4d6762c4994207bd582afb96f064/addons/hr_holidays_attendance/models/hr_leave_type.py#L35-L66), but then they are removed in [`get_allocation_data_request()`](https://github.com/odoo/odoo/blob/5c3deb11627f4d6762c4994207bd582afb96f064/addons/hr_holidays/models/hr_leave_type.py#L489) just before returning because `max_leaves` is zero. ### Solution: We also set `max_leaves` to `employee.total_overtime`. If the employee doesn't have any extra hours, then it will not display. opw-5925258 Forward-Port-Of: odoo/odoo#255504 Forward-Port-Of: odoo/odoo#253655
This update resolves a restriction that previously limited access to KSeF functionality for users without administrative privileges. By adding necessary permissions, non-admin users can now perform actions related to KSeF compliance, ensuring broader usability of the l10n_pl_edi module. This change enhances efficiency and simplifies processes for a wider range of users.
Original PR description
Fields on `res_company` related to KSeF are marked only for group `base.group_system`, as are the `certificate.certificate` and `certificate.key` models. Adding `compute_sudo` and `sudo()` calls where it's needed in actions that can be performed by non-admin users. task-6018713 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253336
This update fixes an issue where scanning a serial number barcode in work orders incorrectly identified the wrong inventory location. The fix adds a location filter to ensure the system always selects the correct warehouse or stock location for the scanned component, improving accuracy and preventing stock discrepancies.
Original PR description
Steps to reproduce: - Create a database in saas-18.3 or above. - Install mrp_workorder. - Create a storable product tracked by serial number. - Either purchase the product from a vendor (a…
Steps to reproduce: - Create a database in saas-18.3 or above. - Install mrp_workorder. - Create a storable product tracked by serial number. - Either purchase the product from a vendor (a Partners/Vendors quant with negative quantity will be generated) or confirm a Manufacturing Order (a Production quant with negative quantity will be generated). - Create a Manufacturing Order using this product as a component. - In the Shop Floor, scan the serial number barcode to add the component. - Check the location of the scanned component. Issue: - When scanning a barcode in the Shop Floor, searches for a quant matching the serial number with no location filter. Because of this, it returns whichever quant has the lowest database ID — which is the Partners/Vendors quant created during the vendor receipt (quantity = -1), instead of the correct WH/Stock quant (quantity = +1). Solution: - To resolve this issue, a location filter ( source location) and have been added to the quant search. As a result, always returns the correct quant from the move's source location with positive stock. opw-5974474
This update fixes an issue where combo prices were incorrect when multiple quantities were selected. The fix ensures that the combo price accurately reflects the selected quantity of each item, resolving a discrepancy in the Point of Sale system. This improves the accuracy of sales transactions.
Original PR description
**Steps to reproduce:** - Open the PoS - Select a combo and choose whatever - Use the numpad or keyboard to set the combo's qty to 10 - Choose another customer or preset - The price is all wrong…
**Steps to reproduce:** - Open the PoS - Select a combo and choose whatever - Use the numpad or keyboard to set the combo's qty to 10 - Choose another customer or preset - The price is all wrong **Why the fix:** Whenever we change the customer or the preset, the **setPriceList** function is triggered. In this function we recompute the combo's children lines' price. Before this commit, we assumed that the combo's parent line's qty would always be one, and the logic was written on this assumption. Meaning that when it's manually changed, the data is wrong. What really happens is that most of the children line's qty end up being treated as an extra price. This happens because in our exemple, the parent and children lines have a qty of 10, but we only set the free qty based on the assumption that the parent line has a qty of 1 on those lines https://github.com/odoo/odoo/blob/f5d5783b6a0c908127aa620ad0ec5b0008d7adf4/addons/point_of_sale/static/src/app/models/pos_order.js#L482-L485 This means that, as the free qty is rapidly depleted, we fall back on the extra products, and their unit price end up becoming the combo's base_price. We now set the right amount in the free qty based on the parent line's qty. When doing this, another problem arises, we have to multiply the children's unit price by the parent's qty, as theunit price's computation was based on the fact that weonly have a qty of one on the parent line. This is because we were still basing the unit_price the the parent's lstPrice, but this price was not using the parent's qty at all, so we need to multiply it by the parent line's qty to make it work. The unit price handling has to be done in the **computeComboItems** function, as we also need to adjust the remaining price accordingly. An access to the parent's qty was added onto the child line, to avoid adding a default parameter to the function, which should be avoided in stable if possible. opw-5266483
This update corrects errors in the Romanian SAFT (SAF-T) report generation, specifically addressing issues flagged by the Romanian validator. The fix restores a key data element and uses a sanitized bank account number, ensuring compliance with reporting standards and preventing validation failures.
Original PR description
Problem --------- In odoo/odoo#184131 and odoo/enterprise#72206, UOM's categories where removed. Along side the removal, the Description tag in the Romanian SAFT UOM table tag. However, this is the SAFT without this node is flagged as invalid by validator in Romanian. Furthermore, in the RO SAF-T, we use the bank account number and not the sanitized one, which may lead to some spaces in the document. Spaces that are not accepted either. Solution --------- Add back the Description node and use the UOM name instead of category. Use the sanitized account number. opw-5956277 Forward-Port-Of: odoo/enterprise#111664
This update significantly speeds up the process of creating manufacturing orders when a sale order triggers a large BoM. Previously, the system recalculated cost shares repeatedly, causing delays. Now, a caching mechanism avoids this redundant calculation, resulting in much faster order processing times.
Original PR description
Before this commit, confirming a Sale Order that creates a Manufacturing Order for a product with a large BoM could take several minutes when `purchase_mrp` was installed. The slowdown comes from…
Before this commit, confirming a Sale Order that creates a Manufacturing Order for a product with a large BoM could take several minutes when `purchase_mrp` was installed. The slowdown comes from `mrp.bom.line._get_cost_share()`, which is called for every line during a BoM explosion. When no explicit `cost_share` is set, the method recomputes the list of eligible BoM lines and checks whether any of them has a manual cost share. That computation depends only on the BoM and the product variant, but it is recomputed for every exploded line during `mrp.bom.explode()`. This causes a full BoM scan to be repeated for every single line. This commit introduces a contextual cache, initialized in `mrp.bom.explode()`, to store that metadata. We compute it once and reuse it for all lines of the same (BoM, variant) within the same explosion. ### Benchmark: | BoM lines | Before PR | After PR | | --- | ---: | ---: | | 100 | 3.747s | 1.094s | | 300 | 26.554s | 2.826s | | 600 | 85.378s | 5.299s | | 992 | 229.246s | 9.068s | opw-6017626 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254868
This update corrects a potential issue where Italian VAT invoices were incorrectly processing withholding reasons. The change broadens the system's search to allow taxes with the same withholding type to be used during import, even if the specific reason doesn't match. This ensures more accurate VAT withholding calculations for Italian businesses.
Original PR description
Some invoice come in with a wrong ENASARCO withholding reason. We now broaden the search to allow taxes with the same withholding type to be used during import even if the withholding reason doesn't match. In the test, I change the Enasarco tax to reason Q to check that it gets correctly assigned. Ticket [link](https://www.odoo.com/odoo/project.task/5175587), [link](https://www.odoo.com/odoo/project.task/5933699) opw-5175587 opw-5933699 Forward-Port-Of: odoo/odoo#251734 Forward-Port-Of: odoo/odoo#236251
This update fixes a bug that prevented the Google address autocomplete feature from working correctly when certain modules modified address fields. The change adds a new widget to street fields and handles address autocomplete across e-commerce and internal address forms, ensuring accurate address suggestions.
Original PR description
_= base,base_address_extended,google_address_autocomplete,website_sale_autocomplete The Google autocomplete feature was breaking when modules such as base_extended_address modified the address form (e.g., replacing street with street_name, street_number, etc.). In this commit: --- - Add the Google autocomplete widget to street-related fields. - Also same thing handled in frontened (e-commerce address autocomplete). - and update 'city_id' from available cities records if matches with google result. - ```update access_rights for RecCity Model - grant read access to public user``` --- task-5382984 opw-5362597 Forward-Port-Of: odoo/odoo#238672
This update fixes an issue where kit products were incorrectly reporting the full sales price of each component in delivery DDTs. Previously, the system didn't properly account for kits, leading to inflated values. Now, the delivery DDT accurately reflects the value of each component within the kit.
Original PR description
Steps to reproduce: - Have an IT company setup - Create a product with a Sales Price and define a kit BOM with 2 components - Create SO with product - Confirm, go to delivery, validate - Print Issue: In the delivery DDT, there is a summary of the delivery where each item has its own entry (product, quantity, value). However, in case of kit BOM, each component is reported with the full value of the sale operation. Analysis: This occurs because in the report code we don't consider the possibility of kit products, where multiple components are associated to the same sale line. Ticket [link](https://www.odoo.com/odoo/project.task/5013606) opw-5013606 Forward-Port-Of: odoo/odoo#255435 Forward-Port-Of: odoo/odoo#224103
This update corrects a legal requirement for invoices generated using the l10n_gt_edi module. Previously, certain invoice document types (FCAM, FCAP, FESP) lacked essential 'complementos' attachments in the PDF version, while they were present in the XML. This fix ensures compliance with tax regulations.
Original PR description
**PROBLEM** For some documents types, the "complementos" are not present in the pdf while they are present in the xml. It's legally required that they are added in the pdf. **STEP TO REPRODUCE** 1. Install l10n_gt_edi. 2. Create an customer invoice. 3. Set the document type to FCAM, FCAP, or FESP. 4. Send the invoice using the cfdi. 5. download the xml and the pdf, notice the complementos are in the xml, but not in the pdf. opw-5970285 Forward-Port-Of: odoo/enterprise#109061
This update fixes an issue where invoices generated with the l10n_dk_nemhandel module were incorrectly using the VAT number instead of the company partner's EAN/GLN as the EndpointID for Nemhandel transmissions. This ensures accurate data transmission and compliance with Danish regulations. The change ensures invoices are properly formatted for electronic payment processing.
Original PR description
**STEP TO REPRODUCE** 1. install l10n_dk_nemhandel, and activate nemhandel. 2. Create a company partner, with a EAN/GLN as the nemhandel id. 3. Create an individual partner linked to the company partner. 4. Create an invoice with this individual partner. 5. Send the invoice with nemhandel. 6. open the xml file, and notice that the EndpointID doesn't use the EAN/GLN of the company partner. (It falls back to the VAT instead). opw-5945440 Forward-Port-Of: odoo/odoo#251783
This update fixes a problem where the AI chat feature was incorrectly showing the 'OOO' banner and engaging in self-conversations. The change ensures that AI conversations correctly identify a real agent correspondent, preventing these unwanted behaviors and improving the overall user experience.
Original PR description
Override AI thread correspondent computation to keep the base behavior but clear the correspondent when it resolves to the current user in ai_composer/ai_chat. This avoids self-chat fallback side effects (like OOO banner) while preserving agent flows that rely on a real non-self correspondent. source of this crash: https://github.com/odoo/enterprise/pull/108217
This update corrects a bug where manual Stripe payments (SEPA Direct Debit) were immediately canceled despite the transaction remaining in 'Pending' status. This prevented subscriptions from correctly reflecting payments and could lead to automatic closures. The fix ensures payments remain in the correct 'Pending' state until Stripe confirms the transaction.
Original PR description
**Problem:** When manually registering a payment using a Stripe SEPA Direct Debit token, the associated `account.payment` is immediately canceled, even though the Stripe transaction is in "Pending"…
**Problem:** When manually registering a payment using a Stripe SEPA Direct Debit token, the associated `account.payment` is immediately canceled, even though the Stripe transaction is in "Pending" status. Later, when Stripe confirms the transaction, the payment remains canceled, leading to subscription closures after 90 days of apparent non-payment. **Steps to reproduce:** 1) Set a customer address to Belgium and add a SEPA Direct Debit payment token via Stripe. 2) Change the company currency to euro. 4) Create a manual invoice for that customer. 5) Pay the invoice using the pre-configured Stripe SEPA token. 6) Observe the `account.payment` is immediately canceled despite the transaction being "Pending". 7) When Stripe confirms the transaction, the payment stays canceled. **Cause:** In `account_payment.action_post()`, after sending the payment request, all payments whose transaction state was not `done` were canceled. For asynchronous payment methods like SEPA Direct Debit, the transaction starts in `pending` (not `done`), so the payment was wrongly canceled. **Solution:** - Only cancel payments whose transaction ended in a failure state (not in `done`, `pending`, or `authorized`), so pending/authorized payments stay in draft/in_process. opw-5934381 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253876
This update corrects an issue where ISO20022 files generated for Swiss companies were being incorrectly formatted, leading to bank rejections. The fix ensures the correct 'PAIN 09' version is used, resolving compatibility problems and preventing failed file submissions. This upgrade dynamically updates existing databases to maintain proper file formatting.
Original PR description
To reproduce the issue:
- Create a database in 17.0, with a Swiss company, and install account_sepa. Make sure the bank journal uses the Swiss IS020022 PAIN version.
- Migrate this database to 18.0
- Generate an ISO20022 xml file for the Swiss company
==> The file is wrongly formatted, and will be rejected by the bank.
This happens because the sepa_pain_version field of the journal is still set to its old selection value ('pain.001.001.03.ch.02') after migration, which is not supported anymore. The ORM hence returns an empty value when accessing the selection field, and does not enter the proper conditions when generating the file.
An upgrade fix has been made here https://github.com/odoo/upgrade/pull/9771. This commit makes sure already-migrated databases dynamically fix the issue as well.
opw-6060612
Forward-Port-Of: odoo/enterprise#111949