Daily updates from Odoo
Friday, November 14, 2025
16 changes · master
Enhancements to existing features
The Indian localization now determines whether invoice lines are goods or services directly from the HSN code, reducing unnecessary mismatch warnings. Missing or invalid HSN codes will now block invoice reporting, helping businesses catch compliance issues earlier.
Original PR description
With this **PR**, we remove the warning about mismatches between HSN code and product type. From now on, the product type will be derived directly from the HSN code: if the HSN starts with '99', it will be considered a 'service'; otherwise, it will be treated as 'goods'. This simplifies the user experience by reducing unnecessary warnings. This will also cover cases where the product is service but the HSN is of goods for e.g. Job Work, Discount Line etc. Additionally, invalid/missing HSN on invoice line will now raise a blocking warning. **task**-5061450 Community PR - https://github.com/odoo/odoo/pull/227879 Forward-Port-Of: odoo/enterprise#95108
Point of Sale can now send refund requests to Six payment terminals when an order line has a negative amount. This helps stores process returns through the terminal more accurately and adds safeguards to avoid incorrect automatic refunds from invalid transaction data.
Original PR description
This PR adds the possibility to refund payments with Six terminals which use TIM (Till Integration Module) protocol. When the amount is negative on an order line in PoS, it will now request a refund instead of a payment on a Six terminal This PR also adds the reversals to Six terminals and adds a check for the `transactionType` field to make sure we don't automatically refund if we get invalid data in this field task-3619619
Kenya payroll is being updated so flexible benefit amounts are configured through salary rules instead of separate payroll input records. This makes payroll setup more consistent and prepares the benefits configuration for the newer salary-rule-based flow, with related test and demo data updates.
Original PR description
The main purpose is to adapt the flexible benefits system to use salary rules for its configuration. At this stage, it simply requires converting the payroll inputs into flexible salary rules. . Adapted the record in the hr_salary_rule_data that linked to payroll inputs to become salary rules with condition_select set to property_input. . Removed the obsolete records previously defined in hr.payslip.input.type and converted their purpose into corresponding salary rules in hr.salary.rule. . Modify the existing tests in test_salary_rules and updated demo data to correctly utilize the new salary rule codes for input creation task-5122338
Planning users will now see more readable names when selecting resources and sale order lines in dropdown fields. This makes it easier to identify the right resource or sales line quickly and reduces selection mistakes.
Original PR description
New formatting for M2X selection of: - Resource - Sale Order Line Improved display_name of Resource and Sale Order line in M2X dropdowns by applying formatted_display_name. task-4972325 Examples : <img width="509" height="459" alt="image" src="https://github.com/user-attachments/assets/6cfa9d8a-59d9-4db5-aa6f-812fe9599068" />
When a call activity is completed by placing a call, the related call record is now shown directly in the chatter. This makes it easier for users to review call details and keep communication history connected to the business record.
Original PR description
If a call activity is marked as done by placing a call, we will show the link to the voip.call record in the chatter. Task-5108217
SEPA payroll payments can now be used without automatically installing the full Accounting app. This keeps Accounting optional while allowing businesses to use Payroll with the free Invoicing module, helping avoid unnecessary plan or pricing changes.
Original PR description
Purpose: Previously, installing Payroll with SEPA payments automatically installed the Accounting app through the `hr_payroll_account` dependency. This forced users out of the OAF plan and added a large module they might not need. This PR includes: - Removed dependency on `hr_payroll_account` from the SEPA Payroll module. - Added dependency on `hr_payroll` instead. - If Accounting is installed, SEPA continues to work as before. Result: With this change, SEPA payroll payments can now work with only the Invoicing module (which is free and doesn’t impact pricing). Accounting remains optional, if already installed, the behavior stays the same. task-5248512
Invoices and sales orders for Brazilian localization now show a clearer tax breakdown for each line, including tax name, amount, and percentage. This improves transparency for users and their customers, especially when taxes are calculated through Avalara.
Original PR description
*: l10n_br_edi, l10n_br_avatax, l10n_br_edi_sale, l10n_br_edi_pos Purpose: Display the tax breakdown of each line on invoices and sale orders, showing the tax name, tax amount, and tax percentage. This implementation will offer transparency to users and their customers alike. Additional changes: - Refactored duplicate logic to mixin since common methods were used across pos.order, sale.order, and account.move - Added _search_existing_tax so that taxes can be searched based on the response received from Avalara - Added l10n_br_tax_details compute to mixin - Extracted _l10n_br_call_avatax_taxes for pos.order and sale.order - l10n_br_edi_avatax_data should be a Json field and not be cleared task-5117824
Planning schedules now show every employee in a selected department when viewing shifts grouped by resource, including employees without assigned shifts. This makes it easier for managers to spot available people and assign work directly from the Gantt view.
Original PR description
Steps to reproduce: - Install the Planning module - Open the Gantt view - Group by Resource - Search using a Department Now, allocated and unallocated employees are shown when grouping by resource and filtering by department. This helps in easily assigning shifts. task-4377548
Resolved issues and error corrections
Fixed an issue where Brazil AvaTax installations could fail if the Brazil EDI module was not installed. The tax calculation now uses its own country-code mapping, improving reliability for companies using AvaTax on its own.
Original PR description
Problem: When only l10n_br_avatax or l10n_br_avatax_sale are installed, an AttributeError gets thrown because the field, l10n_br_edi_code, is defined in the dependent module, l10n_br_edi. Solution: A mapping from the country to its EDI code is defined in the mixin so that the required information is still passed into the tax calculation request. This removes the need to use the field l10n_br_edi_code defined in l10n_br_edi. related PR: https://github.com/odoo/enterprise/pull/97845 runbot-build-error-233841
Partial credit notes on subscription invoices now reduce the invoiced quantity only by the amount credited, instead of clearing it completely. This keeps subscription records accurate after partial refunds, helping teams avoid billing discrepancies and incorrect subscription status information.
Original PR description
**Issue** When creating a partial credit note (i.e., for a quantity less than originally invoiced) for a subscription invoice, the `qty_invoiced` on the corresponding subscription order line is…
**Issue** When creating a partial credit note (i.e., for a quantity less than originally invoiced) for a subscription invoice, the `qty_invoiced` on the corresponding subscription order line is incorrectly set to zero, instead of reflecting the remaining quantity. **Steps to Reproduce** 1. Create a subscription with a quantity of 50. 2. Confirm the subscription and generate an invoice. 3. Create a credit note (reversal) for the invoice. 4. Change the credited quantity to 30. 5. Post the credit note. 6. The subscription order line shows qty_invoiced = 0 instead of the expected 20. **Root Cause** The method `_get_max_invoiced_date()` is used to determine the latest invoiced period for a subscription. In its original implementation, it removes refunded periods from the list of invoice dates regardless of whether the refund is partial or full. This causes the system to consider the period as not invoiced at all, which leads to incorrect recomputation of `qty_invoiced` **Fix** Adjust `_get_max_invoiced_date()` to track the net invoiced quantity per period. A period is only removed from the list of invoice dates if it has been fully refunded (i.e., net quantity is zero). This ensures that partially refunded periods are still considered invoiced, and the `qty_invoiced` is correctly updated to reflect the remaining quantity Opw-4908760 Forward-Port-Of: odoo/enterprise#99326 Forward-Port-Of: odoo/enterprise#91344
This update restores the correct display and calculation of pending bank transactions in bank reconciliation. It fixes a missing template extension and ensures totals are fully calculated before being shown, helping users see accurate reconciliation information.
Original PR description
In this commit: https://github.com/odoo/enterprise/commit/1691a9d6ec426566b81537544cafe09d9c62ad78 We added a template to inherit BankRecKanbanRenderer, but we forgot to add the extension. By doing that it broke the pending transaction template override. Also this: https://github.com/odoo/enterprise/commit/5d5a7aca4f0abb4492314324631e8b5463a35332 change the getJournalTotalAmount to use a super instead, but it was missing an await otherwise we just have a promise no task id Forward-Port-Of: odoo/enterprise#99066
Payroll accounting localization packages now install automatically when the matching local payroll app is installed. This prevents missing salary journal settings, helping payroll structures work correctly without manual setup.
Original PR description
Bug: On a runbot, when installing a new loca, the structure doesn't have a salary journal. Cause: If you have hr_payroll_account, you then have payroll and accounting. Then let's say you install l10n_eg_hr_payroll, it will not automatically install l10n_eg_hr_payroll_account because it depends on l10n_eg which is not installed. So the field salary journal exists because of hr_payroll_account but is not populated by the l10n_eg_hr_payroll_account module. Fix: Change the autoinstall modules needed so that only the hr_payroll_account and l10n_xx_hr_payroll account are needed to autoinstall the l10n_xx_hr_payroll_account module. This will automatically install the corresponding l10n_xx module. Task: 5245980
This fix ensures older payments missing a required tracking ID can still be included in payment batches. When exporting payments, the system now creates the missing ID automatically, avoiding errors for companies with legacy data.
Original PR description
…ayments The migration script [1] for the end-to-end feature creates the `end_to_end_uuid` field even when `account_online_payment` is not installed. In such databases, the field is added but remains NULL for existing payments. If these legacy payments are later added to a batch, a traceback occurs because the batch logic assumes that `end_to_end_uuid` is always set [2]. This commit generates a UUID on the fly when exporting a payment whose `end_to_end_uuid` is empty, ensuring that batch creation works correctly even when `account_online_payment` was not installed. [1]: https://github.com/odoo/upgrade/blob/ed83d47b2aaa63113ea86ea83d1ca2c886f60063/migrations/account_iso20022/saas~18.5.1.0/pre-migrate.py#L10 [2]: https://github.com/odoo/enterprise/blob/ebdc2fe2ade72b1505dac5490b7df2a1d06fcb4b/account_iso20022/models/account_journal.py#L289 no task-id Forward-Port-Of: odoo/enterprise#99364
Intrastat reports now use the region assigned to the relevant warehouse when one is available, instead of always falling back to the company default. This improves reporting accuracy for businesses operating warehouses in different regions, including sales, purchases, and point-of-sale flows.
Original PR description
* = stock_intrastat_{pos,purchase_stock,sale_stock}
This commit changes the intrastat report to use the warehouse intrastat
region on moves that has a warehouse intrastat region. Previously, the
region applied was the default one in the company's configuration. The
report's query and domain were modified to take into account the warehouse
region if the move has a warehouse intrastat region.
3 new bridge modules were created with pos, purchase stock, and sale stock.
Each bridge module adds the necessary query join and domain to get the region code.
task-5135764The bank reconciliation screen now uses the remaining unpaid amount when adding partially reconciled invoices or bills. This prevents incorrect payment amounts from appearing and helps accounting teams reconcile bank transactions accurately.
Original PR description
A mistake in 0051b2e1cc12112767acb60a451b0c0b40ab9358 made the bank rec widget use the total currency amount instead of the residual currency amount, which lead to incorrect amounts when adding an invoice/bill line that was previously partially reconciled.
Report variants that are limited by country are shown correctly again when foreign VAT is not allowed. This restores access to the appropriate accounting reports for companies operating under those local rules.
Original PR description
Since this commit https://github.com/odoo/enterprise/commit/13b28f789e0b1d9c3e266a99aae65c48bb6ce8b6, no variants with the availability condition set to country and not allowing foreign vat were displayed anymore. Forward-Port-Of: odoo/enterprise#99379