Friday, January 23, 2026
12 changes · saas-18.2
New functionality added to Odoo
This update adds a new tax specifically for income related to work incapacity (sick leave) in Spain. It ensures Odoo accurately reports this income on Form 190, aligning with AEAT requirements and preventing potential tax errors. This improves compliance and traceability for Spanish businesses.
Original PR description
### Description of the feature this PR addresses: **Specific tax on withholdings for incapacity to work created to correctly reflect the amounts derived in Form 190 of the AEAT.** A new tax called…
### Description of the feature this PR addresses: **Specific tax on withholdings for incapacity to work created to correctly reflect the amounts derived in Form 190 of the AEAT.** A new tax called "**100% WHI monies**" has been created with the aim of correctly reflecting the income derived from incapacity for work in the AEAT's Model 190. ### Current behavior before PR: Currently, Odoo does not allow automatic differentiation between monetary payments derived from work incapacity and those not derived from it. This creates a problem when generating Model 190, as the Spanish Tax Agency (AEAT) requires both types of payments to be reported separately (according to the codes and subcodes established in the model). **In practice, this separation is necessary because:** - Income derived from incapacity for work (e.g., sick leave) is considered employment income with differentiated tax treatment. - Withholdings made on these amounts must be declared in specific sections of Form 190. - If they are not separated correctly, the totals on the form may be incorrect or incomplete, affecting the accuracy of the tax information submitted. ### Desired behavior after PR is merged: A new tax has been added to represent “100% Withholding income tax (workers)”, allowing Odoo to: - Correctly identify and calculate the related amounts. - Report them separately in the AEAT Model 190. - A new tax group has also been created to distinguish these withholdings from regular ones. ### Benefits: - It allows you to correctly generate Form 190, separating income derived from and not derived from work disability. - It facilitates the accounting and tax traceability of this type of income. - It ensures consistency with the information structure required by the Spanish Tax Agency (AEAT), avoiding errors in the annual filing. - It improves the flexibility of the Odoo tax system, adapting it to actual tax needs. ### Technical summary: - A **new specific tax** has been created for withholdings associated with incapacity for work benefits. - This tax **allows the amounts corresponding to these benefits to be identified, accounted for, and reported independently.** - In addition, a **new tax group "Whitholdings IRPF Workers" has been added that groups these withholdings together**, allowing them to be clearly distinguished from other withholdings on earned income. The related issue: https://github.com/OCA/l10n-spain/issues/4416 ### Follow-up suggestion: adjust Odoo’s base tax “15% WHI monies” **Proposal:** Change the base tax “15% WHI monies” to 100% and move it to the new “Whitholdings IRPF Workers” tax group. **Why:** The current 15% rate is not aligned with how AEAT Model 190 requires amounts to be computed: the base should reflect 100% of the earnings derived from temporary incapacity, with the withholding rate applied on top of that base. Keeping 15% leads to misclassification and wrong totals in the "_percepciones_" and "_retenciones_" sections. These are variable withholdings, not fixed taxes — each worker’s rate can change monthly depending on their income and number of days worked. Therefore, having a fixed 15% rate is conceptually incorrect and causes misclassified amounts and inaccurate totals, forcing users to adjust values manually after payroll. Ideally, this tax should not have any fixed percentage defined. Since Odoo currently requires a rate, setting the base to 100% is a pragmatic workaround that ensures more accurate and flexible withholding calculations. **Outcome:** - Correct calculation and reporting of **_percepciones derivadas de incapacidad laboral_**. - Clean separation from other withholdings via the new tax group. - Consistency between accounting, payroll, and the 190 export. Would you accept this change? @moduon @rafaelbn @EmilioPascual @chklop @jco-odoo MT-11667 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232515
Resolved issues and error corrections
This update fixes an issue where the dashboard wasn't accurately counting high-priority maintenance requests. The fix ensures that critical requests are correctly identified and displayed, improving visibility and allowing users to prioritize maintenance effectively. This enhances the reliability of the maintenance dashboard.
Original PR description
Issue before this commit: ========================= The high-priority maintenance request count (todo_request_count_high_priority) was not calculated correctly. Steps to Reproduce:…
Issue before this commit: ========================= The high-priority maintenance request count (todo_request_count_high_priority) was not calculated correctly. Steps to Reproduce: ========================= - Install the maintenance module. - Create a maintenance request and set the Priority to High (3-starred) in the form view. - Open the dashboard. - Observe that the high-priority request count is not displayed. - The count always remains 0, even when high-priority requests exist. Cause of the issue: ========================= In this [PR](https://github.com/odoo/odoo/pull/94866), the logic was mistakenly changed. The priority field is defined as a Selection field, but while computing the count, the comparison was done against an integer(3, not '3') instead of the actual string value. Since the stored value is '3' (string), the condition is always evaluated to False, resulting in a count of 0. With This Commit: ========================= Ensure that high-priority maintenance requests are correctly counted and displayed on the dashboard when they exist. This provides better visibility of critical requests and helps users prioritise maintenance work effectively. Forward-Port-Of: odoo/odoo#244987
This update optimizes how Odoo sends notifications, specifically when the system is under heavy load. By using a faster JSON encoding library (orjson), the system processes notifications more efficiently, reducing delays and improving overall responsiveness. This results in a smoother user experience.
Original PR description
When the gevent server is under high load, the time required to acquire a cursor and fetch notifications increases. This causes notifications to accumulate, leading to larger payloads. Serializing these large payloads using the standard json library becomes a bottleneck. In a gevent environment, this monopolizes the event loop, delaying the processing of other greenlets. This commit introduces optional support for `orjson`. If installed, it is used to significantly speed up JSON encoding, freeing up the event loop. Using `orjson` increases the throughput by ~20% under high load. Forward-Port-Of: odoo/odoo#245072 Forward-Port-Of: odoo/odoo#241601
This update corrects a timezone discrepancy impacting invoices sent to ZATCA in Saudi Arabia. Previously, the system added a +03:00 offset, which ZATCA requires to be transmitted in the Asia/Riyadh timezone. This fix ensures invoices are formatted correctly for ZATCA compliance, preventing potential processing delays or errors.
Original PR description
The time information added to the date of the invoice post for ZATCA in iso format which adds +03:00. However ZATCA expects the time to be sent as is in Asia/Riyadh timezone. - Set up a ZATCA company and onboard a journal - To simulate the timezone issue, replace the hour value with 23h in the following line: vals['l10n_sa_confirmation_datetime'] = datetime.combine(move.invoice_date, fields.Datetime.now().time()). (use .replace(hour=23))) - Create, confirm, and send an invoice to ZATCA opw-5373067 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#244761 Forward-Port-Of: odoo/odoo#243961
This update removes the outdated 'Por Definir' payment method as the default for invoices, sale orders, and POS orders in the MX localization module. This change corrects a fiscal inconsistency, particularly when using the PUE payment policy, ensuring accurate reporting and compliance.
Original PR description
### Issue: The payment method `99 – Por Definir` was used as the default value for invoices, sale orders, and POS orders This leads to fiscal inconsistencies, especially when invoices use the `PUE`…
### Issue: The payment method `99 – Por Definir` was used as the default value for invoices, sale orders, and POS orders This leads to fiscal inconsistencies, especially when invoices use the `PUE` payment policy, where this payment method is invalid ### Cause: In the `_compute_l10n_mx_edi_payment_method_id` methods, the default value was always set to `Por Definir` ### Fix: After discussion with the PO (MIAL), the chosen solution is to archive the payment method `99 – Por Definir`and remove it as a default value All valid cases should already be handled explicitly, making it clear to the user that something is missing when the data is blank ### Steps to reproduce: - Install `l10n_mx_edi` and switch to the MX company - Create an invoice with today’s invoice date - The payment policy is set to PUE - Before the fix, the payment method is set to `Por Definir` For Sale Order and POS Order tests, it's the default value as soon as you create an order opw-5406038 Forward-Port-Of: odoo/enterprise#105058 Forward-Port-Of: odoo/enterprise#104164
This update fixes an issue preventing bookings from being scheduled for the last hour of the day. The system was incorrectly flagging 23:59:59 as unavailable, blocking appointments. The fix ensures that appointment slots can now accurately include time ranges ending at 00:00, improving scheduling flexibility.
Original PR description
**Steps to reproduce:** - Go to Appointment app - Edit an appointment type - Ensure its availability is on resources - Set duration to 1 hour - Add a schedule slot ending in 00:00 - Save and go to…
**Steps to reproduce:** - Go to Appointment app - Edit an appointment type - Ensure its availability is on resources - Set duration to 1 hour - Add a schedule slot ending in 00:00 - Save and go to the website page of the appointment - Last slot is not showing (23:00-00:00) **Issue:** When computing the appointment slots of a resource using time range, the end of day is considered as an unavaibility resource slot with this interval in `_get_unavailable_intervals`: `i_start = 23:59:59.999999` `i_stop = 00:00` this conflicts with the given range (23:00-00:00) in `self._slot_availability_is_resource_available` It comes from `_attendance_intervals_batch`, as `float_to_time(24.0)` is converted to `time.max` (23:59:59.999999) by: `day_to = datetime.combine(day, float_to_time(attendance.hour_to))` This introduces the microsecond unavaibility at the end of the day, which blocks the booking. (it's working properly for availability on users appointments) **Fix:** Changed the condition so that 23:59:59.999999 is considered as equal to 00:00. opw-5163892 Forward-Port-Of: odoo/enterprise#100853
This update resolves an issue preventing point of sale functionality within the l10n_ar_edi module for Arabic VAT. The fix ensures that sales transactions using the Arabic VAT accounting method are correctly processed, improving the module's core functionality for businesses operating in Argentina.
Original PR description
Tarea: 62909 Forward-Port-Of: odoo/enterprise#105104
This update fixes a calculation error in the Vietnam (l10n_vn) sales tax reports. The previous formula excluded 8% VAT transactions from the total sales base, leading to inaccurate reporting. This change ensures that all sales transactions, including those with 8% VAT, are correctly included in the report totals.
Original PR description
`VAT_SALES` report line aggregates total untaxed amount from its children lines. Previously, the formula for this line was missing `VAT_SALES_8.amount_untaxed`. As a result, the base amount for 8% VAT transactions was excluded from the total sales base calculation. This commit adds the missing tag to the `VAT_SALES` formula to ensure the total taxable base is calculated correctly. task-5836154 Forward-Port-Of: odoo/odoo#244915
This update provides more specific error messages when the message list fails to load. Previously, users only saw a generic 'Ann error occurred' message. Now, the commit displays the underlying error details, giving support teams a clearer understanding of the issue and its potential cause.
Original PR description
Backport of https://github.com/odoo/odoo/pull/244094 Before this commit, when message list failed to load, it just displays a "Ann error occurred" generic message with a retry button. This assumes that error happens rarely and when so this is temporarily. However some errors are persistent and it's frustrating to have no clue on why there's error or what may have caused it. This commit shows the `Error.toString()` from fetch message RPC failure on UI, so that there's a clue on the reason the fetch of messages failed. Before / After <img width="305" height="67" alt="Screenshot 2026-01-20 at 15 10 38" src="https://github.com/user-attachments/assets/34c546df-71e6-4055-9f85-8d85a9c89b35" /> <img width="334" height="100" alt="Screenshot 2026-01-20 at 15 09 07" src="https://github.com/user-attachments/assets/5fadd0b7-7ea0-43ca-8c28-0ac1d33650ff" /> Forward-Port-Of: odoo/odoo#245073 Forward-Port-Of: odoo/odoo#244754
This update resolves an issue where tax reverse charges weren't being accurately reported on BIS3 invoices. The system now correctly handles these charges by classifying them as 'Prepaid Amounts,' ensuring accurate tax calculations and compliance. This change improves the reliability of invoice data for international transactions.
Original PR description
There is no WithholdingTaxTotal node in BIS3. You cannot report any negative tax amount as taxes. You can only report VAT taxes but tax reverse charge are not considered as VAT. This commit reports the tax reverse charge amount as a PrepaidAmount instead. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240525
This update fixes an issue where zero-percent taxes (NT/EXEMPT) were incorrectly filtered out during downpayment creation in the Arabic localization. Previously, these taxes weren't properly accounted for, leading to incorrect calculations. This change ensures accurate tax reporting for downpayments and other scenarios.
Original PR description
Taxes 0% NT and 0% EXEMPT should not be fixed taxes. This is causing issue in some cases such as downpayments, where those taxes needs to be present, but fixed taxes are filtered at the creation of the downpayment. opw-5815953 Forward-Port-Of: odoo/odoo#245361 Forward-Port-Of: odoo/odoo#245252
This update resolves issues related to error handling and compatibility with the UBL (Universal Business Language) tax extension for HR payroll. Specifically, it prevents conflicts with other UBL modules and now displays warnings for invoices that fail to fiscalize correctly, improving the reliability of payroll processing.
Original PR description
- Improving error handling for various requests - Adjusting XML generation to not conflict with `account_edi_ubl_cii_tax_extension` if it is installed - Adding a separate test for HR:E category taxes - Replacing skipping import of not successfully fiscalized document with warnings displayed on the moves after import task-none --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245028