Daily updates from Odoo
Thursday, July 23, 2026
24 changes · master
Enhancements to existing features
Philippine localization now avoids duplicating partner name details by deriving first, middle, and last names from the main name while still allowing updates when needed. Branch codes are left blank by default and safely fall back to standard values for reporting, reducing manual data cleanup while keeping tax reports usable.
Original PR description
Clean up the fields stored on the res.partner model. The first, middle and last name fields are now computed with inverses, to avoid storing the name twice in the database and reduce manual work. The branch code is now left empty by default, with fallbacks to '000' when needed to generate a report. It is still automatically computed from the VAT number if possible. task-6146199
Users can again export dynamic folder views from Documents into spreadsheets and Knowledge link settings, making it easier to reuse up-to-date document views. The change also protects folder access tokens from being exposed through Knowledge view settings.
Original PR description
It is convenient to export a dynamic view of a folder in both spreadsheet and knowledge links settings. Care is taken to avoid leaking access folders tokens through the search panel/model's state in knowledge. Task-5180137
The quick product creation window in the website editor has been redesigned so product details and images are easier to manage. When editing a product image, users are now taken directly to the media manager, making the process smoother and less cramped.
Original PR description
In the website editor, it is possible to quickly add a new product. However, the opened view looks bad, especially when adding an image, as everything is squeezed. This commit improves the UI and opens the media manager when editing the image. Community: https://github.com/odoo/odoo/pull/278040 task-6307166
Loans can now include analytic accounts so loan-related journal entries reflect the correct analytic distribution. This helps businesses track loan costs and allocations more accurately in their reporting.
Original PR description
Similar to assets, users need the ability to add analytic accounts to loans so that the analytic distribution impacts the generated journal entries. Task-4575979
POS operators can now see self-order counts in the same notification area as other order status updates, making it easier to monitor incoming activity. The update also adds an option to temporarily snooze the self-order service for a chosen period, giving staff more control during busy or unavailable times.
Original PR description
In this commit: ------------------ - Unified the order status notification widget to display self-order counts within the same widget. - Implemented a toggle to snooze the self-order service for a specified duration. task: 6110229 Community PR: https://github.com/odoo/odoo/pull/261677 Upgrade PR: https://github.com/odoo/upgrade/pull/10064
The Knowledge app now handles popover context automatically instead of passing it manually in comment and sidebar components. This simplifies the underlying implementation and should make future maintenance safer without changing the user experience.
Original PR description
This commit removes the env given to usePopover. usePopover and useOwnedDialogs now get the current owl scope by themselves (with an option) and propagates it to the popover.
Odoo Box device records now include a connection type, making it easier for users to match each record with the corresponding physical device. This improves day-to-day identification and support for connected devices.
Original PR description
We added a connection type to help users find which record corresponds to which actual device. see odoo/obox#203 task-6332387
Users can now enable or disable each AI provider independently of whether an API key is saved. This makes AI configuration easier to manage and improves feedback when API keys are missing or invalid.
Original PR description
Prior to this PR, user had to delete the API key set in order to disable the corresponding provider option in the AI config view. With this PR, we removed the compute method to allow the enable/disable provider option independently from the API key value. Additionally, reworded error messages when API keys are unable and added custom messages when provided API key is invalid. task: 6331248
Resolved issues and error corrections
Uploaded public holidays now receive the required work entry type before payslips are created. This prevents payroll processing from failing when companies import public holidays through the localization payroll tools.
Original PR description
Steps to reproduce: - Install payroll and timeoff. - Open the Public Holidays menu. - Upload public holidays. - Create a payslip. Issue: - A traceback occurs while creating the payslip. Cause: - The uploaded public holidays do not have a Work Entry Type assigned. As a result, the work entries are empty, which causes the payslip creation to fail. Fix: - Set Work Entry Type before creating payslips extending public holiday model. Task-6394524
Spanish VAT book exports now ignore negative tax components when calculating displayed tax amounts. This prevents valid EU vendor bill taxes from incorrectly appearing as zero, improving accuracy in tax reporting.
Original PR description
Problem: In the Spanish VAT books, taxes with negative component (like 21% EU G) always show their amounts as zero. Steps to reproduce: 1. Install the l10n_es_reports module and select the Spanish company 2. Create a vendor bill with a vendor from another EU country and add a product 3. Make sure the tax applied to the product has a negative component (like 21% EU G) 4. Confirm the bill 5. Go to Accounting > Reporting > Tax Return 6. Generate the VAT books from the action menu and check the tax amounts 7. Notice how the tax amount is zero, even though the tax was applied to the bill Cause: When calculating the tax amounts, the negative component cancels out the positive component, leading to the amount always showing as zero in the VAT books. opw-6169766 Forward-Port-Of: odoo/enterprise#124030 Forward-Port-Of: odoo/enterprise#123738
The timesheet assistant now recognizes events from coding editors correctly, so they display with the intended development icon. This makes assistant activity clearer for users who track work connected to development tools.
Original PR description
In the assistant, events from a coding editor use the "code" event type, which doesn't exist. This PR changes it to the correct value, which is "development". Task-6392585 Forward-Port-Of: odoo/enterprise#124502
Belgian payroll now correctly treats employees with a judicially separated marital status when calculating withholding tax and special social security contributions. This prevents affected payslips from applying zero rates or excessive reductions, improving payroll accuracy and compliance.
Original PR description
**Steps to Reproduce:** 1. Create a new employee. 2. Set their marital status to "Judicially Separated". 3. Generate a payslip. **Reason:** - The "Judicially Separated" marital status was not explicitly included in the conditions for calculating withholding taxes or special social contributions. As a result, employees with this status bypassed the calculations entirely, receiving a rate of 0 for both and a significantly larger reduction on master which also appears to be incorrect. **Solution:** - Included the 'separated' status in isolated tax and CSSS logic. Task-6321245 Forward-Port-Of: odoo/enterprise#124992 Forward-Port-Of: odoo/enterprise#121457
The barcode app now applies a default limit when loading reusable packages for transfers. This prevents very large package lists from causing long waits, improving responsiveness for warehouses with tens of thousands of packages.
Original PR description
# How to reproduce - Have a lot of reusable & locationless packages (e.g. > 10 000) - Go to any transfer via the barcode application # The issue There is a very long loading time, even in local…
# How to reproduce - Have a lot of reusable & locationless packages (e.g. > 10 000) - Go to any transfer via the barcode application # The issue There is a very long loading time, even in local testing. The client of the tickets experiences loadings up to 120 seconds with 50k packages # Cause When opening a transfer, we load barcode data by doing an API call to `_get_stock_barcode_data` : https://github.com/odoo/enterprise/blob/fe058ef501767b7ed9758fc9264f664b32c6bae8/stock_barcode/models/stock_picking.py#L85 During this we preload a lot of records, notably packages : https://github.com/odoo/enterprise/blob/fe058ef501767b7ed9758fc9264f664b32c6bae8/stock_barcode/models/stock_picking.py#L128 The issue is that in the fields we read for the packages, two of them (`location_dest_id` & `contained_quant_ids`) have a `_read_group` in their compute (or in the compute of one of the fields they depend on) : https://github.com/odoo/odoo/blob/625e6bcbd66c45ea2f699df14e2ea12e2e28a893/addons/stock/models/stock_package.py#L65 https://github.com/odoo/odoo/blob/625e6bcbd66c45ea2f699df14e2ea12e2e28a893/addons/stock/models/stock_package.py#L146 Fortunately, this does not mean that we make a query for every records. Instead, in Odoo, we fetch records in batch of 1000. So, for the case of the client, every time he loads the database, the backend does 50 000 / 1000 x 2 = 100 queries, which hinders performance a lot A [PERF] commit was done to limit the number of packages that are fetched base on a config parameter. The problem is that this parameter does not have a default value, so clients still end up with the problem. [PERF]: https://github.com/odoo/enterprise/commit/efe18bc1ea479270e42846986d7ed449b0865617 # Proposed Solution Add a default value for that config parameter. The exact value is up to discussion opw-6200730 Forward-Port-Of: odoo/enterprise#124538 Forward-Port-Of: odoo/enterprise#123696
The AI module’s automated tests were adjusted to focus only on editable email content after a related editor behavior change. This helps keep quality checks reliable without changing what end users see or do.
Original PR description
This commit updates the tests after https://github.com/odoo/odoo/pull/276332 to query only the editable content, ignoring the DOM clone created by `convert_inline`. opw-3776054 Forward-Port-Of: odoo/enterprise#124648
Envia shipping label requests now send the weight of each item when using Amazon shipping. This prevents Amazon from applying default weights that could incorrectly block shipments with larger quantities.
Original PR description
**Issue:** Envia API documentation is very bad. When trying to generate an Amazon Ground shipping with Envia, the API will sometimes reject the payload with the following error: `Total items weight…
**Issue:** Envia API documentation is very bad. When trying to generate an Amazon Ground shipping with Envia, the API will sometimes reject the payload with the following error: `Total items weight exceeds package weight. Please refer to API documentation for allowable limits. (D-703)` Even though the [Envia documentation](https://docs.envia.com/reference/create-shipping-label) doesn't include it, it seems that Amazon requires the weight for each product. If the payload doesn't include the per-item weight, Amazon will set a default weight, which will cause the error to show up if the delivery contains a high quantity. This can be a blocking issue for some customers. **Steps to reproduce on a fresh DB:** - Install Inventory, Sales, and Envia Shipping - Switch company to be based in India (need to provide an address to deliver from, I just used the Odoo India address - InfoCity Gate, Gandhinagar, Gujarat 382007) - Configure an Amazon delivery carrier with Envia (India seems to be the only country that supports Amazon with Envia) - Inventory > Configuration > Delivery Methods > Envia.com method - Must be in a Production environment (because Envia's sandbox server does not work for some reason?) - Add an Envia Production Access Token (will have to use one with some funds) - Change 'Ship From' to India - Configure the `Envia.com Service Name`, set Carrier and Service to AMAZON and AMAZON - Amazon Shipping Standard - Create a demo product, give it an arbitrary weight like 0.1 kg - Create a sales order to an Indian customer, include the demo product with a high quantity (like 20), confirm (might have to create a warehouse and configure the customer's information) - On the generated picking, set the Carrier to Envia.com on the Additional Info tab - When trying to Validate, it should throw the error **Fix:** When generating the payload in _get_shipping_lines() in envia_request, include the item weight in the dictionary. Related ticket: opw-6261682 Forward-Port-Of: odoo/enterprise#125017 Forward-Port-Of: odoo/enterprise#123935
Merging manufacturing orders now removes pending quality checks from the cancelled source orders. This prevents outdated quality tasks and buttons from remaining visible, reducing confusion for manufacturing and quality teams.
Original PR description
Version: -------- - 18.0+ Steps to reproduce: ------------------- - Install `quality_mrp` - Create a manufactured product with a BoM - Create a Quality Point for the `Manufacturing` operation of that…
Version: -------- - 18.0+ Steps to reproduce: ------------------- - Install `quality_mrp` - Create a manufactured product with a BoM - Create a Quality Point for the `Manufacturing` operation of that product - Create and confirm multiple Manufacturing Orders - Verify that each MO generates a quality check - From the MO list view, select the MOs and merge them from the gear menu(merge) Issue: ------ When Manufacturing Orders are merged, All MOs are cancelled but it keep their quality checks in the 'To Do' state. As a result: - The quality checks remain linked to cancelled MOs - The 'Quality Checks' smart button is still displayed on cancelled MOs Expected behavior: ------------------ - Pending quality checks should be deleted when the MO is cancelled - The 'Quality Checks' smart button should no longer be displayed Cause: ------ A previous [fix](https://github.com/odoo-dev/enterprise/commit/db93bd2ee313b6bb1959a41c9beb9850975b9959 ) introduced logic to remove pending quality checks when a Manufacturing Order is cancelled: This logic was implemented in `action_cancel()` by unlinking quality checks associated with the cancelled MO: https://github.com/odoo/enterprise/blob/20bc0eb5c2cec67eecd3b44450934e23370b48f2/quality_mrp/models/mrp_production.py#L94-L97 However, when MOs are merged, the merge flow does not call `action_cancel()`. Instead, it directly invokes `_action_cancel()` on the source Manufacturing Orders: https://github.com/odoo/odoo/blob/aca0b7289c68fc7a75d47ab313f5f791ebf30f7d/addons/mrp/models/mrp_production.py#L1778 Since the quality check cleanup is implemented only in `action_cancel()`, it is bypassed during the merge process. As a result, the source MOs are cancelled but their pending quality checks remain in place. --- Related community PR : https://github.com/odoo/odoo/pull/267987 --- opw-6260735
This fix ensures Starshipit delivery item details send the product barcode as the barcode and the internal reference as the SKU. This helps avoid confusion in shipping records and improves accuracy when matching delivered items.
Original PR description
Current behavior: --- Barcode is assigned to sku in the item model payload Fix: --- Assigned product barcode in barcode and internal reference in sku opw-6221412
The website AI now receives clearer guidance when creating or changing buttons, so visual edits such as text color are applied correctly and no longer get undone by page cleanup rules. Video additions are also handled more consistently by removing an unintended faded appearance.
Original PR description
Steps to see the issue: - start editing a page - ask AI to add a button - ask AI to change the text color of the dropped button => AI reports the change as applied, but the frontend rolls it back during normalization because the button keeps the `btn-primary` class, whose style takes precedence over inline color. To fix this, we add explicit instructions for button edits so AI uses `btn-custom` and defines complete button styling when changing button appearance. We also move video-related prompt into the same snippet specific instructions section for consistency and easier maintenance. task-6196298
This fixes an issue where contact details in the VoIP transfer screen would close automatically during an active call. Users can now keep a contact entry open while deciding where to transfer the call, avoiding interruption and confusion.
Original PR description
Commit [1] tried to make it so some VoIP UI state resets when it should: - Resetting the scroll to the top of search results - Closing opened tab entries This introduced this bug: - Start a call -…
Commit [1] tried to make it so some VoIP UI state resets when it should: - Resetting the scroll to the top of search results - Closing opened tab entries This introduced this bug: - Start a call - Click the transfer button - Click on a contact tab entry to open it => Bug: after max 1 second it closes. It closes in fact on any re-render... and one happens because of the in-call timer update, every second. Why does it happen on any re-render although it is implemented thanks to a `useEffect` that normally only subscribes to its inner reactive parts? Because calling `this.props.onListContextChange();` actually subscribes to `this.props.onListContextChange` changes... and it changes every re-render because it is assigned an arrow function in the component XML. This might be considered an Owl bug later... same as arrow functions are considered the same for re-renders (.alike), they could be considered as such for `useEffect` triggers? This commit meanwhile fixes the bug by removing that `onListContextChange` props: it was given the same value everywhere, let's just inline that for now. [1]: https://github.com/odoo/enterprise/commit/690be9aefc8e60f43a26cf5cadede842baed7fd6
This fix aligns manufacturing work order timelines with updated planning behavior. It also adjusts duration calculations in grouped Gantt views so users see more accurate scheduling information.
Original PR description
[This PR](https://github.com/odoo/odoo/pull/106990) modifies the behavior of the planned dates of workorder so some tests must be adapted as well as the values used to compute the duration of the aggregated grouped pills of `MRPWorkorderGanttRow` opw-3008089
This fix prevents database upgrades from failing when an HR document folder was previously deleted or disabled. The system now skips unavailable employee folders when adding the HR signing shortcut, keeping upgrades running smoothly without restoring unwanted folders.
Original PR description
Steps to reproduce: 1 Install documents_hr and hr_sign on saas-19.1. 2 Go to Settings → Documents → disable Human Resources. 3 Open the Documents app and delete the Employees - My Company folder. 4…
Steps to reproduce:
1 Install documents_hr and hr_sign on saas-19.1.
2 Go to Settings → Documents → disable Human Resources.
3 Open the Documents app and delete the Employees - My Company folder.
4 Upgrade the database to saas-19.2.
Issue:
- During the upgrade, the post-init hook attempts to embed the HR Sign action into predefined document folders. Since the Employees - My Company folder has been deleted (or is inactive), the folder lookup returns no record, leading to the following error:
```python3
Traceback (most recent call last):
File "/home/odoo/src/odoo/saas-19.2/odoo/service/server.py", line 1664, in preload_registries
registry = Registry.new(dbname, update_module=update_module, install_modules=config['init'], upgrade_modules=config['update'], reinit_modules=config['reinit'])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.2/odoo/tools/func.py", line 65, in locked
return func(inst, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.2/odoo/orm/registry.py", line 186, in new
load_modules(
File "/home/odoo/src/odoo/saas-19.2/odoo/modules/loading.py", line 465, in load_modules
load_module_graph(
File "/home/odoo/src/odoo/saas-19.2/odoo/modules/loading.py", line 244, in load_module_graph
getattr(py_module, post_init)(env)
File "/home/odoo/src/enterprise/saas-19.2/documents_hr_sign/__init__.py", line 12, in _embed_sign_post_init
folders.with_user(SUPERUSER_ID)._embed_action(sign_action.id)
File "/home/odoo/src/enterprise/saas-19.2/documents/models/documents_document.py", line 1643, in _embed_action
folder.action_folder_embed_action(folder.id, action_id)
File "/home/odoo/src/enterprise/saas-19.2/documents/models/documents_document.py", line 1614, in action_folder_embed_action
return self.get_documents_actions(folder_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/enterprise/saas-19.2/documents/models/documents_document.py", line 1522, in get_documents_actions
raise UserError(_('This folder does not exist or is not accessible.'))
odoo.exceptions.UserError: Esta carpeta no existe o no es accesible.
```
Root cause:
- As part of documents_sign, the documents_hr_sign action is embedded into predefined document folders (introduced in https://github.com/odoo/enterprise/pull/101890).
- The folder lookup relies on [_search()](https://github.com/odoo/odoo/blob/85992d5f5f8caeacdcc570fb9fefb4cfcec6460c/odoo/orm/models.py#L4681-L4691), which filters out inactive records
through the active test. Consequently, [search_fetch()](https://github.com/odoo/odoo/blob/85992d5f5f8caeacdcc570fb9fefb4cfcec6460c/odoo/orm/models.py#L1441-L1451) returns no matching
folder when the predefined folder has been deleted or deactivated. It will
try to get document actions of predefined folder here, so if the folder is
https://github.com/odoo/enterprise/blob/6d334a17d10faec33d60f4a8d7d263c091bb456e/documents/models/documents_document.py#L1592
inactive it will not be able to read the folder here.
https://github.com/odoo/enterprise/blob/6d334a17d10faec33d60f4a8d7d263c091bb456e/documents/models/documents_document.py#L1494
Fix:
- Instead of attempting to embed the Sign action into all company employee folders, filter out inactive folders before calling _embed_action().
- This ensures the post-init hook only processes active employee document folders. If a predefined folder has been deleted or deactivated, it is skipped preventing the upgrade from attempting to embed an action into an inaccessible folder and avoiding the resulting UserError.
opw-6358063
upg-4449902
Forward-Port-Of: odoo/enterprise#123846Code cleanup and technical improvements
This update keeps Odoo Studio's form editor aligned with recent interface changes in the underlying Odoo platform. It helps ensure Studio continues to target the correct form sections when users customize screens, with no expected visible change for everyday users.
Original PR description
With OWL3 refactoring of notebook component in odoo/odoo#269101 we adapt the xpaths Community PR: https://github.com/odoo/odoo/pull/269101
The Knowledge app now passes comment thread sizing information more directly between components. This is an internal cleanup that helps keep the comments feature easier to maintain without changing how users interact with it.
Original PR description
This commit removes a `useSubEnv` in comments handler that provided thread heights. The child component still needs these heights. They are given in props instead.
Several Odoo Enterprise apps now use a newer internal method for handling user interface events. This keeps the affected areas aligned with current platform practices and helps maintain reliability without changing visible functionality.
Original PR description
\* iap_extract,knowledge,spreadsheet_edition,voip This commit replaces all occurence of `useExternalListener` by `useListener`.