Daily updates from Odoo
Friday, December 12, 2025
26 changes · 19.0
Enhancements to existing features
This update ensures Odoo correctly handles negative invoice lines in Mexico's CFDI e-invoicing format. Previously, the system struggled when negative line amounts exceeded the total of multiple positive lines. This change improves compliance with Mexican regulations and prevents potential invoicing errors.
Original PR description
In mexico, you cannot send any negative lines in the CFDI (Mexican e-invoicing). The negative lines are distributed accross the positive ones in _dispatch_global_discount_lines. This test ensures the negative line is well distributed when its amount is higher than the sum of multiple positive lines. Forward-Port-Of: odoo/enterprise#101888
This update enhances the clarity of financial reports, particularly the Trial Balance and General Ledger, by displaying unaffected earnings as separate lines for each company. It also addresses several localization issues and introduces a warning for unallocated earnings when generating reports like SAF-T. This ensures more accurate and understandable financial data.
Original PR description
This commit changes the way the Unaffected Earnings are displayed in the Trial Balance. Instead of allocating unaffected earnings to the equity_unaffected account when the report is rendered, we now showcase the earnings to an additional line per company, with no relation to an account. In this commit, we also add the account type 'expenses_other' which was missing from the line 'Less Other Expenses' in the Generic P&L. Task [link](https://www.odoo.com/odoo/project.task/5153168) task-5153168
Resolved issues and error corrections
This update fixes an issue where subscription details weren't being displayed correctly within the project dashboard. The fix addresses a problem with how subscription data was being filtered and retrieved, ensuring subscription titles are now shown accurately when the subscription section is expanded. This improves the user experience for managing subscriptions.
Original PR description
Before this commit, when subscriptions were linked to the analytic account of a project, the sale order items appears in an unwanted section when the section is unfolded. Meanwhile, when the subscription section is unfolded the title of the subscriptions items are not correctly displayed. The first issue is due to the fact that we did not correctly exclude the subscriptions items from the domain. The second issue is due to the fact that we fetch the field 'name' from the subscription search instead of the field 'display_name' task-5159781 Forward-Port-Of: odoo/enterprise#97238
This update resolves a problem where tests were failing after a recent change that limited the use of 'mock' helpers. The fix ensures tests continue to run correctly, maintaining the stability of the Odoo Enterprise system. This change primarily impacts internal testing processes.
Original PR description
This commit adapts tests failing due to a recent fix preventing the use of 'mock...' helpers outside of tests. - Community: https://github.com/odoo/odoo/pull/239237 Forward-Port-Of: odoo/enterprise#101802 Forward-Port-Of: odoo/enterprise#101780
This update resolves an issue where users with access to multiple companies but only one employee were unable to schedule themselves for planning slots in those companies. The fix restores the previous behavior, ensuring all authorized users can participate in planning across their companies. This corrects a database inconsistency and improves usability.
Original PR description
Since #91616, if a user has access to multiple companies but only has an employee in one, they are unable to assign themselves to a planning slot from a company other than that of their employee. This was not the case in previous versions and is causing issues in our internal db. To restore the previous behavior, any user with access to a company but only 1 employee will be able to assign themselves to slots of said company. opw-5163200 Forward-Port-Of: odoo/enterprise#101659
This update fixes an issue where multiple quality checks were being created for the same picking when adding additional products. The change adds a validation step to ensure only one operation-based quality check is generated per picking, streamlining the quality control process and preventing redundant checks.
Original PR description
Steps to reproduce: -------------------------- 1. Install the Quality module. 2. Create a Quality Control Point with: * Control per: Control on Operation. * Operation: Receipts (set in the Operations…
Steps to reproduce: -------------------------- 1. Install the Quality module. 2. Create a Quality Control Point with: * Control per: Control on Operation. * Operation: Receipts (set in the Operations field). 3. Create a Receipt containing one product. 4. Click the Mark as To Do button. 5. Add another product to the same Receipt and save it. Observation: -------------------------- Two quality checks are generated for the same picking, despite the tooltip indicating that only one check should be created per operation. Issue: -------------------------- No validation existed to verify whether an operation-based quality check had already been created for the picking when adding additional stock moves after confirmation. Solution: -------------------------- Add a check ensuring that if a quality check already exists for the same picking type and operation (with no product or category criteria), no additional operation-based quality checks are created. opw-5249233 Forward-Port-Of: odoo/enterprise#101788 Forward-Port-Of: odoo/enterprise#100118
This update restores the missing email templates required for sending invoices and credit notes in compliance with DIAN regulations within the l10n_co_dian module. The previous removal of these templates was corrected, ensuring proper functionality for Colombian businesses using Odoo Enterprise. This fix addresses a critical requirement for accurate tax reporting.
Original PR description
**Steps to reproduce:** - Create a database with l10n_co module - "Invoice (DIAN): Sending" and "Credit Note (DIAN): Sending" are missing in the available templates **Issue:** Xml line which added "l10n_co_dian.email_template_edi_invoice" and "l10n_co_dian.email_template_edi_credit_note" templates was removed in https://github.com/odoo/enterprise/commit/7add9dbface8e67dd25b05653d514d5f8c2cfa38 **Fix:** Re-add the `<function>` to `_create_dian_mail_templates` in the `.xml`. opw-5385848
This update fixes an issue where helpdesk return pickings incorrectly defaulted to a generic incoming operation type. The change ensures that returns are now automatically created using the specifically configured 'Delivery Orders' operation type, streamlining the return process and improving accuracy.
Original PR description
Steps to reproduce: - 1. Go to Inventory > Configuration > Operation Types. 2. Open the 'Delivery Orders' operation type. 3. In the 'Returns Type' field, select a specific 'Returns' operation and save. 4. Go to the Helpdesk app and create a new ticket. 5. Click the 'Return' button to create a return picking. Issue: - The 'Operation Type' on the newly created return defaults to the first available 'incoming' operation. It incorrectly ignores the specific 'Returns Type' that was configured on the 'Delivery Orders' operation type. Cause: - The _prepare_picking_default_values method on the stock.return.picking wizard contained logic to search for the first operation type with code='incoming'. Fix: - The logic now finds the 'outgoing' (Delivery) operation type and uses its configured 'Returns Type' as the default for the new return. task-5074911
This update addresses a performance issue in the sign module related to corrupted PDF files. By updating the PDF.js library, Odoo now avoids an infinite loop and potential traceback errors when handling problematic uploads, ensuring smoother document processing. This improves the reliability of the sign workflow.
Original PR description
Modification of module to align it with the newer version This commit updates the PDF.js library to patch the issue related to: mozilla/pdf.js#18878 In Odoo this issue raises a performance issue that makes a infinite loop when you upload a corrupted file and Odoo tries to upload a traceback. OPW-5214755 Forward-Port-Of: odoo/enterprise#101551 Forward-Port-Of: odoo/enterprise#99912
This update fixes a bug where the 'Other Expenses' account type wasn't displayed in the Balance Sheet report. The change was made to align the report with a recent addition to the system for vendor bill tracking. This ensures all financial data is accurately reflected in the Balance Sheet.
Original PR description
In saas-18.3 a new account type was added: "Other Expenses" These accounts are excluded from the account many2one field to make it easier to find relevant expense accounts for vendor bills. Issue: This account type is not included in the Balance Sheet report. see comment in opw-5269456 related to opw-5191111 Forward-Port-Of: odoo/enterprise#101591
This update allows the 'Emissions stat' button to be displayed on a wider range of account moves, including Purchase Receipts, previously it was limited to specific invoice types. This expands the data available for ESG reporting and provides a more complete picture of emissions across the business.
Original PR description
Prior to this PR, we limited the display of the Emissions stat button of 'account.move' to Vendor Bills and Credit Vendor Bills ('in_invoice' and 'in_refund'). But emissions could be reported in other types of moves (e.g. Purchase Receipt), so we remove that condition.
task-5407761
Forward-Port-Of: odoo/enterprise#101906This update resolves a technical issue that prevented users from correctly setting accounting periods when configuring their tax returns journal. The fix ensures that a necessary installation step is triggered, preventing a traceback error and allowing users to complete this important setup process. This improves the stability and usability of the accountant module.
Original PR description
From **saas-18.3**, when installing the accountant module, after [this PR](https://github.com/odoo/enterprise/commit/49aca723c2422fedcc8bda963a6346a172825617#diff-c703c688dc3f80644a43c96657cb2db0122b83cee9bcfa417554b0c7f1e4f550L22) the `_initiate_account_onboardings()` was not called anymore for companies that already had a chart template. This caused a traceback while configuring the Accounting Period on the Tax Returns journal: `ValueError - Expected singleton: onboarding.progress()` We now fix this behavior by ensuring that `_initiate_account_onboardings()` is called when installing the chart_template, filling the gap that was introduced. **Steps to Reproduce:** 1. Install `accountant` module without demo data. 2. Accounting > Dashboard > _Tax Returns_ Journal, click on the **"Tax Returns"** button. 3. Set an **Opening Date** in the wizard and try to apply the **Accounting Periods**. sentry-7064593163 Forward-Port-Of: odoo/enterprise#101442
This update resolves a translation issue within the l10n_be_reports module. The system incorrectly attempted to use VAT communication logic for a company using the LU localization, resulting in a ValueError. The fix ensures the correct chart template is used during translation loading, preventing this error.
Original PR description
``` File "/home/odoo/src/odoo/19.0/addons/account/models/ir_module.py", line 100, in _register_hook self.env.registry._delayed_account_translator(self.env) File…
```
File "/home/odoo/src/odoo/19.0/addons/account/models/ir_module.py", line 100, in _register_hook
self.env.registry._delayed_account_translator(self.env)
File "/home/odoo/src/odoo/19.0/addons/account/models/ir_module.py", line 90, in load_account_translations
env['account.chart.template']._load_translations(langs=langs)
File "/home/odoo/src/odoo/19.0/addons/account/models/chart_template.py", line 1449, in _load_translations
._get_chart_template_data(chart_template)
File "/home/odoo/src/enterprise/19.0/account_accountant/models/account_chart_template.py", line 31, in _get_chart_template_data
data = super()._get_chart_template_data(chart_template)
File "/home/odoo/src/odoo/19.0/addons/account/models/chart_template.py", line 803, in _get_chart_template_data
data = func(self, template_code)
File "/home/odoo/src/odoo/19.0/addons/account/models/chart_template.py", line 59, in wrapper
return func(*args, **kwargs)
File "/home/odoo/src/enterprise/19.0/l10n_be_reports/models/account_chart_template.py", line 52, in _get_be_account_reconcile_model
prepayment_communication = self.env['qr.code.payment.wizard']._be_company_vat_communication(self.env.company).replace('+++', '')
File "/home/odoo/src/enterprise/19.0/l10n_be_reports/models/qr_code_payment_wizard.py", line 14, in _be_company_vat_communication
number = int(vat)
ValueError: invalid literal for int() with base 10: 'LU19038918'
```
```sql
kmod_3311837=> select id,name,chart_template,parent_id from res_company;
id | name | chart_template | parent_id
----+---------------------+----------------+-----------
3 | C.R.O.Qu.E.T. S.A. | be_comp |
2 | KG5380 | be_comp |
1 | KNOWLEDGE GATE S.A. | lu |
(3 rows)
kmod_3311837=> select id,model,module,res_id from ir_model_data where name = 'main_company';
id | model | module | res_id
----+-------------+--------+--------
2 | res.company | base | 1
(1 row)
```
```
> /home/odoo/src/enterprise/19.0/l10n_be_reports/models/account_chart_template.py(52)_get_be_account_reconcile_model()
-> if template_code in ['be', 'be_comp', 'be_asso']:
(Pdb) template_code
'be_comp'
(Pdb) self.env.company
res.company(1,)
(Pdb) self.env.company.chart_template
'lu'
(Pdb)
```
- The traceback occurs because during the translation loading process, the system calls [_get_chart_template_data](https://github.com/odoo/odoo/blob/38cffd1d1580693c56f0d897b8c8e60b938a8e85/addons/account/models/chart_template.py#L1465)
for all available template codes. In the customer’s database, there are three companies: Company 2 and Company 3 use the BE_COMP localization, while Company 1 uses the LU localization.
- When _get_chart_template_data is executed for the BE_COMP chart template, it eventually calls [_get_be_account_reconcile_mode](https://github.com/odoo/enterprise/blob/d13dc2d7b54d7e43f3b27b19131d0a277d0498b8/l10n_be_reports/models/account_chart_template.py#L49) During this call, the function receives the correct template code (be_comp) as an argument. However, self.env.company returns Company 1, because Company 1 is set as the main_company.
- As a result, [_be_company_vat_communication](https://github.com/odoo/enterprise/blob/d13dc2d7b54d7e43f3b27b19131d0a277d0498b8/l10n_be_reports/models/qr_code_payment_wizard.py#L14) is called with Company 1, even though this company uses the LU localization. Since LU localization does not support the BE VAT communication logic, an error is raised from this method.
- I have made a fix that uses the chart_template of self.env.company to avoid the blocking issue during the upgrade. However, I am not fully sure whether this is the correct solution. Since the load_translation method does not pass with_company when retrieving the chart template, this issue will always occur because the methods are executed in the context of the main company instead of the company that the chart template actually belongs to.
opw-5342498This update fixes a bug where vendor bills incorrectly used the company's bank account instead of the vendor's. Previously, selecting a payment method automatically populated the partner_bank_id field with the company's account. This change ensures the partner_bank_id always reflects the vendor's bank account, improving accuracy in billing records. This resolves bug #239249.
Original PR description
Description of the issue/feature this PR addresses: fixes bug #239249 See the bug report for full details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where foreign currency rates weren't correctly applied when generating Datev CSV reports. Now, the system accurately reflects the foreign currency rates set on invoices, ensuring accurate reporting for German clients. This improves the reliability of financial data exports.
Original PR description
When we set the foreign currency rate on invoices, it won't be used when exporting the report. Make sure to use the correct currency rate. task-5404816
This update resolves an issue where attachment files for returns weren't being generated correctly, and ensures consistent behavior when resetting return reports. The fix standardizes how attachments are created and resets, leading to more reliable reporting and data management.
Original PR description
[FIX] account_reports: returns: fix generations of files as attachments _generate_submission_attachments does not exist anymore ; it's been renamed to _generate_locking_attachments. Because of that,…
[FIX] account_reports: returns: fix generations of files as attachments _generate_submission_attachments does not exist anymore ; it's been renamed to _generate_locking_attachments. Because of that, some intended overrides were not executed properly, and several XML/CSV export files were not generated and added as attachments to the return. Moreover, the functions generating export files used to be called by account.report's export_file function (from a button defined in options['buttons']). export_file always forced the 'export_mode' key into the options it passed tp those file generators; we reintroduce this behavior for consistency, to avoid messy situations due to forward-port or functions being converted from the former paradigm to the new one. Note, however, it's always better to fully regenerate the options from such a generator. ================================================================================= [FIX] account_reports: returns: homogenize the reset behavior Before this fix, resetting a tax report deleted all the attachments of the return, while resetting for example the Partner VAT Listing (in Belgium), left them untouched. We now introduce a common helper for all reset functions, defining the behaviors they should share.
This update ensures that the status of Brazilian e-invoices is accurately reflected as 'Cancelled' after a cancellation request is processed. Previously, the status field was left blank, causing confusion. The fix correctly updates the status within the EDI system, aligning with the expected e-invoice cancellation process.
Original PR description
**Steps to reproduce:** * Install the **Accounting** and **l10n_br_edi** modules. * Create and post a Brazilian customer invoice using an **Avatax fiscal position** * [Guide to setup EDI for…
**Steps to reproduce:** * Install the **Accounting** and **l10n_br_edi** modules. * Create and post a Brazilian customer invoice using an **Avatax fiscal position** * [Guide to setup EDI for l10n_br](https://docs.google.com/document/d/1CSUKpnyhty5WBqUDBE-7dGvu0qxaC5vQ0loz0fYNg04/edit?tab=t.0) * Confirm the invoice and **send it to e-invoice (Brazil)**. * Confirm the **Brazil E-Invoice Status** shows **'Accepted'**. * Click **Request Cancellation**, enter a cancellation reason, and submit the request. **Observed behavior:** * The invoice moves to **Cancelled** state. * The cancellation XML is generated and attached in the chatter. * SEFAZ returns a successful cancellation response. * However, the **BR EDI Status** becomes **empty**, instead of reflecting **'Cancelled'**. **Cause:** * In the wizard `l10n_br_edi.invoice.update`, both `_finalize_update()` and `_submit_services()` assign `l10n_br_last_edi_status = 'cancelled'` **before** calling `button_cancel()`. * `button_cancel()` internally triggers `button_draft()` for posted invoices. * The Brazil EDI override of `button_draft()` resets `l10n_br_last_edi_status = False`. * This clears the status that was just set, leaving the field blank. **Fix:** * move `l10n_br_last_edi_status = "cancelled"` to `button_cancel()` method. opw-5378542 Forward-Port-Of: odoo/enterprise#101438
This update ensures that a 'partner ID' is always provided when processing SEPA payments. Previously, a missing partner ID could cause errors during batch payment creation, leading to payment processing failures. This change improves the reliability and stability of our payment processing system.
Original PR description
When doing a payment with SEPA as the payment method, and then create a batch payment out of it. It could happen that the partner_id of the payment was not set. That would cause a traceback because in the _get_CdtTrfTxInf we do a browse on the partner to use it later on. But since the partner is False, we have an empty record set. task-5213880 Forward-Port-Of: odoo/enterprise#98249
This update fixes a technical error that prevented some users from accessing the employee version history. The payroll module's access restrictions were not correctly applied to the user interface, causing a frontend error. The fix ensures that only authorized users can view this data.
Original PR description
Steps to reproduce: - Log in as a user with only Employee Administrator rights (no payroll access). - Open the Employees app and create a new employee. - Click the History smart button. - A traceback is raised. Cause: The payroll module restricts contract_date_start and contract_date_end to hr_payroll.group_hr_payroll_user, but the search view still referenced these fields. Since the view was not updated accordingly, non-payroll users triggered a frontend parsing error. Fix: Override the search view to update the filters and match the model's access restrictions. task-5401143 Forward-Port-Of: odoo/enterprise#101710
This update resolves a limitation preventing non-administrator users from utilizing the delivery_usps_rest module. By implementing sudo() calls, the module now grants necessary access to the USPS Rest API, expanding functionality without requiring elevated user permissions. This improves usability for a wider range of users.
Original PR description
Non-admin users are currently unable to use the delivery_usps_rest module because several fields are limited to the "base.group_system" group. It's obviously not feasible to give everyone the "Role / Administrator" role. This PR makes necessary sudo() calls the same way that delivery_ups_rest does. Forward-Port-Of: odoo/enterprise#101163
This update resolves a test failure related to user switching in the MRP work order module. The fix ensures the test waits for shop floor records to fully load after a user change, preventing false negatives. This improves the reliability of the test suite.
Original PR description
The test `test_shop_floor_my_wo_filter_with_pin_user` sometimes fails on these steps:…
The test `test_shop_floor_my_wo_filter_with_pin_user` sometimes fails on these steps: https://github.com/odoo/enterprise/blob/422ac3d5b10c44233321010b9ecb8e37735b3ea3/mrp_workorder/static/tests/tours/tour_shopfloor.js#L177-L190 https://github.com/odoo/enterprise/blob/422ac3d5b10c44233321010b9ecb8e37735b3ea3/mrp_workorder/static/tests/tours/tour_shopfloor.js#L196-L206 https://github.com/odoo/enterprise/blob/422ac3d5b10c44233321010b9ecb8e37735b3ea3/mrp_workorder/static/tests/tours/tour_shopfloor.js#L212-L221 This happends since changing the user requires some time to display the related shopfloor records, but the steps check the number of visible records as soon as it has switched rather than when it is sure that the records are displayed. #### Fix: Since switching employees will first empty the recordset and later display the related records, we can split the steps in two. We first check that we switched users, then we check the existence of a record that is not present for the previous user, and only then perform the related checks. #### runbot-226734 Forward-Port-Of: odoo/enterprise#101268 Forward-Port-Of: odoo/enterprise#100746
This update resolves a bug that prevented refunds from being processed correctly for orders created with 'Consumidor Final Anónimo' customers in the Point of Sale system. The fix ensures proper error dialog display and prevents crashes, improving the refund process for this customer segment.
Original PR description
We had a bug when attempting to refund orders that were created with the "Consumidor Final Anónimo" customer. The refund validation would crash with a TypeError instead of showing the proper error…
We had a bug when attempting to refund orders that were created with the "Consumidor Final Anónimo" customer. The refund validation would crash with a TypeError instead of showing the proper error message. Steps to reproduce: ------------------- In POS with l10n_cl_edi module activated: * Create a new order with "Consumidor Final Anónimo" as customer * Add products and pay the order * Validate the order * Attempt to refund this order > Observation: The refund validation would crash with: TypeError: Cannot read properties of undefined (reading 'add') at OrderPaymentValidation.isOrderValid Why the fix: ------------ The code was trying to access `this.dialog` which is undefined in the OrderPaymentValidation class context. The dialog service should be accessed via `this.pos.dialog`, which is the correct pattern used throughout the base OrderPaymentValidation class. This fix ensures the error dialog is properly displayed when attempting to refund orders for the anonymous final consumer, instead of crashing with a TypeError.
This update ensures that the visitor's country is always displayed on the live chat information panel for all users with access to the conversation, not just the initial agent. This provides a more complete view of the conversation context, improving communication and support efficiency.
Original PR description
Before this PR, the visitor country flag was only shown to the agent who was first assigned to the conversation. In practice, country should always be displayed on the info panel. Users that have the rights to see the conversation should have every information available as well. 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
This update resolves an issue where long text inputs within the Odoo Web Studio editor would overflow, causing display problems. Now, long text is automatically truncated, ensuring a clean and usable interface for users creating and editing web pages.
Original PR description
**Before this commit:** Long input text overflowed and was not truncated. **After this commit:** Long input text is now properly truncated, preventing overflow. task-5240113 Forward-Port-Of: odoo/enterprise#99535
This update resolves an issue where Arabic date formats were causing errors when generating accounting reports. The fix ensures consistent date handling across different server environments, preventing report generation failures. This improves the reliability of financial reporting for all users.
Original PR description
Steps to reproduce: - Complete a purchase - Go to Accounting > Review > Bills to receive - Select the PO and click on `Create Accrual Entries` Issue: A traceback appears, showing an invalid date format. To keep date formats working properly with the server independantly from the locale, we must use `serializeDate` to avoid symbols that wouldn't be understood by the server.
This update addresses a missing dependency for the l10n_be_intervat module, which is essential for its functionality. The change adds a safety mechanism to handle cases where PyJWT isn't installed, logging a helpful message to the user. It also updates import statements for improved code stability.
Original PR description
The l10n_be_intervat module needs `PyJWT`, but it is not listed in external_dependencies. As we cannot change module dependencies in a stable version, this commit adds a try-except block regarding the import. In case the library is not installed, an error is logged to inform the user that they need to install the `PyJWT` module. Additionally, this commit updates the import of ImmatureSignatureError to come from jwt.exceptions instead of jwt. no-task