Monday, April 13, 2026
18 changes · 18.0
Enhancements to existing features
This update simplifies the creation of Spanish tax reports (303 and 347) by automatically displaying key information. Specifically, the 'exonerated from 390' field is now visible on the print BOE wizard for relevant periods, and a new grouping is added for audit operations in report 347, streamlining the reporting process.
Original PR description
In this PR: - In tax report 303, the 'exonerated from 390' boolean field is now visible on the print BOE wizard , when period is either last month or last quarter so that user does not have to enable it manually on the AEAT page. - In the annual tax report 347, when a user clicks to audit the operations of the entity, a new group by is added in context to group the reports by move type and date(quarter). task-5863744
Resolved issues and error corrections
This update addresses a critical issue where Odoo would crash when attempting to download a URL document alongside a spreadsheet. The fix ensures stable and reliable downloading of both document types, improving user workflow and preventing data loss. This resolves a reported instability impacting users accessing and sharing documents.
Original PR description
Try to download a url document along with a spreadsheet. `onDownload` crash when trying to download a url document. Task: 5485662 Forward-Port-Of: odoo/enterprise#112513
This update fixes a limitation in Odoo Studio where activity filters weren't consistently available when the 'use_mail' option was enabled. The change adds necessary filters for overdue, today, and upcoming activities, ensuring users can effectively manage and filter records based on their activity status within Studio.
Original PR description
Steps to reproduce
==================
- Install studio
- Create a new app
- Create a new model
- Keep the Chatter toggled (use_mail)
- Exit studio
- Create three records, one with an activity in the past, one today and one in the future
- Click on the clock status icon in the top right
- There should be a section with the new model
- Click on 1 Late => every records is displayed
- Same for Today and Future
Cause of the issue
==================
https://github.com/odoo/odoo/blob/b6434b91a7f94075e1372ec827787504ef7aa4f0/addons/mail/static/src/core/web/activity_menu.js#L39-L77
For this feature to work, the activities_{overdue,today,upcoming_all} filter should be present
Solution
========
We add them to the search view. They are all pretty much implemented the same way in every model.
opw-6069150This update resolves an issue where the LU financial reports were incorrectly showing only the first product ID when multiple products lacked a required internal reference. The fix now displays all products with missing internal references, ensuring accurate reporting for Luxembourg businesses. This aligns with reporting requirements and improves data accuracy.
Original PR description
This is one of several commits fixing the FAIA xml export. The internal reference must be set for all products reported in the FAIA report. When there are multiple products missing this field, our previous code only reported the first ID to the customer. This commit shows the customer all incorrectly configured products. opw-5427296 Forward-Port-Of: odoo/enterprise#113452
This update resolves a technical issue in the Lu reporting module that caused incorrect debit and credit calculations in XML exports. By ensuring amounts are always positive, the system now accurately reflects financial data, preventing reporting errors and improving data integrity. This change is part of a larger effort to improve FAIA XML export functionality.
Original PR description
This is one of several commits fixing the FAIA xml export: - #113452 - #113455 - #113846 When an invoice line has a negative `price_unit`, the `Invoice/Line/InvoiceLineAmount/Amount` element has a negative value. This causes validation errors when comparing the total debit or credit values (such as `SalesInvoices/TotalDebit`) to the individual amounts, as the sum of individual "debit" lines will include some credit amounts and vice versa. Solution: record if the line is actually a debit or a credit, then use the absolute value of the balance in the Amount element. opw-5427296 [Link](https://www.odoo.com/odoo/unassigned-tasks/5427296) Forward-Port-Of: odoo/enterprise#113316
This update significantly speeds up the process of searching for attachments within the accounting module. Previously, the search was slow, particularly when dealing with a large number of records. This change batches the search, resulting in a dramatic performance improvement, especially for users with many transactions.
Original PR description
The search method is called once per record in self to get the attachments. This is a backport of odoo/enterprise/pull/85346 Benchmark: | No AML in self | Before PR | After PR | |----------------|-----------|----------| | 80 | 100 ms | 4 ms | | 5000 | 3.3 s | 200 ms | Community PR: odoo/odoo/pull/256399 opw-5881026 Forward-Port-Of: odoo/enterprise#112345
This update fixes an issue where vendor bill payments wouldn't automatically update to 'Paid' status, even after the bill was fully paid. The fix ensures that both linked invoices and vendor bills are checked, correctly transitioning payment statuses to 'Paid' for accurate financial reporting. This improves the reliability of our accounting processes.
Original PR description
**Steps to reproduce:** 1. Install `invoice` module. 2. Create a Vendor Bill, confirm it, and register payment. 3. Observe that Bill is marked `Paid`, but Payment status remains `In Process`.…
**Steps to reproduce:** 1. Install `invoice` module. 2. Create a Vendor Bill, confirm it, and register payment. 3. Observe that Bill is marked `Paid`, but Payment status remains `In Process`. **Issue:** When paying a Vendor Bill, the payment remains in the `In Process` state even after the Bill is fully paid, unlike Customer Invoices where the payment correctly transitions to `Paid`. **Cause:** The discrepancy occurs because the system checks linked invoices to update the payment status but fails to check linked bills. In `account.payment`, the `_compute_state` method only checks [reconciled_invoice_ids] to determine if the payment should transition from `In Process` to `Paid`. It ignores `reconciled_bill_ids` (Vendor Bills). **Fix:** Update code to check both `reconciled_invoice_ids` and `reconciled_bill_ids`. If all linked invoices or bills are paid, the payment status is updated to `Paid`. Related PR : [#231243](https://github.com/odoo/odoo/pull/231243/changes#diff-143d17de807d23650088a8c12f0a5b5cc2246b1b51e0bb7634e85247b6e535eaR392) opw-5865798
This update fixes an issue where MyInvois was receiving incorrect invoice amounts for individual POS e-invoices. The change ensures the Total Amount Payable accurately reflects the e-document's total value, aligning with MyInvois requirements and preventing payment discrepancies. This improves data accuracy for tax reporting.
Original PR description
For individual POS e-invoices, the PrePayment Amount was mapped to the payment linked to the invoice. This incorrectly decreased the Total Amount Payable to 0, since POS orders are already paid at the counter. MyInvois tax officer and helpdesk requires that the Total Amount Payable (cbc:PayableAmount) to reflect the total amount of the issued e-document, regardless of prior payments. This commit forces the PaidAmount to 0 for individual POS e-invoices, ensuring the PayableAmount correctly matches the TaxInclusiveAmount as expected by the MyInvois API. task-6057187
This pull request fixes an issue where the Point of Sale system wasn't correctly evaluating complex filtering criteria. The update allows for more precise filtering of products and data within the POS, leading to improved accuracy and efficiency in order processing. This enhancement ensures that sales staff can quickly and reliably find the right products for customers.
Original PR description
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 a validation error in Odoo's accounting module that occurred when users attempted to reconcile payments from different companies. The fix ensures the 'Outstanding Credits/Debits' widget only displays invoices and payments within the same company, improving user experience and preventing incorrect reconciliation attempts.
Original PR description
The invoice outstanding credits/debits widget currently displays all reconcilable items for a partner across the same account, regardless of the company they belong to. In multi-company environments,…
The invoice outstanding credits/debits widget currently displays all reconcilable items for a partner across the same account, regardless of the company they belong to. In multi-company environments, specifically when accounts have been merged, this allows users to see and try to reconcile payments from Company A into an invoice from Company B. This action eventually triggers a validation error stating that entries must belong to the same company. This commit adds a company filter to the widget's logic to ensure only relevant outstanding payments are suggested, preventing cross-company reconciliation errors and improving UX. **Description of the issue/feature this PR addresses:** This PR fixes a validation error in multi-company environments where the invoice_outstanding_credits_debits_widget suggests payments or credit notes belonging to a different company than the current invoice. The issue typically arises when a partner has outstanding transactions in multiple companies and the accounts (e.g., Account Receivable) have been merged, allowing the widget to query lines that are not valid for the current record's company context. **Current behavior before PR:** When viewing an invoice for Company A, the "Outstanding Credits/Debits" widget displays all reconcilable account.move.line records for that partner that match the account type, regardless of their company_id. If a user clicks "Add" on a payment that belongs to Company B, Odoo attempts to reconcile them, resulting in a traceback or a validation error: "Invalid Operation: All tracebacks/entries must belong to the same company." This creates confusion for the end-user, as they are presented with "ghost" credits that cannot actually be applied. **Desired behavior after PR is merged:** The invoice_outstanding_credits_debits_widget (and the underlying logic in account.move) will strictly filter the suggested outstanding items by self.company_id. Users will only see and be able to reconcile payments, credit notes, or debits that belong to the same company as the invoice they are currently processing. This ensures data integrity and a seamless UX in multi-company setups. **Steps to reproduce:** 1) Enable Multi-Company: Ensure you have at least two companies (e.g., Company A and Company B) active in your database. 2) Chart of Accounts Setup: In both companies, use the same account for Receivables (or merge them so they share the same ID/Code if testing a migrated environment). 3) Ensure the account is marked as Allow Reconciliation. 4) Create a Payment in Company B: 5) Post the payment so it remains as an "Outstanding Receipt". 6) Create an Invoice in Company A 7) Confirm/Post the invoice. 8) Check the Widget: Scroll down to the bottom of the Invoice form in Company A. 9) Observe the "Outstanding Credits" widget. The Error: The payment from Company B will appear as an available credit for the invoice in Company A. 10) Click on "Add". A validation error (UserError) will pop up: "All entries must belong to the same company." **video** https://drive.google.com/file/d/1PfBxupP8t-t21wsP2FIgNXFnTP0Zq140/view --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a problem where electronic invoices (FatturaPA) generated with units of measure containing special characters failed validation. The fix normalizes these characters to ensure the XML complies with the required format, allowing invoices to be correctly submitted. This prevents errors and ensures compliance with Italian tax regulations.
Original PR description
### Issue before this commit: When generating the electronic invoice XML (FatturaPA) with units of measure containing non-standard Unicode characters (e.g. m², m³), the resulting XML fails…
### Issue before this commit: When generating the electronic invoice XML (FatturaPA) with units of measure containing non-standard Unicode characters (e.g. m², m³), the resulting XML fails validation, as these characters are not accepted by the SdI format. ### Steps to reproduce the issue: 1. Download Italian loc + electronic invoicing 2. Activate UoM option in settings 3. Set a product UoM in any unit that has an apex/power of (ex. m2, m3) 4. Invoice this product 5. Create the XML for SdI 6. Check format with Fex > apex is not recognised as a valid character ### Cause of the issue: The UoM name is exported as-is into the XML. Non-standard Unicode characters are preserved during formatting and are not compatible with the allowed character set defined by the FatturaPA specifications. ### Reason to introduce the fix: Ensure that units of measure are normalized into a compatible representation before being included in the XML, so that the generated file complies with SdI validation rules. opw-6075119 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257012
This update fixes an issue where sale orders were incorrectly using the analytic account from one company instead of the correct company's project. The change ensures that sales orders accurately reflect the project and company associated with the product, improving financial reporting across multiple companies. This resolves a discrepancy in how analytic distributions are calculated.
Original PR description
Pre-requisites: ------------------------------------------ 1. Install `sale_project` and `project_account_budget` modules 2. Have two companies configured in the system 3. Enable Timesheets from the…
Pre-requisites:
------------------------------------------
1. Install `sale_project` and `project_account_budget` modules
2. Have two companies configured in the system
3. Enable Timesheets from the Settings app
4. Create two projects (one for each company)
5. Ensure the following settings are enabled on both projects:
* Timesheets
* Billable
Steps to Reproduce:
------------------------------------------
1. Switched to Company A
2. Create a product with:
* Type: Service
* Create on Order: Task
* No company restriction
3. Set the product's `project_id` to Company A's project
4. Switch to the newly created company (Company B)
5. Set the product's `project_id` to Company B's project
6. Enable Analytic Distribution from SOL Optional
7. Create a sale order with the configured product, and delete the auto-fetched
Analytic Distribution account for the sale order (Company B's project)
8. Now confirm the sale order
Observation:
----------------------------------------
The SOL's analytic distribution uses the analytic account from Company A's project instead of Company B
Issue:
----------------------------------------
The `project_id` field on `product.template` is `company_dependent=True`, meaning it stores different values per company. However, in `_compute_analytic_distribution()`, the code accesses `line.product_id.project_id` without calling `with_company`, so it resolves the field using the wrong company context
Solution:
----------------------------------------
using `with_company()`, the correct company context is applied when accessing
`project_id`, preventing inconsistencies in multi-company environments and
ensuring the appropriate project is used for the corresponding company.
opw-5864452This update corrects a bug in the leave balance report that was miscalculating employee leave balances, particularly with overlapping allocations. The fix ensures accurate reporting by properly accounting for leave periods and handling timezone differences, leading to more reliable leave tracking data. This improves the accuracy of HR reporting.
Original PR description
__ISSUE__: - FIFO balance miscalculation for non-overlapping allocations. cumulative_allocated_days was partitioned globally by (employee, leave_type), but taken_per_allocation scoped leaves to each…
__ISSUE__:
- FIFO balance miscalculation for non-overlapping allocations. cumulative_allocated_days was partitioned globally by (employee, leave_type), but taken_per_allocation scoped leaves to each allocation's date range. This caused the FIFO formula to silently absorb leaves from one period into another's allocation capacity.
ex:
Alloc A (20 days) 2025, taken leaves 15 days
Alloc B (20 days) 2026, taken leaves 5 days
report: 2025: (15 taken), (5 left)
2026: (7 taken), (20 left)
- Left" rows shifted by one year in non-UTC timezones. Allocation date_from/date_to (Date fields) were cast to timestamp as midnight UTC. In negative-UTC /positive-UTC timezones midnight UTC of Dec 31 renders as the prev/next day.
__FIX__:
- detect overlap groups using a running MAX(date_to) and partition the cumulative sums within each overlap group. This way non-overlapping allocations are treated as independent, while overlapping or open-ended allocations still share FIFO within their group.
- offset allocation dates by 12 hours so no timezone can shift them across a day boundary.
- opw-5169606
- opw-5352114This update resolves a bug on mobile devices where the chat composer would become unresponsive when the navigation menu was open. The fix prevents the navigation menu from stealing focus from the composer, ensuring users can consistently use the chat feature. This improves the mobile chat experience.
Original PR description
**Description of the issue this PR addresses:** On mobile devices, the chat composer becomes unresponsive when the navigation menu `navbar-toggler` is open.…
**Description of the issue this PR addresses:** On mobile devices, the chat composer becomes unresponsive when the navigation menu `navbar-toggler` is open. https://github.com/user-attachments/assets/8ef01ec6-4a44-41d3-8b86-74f68caf47ef Steps to reproduce: 1. Open the website in a mobile view. 2. Tap the navbar toggler to open the mobile menu. 3. Without closing the menu, open the chat window. 4. Tap on the message composer text area. → The composer is not accessible. This happens because the bootstrap `Offcanvas` (used by the `navbar-toggler`) traps focus by listening for `focusin` events bubbling up to the document. When the composer is tapped, the Offcanvas intercepts the event and immediately steals focus back to itself, dismissing the virtual keyboard. This commit stops the event propagation at the composer level, ensuring the composer can reliably retain focus in responsive views without interference from active menus. Task-[5954657](https://www.odoo.com/odoo/project/1519/tasks/5954657) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250294
This update fixes an issue where delivery slips incorrectly displayed product prices in the company currency instead of the customer's order currency. This change ensures accurate pricing on delivery slips when orders are placed in foreign currencies, improving financial reporting and customer invoicing. The fix was triggered by a previous code change.
Original PR description
The product value reported on delivery slips may incorrectly use the company currency instead of the order currency. Steps to reproduce: - Enable multi-currency and create a foreign currency - Create a pricelist in the foreign currency - Create and confirm a Sale Order using that pricelist - Add a delivery via carrier (eg. Fedex) - Confirm the delivery and generate the commercial invoice. Issue: The 'sale_price' on the stock move lines is taken in company currency rather than order currency. opw-6104130
This update significantly speeds up the process of finding attachments within Odoo, particularly when dealing with a large number of records. Previously, the search was slow, but this change batches the search, resulting in a dramatic performance improvement. This will lead to faster response times and a smoother user experience.
Original PR description
The search method is called once per record in self to get the attachments. This is a backpot of odoo/odoo/pull/209562. Benchmark: | No AML in self | Before PR | After PR | |----------------|-----------|----------| | 80 | 100 ms | 4 ms | | 5000 | 3.3 s | 200 ms | enterprise PR: odoo/enterprise/pull/112345 opw-5881026 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256399
This update corrects an issue where BIS3 invoices were incorrectly retrieving all contacts associated with a VAT instead of the intended partner. This change ensures that the correct partner is identified during import, streamlining invoice processing and improving data accuracy. The fix was made as part of a legal agreement and follows Odoo's PR guidelines.
Original PR description
Currently, the contact will be retrieved on import of a BIS3, as we retrieve the last partner created with this VAT, which would be all the contacts --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug where Ctrl+A didn't select the entire editable content when the first element was non-editable. It ensures the selection anchors to the deepest editable position, correctly selecting and removing the full content when deleting.
Original PR description
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