Daily updates from Odoo
Tuesday, January 13, 2026
8 changes · 19.0
New functionality added to Odoo
This update reflects new regulations from the Mexican government (DOF) regarding Employment Subsidy calculations for 2026. The UMA subsidy percentage rates have been adjusted to 15.59% (starting Jan 1st, 2026) and 15.02% (starting Feb 1st, 2026), ensuring compliance with current tax laws.
Original PR description
As per the DOF publication on December 31, 2025, the UMA percentages used to calculate the Employment Subsidy have been updated for 2026. New values: - From Jan 1st, 2026: 15.59% - From Feb 1st, 2026: 15.02% This commit adds these new parameter values to "Mexico: UMA Percentage for Subsidy". Reference: https://www.dof.gob.mx/nota_detalle.php?codigo=5777649&fecha=31/12/2025 target: 19.0 task-5488347
Enhancements to existing features
This update ensures our Brazilian tax compliance by incorporating the latest NCM (National Customs) code requirements. The changes include marking expiring codes with 'DEPRECATED' and adding new codes to accurately reflect current tax regulations. This update is crucial for accurate financial reporting and avoiding potential tax issues.
Original PR description
This **PR** updates the NCM code list as per latest requirement. It appends `DEPRECATED` at the end of expires codes. Also it introduces a few new codes. **task**-5381617 Forward-Port-Of: odoo/enterprise#102009
Resolved issues and error corrections
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 applied when appropriate, aligning with payroll regulations. This improves the accuracy of salary payments.
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
This update corrects a display issue where archived recurring plans continued to appear on the website product pages. The fix ensures that inactive plans are no longer considered during pricing selection, preventing outdated information from being shown to customers. This improves the website's accuracy and user experience.
Original PR description
**Steps to produce:** - Install `sale_subscription,website_sale` module. - `Subscription > Configuration > Recurring Plans`. - `Archive` the `Monthly` plan. - Go to website > Shop > Open product `Car…
**Steps to produce:** - Install `sale_subscription,website_sale` module. - `Subscription > Configuration > Recurring Plans`. - `Archive` the `Monthly` plan. - Go to website > Shop > Open product `Car Leasing (SUB)`. **Issue:** - Even after archiving the Monthly recurring plan, its pricing still appears on the website product page. **Root cause:** - At [1], when searching for a suitable recurring price, the system does not filter out pricing records belonging to archived recurring plans. - As a result, inactive plans are still considered during pricing selection. **Solution:** - In this fix, we ensure that recurring plan pricing is included only if the related plan is active. - Archived plans are now ignored, preventing them from appearing on the website. [1]: https://github.com/odoo/enterprise/blob/25edaac85f8fd1699bb78163b01efb966e7fb680/sale_subscription/models/sale_subscription_pricing.py#L78-L79 before <img width="340" height="184" alt="recurring_plan_before" src="https://github.com/user-attachments/assets/abac39fb-5765-4bc4-aec3-87eef7135a18" /> after <img width="337" height="168" alt="recurring_plan_after" src="https://github.com/user-attachments/assets/35ee92e8-e66b-4612-add3-58b277560ea5" /> **opw-5266333** Forward-Port-Of: odoo/enterprise#103473 Forward-Port-Of: odoo/enterprise#100587
This update fixes an issue where the automated PDF generation for payroll wasn't working when multiple payslips were being processed. The change ensures that PDFs are correctly generated regardless of the number of payslips, improving payroll reporting accuracy. This resolves a previous bug that prevented scheduled PDF generation from completing.
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 fixes a bug in the Barcode app's Manufacturing Order creation flow. When tracking is disabled, a manufacturing order wouldn't correctly add components. The fix ensures the necessary data is available before a comparison is made, preventing errors and ensuring components are properly added to the manufacturing order.
Original PR description
Fix an incorrect flow when creating a Manufacturing Order through the Barcode app. Steps to reproduce: - Disable tracking in Settings - Create a BOM for product Table with components Wood and Screws…
Fix an incorrect flow when creating a Manufacturing Order through the Barcode app. Steps to reproduce: - Disable tracking in Settings - Create a BOM for product Table with components Wood and Screws - In the Barcode app, go to Manufacturing - Click New > Add product and select Table - Click Confirm -> Components are not added after the Table line The issue occurs because `set_qty_producing` is called even when `lot_producing_id` is undefined, leading to a call to `_set_quantity_done` who will delete Stock Move Line since quantity done is 0. So, since SML was deleted, the `move_raw_line_ids` will also be affected. This happens when tracking is disabled, causing the condition `lineRecord.data.lot_producing_id != this.env.model.record.lot_producing_id` to evaluate as true (undefined != false), which triggers `set_qty_producing`. This fix ensures that `lot_producing_id` is defined before performing the comparison. opw-5165163 Forward-Port-Of: odoo/enterprise#103849 Forward-Port-Of: odoo/enterprise#98440
A bug in the automated invoice generation process was causing the system to repeatedly reschedule itself, consuming server resources. This was due to a missing progress update within the subscription processing loop. This fix ensures all invoices are correctly accounted for, preventing the infinite loop and improving system stability.
Original PR description
The scheduled action responsible for generating recurring invoices (`_create_recurring_invoice`) can enter an infinite loop, repeatedly rescheduling itself and consuming server resources without…
The scheduled action responsible for generating recurring invoices (`_create_recurring_invoice`) can enter an infinite loop, repeatedly rescheduling itself and consuming server resources without making any actual progress. ### Reproduction Steps 1. Create a single subscription in the "In Progress" stage. 2. Ensure the subscription meets a condition that causes it to be skipped during invoicing (e.g., it has a draft invoice linked but no payment token). 3. Run the "Sale Subscription: generate recurring invoices and payments" cron. 4. Observe that the cron completes but is immediately rescheduled by the system, repeating the cycle indefinitely. ### Root Cause The Odoo cron mechanism uses a progress tracking system to handle large batches of records. When a job starts, it initializes a `remaining` counter representing the total workload. As records are processed, the job is expected to report its progress to decrement this `remaining` count. If a job finishes with `remaining > 0`, the system assumes the batch was interrupted (e.g., by a timeout) and immediately reschedules the job to complete the unfinished work. In the `sale_subscription` module, the `_create_recurring_invoice` method initializes this counter and iterates over subscriptions. It relies on a helper method, `_subscription_commit_cursor`, to commit the transaction and report progress (decrementing `remaining`). However, inside the processing loop, several conditional checks (such as filtering out subscriptions with existing draft invoices) use the `continue` statement to skip the current record. These skip branches bypass the `_subscription_commit_cursor` call. Consequently, the `remaining` counter is never decremented for these skipped records. The cron finishes with a positive `remaining` value, leading the system to incorrectly flag the job as "partially done" and reschedule it indefinitely. ### Fix Update the loop logic to ensure `_subscription_commit_cursor(auto_commit, progress=1)` is called in all execution paths, including those where a subscription is skipped via `continue` or where an exception is handled. This ensures that every inspected subscription is accounted for in the progress tracking, allowing the `remaining` counter to correctly reach zero and preventing unnecessary rescheduling. opw-5137931
This update resolves an issue where credit notes with discounts on invoice lines were failing validation with SUNAT. The fix prevents users from creating credit or debit notes with line discounts, aligning with SUNAT regulations that treat credit notes as simple amount adjustments. This ensures credit notes are correctly validated and processed.
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