Tuesday, January 13, 2026
20 changes · saas-19.1
Enhancements to existing features
This update ensures invoice labels comply with Section 31 of the CGST Act, which dictates how invoices are labeled based on the type of supplies and customer status. Specifically, the label now correctly reflects whether a document contains only taxable or exempt supplies, aligning with Indian tax regulations. This change improves compliance and accuracy for our Indian users.
Original PR description
Previously, the invoice label was always displayed as “Tax Invoice” or “Invoice”. However, as per Section 31 of the CGST Act, the document label must depend on the nature of supplies and the customer type: - If the document contains only taxable supplies => “Tax Invoice” - If the document contains only exempt supplies => “Bill of Supply” - If the customer is unregistered and the document contains both taxable and exempt supplies => “Invoice-cum-Bill of Supply” - If the customer is registered and the document contains both taxable and exempt supplies, separate documents must be issued as per the law. With this commit, the invoice label is generated strictly in accordance with Section 31 of the CGST Act. In the case of a registered customer where both taxable and exempt supplies exist in a single document, the label will be printed as “Invoice”. task-5468323 Forward-Port-Of: odoo/odoo#241512
This update enhances the Odoo software's support for the Uruguayan market by adding and refining account configurations, specifically for fixed assets and related expenses. It also introduces automated depreciation support for various asset types, streamlining financial reporting within the Uruguay localization.
Original PR description
This commit enhances the Uruguay localization by adding missing accounts and updating existing ones, and by configuring Asset Models for fixed asset management. Changes: - Added and updated account.account entries for fixed assets and related expenses. - Added account.asset data to support automated depreciation for different asset types. task-5392954 Forward-Port-Of: odoo/odoo#240891
Resolved issues and error corrections
This update corrects a technical issue related to Brazilian tax reporting for invoices impacted by a recent fiscal reform. Previously, informative tax details were sometimes omitted, which is now required to ensure accurate XML reporting. This change guarantees compliance with the new regulations.
Original PR description
Before the fiscal reform, we deliberately avoid sending back informative taxes for service invoices because they may change depending on how and when the invoice is paid and they only need to appear on the XML optionally. New informative taxes specific to the fiscal reform are required to appear on the XML and therefore we must always send them. task-5450142 Forward-Port-Of: odoo/enterprise#103670 Forward-Port-Of: odoo/enterprise#103599
This update resolves an error that occurred when creating attendance records for employees with specific overtime rules. The fix ensures that date and time values are handled correctly during overtime interval calculations, preventing a 'datetime' vs. 'int' type error. This ensures attendance creation functionality is stable.
Original PR description
Currently, an error occurs when a user creates an attendance for an employee. **Steps to Reproduce ([Video](https://drive.google.com/file/d/1vm89hHBOVcliYwZjP7fwNOzwC68V3B1l/view)):** - Install the…
Currently, an error occurs when a user creates an attendance for an employee.
**Steps to Reproduce ([Video](https://drive.google.com/file/d/1vm89hHBOVcliYwZjP7fwNOzwC68V3B1l/view)):**
- Install the `hr_attendance` module.
- Go to `Overtime Rulesets` and create a `new overtime ruleset` by adding an `overtime rule`.
Set Based on to `Timing`.
Set the `Start time greater than the Stop time` (ex, Start = 10 and Stop = 5).
- Go to `Employees`, open `any employee record`, and assign this `Overtime Ruleset` to the employee.
- Now go to `Attendances` and `create an attendance` for that employee.
`TypeError: '>' not supported between instances of 'datetime.datetime' and 'int'`
**Cause:**
This error occurs when a user sets the overtime rule on an employee and then creates an attendance. At that point, the system tries to calculate the overtime intervals based on the timing rule. Because the rule’s start time is greater than the stop time, it attempts to calculate the interval for the remaining working period of the day. However, the start date and end date are calculated in datetime format [1], while integer and float values are passed as arguments [2] for day in interval calulation. Since the interval expects values of the same data type, than it raise the error [3].
**Fix:**
This commit ensures that the day start and day end values are passed in datetime format.
[1]: https://github.com/odoo/odoo/blob/67191cf0915081df352331a698be47b7e3ecd505/addons/hr_attendance/models/hr_attendance_overtime_rule.py#L524
[2]- https://github.com/odoo/odoo/blob/67191cf0915081df352331a698be47b7e3ecd505/addons/hr_attendance/models/hr_attendance_overtime_rule.py#L530
[3]: https://github.com/odoo/odoo/blob/67191cf0915081df352331a698be47b7e3ecd505/odoo/tools/intervals.py#L138-L154
sentry-7166788786
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#242491This update resolves an issue where invoices generated with complex certificates (multiple similar RDNs) failed validation by official Spanish tax authorities. The fix ensures the issuer is correctly generated by prioritizing RDNs during the process, improving compliance with regulatory requirements. This prevents potential errors in invoice processing.
Original PR description
When a certificate contains multiple RDNs of the same type (for example several OU entries), the generated issuer is incorrect. This happens because the current implementation relies on a dictionary to sort the RDNs, causing duplicate keys to be overwritten. Steps to reproduce: - Create a certificate with multiple OU RDNs - Upload the certificate in Odoo - Generate the Facturae EDI document - Validate it using official tools: https://face.gob.es/es/facturas/validar-visualizar-facturas https://valide.redsara.es/valide/ejecutarValidarFirma/ejecutar.html The validation fails because the issuer is incorrect. This commit fixes the issue by sorting RDNs using a priority-based list, ensuring all RDNs are preserved and ordered correctly. opw-5408225 opw-5380996 opw-5253287 Forward-Port-Of: odoo/odoo#243098 Forward-Port-Of: odoo/odoo#241094
This update fixes an issue where discounts applied to repair quotations weren't correctly carried over to the linked sale order lines. The fix removes a faulty process that was resetting the discount calculation, ensuring that discounts are accurately reflected in the final order. This improves the accuracy of pricing and reporting for repair services.
Original PR description
**Steps to reproduce:** * Install the **Repair** module with demo data. * From Setting -> enable 'Discounts' and 'Pricelists' * From the home screen, search for Pricelist and open it. * Open the…
**Steps to reproduce:** * Install the **Repair** module with demo data. * From Setting -> enable 'Discounts' and 'Pricelists' * From the home screen, search for Pricelist and open it. * Open the default USD pricelist and go to Configuration → `Show public price & discount to the customer` * Open the *Repair* app. * Create a **Repair Order with parts**. * Click **Create Quotation** button from the repair order. * In the quotation, order line and set a **discount**. * Return to the repair order using the **Repairs** smart button. * Confirm the repair order, then **Start repair** and **End repair** order. **Observed behavior:** * The discount added on the quotation line disappears from the linked sale order line. **Cause:** * The `discount` field on `sale.order.line` is computed by `_compute_discount`, which `depends` on `product_id`, `product_uom`, and `product_uom_qty`. When `product_uom_qty` is written during `action_repair_done`, the compute method is triggered and the `discount` is recalculated. https://github.com/odoo/odoo/blob/49169c4c4fec57d78cd82c4c9366de9d69540e6a/addons/repair/models/repair.py#L457 **Fix:** * Remove the for loop that calls `write()` on the sale order lines, as it is functionally incorrect and causes the discount to be reset. --- opw-5352567 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243075 Forward-Port-Of: odoo/odoo#238410
This pull request addresses several critical issues impacting payroll processing for Australian businesses using Odoo Enterprise. Specifically, it resolves problems with zeroing, Medicare calculations, STP reporting accuracy, and rounding errors, ensuring more reliable and compliant payroll operations. These fixes improve the overall stability and accuracy of the system.
Original PR description
Tracebacks on zeroing Medicare computation to require the variation form Rounding error on STP reporting of Additional withholding task-5416549 Forward-Port-Of: odoo/enterprise#103929
This update fixes an issue where the automated PDF generation for paychecks wasn't working when multiple paychecks were scheduled. The fix ensures that PDFs are correctly generated for all employees, regardless of the number of paychecks being processed. This improves the reliability of payroll reporting.
Original PR description
### Issue: When running the scheduled action "Payroll: Generate pdfs" for several payslips, nothing is generated and a traceback can be seen in the logs. ### Steps to reproduce: - Disable scheduled…
### Issue: When running the scheduled action "Payroll: Generate pdfs" for several payslips, nothing is generated and a traceback can be seen in the logs. ### Steps to reproduce: - Disable scheduled action: "Payroll: Generate pdfs" (to avoid side effect in next step) - Refuse all time off for "Anita Oliver" (to avoid side effect in next step) - Create a user for the employee "Anita Oliver" - Link the employee and the user - Create 2 payslips - 1 for "Mitchell Admin" - 1 for "Anita Oliver" - Compute sheet and confirm both payslips - Run scheduled action: "Payroll: Generate pdfs" - Nothing happens ### Cause: The traceback is raised on the line `self._get_document_partner().id` because `_get_document_partner()` can return a recordset. ### Solution: Call `ids` instead of `id`. ### Note: Calling `_get_document_partner()` on a recordset [here](https://github.com/odoo/enterprise/blob/a0729c8d42ca93016b23e331d8f38c1f4fa88f12/hr_payroll/models/hr_payslip.py#L444) seems unexpected as, if only one payslip in the recordset has `self.employee_id.user_id.partner_id` evaluating to `True`, then it will return only this partner, completely ignoring the other part checking `self.employee_id.work_contact_id`. The final code works fine as `_check_create_documents()` is called again individually [here](https://github.com/odoo/enterprise/blob/a0729c8d42ca93016b23e331d8f38c1f4fa88f12/documents/models/ir_attachment.py#L86). opw-5213979 Forward-Port-Of: odoo/enterprise#103749 Forward-Port-Of: odoo/enterprise#101911
This update resolves an issue where certain buttons on the softphone (for helpdesk and recruitment) were inaccessible to some users. The fix adds necessary permission checks, ensuring all authorized users can now create and view tickets/applicants through the softphone interface. This improves usability and functionality for relevant teams.
Original PR description
The ticket/applicant create/view buttons on softphone are missing permission check. Add them. Task-5461729
This update resolves an issue where failed electronic payments in Point of Sale would block users from canceling the payment. A new 'Force cancel' button has been added, mirroring the 'Force done' button, to allow users to bypass this block and complete the cancellation process. This improves the user experience and prevents lost sales due to payment processing errors.
Original PR description
Before this commit, if an electronic payment failed (e.g. due to the payment terminal/IoT box not being reachable) and the user subsequently tried to cancel the payment from the POS, they would reach a blocked state. The payment never cancels but it cannot be deleted. This commit adds a 'Force cancel' button, similar to the 'Force done' button already present, to allow the user to get unblocked in this situation. task-5485237 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243263
This update corrects a problem where the system incorrectly predicted downpayment accounts when a specific setting wasn't defined. The fix restores the original prediction method, which relies on the system's historical data instead of the partner's information. This ensures accurate downpayment account assignments within the sales process.
Original PR description
In this pr (https://github.com/odoo/odoo/pull/206494), we changed the way downpayment accounts are set. Before, it was set on product categories, now, it's set on res.settings. But with this change, and unexpected behavior occurs. In case the downpayment account is not set in the setting, we try to predict the account to put, but the prediction is wrong, it's predicting based on the partner, but it should be based on the db history. This commit fix that, and brings back the old prediction. task-5473406 Forward-Port-Of: odoo/odoo#242772
This update resolves a validation error that occurred when starting work orders with flexible resources. The fix ensures that attendance intervals are correctly calculated, preventing the 'start date' from being after the 'end date' when using flexible schedules. This improves the reliability of time off requests and work order scheduling.
Original PR description
**Steps to reproduce** On a local DB, with demo data: - Change your machine's time to a late part of the day (e.g. 6pm) - Install `mrp_workorder` - Set the "Standard 40 hours/week" (used by a…
**Steps to reproduce** On a local DB, with demo data: - Change your machine's time to a late part of the day (e.g. 6pm) - Install `mrp_workorder` - Set the "Standard 40 hours/week" (used by a workcenter) as flexible. - From the Shop Floor, start the "WH/MO/00003 - Manual Assembly" workorder. "Validation Error: The start date of the time off must be earlier than the end date." **Cause** `_calculate_date_finished` in mrp is calling `plan_hours` and under certain conditions with a flexible resource, it is possible for `plan_hours` to return a datetime before the `day_dt` parameter. This happens because for flexible resources, `_attendance_intervals_batch` can return attendance intervals with start or end datetimes outside of the start_dt -> end_dt window. For example, a flexible calendar with 8h/day will return the 8:00->16:00 interval, even if start_dt is later than 8:00. **Change** Don't return attendance intervals outside of the [start_dt, end_dt] interval by shifting them if necessary. opw-5123230 Forward-Port-Of: odoo/odoo#243101 Forward-Port-Of: odoo/odoo#233169
This update corrects a technical error in the l10n_dk module that was preventing OIOUBL invoices from passing validation checks. The issue stemmed from using the incorrect codelist for the EndpointID scheme, which has now been updated to the correct version. This ensures proper compliance with OIOUBL standards and facilitates seamless invoice processing.
Original PR description
**PROBLEM** Generated OIOUBL files don't pass schematrons validations. **STEP TO REPRODUCE** 1. Install the l10n_dk module. 2. Create a dk partner with an adress, and VAT number (DK12345674 for example, don't forget to add a street number for the DK Company address). 3. Create an invoice for the DK partner, and download the xml. 4. Use this validator https://oioubl.nemhandel.dk/validation (Odoo Peppol IAP validator tests oioubl version 3.0 which is not the version we want to test). **CAUSE** We used [wrong codelist](https://oioubl-demo.nemhandel.dk/oioubl/kodelister/ElectronicAddressSchemeCode-3.0.html) (oiubl3.0) for schemeID instead of the [one we should use](https://oioubl21.oioubl.dk/Codelists/en/urn_oioubl_scheme_endpointid-1.1.html) (oioubl2.1). opw-5379474 Forward-Port-Of: odoo/odoo#243144 Forward-Port-Of: odoo/odoo#240586
This update fixes a problem where customers on one website could access payment providers enabled only for a different website. The change ensures that payment compatibility is correctly determined based on the customer's website, preventing incorrect payment options from appearing in the sales portal. This improves the customer experience and ensures accurate payment processing.
Original PR description
[FIX] website_sale, adding website_id in portal controller Version: 17.0+e Steps to reproduce ------------------ The database has two different websites. A payment provider is enabled for just one of…
[FIX] website_sale, adding website_id in portal controller Version: 17.0+e Steps to reproduce ------------------ The database has two different websites. A payment provider is enabled for just one of them (website1). When a sale order is created on the sales app and the customer accesses it in its portal on the website2, he is able to pay with the payment provider which is only enabled on website1. The problem also occurs when previewing the customer’s portal view. Why it's happening ------------------ When accessing an order via “/my/orders/<int:order\_id>”, the portal_order_page method calls _get_compatible_providers without passing the website_id. The overriding logic in website_payment then defaults to considering all activated payment methods as compatible, regardless of website restrictions. As no website_id is provided, the overriding method from the payment_provider extension in website_payment module considers every activated payment methods as compatible. The Fix ------- We now add the current website's id to the method if none has been added before. opw-5172444, “Payment provider visible on sales order portal" --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242955 Forward-Port-Of: odoo/odoo#235954
This update fixes an issue where the basic salary was incorrectly calculated for employees in Saudi Arabia. The system now verifies the presence of 'WORK100' in the employee's worked days, ensuring the basic salary is only triggered when appropriate, aligning with Saudi payroll regulations. This improves payroll accuracy and compliance.
Original PR description
purpose: we should check if there are WORK100 in the worked days, but as of now, we dont, and that results in having the basic salary triggered even when it shouldn't. - made basic salary only computed when work entry source is calendar or WORK100 in the worked days (there are attendances for the employee) and made its amount adapt with the worked days task-id: 5472853 Forward-Port-Of: odoo/enterprise#103493
This update resolves issues related to changes in working schedules impacting leave requests. Specifically, it prevents leaves from being incorrectly refused and handles multi-day leaves more reliably by splitting them when necessary. Cancelled leaves are now excluded from these schedule changes.
Original PR description
Before this commit: - Changing the working schedule the day before a non-refused leave caused the leave to be refused. - For multi-day leaves, changing the working schedule before the end, split the leave into two records, both kept in the same state. - Changing the working schedule while a cancelled leave existed raised an error. After this commit: - Changing the working schedule the day before a leave now resets the leave to draft and recomputes its duration. - For multi-day leaves, changing the working schedule before the end splits the leave into two leaves: - the first keeps its original state, - the second is set to draft. - Cancelled leaves are excluded from the working schedule change flow. task-5420417 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#240408
This update resolves an issue preventing credit notes with discounts from being correctly validated by SUNAT. The system now checks for line discounts on credit notes, aligning with SUNAT regulations that treat credit notes as pure amount adjustments. This ensures accurate edi file generation and successful credit note processing.
Original PR description
Steps to reproduce: - With a PE Company setup - Create an Invoice with "Document Type" set to "(01) Factura" - Set a discount on the invoice line - Confirm and send for validation - Create the credit…
Steps to reproduce: - With a PE Company setup - Create an Invoice with "Document Type" set to "(01) Factura" - Set a discount on the invoice line - Confirm and send for validation - Create the credit note - Confirm the credit note and send for validation Issue: Credit note validation will fail with error `3271|El valor de venta por ítem difiere de los importes consignados. - Detalle: xxx.xxx.xxx value='ticket: 1767185167086 error: Error en la linea: 1: 3271 (nodo: "cac:CreditNoteLine/cbc:LineExtensionAmount" valor: "600.00")'` This occurs because while UBL standard allows AllowanceCharge in credit notes, SUNAT does not. Credit notes are treated as pure amount adjustments, not price recalculations. Discounts were already applied in the invoice, so SUNAT ignores AllowanceCharge in CN, causing error 3271. With this commit we introduce a check to ensure users won't post edi credit or debit notes containing line discounts opw-5414766 Forward-Port-Of: odoo/enterprise#103106
This update fixes a bug where payslips were showing blank worked days for employees with fully flexible contracts. The change ensures that worked days are accurately calculated, even when contracts don't have a standard calendar assigned, addressing a potential issue with payroll accuracy. This impacts all users of the Enterprise module.
Original PR description
**Issue:** Payslips show blank worked days for employees with contracts without a `resource_calendar_id` (fully flexible, despite having valid work entries **Cause:** `_get_worked_day_lines()` skips…
**Issue:** Payslips show blank worked days for employees with contracts without a `resource_calendar_id` (fully flexible, despite having valid work entries **Cause:** `_get_worked_day_lines()` skips worked day computation if the contract has no calendar https://github.com/odoo/enterprise/blob/1a10e0444fdb71a072262a1f14f0bfc766d109c6/hr_payroll/models/hr_payslip.py#L665-L674 **Steps to Reproduce:** - Assign an employee a fully flexible contract with attendance as work entry source. - Create work entries based on the attendance records of the employee record - Go to employees > contracts > new Payslip Worked Days section is empty, even though attendance shifts are showing up on top. **Fix:** removing the calendar requirement in the main method and adding a fallback calendar in the called utility method **Note:** same issue happens if work entry source of the contract is Planning opw-4931972 Forward-Port-Of: odoo/enterprise#98941 Forward-Port-Of: odoo/enterprise#93935
This update fixes an issue where payment processing could fail due to unexpected text-based responses from providers like Flutterwave and Worldline during outages. The system now gracefully handles these responses by extracting the error message, preventing errors and ensuring smoother payment processing.
Original PR description
Both Flutterwave and Worldline may respond with plain text rather than JSON-formatted responses when a Cloudflare outage occurs. This would lead to a traceback in Odoo when trying to extract the error message from the request response. This commit introduces a fallback to the text content of the response when any provider fails to parse the response as a JSON content. opw-5403982 Forward-Port-Of: odoo/odoo#242894
This update corrects a bug where purchase taxes weren't correctly applied to purchase orders when products were added from parent company purchase agreements. The fix ensures that taxes associated with the parent company are now accurately reflected on child company purchase orders, improving financial accuracy. This impacts how taxes are calculated for purchases across different company branches.
Original PR description
### Issue: In a child company, adding a product from a Purchase Agreement to a Purchase Order does not apply the associated parent company's purchase taxes ### Cause: In the onchange, taxes were filtered by company: ```python taxes_ids = fpos.map_tax(line.product_id.supplier_taxes_id.filtered(lambda tax: tax.company_id == requisition.company_id)).ids ``` This filter fails for taxes belonging to the parent company, so they were not applied on the child company purchase order ### Steps to reproduce: - Create a company branch and switch to it - Enable `Purchase Agreements` in Settings - Create a product with a Purchase Taxes (ex. 15%) - Create a Purchase Agreement for any vendor with this product - Create a RFQ for the vendor and add the agreement - Observe that the tax is not applied opw-5121243 Forward-Port-Of: odoo/odoo#243169 Forward-Port-Of: odoo/odoo#237114