Daily updates from Odoo
Friday, March 13, 2026
20 changes
2 changes
Enhancements to existing features
This change optimizes the process of generating GST reports by streamlining the database query. The original query was slow when dealing with large amounts of data, but this update removes a complex domain condition, significantly improving performance and reducing processing time. This results in faster report generation and a better user experience.
Original PR description
If account.move and account.move.line have big data then domain with create problme ORM create sub query like this ``` SELECT account_move.id FROM account_move WHERE (…
If account.move and account.move.line have big data then domain with create problme ORM create sub query like this
```
SELECT
account_move.id
FROM
account_move
WHERE
(
account_move.l10n_in_gst_return_period_id = 23
OR (
account_move.move_type IN ('in_invoice', 'in_refund')
AND account_move.invoice_date >= '2025-11-01'
AND account_move.invoice_date <= '2025-11-30'
AND account_move.company_id IN (1)
AND account_move.state = 'posted'
AND (
account_move.l10n_in_gst_treatment NOT IN ('composition', 'unregistered', 'consumer')
OR account_move.l10n_in_gst_treatment IS NULL
)
AND account_move.id IN (
SELECT
account_move_line.move_id
FROM
account_move_line
WHERE
EXISTS (
SELECT 1
FROM account_move_line_account_tax_rel AS account_move_line__tax_ids
WHERE account_move_line__tax_ids.account_move_line_id = account_move_line.id
)
)
)
)
ORDER BY
account_move.date DESC,
account_move.name DESC,
account_move.invoice_date DESC,
account_move.id DESC
```
See this EXPLAIN for big database
```
Gather Merge (cost=165759176482.82..2983665158687.50 rows=36 width=30)
Workers Planned: 2
-> Incremental Sort (cost=165759175482.80..2983665157683.32 rows=18 width=30)
Sort Key: account_move.date DESC, account_move.name DESC, account_move.invoice_date DESC, account_move.id DESC
Presorted Key: account_move.date
-> Parallel Index Scan Backward using account_move__date_index on account_move (cost=59.28..2983665157682.51 rows=18 width=30)
Filter: ((l10n_in_gst_return_period_id = 23) OR (((move_type)::text = ANY ('{in_invoice,in_refund}'::text[])) AND (invoice_date >= '2025-11-01'::date) AND (invoice_date <= '2025-11-30'::date) AND (company_id = 1) AND ((state)::text = 'posted'::text) AND (((l10n_in_gst_treatment)::text <> ALL ('{composition,unregistered,consumer}'::text[])) OR (l10n_in_gst_treatment IS NULL)) AND (SubPlan 1)))
SubPlan 1
-> Materialize (cost=58.84..1601427.18 rows=4994548 width=4)
-> Merge Semi Join (cost=58.84..1556944.44 rows=4994548 width=4)
Merge Cond: (account_move_line.id = account_move_line__tax_ids.account_move_line_id)
-> Index Scan using account_move_line_pkey on account_move_line (cost=0.44..1339780.32 rows=26611459 width=8)
-> Index Only Scan using account_move_line_account_tax_rel_pkey on account_move_line_account_tax_rel account_move_line__tax_ids (cost=0.43..88678.65 rows=4994548 width=4)
```
So removing this from domain and put it as condition it's faster
Forward-Port-Of: odoo/enterprise#110334
Forward-Port-Of: odoo/enterprise#109795This update enhances the statement line dropdown by visually highlighting matching move lines with the same amount and currency. This provides users with quicker identification of related transactions, streamlining reconciliation processes. The change also includes an optional display setting for this feature.
Original PR description
This will add a new colored bubble on the dropdown of a statement line when there is a move line that has the same amount currency or amount. task-5493859 Forward-Port-Of: odoo/enterprise#104896
6 changes
Enhancements to existing features
This update simplifies the partner list by adding a direct 'unselect' button. Previously, users had to hover over a selected partner to remove it, which was confusing. This change makes it easier and more intuitive for users to manage their customer list.
Original PR description
Before this commit: ==== - Initially if partner is selected then hovering over partner shows option to remove the partner, until user won't be able to get how to remove the customer if selected. - Not good from user perspective. Following this commit: ==== - Unselect button will be shown everytime instead of hovering if partner is selected so that when user open the partner list, user can easily unselect the partner. task-5945904 Forward-Port-Of: odoo/odoo#249405
This update introduces a new button in the order management interface that allows users to quickly move all orders to the next stage of processing. When an order reaches the final stage, the preparation status is automatically marked as complete, improving workflow efficiency. This change simplifies order management and reduces manual effort.
Original PR description
In this commit: =============== - We added a `Clear All Orders` button in the sidebar. On clicking that, all the orders will be moved to their next respective stage. - If the order stage is already the last stage, then the order's preparation state is marked as done. Task: 5877460 Forward-Port-Of: odoo/enterprise#105847
This update enhances the Turkish localization for Odoo, specifically addressing issues related to invoice generation and VAT compliance. Key changes include mandatory fields for tax exemption reasons and improved handling of UBL invoice generation, ensuring accurate and compliant invoices for Turkish businesses.
Original PR description
This commit adds the following improvements and bug fixes to the turkish localization: - Make shipping method required for GiB export invoices - Make Exemption Reason mandatory when Invoice Type is Tax Exempt - Ensure Invoice Type is selected when Invoice Scenario is set - Hide the nilvera send status for Vendor Bills - Adjust the error message for missing CTSP numbers on invoice lines - Allow resetting Vendor Bills to draft - Give priority to the currency rate on the invoice when generating UBL - Create a new bridge module to bypass the VAT validation for test VAT numbers - Fix bug in bulk customer verification task-5868201 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249247
This change optimizes the process of generating GST reports by streamlining the database query. Specifically, it removes a complex domain filter that caused performance issues with large datasets. This results in faster report generation times, improving efficiency for users.
Original PR description
If account.move and account.move.line have big data then domain with create problme ORM create sub query like this ``` SELECT account_move.id FROM account_move WHERE (…
If account.move and account.move.line have big data then domain with create problme ORM create sub query like this
```
SELECT
account_move.id
FROM
account_move
WHERE
(
account_move.l10n_in_gst_return_period_id = 23
OR (
account_move.move_type IN ('in_invoice', 'in_refund')
AND account_move.invoice_date >= '2025-11-01'
AND account_move.invoice_date <= '2025-11-30'
AND account_move.company_id IN (1)
AND account_move.state = 'posted'
AND (
account_move.l10n_in_gst_treatment NOT IN ('composition', 'unregistered', 'consumer')
OR account_move.l10n_in_gst_treatment IS NULL
)
AND account_move.id IN (
SELECT
account_move_line.move_id
FROM
account_move_line
WHERE
EXISTS (
SELECT 1
FROM account_move_line_account_tax_rel AS account_move_line__tax_ids
WHERE account_move_line__tax_ids.account_move_line_id = account_move_line.id
)
)
)
)
ORDER BY
account_move.date DESC,
account_move.name DESC,
account_move.invoice_date DESC,
account_move.id DESC
```
See this EXPLAIN for big database
```
Gather Merge (cost=165759176482.82..2983665158687.50 rows=36 width=30)
Workers Planned: 2
-> Incremental Sort (cost=165759175482.80..2983665157683.32 rows=18 width=30)
Sort Key: account_move.date DESC, account_move.name DESC, account_move.invoice_date DESC, account_move.id DESC
Presorted Key: account_move.date
-> Parallel Index Scan Backward using account_move__date_index on account_move (cost=59.28..2983665157682.51 rows=18 width=30)
Filter: ((l10n_in_gst_return_period_id = 23) OR (((move_type)::text = ANY ('{in_invoice,in_refund}'::text[])) AND (invoice_date >= '2025-11-01'::date) AND (invoice_date <= '2025-11-30'::date) AND (company_id = 1) AND ((state)::text = 'posted'::text) AND (((l10n_in_gst_treatment)::text <> ALL ('{composition,unregistered,consumer}'::text[])) OR (l10n_in_gst_treatment IS NULL)) AND (SubPlan 1)))
SubPlan 1
-> Materialize (cost=58.84..1601427.18 rows=4994548 width=4)
-> Merge Semi Join (cost=58.84..1556944.44 rows=4994548 width=4)
Merge Cond: (account_move_line.id = account_move_line__tax_ids.account_move_line_id)
-> Index Scan using account_move_line_pkey on account_move_line (cost=0.44..1339780.32 rows=26611459 width=8)
-> Index Only Scan using account_move_line_account_tax_rel_pkey on account_move_line_account_tax_rel account_move_line__tax_ids (cost=0.43..88678.65 rows=4994548 width=4)
```
So removing this from domain and put it as condition it's faster
Forward-Port-Of: odoo/enterprise#110334
Forward-Port-Of: odoo/enterprise#109795This update streamlines the timesheet assistant by simplifying labels and UI elements, while also enhancing the accuracy of time calculations and resolving display issues. Key changes include restricting access to the billable status field and optimizing how project information is stored for better performance.
Original PR description
[IMP] {helpdesk,sale,project}_timesheet_{,enterprise,forecast}: timesheet assistant generic improvements
In this Commit,
- Assistant Form > "Billable" boolean hidden for users without Sales access rights
- Assistant Form > Labels updated:
- "Project Name" → "Project"
- "Task Name" → "Task"
- "Time Spent" → "Time"
- "Save Changes" → "Save"
- Assistant Form UI Improved by applying same changes done in master,
REF: https://github.com/odoo/enterprise/pull/104347
- Assistant Form > create and edit option removed for projects
- Suggestions logic reviewed for better results
- Correct time calculation for chronological grouping
- Unmatched project display issues resolved in both suggestions and local config
- Local Config List view aligned with Odoo UI views
- Local Config Storage limited to project/task/ticket IDs instead of `display_name`
and `id`
task-5902077This update enhances the statement line dropdown by adding colored bubbles to highlight matching move lines with the same amount and currency. This provides users with quicker visual cues for related transactions, streamlining reconciliation processes. The feature also includes an optional display setting for increased flexibility.
Original PR description
This will add a new colored bubble on the dropdown of a statement line when there is a move line that has the same amount currency or amount. task-5493859 Forward-Port-Of: odoo/enterprise#104896
1 change
Enhancements to existing features
This change optimizes the process of generating GST reports by streamlining the database query. The original query was slow due to a complex sub-query, which has been simplified. This results in faster report generation, particularly when dealing with large volumes of accounting data.
Original PR description
If account.move and account.move.line have big data then domain with create problme ORM create sub query like this ``` SELECT account_move.id FROM account_move WHERE (…
If account.move and account.move.line have big data then domain with create problme ORM create sub query like this
```
SELECT
account_move.id
FROM
account_move
WHERE
(
account_move.l10n_in_gst_return_period_id = 23
OR (
account_move.move_type IN ('in_invoice', 'in_refund')
AND account_move.invoice_date >= '2025-11-01'
AND account_move.invoice_date <= '2025-11-30'
AND account_move.company_id IN (1)
AND account_move.state = 'posted'
AND (
account_move.l10n_in_gst_treatment NOT IN ('composition', 'unregistered', 'consumer')
OR account_move.l10n_in_gst_treatment IS NULL
)
AND account_move.id IN (
SELECT
account_move_line.move_id
FROM
account_move_line
WHERE
EXISTS (
SELECT 1
FROM account_move_line_account_tax_rel AS account_move_line__tax_ids
WHERE account_move_line__tax_ids.account_move_line_id = account_move_line.id
)
)
)
)
ORDER BY
account_move.date DESC,
account_move.name DESC,
account_move.invoice_date DESC,
account_move.id DESC
```
See this EXPLAIN for big database
```
Gather Merge (cost=165759176482.82..2983665158687.50 rows=36 width=30)
Workers Planned: 2
-> Incremental Sort (cost=165759175482.80..2983665157683.32 rows=18 width=30)
Sort Key: account_move.date DESC, account_move.name DESC, account_move.invoice_date DESC, account_move.id DESC
Presorted Key: account_move.date
-> Parallel Index Scan Backward using account_move__date_index on account_move (cost=59.28..2983665157682.51 rows=18 width=30)
Filter: ((l10n_in_gst_return_period_id = 23) OR (((move_type)::text = ANY ('{in_invoice,in_refund}'::text[])) AND (invoice_date >= '2025-11-01'::date) AND (invoice_date <= '2025-11-30'::date) AND (company_id = 1) AND ((state)::text = 'posted'::text) AND (((l10n_in_gst_treatment)::text <> ALL ('{composition,unregistered,consumer}'::text[])) OR (l10n_in_gst_treatment IS NULL)) AND (SubPlan 1)))
SubPlan 1
-> Materialize (cost=58.84..1601427.18 rows=4994548 width=4)
-> Merge Semi Join (cost=58.84..1556944.44 rows=4994548 width=4)
Merge Cond: (account_move_line.id = account_move_line__tax_ids.account_move_line_id)
-> Index Scan using account_move_line_pkey on account_move_line (cost=0.44..1339780.32 rows=26611459 width=8)
-> Index Only Scan using account_move_line_account_tax_rel_pkey on account_move_line_account_tax_rel account_move_line__tax_ids (cost=0.43..88678.65 rows=4994548 width=4)
```
So removing this from domain and put it as condition it's faster
Forward-Port-Of: odoo/enterprise#110334
Forward-Port-Of: odoo/enterprise#1097951 change
Enhancements to existing features
This update aligns Odoo's Peppol EAS field selections with the latest Peppol codelist version 9.5. This ensures Odoo continues to meet regulatory requirements for electronic invoicing and simplifies compliance with Peppol standards. The change was made to reflect official updates from the Peppol organization.
Original PR description
A new version of codelist (v9.5) has been released. This commit aligns the Peppol EAS field selection with the Peppol codelist v9.5 See the changelog here : https://docs.peppol.eu/edelivery/codelists/changelog.html Updates applied according to the official v9.5 changes. task-5461213 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243990
9 changes
Enhancements to existing features
This update enhances the Odoo demo data by adding 'hr_responsible_id' values, replacing the default 'Oodobot' assignment. This provides a more realistic and useful demo environment for evaluating the planning module, aligning with best practices for demonstration data.
Original PR description
Changes: Added hr_responsible_id to the demo data as per the request since by default it's assigned to Oodobot it's better add real users to the demo data Com PR-244686 task-5602911
This update streamlines rental order management by automating price calculations and improving the user interface. The delivery date is now automatically managed, eliminating manual adjustments and the need for separate price updates, resulting in a more efficient rental process.
Original PR description
Before this change: -A delivery date field was manually editable and used to control the rental delivery date. -Changing the pricelist displayed an "Update Prices" button which had to be clicked to…
Before this change: -A delivery date field was manually editable and used to control the rental delivery date. -Changing the pricelist displayed an "Update Prices" button which had to be clicked to recompute prices. -Changing the rental start or end date showed an "Update Rental Prices" button to update rental pricing. -The rental period field was displayed below the delivery date. -The recurring plan field was visible even when no subscription product was present. After this change: -The delivery date field is hidden and automatically computed from rental_start_date. -Prices are automatically recomputed when the pricelist changes, removing the need for the "Update Prices" button. -Rental prices are automatically recomputed when the rental start or end date changes, removing the "Update Rental Prices" button. -The rental period field is moved before the pricelist field for better UI flow. -The recurring plan field is now hidden when the order does not contain any subscription product. task-6031439
This update simplifies payslip creation by replacing an outdated field with a more modern contract type. It now requires a 'structure_id' to be specified on payslip runs, ensuring accurate payroll calculations and reporting. This change enhances the reliability of payslip generation across different localization settings.
Original PR description
In this commit, we removed the usage of employee_type and replaced it with contract_type_id.
In general cases, we consider an employee to be a record having contract_type_id set to
self.env.ref('hr.contract_type_employee') (previously it was employee_type = employee).
In some specific cases (specific localizations), we have specific conditions
(e.g., in l10n_be we check the dmfa_code).
Additionally, we added the structure_id field to the hr.payslip.run model and made it required.
We also added the contract_type_id field to hr.payslip.run to allow filtering employees by their
contract type when generating payslips for a given payslip run.
task-5430894This update improves the clarity of rental agreements by displaying rental start and end dates within the sales order preview. Previously, this information was hidden in the product line descriptions, making it harder for users to quickly review the key terms of the rental. This change ensures better visibility and management of rental agreements.
Original PR description
Rental start and end dates are no longer shown in product line descriptions and are now displayed in the sales order preview. task-5388947
This update enhances the accuracy of Hong Kong payroll reports by rounding currency values to avoid potential errors when reporting to the IRD. The change ensures correct HKD reporting by using a more precise rounding method before converting to an integer, addressing a minor but important issue. Additionally, the rental system has been updated to fully support all officially recognized IRD rental benefit types.
This update adjusts the Launch Campaign button's visibility within the appraisal module based on user roles and reporting structure. Users without appraisals and without subordinates will no longer see the button, while those with subordinates will. Additionally, system-wide warnings are displayed for officers and administrators, ensuring consistent messaging.
Original PR description
Purpose: - Hide the Launch Campaign button for users without appraisal access and no subordinates. - Show the Launch Campaign button for users without appraisal access but with subordinates. - Show warnings across all relevant employees for officer/administrator rights. Done through the JS controller because in the Kanban and list view, to hide the button, I don't have records to apply conditions based on. task-5438049
This update simplifies the naming of joint committees within the Odoo Enterprise system. By removing redundant prefixes and moving data to a CSV file, the system is now more efficient and easier to maintain. This change improves data clarity and reduces complexity.
Original PR description
Almost all joint committees start with the same ""(Sub-)(Sub-)Joint Committee for (the)". This is unnecessary as the field is already called Joint Committee. This removes those unnecessary prefixes and also move the data to a csv for concise code. Task: 6025737
This update enhances the user experience for our messaging apps (mail, im_livechat, and WhatsApp) by improving the organization of channel members and streamlining discussion management. The changes include updated user interfaces and clearer channel type labels, making these apps more intuitive and efficient for users.
Original PR description
This commit introduces several improvements to the channel views in the mail, im_livechat and whatsapp module. The changes include enhancements to the user interface, better organization of channel members, and improved functionality for managing discussions and better strings for channel types. task-5475249 https://github.com/odoo/odoo/pull/243845
This update streamlines the Live Chat experience by reorganizing form views and standardizing the associated copy. The changes group related actions together for easier access and improve the overall clarity of the Live Chat interface. This enhancement aims to make Live Chat more intuitive and efficient for users.
Original PR description
community PR: https://github.com/odoo/odoo/pull/253027 This commit improves the form views related to Live Chat by: 1. Reordering the action buttons to group chat related actions together. 2. Harmonizing the Live Chat copywriting. task-6018898
1 change
Enhancements to existing features
This change optimizes the process of generating GST reports by streamlining the database query. Specifically, it removes a complex domain filter that caused performance issues with large datasets, resulting in faster report generation times. This improvement ensures smoother and more efficient report processing.
Original PR description
If account.move and account.move.line have big data then domain with create problme ORM create sub query like this ``` SELECT account_move.id FROM account_move WHERE (…
If account.move and account.move.line have big data then domain with create problme ORM create sub query like this
```
SELECT
account_move.id
FROM
account_move
WHERE
(
account_move.l10n_in_gst_return_period_id = 23
OR (
account_move.move_type IN ('in_invoice', 'in_refund')
AND account_move.invoice_date >= '2025-11-01'
AND account_move.invoice_date <= '2025-11-30'
AND account_move.company_id IN (1)
AND account_move.state = 'posted'
AND (
account_move.l10n_in_gst_treatment NOT IN ('composition', 'unregistered', 'consumer')
OR account_move.l10n_in_gst_treatment IS NULL
)
AND account_move.id IN (
SELECT
account_move_line.move_id
FROM
account_move_line
WHERE
EXISTS (
SELECT 1
FROM account_move_line_account_tax_rel AS account_move_line__tax_ids
WHERE account_move_line__tax_ids.account_move_line_id = account_move_line.id
)
)
)
)
ORDER BY
account_move.date DESC,
account_move.name DESC,
account_move.invoice_date DESC,
account_move.id DESC
```
See this EXPLAIN for big database
```
Gather Merge (cost=165759176482.82..2983665158687.50 rows=36 width=30)
Workers Planned: 2
-> Incremental Sort (cost=165759175482.80..2983665157683.32 rows=18 width=30)
Sort Key: account_move.date DESC, account_move.name DESC, account_move.invoice_date DESC, account_move.id DESC
Presorted Key: account_move.date
-> Parallel Index Scan Backward using account_move__date_index on account_move (cost=59.28..2983665157682.51 rows=18 width=30)
Filter: ((l10n_in_gst_return_period_id = 23) OR (((move_type)::text = ANY ('{in_invoice,in_refund}'::text[])) AND (invoice_date >= '2025-11-01'::date) AND (invoice_date <= '2025-11-30'::date) AND (company_id = 1) AND ((state)::text = 'posted'::text) AND (((l10n_in_gst_treatment)::text <> ALL ('{composition,unregistered,consumer}'::text[])) OR (l10n_in_gst_treatment IS NULL)) AND (SubPlan 1)))
SubPlan 1
-> Materialize (cost=58.84..1601427.18 rows=4994548 width=4)
-> Merge Semi Join (cost=58.84..1556944.44 rows=4994548 width=4)
Merge Cond: (account_move_line.id = account_move_line__tax_ids.account_move_line_id)
-> Index Scan using account_move_line_pkey on account_move_line (cost=0.44..1339780.32 rows=26611459 width=8)
-> Index Only Scan using account_move_line_account_tax_rel_pkey on account_move_line_account_tax_rel account_move_line__tax_ids (cost=0.43..88678.65 rows=4994548 width=4)
```
So removing this from domain and put it as condition it's faster
Forward-Port-Of: odoo/enterprise#110334
Forward-Port-Of: odoo/enterprise#109795