Daily updates from Odoo
Thursday, November 20, 2025
21 changes · master
Enhancements to existing features
The IoT module files were reformatted using a standard formatting tool to make the codebase more consistent and easier to maintain. This is an internal cleanup with no expected change to user-facing behavior, and future checks will help keep the formatting consistent.
Original PR description
This commit formats all the files in the `iot` module using `prettier`. This formatting will be enforced by the ESLint test (see associated Community PR https://github.com/odoo/odoo/pull/236516).
Users can now mark or unmark documents as favorites directly from the list view, matching the behavior already available in Kanban view. The shortcut only appears when documents are selected, reducing clutter and making the action more relevant.
Original PR description
- Previously, toggling favorites was only supported in the Kanban view and not available in the list view. - Favorites can now be toggled in the list view, and provide consistency across all views. - Additionally, the shortcut command is now only available when at least one record is selected, as it doesn't make sense to show the command when no documents are selected. Task-4822074
Payroll users can now remove work entry export records for several Belgian payroll providers. This helps teams correct or clean up exported payroll data when records are no longer needed.
Original PR description
*={acerta,group_s,partena,prisma,sd_worx,ucm}
Payroll users should be able to delete the work entry export records.
task-5050476The default Administrator employee is no longer included in standard company data and is only available with demo data. This keeps new databases cleaner and avoids an incomplete placeholder employee getting in the way, while users can still create an Administrator employee when needed.
Original PR description
## Purpose The default administrator employee (in master data) sometimes can get annoying, making it difficult to code easy features. Moreover, almost all the fields of this employee are empty, and the user can easily create its own Administrator employee by clicking the "Create Employee" button from the Admin User View. ## Solution Moving the admin employee to the demo data. [community#232627](https://github.com/odoo/odoo/pull/232627) [upgrade#8806](https://github.com/odoo/upgrade/pull/8806) [task-5138634](https://www.odoo.com/odoo/all-tasks/5138634)
This update adds support for UK EC Sales and Intrastat return reporting. It helps businesses prepare required cross-border trade declarations more consistently within Odoo.
This update aligns several business workflows with a platform change where asking for zero records now correctly returns none. It helps avoid unintended records appearing in manufacturing planning, subscriptions, and barcode/package operations when a zero-result limit is expected.
Original PR description
https://github.com/odoo/odoo/pull/234231
The manufacturing work order display no longer keeps an unused reference in its setup logic. This removes outdated code tied to a previous storage naming approach, reducing confusion and making future maintenance safer.
Original PR description
Picking type Was only used in the previous local storage key name and was undefined. see odoo/enterprise#88073 (original PR) see odoo/enterprise#93841 (Fix PR were we remove the `picking_type_id` key from local storage name)
Installing an accounting chart template for countries in the SEPA zone now also installs ISO 20022 payment support. This helps businesses in those countries get the right bank payment capabilities automatically, reducing manual setup.
Original PR description
This commit will allow to install account_iso20022 when installing a chart template from the SEPA zone. task-5163045 Forward-Port-Of: odoo/enterprise#97209
The U.S. direct deposit settings are now connected to the community accounting setup, making them easier for users to discover in the right place. This improves configuration clarity without changing the direct deposit feature itself.
Original PR description
Change the new settings panel from being defined in enterprise to being defined in l10n_us_account and overriden here for proper discoverability. task-5080414
Resolved issues and error corrections
This fix prevents duplicate or incorrect tax closing entries when multiple tax reports exist for the same country. It ensures each eligible report only uses the relevant tax lines, disables duplicate return generation where reports overlap, and moves some reports to a review-and-submit flow when no closing entry is needed.
Original PR description
It's possible for different tax reports to exist in the same country, each with its own return type. However, this is an issue when they aren't configured to generate closing entries with distinct contents, since each of them will then repeat the content of the other. To fix this, when it's legitimate to make multiple closing entries, we make sure the closing entry only considers the tax move lines linked to the report's tax tags. If multiple reports must generate the same closing entry (typically because one of them is a simplified version of the other), we disable the generation of the return for one of them. Some reports also didn't need to generate a closing entry and were switched to a 'review_submit' state. task-5123564 Forward-Port-Of: odoo/enterprise#99182 Forward-Port-Of: odoo/enterprise#98158
This fixes a failure that prevented users from uploading videos to YouTube from Odoo when the older jQuery library was unavailable. The upload process now uses modern browser methods while preserving upload progress feedback.
Original PR description
Issue: when trying to upload a video to youtube, we receive an error as "ReferenceError: $ is not defined" meaning we're not able to reach the jQuery identifier. So following the trend we're moving away from jQuery, this commit removes the usage of jQuery in the youtube upload field. - Replaced $.ajax() with fetch() in _openUploadSession, _updateProcessingInfo, and _onClearClick methods - Replace $.ajax() with XMLHttpRequest in _uploadFile to maintain upload progress tracking opw-5142810 Forward-Port-Of: odoo/enterprise#97364
Fixes an issue where reusing a saved AI live chat website block could crash the website editor. Users can now save and re-add the AI chat snippet from custom blocks without interruption.
Original PR description
Steps to reproduce: ------------------------- 1. Install Website and AI modules. 2. Open the website editor. 3. From the Intro block, search for the AI snippet and add the snippet contains 'Need…
Steps to reproduce:
-------------------------
1. Install Website and AI modules.
2. Open the website editor.
3. From the Intro block, search for the AI snippet and add the snippet contains 'Need Help?'.
4. Click on the added block, then click the Save icon from the Style tab.
5. Save the snippet
6. Go to Blocks → Custom Blocks and add the saved snippet.
Observation:
-------------------------
A traceback is raised:
```
TypeError: Cannot read properties of null (reading 'remove')
at AILivechatOptionPlugin.onSnippetDropped
```
Issue:
-------------------------
The `onSnippetDropped` method
https://github.com/odoo/enterprise/blob/bb3699cc112acb3ec545d3aa5f3d8f7263a5dac6/ai_website_livechat/static/src/website/plugins/ai_livechat_option_plugin.js#L39-L51 executes every time a snippet is dropped into the layout. When the snippet is first added, the method removes the `<div>` with class `s_ai_livechat_preview`. Upon saving, the snippet is stored without that `div`. When re-adding the saved snippet from custom tab, the method runs again but fails since the `s_ai_livechat_preview` element no longer exists, resulting in the traceback.
Solution:
-------------------------
Added the optional chaining operator to safely remove the `s_ai_livechat_preview` div only when it exists.
opw-5227072
Forward-Port-Of: odoo/enterprise#99276The Copy to Clipboard option now appears correctly for regular conversations when the AI module is installed. This fixes a visibility issue in message actions and adds test coverage to help prevent the problem from returning.
Original PR description
Before this commit, "Copy to Clipboard" was sometimes not visible in the message action list when message had some text content. This happens because message actions can condition overridden by some…
Before this commit, "Copy to Clipboard" was sometimes not visible in the message action list when message had some text content. This happens because message actions can condition overridden by some other modules, and the way overrides of action condition work is to have boolean value taking precedence over the local condition of action. This architecture is meant to provide exhaustive list of actions to allow, which is quite useful to control what livechat visitors can have. However this architecture requires overrides to properly return `undefined` when the local condition should apply, which was not the case for an override by `ai` module. So when `ai` module is installed, the "copy to clipboard" feature as not available. This commit fixes the issue by adapting the condition in `ai` module to return `undefined` on non-AI conversations, and add test coverage for both `@mail` discuss suite and all overrides of discuss in `@test_discuss_full_enterprise`. opw-5240768 https://github.com/odoo/odoo/pull/236295 Forward-Port-Of: odoo/enterprise#99794
The IoT connection flow now checks the device token before looking up older device records. This prevents unnecessary error logs when an IoT box reconnects after being unpaired or used with another database.
Original PR description
Steps to reproduce: 1. Connect an IoT box 2. Now unpair it from the IoT box homepage (record stays in DB) 3. Connect the same box again to a different DB but with the same IP (e.g. when a developer switches branch) 4. Now go back to the original DB 5. Observe a traceback in the DB logs when the IoT calls /iot/setup (`cannot access id on NoneType`) This traceback occurs because we were checking for an old IoT box record before checking if the token matches. We simply swap the checks around to prevent the traceback.
Website content generation issues are now recorded as warnings instead of errors when they do not block the user. This keeps monitoring reports cleaner while users still receive the appropriate notification when generation fails.
Original PR description
- Currently, we log an error whenever an error occurs during content generation for any webpage. - However, it is a non-blocking error so it can be safely converted to a `_logger.warning`, as we already notify user about the error through a notification [1]. - Additionally, the errors caught here will be all UserErrors so no need to log another error, so we log a warning instead. - This commit converts the `_logger.error` into `_logger.warning`. [1]: https://github.com/odoo/enterprise/blob/b001e9cc2af0f800e2a7965b61aa9b9c5bd4e89e/ai_website/static/src/components/dialog/add_page_dialog.js#L74-L80 sentry-6974000714 Forward-Port-Of: odoo/enterprise#98844
This fix prevents the inter-company transaction settings from replacing a company's chosen warehouse when purchase order generation is enabled. Businesses with multiple companies and warehouses can keep the correct warehouse assignment, reducing order routing mistakes.
Original PR description
Issue: -------- While having multiple companies, multiple warehouses and when different warehouses are set for different companies other than the first one(id=1) under Inter-Company Transactions "Use…
Issue: -------- While having multiple companies, multiple warehouses and when different warehouses are set for different companies other than the first one(id=1) under Inter-Company Transactions "Use Warehouse". Now, when we check the 'Generate Purchase Orders' then the 'Use Warehouse' value which was set before is getting overridden to the first Warehouse which has minimal 'id'. Cause: ------ [Here](https://github.com/odoo/enterprise/commit/6324a6bab04fa0f3aa6d87deabc44c7c2eafc295#diff-51563a07f4b65f4ffe54bfb161ac1e9e58ff0f0bcf2522c9f6aa3746b60a68adR28-R38) Since, whenever there's a change within any of those check-boxes the compute will be triggered and the values will get modified. During this trigger the value set in the 'Use Warehouse' is getting overridden to the warehouse with minimal 'id'(For ex: id-1). Solution: ----------- To fix this, we'll just check if there's no value set before. If yes, then we'll set the first warehouse which has minimal 'id'. Otherwise, set the one which is selected. Steps to reproduce: ------------------------- 1. Create a fresh db with multiple warehouses and 'sale_purchase_stock_inter_company_rules' module installed. 2. Go to General Settings> Inter-Company Transactions and check/select 'Generate Sale Orders' and set a different warehouse and save. 3. Now check/select the 'Generate Purchase Orders' and save. 4. Look at the Use Warehouse value in the Settings. It will be the first one with minimal 'id'. Ref PRs: 1. https://github.com/odoo/enterprise/pull/55350 Forward-Port-Of: odoo/enterprise#87276
CSV bank statement imports now keep imported statement lines even when automatic reconciliation hits a user-facing error. Users can still complete reconciliation manually afterward, reducing failed imports and repeated work.
Original PR description
### Issue: When importing a CSV file with bank statements, if an error is raised during the reconciliation, the creation of the bank statement lines is roll backed. ### Steps to reproduce: - Install…
### Issue: When importing a CSV file with bank statements, if an error is raised during the reconciliation, the creation of the bank statement lines is roll backed. ### Steps to reproduce: - Install "account_bank_statement_import_csv" - In the bank journal configuration: - Set the "Outstantding Receipts accounts" of "Manual payments" to a "Bank" account - Set the "Outstantding Payments accounts" of "Manual payments" to the same "Bank" account - Create a new transaction for $333.0 for example - Find its Journal Entry and change its reference to 'testref' - have a CSV file like this: ``` label, amount testref,333 ``` - Import this file - Make sure label is linked to label and amount to amount - Import - An error shows, no lines are imported ### Cause: On import, we try to auto reconcile the lines using `_cron_try_auto_reconcile_statement_lines` ([here](https://github.com/odoo/enterprise/blob/843a17367525c80653d37ecdd9d87434d3e92454/account_bank_statement_import_csv/wizard/account_bank_statement_import_csv.py#L146)). If an error occurs during the reconciliation, we call `self.env.cr.rollback()` [here](https://github.com/odoo/enterprise/blob/843a17367525c80653d37ecdd9d87434d3e92454/account_accountant/models/account_bank_statement.py#L190-L192). This rollback cancels the transaction, including the creation of the statement lines. ### Solution: If the error raised is a `UserError` then we don't roll back and just ignore it. This causes no issues as we caught all exceptions to always continue the reconciliation with the next batch. For UserErrors we should let the user reconcile manually afterward. Also, as the rollback can undo the creation of `st_lines`, we add `if st_lines.exists():` before writing on the variable. Test is not possible as we don't roll back during tests. opw-5138855 Forward-Port-Of: odoo/enterprise#99073
This fix prevents Sendcloud delivery validation from crashing when a sales order includes a down payment line. It ensures only real product lines are used for customs price calculations, allowing affected shipments to be processed normally.
Original PR description
Steps to reproduce ----- - Create a SO with a sendcloud delivery - Create an invoice for a down payment & confirm it - Go to the delivery and validate it > Traceback Cause ----- Creating a down…
Steps to reproduce ----- - Create a SO with a sendcloud delivery - Create an invoice for a down payment & confirm it - Go to the delivery and validate it > Traceback Cause ----- Creating a down payment adds lines to the SO https://github.com/odoo/odoo/blob/7bbfb207f8699973f8580ea18821f82b1a83e149/addons/sale/wizard/sale_make_invoice_advance.py#L163-L165 When we confirm the delivery, we retrieve the price of products for customs. https://github.com/odoo/enterprise/blob/f1a385e44ff9cb0e6a6c50c743762fb45329c957/delivery_sendcloud/models/sendcloud_service.py#L515-L520 To do this, we iterate over the SOL and skip lines where the product qty is 0 https://github.com/odoo/enterprise/blob/f1a385e44ff9cb0e6a6c50c743762fb45329c957/delivery_sendcloud/models/sendcloud_service.py#L525-L528 The problem is that the down payment SOL has no uom. This means that when we do `float_is_zero(line.product_uom_qty, precision_rounding=line.product_uom.rounding)` precision_rounding is `0.0`. So when `float_is_zero` calls `_float_check_precision` we go through https://github.com/odoo/odoo/blob/7bbfb207f8699973f8580ea18821f82b1a83e149/odoo/tools/float_utils.py#L33-L36 where the assert is false, creating the traceback. ----- Ticket: opw-5207574 Forward-Port-Of: odoo/enterprise#99178
Users with the right manufacturing and timesheet permissions can now finish work orders even when the related project is assigned to someone else. This prevents an access error during analytic accounting entries, reducing interruptions on the shop floor.
Original PR description
Steps to reproduce: - Enable Analytic Accounting. - Assign a project A to User A. - Create user B with Manufacturing User + Timesheet User rights. - Create a storable product “P1” with the following…
Steps to reproduce:
- Enable Analytic Accounting.
- Assign a project A to User A.
- Create user B with Manufacturing User + Timesheet User rights.
- Create a storable product “P1” with the following BoM:
- Component: 1 unit of C1
- Workorder: Operation of 60 minutes
- Project: Project A
- As user B:
- Create a mo to produce one unit of “P1”
- confirm the MO
- start the workorder and try to mark it as done.
Issue:
An access error is raised when creating analytic lines:
"Sorry 'user B' doesn't have read access to account.analytic.line"
Explanation:
Since the project is assigned to Mitchell Admin and not to Marc Demo,
the access rule below applies:
https://github.com/odoo/odoo/blob/19.0/addons/hr_timesheet/security/hr_timesheet_security.xml#L50-L62
Because Marc Demo belongs to the "Timesheet User" group but not to
the "Accounting" group, he lacks the required access rights,
which triggers the analytic line read restriction.
opw-5262213
Forward-Port-Of: odoo/enterprise#99716Italian POS users can now reprint the exact past order receipt they select, instead of accidentally printing the most recent receipt. This prevents customer service and record-keeping errors when businesses need copies of older receipts.
Original PR description
before this commit, when trying to reprint a past order it would not work. Instead it would print the last order no matter what order is selected. Steps to reproduce: 1. setup an DB with an italian…
before this commit, when trying to reprint a past order it would not work. Instead it would print the last order no matter what order is selected. Steps to reproduce: 1. setup an DB with an italian POS 2. make 2 sales with a different product (easier tracking) 3. open the "orders" view 4. try to reprint the ticket of the firt order result: the receipt of the second order is printed the reason for this is that we were using the printer's built in command "printDuplicateReceipt" which is inteded for printing the very last receipt. With this commit, we changed the behavior and invoke another printer command. That command is meant to reprint any receipt, based on the provided reference. After this commit, trying to print any past receipt will print that exact receipt. IMPORTANT NOTE: In theory, the printer command can reprint any number of receipts. We decide that we will only use it to reprint the one receipt selected by the user. This moves the complexity of parsing date strings and ranges to the command component and therefore will keep the rest of the code cleaner. opw-5008702 opw-4882480 Forward-Port-Of: odoo/enterprise#99842 Forward-Port-Of: odoo/enterprise#96122
Fixed an issue where using backspace on the VoIP keypad did not delete highlighted characters when the selection started at the beginning. This restores expected editing behavior for users entering or correcting phone numbers while preserving safeguards against cursor errors.
Original PR description
This commit fixes a regression introduced in commit [1] prevented deleting when a selection began at index 0; extend the guard so the numpad (keypad) backspace still removes the highlighted characters while keeping the cursor-safety logic. [1]: https://github.com/odoo/enterprise/commit/73b01fa5e1f56d4ab71d67760b15942fb2fa0e31 task-5217676 Forward-Port-Of: odoo/enterprise#99835 Forward-Port-Of: odoo/enterprise#99358