Daily updates from Odoo
Saturday, March 14, 2026
26 changes · master
Enhancements to existing features
This update adds versioning to Odoo's live chat stores, mirroring a recent community change. This ensures that live chat data is consistently tracked and managed, improving data integrity and reliability. It's a necessary step for maintaining the stability of our live chat functionality.
Original PR description
Counterpart of the community PR that adds versioning to the discuss store. Any route returning or sending a store should be versionned via the `mail_route` decorator. community: https://github.com/odoo/odoo/pull/246467
This update adds a button to quickly move all orders to the next stage in the preparation process. When an order reaches the final stage, the preparation status is automatically marked as complete, improving efficiency and reducing 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 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#109795Resolved issues and error corrections
This update prevents installation errors when the PostgreSQL user lacks necessary permissions. By checking if the pg_vector extension is already installed before attempting to create it, the update avoids a common error and simplifies the installation process without granting excessive database privileges. This improves stability and ease of use.
Original PR description
[FIX] ai: test if pg_vector is installed before launching the create extension command
The command `CREATE EXTENSION IF EXISTS ...` require the postgresql user to have rights to use the command `CREATE EXTENSION`.
If the extension is already installed it will fail with a stacktrace because of inssuficient rights. `psycopg2.errors.InsufficientPrivilege`
With this PR we want to be able to install the module without giving too many rights to the postgresql user.
Forward-Port-Of: odoo/enterprise#110091
Forward-Port-Of: odoo/enterprise#109650This update ensures that German customer addresses are correctly formatted when used with Amazon. Previously, the system incorrectly sent company names as the primary address line, causing delivery validation errors. This change swaps the fields to ensure accurate address formatting and successful delivery.
Original PR description
When filling in a German address on Amazon, customers are presented with two fields: - Street, and - Building or company name. The street is sent as AddressLine2, while the building/company name is sent as AddressLine1. However, delivery providers validate address existence, which fails when address line 1 is not a street name. To resolve this, we swap these two fields for German addresses. opw-4668178 Forward-Port-Of: odoo/enterprise#109215
This update focuses on improving the Field Service feature by ensuring migrated functionality remains operational and streamlining the daily workflow for planning users. Key changes include accurate time tracking, enhanced reporting, and UI refinements for better usability.
Original PR description
This commit continues to review the new Field Service to make sure the features migrated from the old Field Service are still available and also improve a bit the flow to facilate the day to day of…
This commit continues to review the new Field Service to make sure the features migrated from the old Field Service are still available and also improve a bit the flow to facilate the day to day of planning users using Field Service feature. In detail, this commit will: - fix traceback and access rights on creation of worksheet - use generated timesheets of the intervention for the report. To do that a new one2many field called `intervention_timesheet_ids` is added in `planning.slot` model. And so instead of relying on 'timesheet_ids' of the slot, which are not necessarily linked to the intervention, we compute the effective hours based on the timesheets generated by the intervention, and use that field in the report and stat button. - change color of trash button in form view in gantt - make sure no planned shifts are not displayed - simplify kanban card when shift is not planned - some relabeling and change worksheet visibility condition in the report - hide resource_ids in calendar popover when empty - hide Field Service report if no customer report - compute is_absent field if shift is not completed - raises a user error when the user tries to reset the state of an intervention in draft if the state was in progress or completed - hides `Hide price on customer report` in settings of planning app if `Customer Report` feature is disabled - add space between worksheet and photos in the portal view and in Field Service report - compute quotations_count field in planning.slot only if the user has sales access - makes sure the context is reset before taking the display name of the customer set to set it to display name of the shift. Because before this commit, when the user creates a new shift and set a customer to the intervention, the display_name of the shift will contain the customer name but also his address which is not really expected. - reorder worksheets data/demo to have the one created in demo data first once the demo data are loaded - relabel email template in field service - order the tracking in planning.slot - reset SO when customer changes - show field service stat button in SO when SO is generated/linked to an intervention. - text white for conflicts tag in kanban otherwise the text is not correctly lisible in light mode. - fix worksheet visibility in portal/report - fix action_complete() and sale_line_id computation when no SO - review card_top of kanban card of planning slot - hide effective_hours and related fields from views/reports - remove group to prevent access errors in SO - hide partner_phone if no partner set on the shift - add photos in field service report - don't allow to add material on draft or published, we should only be able to add material when the intervention is in progress or completed task-5994280 Forward-Port-Of: odoo/enterprise#109963
This update resolves an issue where navigating back from the Helpdesk message search panel on mobile devices resulted in an error. The fix ensures a smoother user experience by implementing a standard navigation pattern for closable components, similar to those used in other parts of the application. This enhances usability and prevents frustrating errors for mobile users.
Original PR description
...in mailboxes on mobile community PR: https://github.com/odoo/odoo/pull/252512 Before this commit, navigating back from a mailbox message search panel on mobile would result in a traceback. Steps to reproduce: 1. Open Discuss on mobile 2. Navigate to bookmarks in bottom bar 3. Open message search 4. Navigate back -> traceback This happens because the `useBackButton` in ActionPanel registers a callback function taken from the env. Said function is missing when the ActionPanel is mounted outside of a chat window or meeting view. This commit fixes the issue by adding a `close` props to ActionPanel, and using that as a callback for back navigation. This is an established pattern for similar closable components like Popover, Dialog and EmojiPicker. task-6013922 Forward-Port-Of: odoo/enterprise#110150
This update corrects an issue preventing basic inventory users from saving delivery records due to incorrect access permissions. The change ensures that only users with the necessary account access rights can modify related data, improving system stability and security. This resolves a restriction on user capabilities within the Odoo Enterprise inventory module.
Original PR description
### Step to reproduce: - Take a user with only basic inventory user access rights - Create a new delivery, add a stock move, try to save the record #### > Access error: Failed to write firld…
### Step to reproduce: - Take a user with only basic inventory user access rights - Create a new delivery, add a stock move, try to save the record #### > Access error: Failed to write firld stock.move.l10n_uy_edi_addenda_ids This flow is tested by the `test_basic_stock_flow_with_minimal_access_rights` test after installing the `l10n_uy_edi_stock` module. Cause of the issue: Since [19.0](https://github.com/odoo/odoo/commit/4a822785ca850c7ae5b21039536333276b2c61af) the read access right of the comodel is checked when writing on a many2many field. However, only the `account.group_account_invoice` does have read access on the `l10n_uy_edi.addenda` model: https://github.com/odoo/enterprise/blob/482b4564b3a81e914d6eead9a7b85a23b7cac3dc/l10n_uy_edi/security/ir.model.access.csv#L2 This is problematic as the `l10n_uy_edi_addenda_ids` field is added to the view even for users without read access rights on the comodel: https://github.com/odoo/enterprise/blob/482b4564b3a81e914d6eead9a7b85a23b7cac3dc/l10n_uy_edi/views/account_move_views.xml#L43-L53 Even if the field is invisible it is now part of the fields checked by the onchange and the values saved by the picking `web_save`. In particular, creating a new picking from the form view and saving the record will try to write an `[]` value on the `stock.picking` `l10n_uy_edi_addenda_ids` field and trigger the access error. runbot-240937 Forward-Port-Of: odoo/enterprise#109817
This update ensures that the system correctly validates UY CFEs (electronic invoices) by granting necessary permissions to access company data. Previously, users without specific group access would encounter validation errors. This change adds sudo() access to company data, resolving this issue and improving the reliability of the UY CFE processing workflow.
Original PR description
This pull request makes a small update to the `_ucfe_inbox` method in `l10n_uy_edi_document.py` to ensure that company-specific fields are always accessed with the appropriate permissions. This is achieved by using the `sudo()` method when retrieving the `l10n_uy_edi_ucfe_commerce_code` and `l10n_uy_edi_ucfe_terminal_code` fields from the `company` record. * Ensured that `l10n_uy_edi_ucfe_commerce_code` and `l10n_uy_edi_ucfe_terminal_code` fields are accessed with elevated permissions by calling `company.sudo()` in the `_ucfe_inbox` method (`l10n_uy_edi_document.py`). Without this fix, if the user doesn't belong to group "base system", it won't be able to validate CFEs, receiving the following message: <img width="1272" height="400" alt="image" src="https://github.com/user-attachments/assets/ec4223fb-5b96-4a3e-babf-2f6a35ecd123" /> Forward-Port-Of: odoo/enterprise#105918
This update prevents a crash when generating invoices for subscriptions with both standard products and timesheet services. Previously, an empty timesheet line caused an error. The fix adds a safeguard to skip invoice lines without sale order links, ensuring invoices can be created correctly regardless of timesheet delivery status.
Original PR description
**Issue:** When generating an invoice for a subscription that contains a mix of regular products (invoiced on order) and timesheet-based services (invoiced on delivery), a traceback can occur if the…
**Issue:** When generating an invoice for a subscription that contains a mix of regular products (invoiced on order) and timesheet-based services (invoiced on delivery), a traceback can occur if the timesheet service has 0 delivered quantity. **Cause:** During the invoice creation process, `_get_reinvoiced_analytic_lines_to_link` iterates over the newly created invoice lines to link analytic lines. It filters the linked sale order lines using `_is_line_reinvoicable()`. If the invoice only contains standard products (because the timesheet line was skipped due to 0 delivery), `so_lines` evaluates to an empty recordset. then calling `_get_range_dates` causes a treace beack because it needs to ensure that ther is at least 1 order `self.ensure_one()` **Fix:** Added a safeguard (`if not so_lines: continue`) inside the loop. If an invoice line does not contain any reinvoicable sale order lines, it is now safely skipped, allowing standard subscription lines to be invoiced alongside undelivered timesheet lines without crashing. task: 5966725 Forward-Port-Of: odoo/enterprise#108685
This update corrects a technical issue where outdated database records related to HR work entries were present. These records have been permanently removed as part of a system update, ensuring data integrity and preventing potential future problems. This change improves the stability and efficiency of the HR payroll module.
Original PR description
The records `hr_work_entry.access_hr_work_entry_officer` and `hr_work_entry.access_hr_work_entry_system` no longer exist. They have been removed by https://github.com/odoo/odoo/pull/244436. runbot_build_error-240728 Forward-Port-Of: odoo/enterprise#110255
This update corrects a bug where helpdesk users weren't seeing ratings for tickets assigned through teams they weren't directly members of. The fix ensures all assigned tickets' ratings are accurately reflected in the average rating views, providing a more complete and reliable customer feedback picture. This improves the accuracy of performance metrics.
Original PR description
Steps to reproduce: - Configure a helpdesk team to be viewable by the test user - Remove test user from member_ids of helpdesk team - With that team selected, create a helpdesk ticket assigned to test user - Submit a rating for the ticket as the customer - As the test user in the helpdesk app overview, click on today average rating or last 7 days average rating Current behavior: - In both views, the test user won't see ratings for tickets attached to helpdesk teams where they are not listed in member_ids Expected behavior: - In both views, the test user should see all ratings of assigned tickets regardless if they are included in a helpdesk team's member_ids Note: member_ids in helpdesk.team appear to be only used for auto assigning new helpdesk tickets, so checking member_ids doesn't account for all potential users working in a team opw-5949917 Forward-Port-Of: odoo/enterprise#109470 Forward-Port-Of: odoo/enterprise#109136
This update fixes a display issue in the SEPA payment wizard, ensuring the warning message accurately reflects the number of payments being processed (originally showing 4 when only the first installment was being paid). Additionally, a bug preventing the 'group payment' button from appearing when multiple bills were selected has been resolved. This ensures accurate payment tracking and a smoother user experience.
Original PR description
[FIX] account_iso20022: right number of payments skipped in send wizard adding tests to the community commit Steps to reproduce: - install modules account_sepa_direct_debit, account_iso20022 - create 2 vendor bills with payment terms so that there are 2 installments per bill, and post them - from the list view, select both bills and click pay - select SEPA as a payment method, a warning message is displayed mentionning 4 payments We want the warning to display a number of 2 payments because we're paying only the first installment of each bill This commit also fixes the visibility of the "group payment" button: when two bills from different suppliers were selected with one having installments, the button was visible task-5917803 Forward-Port-Of: odoo/enterprise#110350 Forward-Port-Of: odoo/enterprise#106894
This update resolves intermittent test failures in the sign feature by using dedicated test users instead of the default 'admin' and 'demo' accounts. This ensures test results are consistent and reliable, preventing disruptions to development and testing.
Original PR description
Relying on the default `admin` and `demo` users caused random runbot failures, as their access rights can be altered by other modules. This commit replaces them with freshly created test users to strictly simulate the presence or absence of the `sign.group_sign_user` group, ensuring the test remains deterministic. Runbot error: https://runbot.odoo.com/odoo/runbot.build.error/241216 Forward-Port-Of: odoo/enterprise#110454
This update fixes a missing 'Reset' button for specific Spanish informational reports. A recent configuration change made the standard reset button invisible. This fix adds a dedicated reset button that appears when the report is completed, ensuring users can properly clear and regenerate these reports.
Original PR description
- The `Reset` button was missing from the dropdown menu for Spanish informational reports (Mod 130, 347, 349, 390). - This occurred because these reports were recently configured with `is_tax_return_type = False` in this [commit](https://github.com/odoo/enterprise/commit/d2b1d29542c0350c267fecffd70d3e288364d8ab). However, the standard reset button (`action_reset_tax_return_common`) is configured to be invisible when `is_tax_return` is false. - This fix adds a reset button specifically for these Spanish reports that appears when the report is completed. task-5214023 Forward-Port-Of: odoo/enterprise#110271 Forward-Port-Of: odoo/enterprise#104739
This update fixes a server error that occurred when merging tables in the Point of Sale system, specifically when a table was empty and an order was present. The fix ensures the system waits for order synchronization before merging, preventing the error and improving table management functionality. This improves the reliability of the POS experience.
Original PR description
Steps to reproduce: - On an empty table, change the guest count - Create an order and send it to the kitchen - Open another table without an order - Merge the first table with the second one Issue: - A server error occurs while merging the tables Fix: - Wait for the merge order to sync before returning the result Task-5502511 Related PR - https://github.com/odoo/odoo/pull/245162 Forward-Port-Of: odoo/enterprise#110052 Forward-Port-Of: odoo/enterprise#104577
This update ensures that taxes are automatically calculated for charge and discount lines in UrbanPiper orders, even when tax data isn't directly provided by the vendor. Previously, taxes weren't applied if UrbanPiper didn't send tax information, and it was limited to India. Now, the system uses standard product tax rules for these lines, ensuring accurate tax calculations across all regions.
Original PR description
Before this commit: --- - If UrbanPiper did not send tax data for charge and discount lines, taxes were not applied. - Tax data was only provided by UrbanPiper for the India region. After this commit: --- - When the payload does not include tax data, compute taxes for charge and discount lines using the product tax, the same way as for normal order lines. task-5895987 Forward-Port-Of: odoo/enterprise#110166 Forward-Port-Of: odoo/enterprise#106686
This update resolves errors in the P&L and Balance Sheet reports specifically for French association companies. The team addressed inconsistencies in the data while acknowledging limitations in report aggregation, ensuring accurate financial reporting for this user group.
Original PR description
The aim of this commit is fixing the Pnl & Balance Sheet report in France for association company. This commit ensures that we don't have any duplicate errors in the PnL & Balance Sheet. We kept some errors in the Balance Sheet (especially about the brut - amort - net) as we can't use aggregation with groupby but the data are not really duplicated. no task id Forward-Port-Of: odoo/enterprise#110163
This update corrects a minor display issue in the account reports where the green comparison color wasn't consistently showing. The change resolves a technical adjustment related to how data is processed after the Dictalypse merge, ensuring accurate and reliable reporting visuals.
Original PR description
With Dictalypse merged, there is a small mistake converting mode <=> comparison_mode since column_percent_comparison_data is now technically a column. The fix is to use comparison_mode instead of mode in the js view. Forward-Port-Of: odoo/enterprise#110476
This update resolves a JavaScript error that occurred when reloading the shopfloor app, specifically during MO process runs. The fix disables the automatic focus of the search bar, preventing a common error related to the element not being available during the reload. This ensures a smoother user experience.
Original PR description
Steps to reproduce:
- Open the shopfloor app
- Reload or duplicate the page where the MO process is running
Issue:
A JavaScript error occur during reload:
UncaughtClientError > TypeError
Uncaught Javascript Error > Cannot read properties of null (reading 'blur')
Occured on 101125414-19-0-all.runbot180.odoo.com on 2026-02-16 04:59:28 GMT
TypeError: Cannot read properties of null (reading 'blur')
at https://101125414-19-0-all.runbot180.odoo.com/web/assets
/9d8abcf/web.assets_web.min.js:36280:459
Cause:
This happens when the search bar component attempts to call `blur()` on `inputRef.el` while the element is not yet available or has already been destroyed during the component lifecycle.
Fix:
Disable the search bar autofocus in the shopfloor
`env.config.disableSearchBarAutofocus = true`.
opw-5902675
upg-3894728
Forward-Port-Of: odoo/enterprise#109803
Forward-Port-Of: odoo/enterprise#107491This update corrects a minor issue in the l10n_be_hr_payroll module that could have affected the accuracy of payroll calculations. The change ensures the code correctly uses loop variables instead of 'self', resolving a potential source of error. This ensures payroll is calculated correctly for Belgian employees.
Original PR description
Use loop variable instead of `self`. Forward-Port-Of: odoo/enterprise#109970
A warning message was appearing during tax report adjustments in the French localization. This was caused by an unnecessary reference to 'box_B1' within the report's calculations. This update removes this reference, ensuring the report functions correctly and eliminates the warning message for users.
Original PR description
Steps to reproduce: 1- Install Accounting and l10n_fr and switch to French company 2- Go to [Settings > Accounting] and make sure fiscal localization is set to France 3. Go to [Accounting > Reporting > Tax return] and change the Report to Tax Report (FR) 4. Make an adjustment to the B1 field Description of issue: Warning message displayed where the text does not mention B1 Expected behavior: No warning message should be displayed when editing B1 Why this happens: 'box_B1' is used in the the expression total comparison when it should not be opw-5960001 Forward-Port-Of: odoo/enterprise#110169
This update resolves a UI issue that occurred when changing wage intervals in the employee payroll settings. The problem stemmed from extra text being added to the employee form view, causing errors. This fix removes the problematic text, ensuring correct wage interval calculations and a stable user experience.
Original PR description
Bug production steps: First, I created a new db with saas-19.1 db from runbot, from payroll->employee->Payroll tab in form view, when you change wage interval to another thing than 'month' error occurs Bug cause: There is another text like /2 months, /2 weeks are inserted from hr_employee_views in the hr_contract_salary_payroll to the XML of the employee form view. Bug solution: Removing the corresponding XML insertions. task - 5469378 Forward-Port-Of: odoo/enterprise#110462 Forward-Port-Of: odoo/enterprise#104116
This update ensures Odoo complies with NACHA rules regarding payment descriptions. Starting March 2026, all payroll payments must include 'PAYROLL' in the Company Entry Description field. This change is necessary to avoid potential payment processing issues and maintain compliance with financial regulations.
Original PR description
Starting March 20, 2026, NACHA requires the Company Entry Description field to contain "PAYROLL" for paying wages, salaries, or compensation [1]. [1] https://www.nacha.org/rules/risk-management-topics-company-entry-descriptions task-5981941 Forward-Port-Of: odoo/enterprise#109460
Features or functions removed from Odoo
This update removes a restriction in the EC Sales List report that previously only allowed reporting for businesses. This change now correctly handles companies that are configured as individuals, ensuring more accurate reporting across all company types. It's a minor improvement to the reporting functionality.
Original PR description
Removing as the prod has a lot of companies that are configured as individuals. no-task Forward-Port-Of: odoo/enterprise#110098 Forward-Port-Of: odoo/enterprise#99807
Code cleanup and technical improvements
This update simplifies how WhatsApp stores data related to store information. This change improves the efficiency and reliability of the WhatsApp integration within the Enterprise version of Odoo. It's a refactoring effort to streamline the process.
Original PR description
Enterprise counter-part. https://github.com/odoo/odoo/pull/253668