Daily updates from Odoo
Wednesday, November 19, 2025
73 changes · 19.0
Enhancements to existing features
Quality checks for repair orders are now created only after a repair is confirmed, instead of as soon as it is opened. This avoids generating checks for repairs that are never actually processed and keeps quality follow-up focused on active work.
Original PR description
- Generate quality checks when a repair order is confirmed rather than when it is created. This ensures that quality checks are only created for repair orders that are actually being processed. - Product and lot updates quality checks only after confirmation. Task [5227065](https://www.odoo.com/odoo/project/966/tasks/5227065)
The mail plugin can now detect which Odoo version is in use. This lets it display a clear message when the version is not supported, helping users understand why the add-in may not work.
Original PR description
Purpose ======= The new addin has been refactored and doesn't work with older Odoo version, and so we add an endpoint to be able to show a message if we don't support that Odoo version. Task-4727609 Forward-Port-Of: odoo/odoo#236286 Forward-Port-Of: odoo/odoo#236047
The Point of Sale sales report now includes a clearer breakdown of payments by method, making it easier to see how customers paid. This helps businesses review sales patterns and reconcile reports more quickly.
Original PR description
In this commit: ----------- - Enhances the PoS sales report by adding detailed breakdowns of payments grouped by payment method. task-5184319 Forward-Port-Of: odoo/odoo#234486
The IoT Box technical information now includes a clickable link from the image version hash to the exact GitHub commit. This makes it easier and faster to verify which software version is running on the device when troubleshooting or checking updates.
Original PR description
To ease checking the HEAD commit on the IoT Box, we now compute the github url to the commit, and redirect to it clicking on the hash in the technical information tab. Forward-Port-Of: odoo/enterprise#99673 Forward-Port-Of: odoo/enterprise#99422
The self-order attribute selection page now shows a clear “Required” badge next to mandatory attributes. This makes it easier for customers to spot what must be selected and reduces the chance of missing required options.
Original PR description
PURPOSE: --------- - Help users to easily identify which attributes are required in the POS self-order attribute selection page. Before this commit: ------ - Required attributes had no badge or clear visual indication. After this commit: ---------- - Added a Required badge next to attribute names so users can quickly identify and select them. Task-5079571
When a company installs a chart template from the SEPA region, the related ISO 20022 payment support is now installed automatically. This makes setup smoother and helps ensure the right payment features are available from the start.
Original PR description
This commit will allow to install account_iso20022 when installing a chart template from the SEPA zone. task-5163045
Resolved issues and error corrections
The message action menu now reliably shows “Copy to Clipboard” for regular conversations, even when the AI module is installed. This fixes a missing option that could prevent users from copying message text in chat and discuss views.
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/enterprise/pull/99794
This update changes how Odoo finds Peppol service providers so it stays compatible with upcoming DNS changes. It helps avoid failed lookups and keeps electronic document exchange working reliably as the old method is phased out.
Original PR description
From November 1st, CNAME DNS will be deprecated for Peppol lookups. From February 1st CNAME lookups will no longer be supported. The replacement are NAPTR DNS records. Multiple solutions were available, such as using DoH (e.g. with cloudflare DNS), but we ended up choosing to proxy DNS requests through IAP to centralize the lookups and make such specs upgrades easier to handle in the future. IAP is now responsible of doing the DNS lookup and fetching the service groups of the found SMP. IAP-side: https://github.com/odoo/iap-apps/pull/1227 task-5179969 Forward-Port-Of: odoo/odoo#233766 Forward-Port-Of: odoo/odoo#232483
The Job Page button on job listings now appears only when Online Posting is enabled, and stays hidden when it is disabled. This avoids confusion and makes the button match the job’s publishing status, while still linking directly to the job page when available.
Original PR description
This commit fixes the visibility of the "Job Page" button on the job kanban view. The job page button is now invisible when the `Online Posting` setting is disabled and visible when it is enabled, and directs to the job link. task-5153230 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233421
The Copy to Clipboard action now appears correctly again for regular conversations, even when the AI module is installed. This fixes a missing option in the message menu and improves consistency for users and support teams.
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
Odoo now adds a timestamp suffix to Flutterwave payment references so each transaction sent to the provider stays unique. This prevents duplicate reference issues when databases are reset during testing or in similar edge cases, improving payment reliability.
Original PR description
The `/payments` endpoint of the Flutterwave v3.0.0 API expects unique `tx_ref` parameters (matching Odoo's payment transaction `reference` field) to be passed. This is guaranteed by a UNIQUE() SQL constraint in Odoo, but testing sometimes involves dropping the database, leading to transaction references being repeated at the provider level for a given merchant account. This commit singularizes all transaction references by suffixing them with the current timestamp, ensuring that the `tx_ref` API parameter remains unique across transaction reference sequences. Forward-Port-Of: odoo/odoo#235799
Users can now export records even when the list is grouped by a property field. This fixes a crash that happened during export, improving reliability for grouped views and avoiding interruption of normal work.
Original PR description
Step to reproduce
- open a task
- add a property field , say test
- add values for this field in few records
- go to list view and group by test
- select a record from result and export it (from Action btn)
Observation:
- traceback
```
File "/home/odoo/17.0/addons/web/controllers/export.py", line 486, in base
groupby_type = [Model._fields[x.split(':')[0]].type for x in groupby]
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
KeyError: 'task_properties.b60ee9baefee14a8'
```
Cause:
- The issue is caused by splitting, which didn't considered property field
- it tried to look for `task_properties.b60ee9baefee14a8` in _fields which causes KeyError
FIx:
- split the field name properly to bring out actual field name while considering granularity as well as the property fields
opw-5159155
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#235979
Forward-Port-Of: odoo/odoo#235209Vendor batch payments now use the correct numbering sequence when they are created and validated. This prevents vendor batches from being labeled with the wrong type of sequence, which could cause confusion in accounting records.
Original PR description
Currently when creating a vendor batch payment, the system may incorrectly use the inbound batch payment sequence to generate the batch name Steps to reproduce: - Create a Vendor payment. - Create a Vendor batch payment, add the payment, validate it. Issue: Name has been set using the incoming batch payment sequence This occurs because `batch_type` is set to readonly when a payment is added to the list. As result, the current batch type is never sent to the backend that will use the default 'inbound'. opw-5128426 Forward-Port-Of: odoo/enterprise#99570
This update corrects how returned subcontracted products are routed so they go back to the appropriate location instead of all being sent to the subcontracting area. It prevents the system from accidentally changing delivery locations during the return process, which helps avoid stock errors and makes returns more reliable.
Original PR description
Steps to reproduce the bug: - Create a storable product "P1" and "P2" with vendor "azure interior" - for P2 subcontracting BoM referencing "azure interior" as subcontractor and component "C1" -…
Steps to reproduce the bug: - Create a storable product "P1" and "P2" with vendor "azure interior" - for P2 subcontracting BoM referencing "azure interior" as subcontractor and component "C1" - Create a receipt for partner "azure interior" including 1 unit of P1 and 1 unit of P2 - Validate the receipt - Create a return for both P1 and P2 Problem: A picking is created with destination location set to the subcontracting location for both products, instead of setting the partner location only for subcontracted products. Solution: Ensure only the move line for subcontracted products uses the subcontracting destination location, while other returned products go back to the supplier location. When the `picking_id.partner_id`` is changed, it triggers a write on the picking, which in turn triggers a write on its moves, but only on the ones that are not scrapped. However, since the `scrapped`` field is a stored computed field, and as it hasn't been accessed before, it needs to be computed. And because its computation depends on `location_dest_id`, that field also needs to be recomputed. as a result, the `location_dest_id`` of the moves that we manually set may be changed unexpectedly. Therefore, in the `_create_return`` function, we check that the picking’s `partner_id` is different from the moves’ partner_id before updating it, to avoid unnecessary writes and the chain of recomputations that could alter our values. Resetting the picking’s partner_id based on the move’s partner_id could actually be removed in master, as it serves no real purpose, the move.partner_id itself is already derived from the picking’s partner_id. We just keep it in stable versions to avoid any unexpected behavior changes. opw-5208289 Forward-Port-Of: odoo/odoo#234850 Forward-Port-Of: odoo/odoo#234521
Fixed an issue where the “Update extra prices” action could disappear too early after a form save, even when not all variant prices had been synchronized. This helps ensure all affected product variants can be updated consistently before being used in sales orders.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have a product with multiple variants; 2. go to one of its attributes; 3. in the form, change the default extra price on multiple lines; 4. click on "Update…
Versions -------- - 18.0+ Steps ----- 1. Have a product with multiple variants; 2. go to one of its attributes; 3. in the form, change the default extra price on multiple lines; 4. click on "Update extra prices"; 5. add the updated variants to a sale order. Issue ----- Only the line on which "Update extra prices" was clicked has been updated, even though the button disappeared on all lines after clicking it. Cause ----- The `_compute_default_extra_price_changed` method only compares the `default_extra_price` of the current record to its `_origin` value. Consequently, after saving the form, it will return `False`, even though only one attribute has been updated. Solution -------- Aside from checking whether the value changed on the form, also check whether any product template attribute value has a `price_extra` that's different from the product attribute value's `default_extra_price`. This way, clicking on "Update extra prices" once won't make the other update buttons disappear. opw-5240236 Forward-Port-Of: odoo/odoo#235088
This update ensures payment references keep the intended prefix when generating a unique reference. It helps avoid confusion and reduces the risk of duplicate-looking transaction names for payments processed through Paymob.
Original PR description
Forward-Port-Of: odoo/odoo#236015
The Activities menu now keeps pagination working even when some activities are filtered out by access rules. This prevents users from getting stuck on the first page and makes it possible to browse all activities they are allowed to see.
Original PR description
**Steps to reproduce:** - Create some activities which should not be accessible to a specific user (according to the `_search` filtering of `mail.activity`) - Go to Activity Menu > View all…
**Steps to reproduce:** - Create some activities which should not be accessible to a specific user (according to the `_search` filtering of `mail.activity`) - Go to Activity Menu > View all activities as the given user - Ensure that the limit (default: 80) is lower than the total number of activities which should be returned and that the new activities are in the returned elements - On `web_search_read` some records are removed by the `_search` override - The pagination navigation buttons are disabled as the returned number of records is lower than the limit - This means that some activities are not accessible to the user (everything above the given limit) **Issue:** The issue comes from the `_search` override which checks the records available to the user. As it's done after fetching with the limit, the resulting number of records can be lower than expected and this breaks the `_format_web_search_read_results` which considers that we have all the possible records and doesn't try to fetch the total count of records. **Fix:** The main issue can't be directly fixed without modifying the way the access are checked in the `_search` override. This could be mitigated by changing the search limit, making the search as superuser, or adding specific filtering but each has its own limitations. Adding `force_search_count` should allow the user to navigate between pages anyway and see all the available activities. But the number displayed in the pagination will often be incorrect for the current and total count. (e.g. we can have 75 records but 1-80/150 is displayed out of 140 actually readable records) opw-5046389 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233585
This update adds a database index to a field used to link invoice symbols with invoice templates in the Vietnam e-invoicing module. It helps the system retrieve related records more efficiently and keeps the module aligned with Odoo’s performance rules.
Original PR description
TestIndex.test_enforce_index_on_one2many_inverse Traceback (most recent call last): AssertionError: The following fields should be indexed with a btree index, as they are inverse of an One2many field: - if the field is sparse -> 'btree_not_null' - if the field is Required or low fraction of False/NULL values -> True or 'btree' - if not sure -> 'btree_not_null': l10n_vn_edi_viettel.sinvoice.symbol.invoice_template_id (inverse of l10n_vn_edi_viettel.sinvoice.template.invoice_symbols_ids) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update prevents an error that could happen when a user adds a product from the sales catalog and immediately removes it. Instead of failing, the system now correctly uses the product’s sale price, so the sales order remains usable and the user can continue working smoothly.
Original PR description
Currently, an error occurs when the user immediately removes a catalog product after adding it. Steps to Reproduce ([Video](https://drive.google.com/file/d/12hOavt1zCa6hbG0EWHsIDGxfgVkxJmLW/view)): -…
Currently, an error occurs when the user immediately removes a catalog product after adding it. Steps to Reproduce ([Video](https://drive.google.com/file/d/12hOavt1zCa6hbG0EWHsIDGxfgVkxJmLW/view)): - Install the `sale_management` module. - Go to `Sales Orders` and create a new `sale order`. - In the order line, click on the `Catalog` button. - `Add` a product and then immediately `remove` it. `ValueError: Expected singleton: sale.order.line()` After [this commit], when the user clicks the Remove button immediately after clicking the Add button (within 500 ms). In this case, the system proceeds with the last request due to the useDebounced delay [1], which removes the product. However, since there is no order line yet for that product [2] and the quantity is 0, the order line [3] is not created. When it attempts to retrieve the discounted price, it raises the error [4]. This commit ensures that if no order line exists, the product's price is returned according to the sale order's pricelist. [this commit]: https://github.com/odoo/odoo/pull/233098/commits/697c559791fdf00b5602b9459bbdf21f392757d8 [1]- https://github.com/odoo/odoo/blob/ec212f38e50520edf612522717952855c8c09a80/addons/product/static/src/product_catalog/kanban_record.js#L17-L19 [2]- https://github.com/odoo/odoo/blob/ec212f38e50520edf612522717952855c8c09a80/addons/sale/models/sale_order.py#L2202 [3]- https://github.com/odoo/odoo/blob/ec212f38e50520edf612522717952855c8c09a80/addons/sale/models/sale_order.py#L2218-L2219 [4]- https://github.com/odoo/odoo/blob/ec212f38e50520edf612522717952855c8c09a80/addons/sale/models/sale_order_line.py#L1602-L1603 sentry-7019831319 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235470
We fixed an issue that could cause the QAP & SAWT report to crash when users switched to it from another report. The report now waits for its related filter information to be ready before showing the page, so it opens reliably and smoothly.
Original PR description
Before: - When switching from another report to the SAWT & QAP report, it gave traceback. - The traceback happened because the system tried to read missing data in the comparison filter. After: - Added a proper check so the report only loads the comparison filter when it exists. - Switching between reports now works smoothly without errors. Impact: - QAP & SAWT report opens reliably without unexpected crashes. Task: 5085985
The appointment page in the website editor could crash when users clicked Edit, preventing them from making changes. The template was adjusted so the page keeps the same look while avoiding a layout structure that confused the editor, restoring normal editing.
Original PR description
#### Steps to Reproduce 1- Create a fresh database on Odoo 19.0. 2 - Install both the Appointments and Website modules. 3 - Go to the website appointment page generated by the module. 4 - Click Edit…
#### Steps to Reproduce
1- Create a fresh database on Odoo 19.0.
2 - Install both the Appointments and Website modules.
3 - Go to the website appointment page generated by the module.
4 - Click Edit in the website builder.
5 - The website editor crashes with the SelectionPlaceholderPlugin error.
#### Issue
After Odoo 19 introduced the new [SelectionPlaceholderPlugin](https://github.com/odoo/odoo/blob/19.0/addons/html_editor/static/src/main/selection_placeholder_plugin.js) in the HTML editor, the appointment progress bar view began to crash, specifically when clicking the “Edit” button of the website editor on the appointment page.
This issue did not occur in earlier versions because the plugin did not exist. And the old editor never scanned or validated raw text nodes.
The appointment progress bar template contained a `li` node using d-flex directly on the `li` element.
In Odoo 19, the HTML Editor’s selectionPlaceholder plugin inspects the DOM after every render to determine where the selection placeholder blocks must be inserted.
Because d-flex changes the internal layout of the `li`, Owl and the HTML editor produces intermediate text nodes / inline nodes inside the flex container. During placeholder evaluation, the editor scans siblings before/after each block using:
```python
selection_blocker_predicates(blocker)
```
This logic expects HTML elements, as it calls:
```python
blocker.hasAttribute(...)
```
However, the flex layout caused the plugin to receive a non-element node (e.g. a TextNode) as blocker.
Since TextNodes do not implement .hasAttribute(), the editor raised:
```python
TypeError: blocker.hasAttribute is not a function
```
This error propagated into:
```python
OwlError: An error occurred in the Owl lifecycle
```
which broke the entire website editor.
#### Traceback
```python
UncaughtPromiseError > OwlError
Uncaught Promise > An error occurred in the Owl lifecycle (see this Error's "cause" property)
Occurred on localhost:8069 on 2025-11-11 13:57:55 GMT
OwlError: An error occurred in the Owl lifecycle (see this Error's "cause" property)
Error: An error occurred in the Owl lifecycle (see this Error's "cause" property)
at handleError (http://localhost:8069/web/assets/1/d4f733d/web.assets_web.min.js:762:101)
at App.handleError (http://localhost:8069/web/assets/1/d4f733d/web.assets_web.min.js:1420:29)
at ComponentNode.initiateRender (http://localhost:8069/web/assets/1/d4f733d/web.assets_web.min.js:854:19)
Caused by: TypeError: blocker.hasAttribute is not a function
at selection_blocker_predicates (http://localhost:8069/web/assets/1/d4f733d/web.assets_web.min.js:14305:1708)
at http://localhost:8069/web/assets/1/d4f733d/web.assets_web.min.js:14306:115
at Array.map (<anonymous>)
at checkPredicate (http://localhost:8069/web/assets/1/d4f733d/web.assets_web.min.js:14306:106)
at isSelectionBlocker (http://localhost:8069/web/assets/1/d4f733d/web.assets_web.min.js:14306:243)
at SelectionPlaceholderPlugin.updatePlaceholders (http://localhost:8069/web/assets/1/d4f733d/web.assets_web.min.js:14307:272)
at http://localhost:8069/web/assets/1/d4f733d/web.assets_web.min.js:12434:52
at Array.forEach (<anonymous>)
at Editor.startPlugins (http://localhost:8069/web/assets/1/d4f733d/web.assets_web.min.js:12434:38)
at Editor.attachTo (http://localhost:8069/web/assets/1/d4f733d/web.assets_web.min.js:12425:6)
```
#### Fix
To avoid creating confusing DOM structures for the editor, the template was updated to:
- Wrap the inner content to keep the same UI layout without affecting the parent `li` block semantics.
##### This insure
- The items stay a clean block-level element.
- The HTML editor correctly identifies block boundaries.
- The selection placeholder plugin no longer receives invalid nodes.
OPW - [5226904](https://www.odoo.com/odoo/project/70/tasks/5226904)This fix prevents an error that could occur when a purchased product receipt is edited and its quantity is changed to zero. Instead of crashing, the product’s value remains unchanged, allowing the user to save the receipt normally.
Original PR description
Currently an error occurs when user change the move line quantity. Steps to Reproduce [video](https://drive.google.com/file/d/12r0DxsKZkvuVjoCsRgXlHJ23NpaqciV7/view?usp=drive_link): - Install the…
Currently an error occurs when user change the move line quantity. Steps to Reproduce [video](https://drive.google.com/file/d/12r0DxsKZkvuVjoCsRgXlHJ23NpaqciV7/view?usp=drive_link): - Install the `purchase_stock` module. - Create a `product` with category: `Costing Method: FIFO`. - Create a `purchase order` and add the newly created product to it. - Click `Confirm Order`, then click on `Receipt` and `validate` it. - Click on `Moves`, open the record, set the `Quantity to zero`, and `save`. `ZeroDivisionError: float division by zero` This error occurs when a user confirms a purchase order, validates its picking, and changes the move line quantity to zero. It then tries to update the move line value and the product's standard price due to the FIFO costing method, but the valued quantity becomes zero from [1], which raises an error at [2]. This commit ensures that if the move line has a zero quantity, the product's standard price remains unchanged. [1]- https://github.com/odoo/odoo/blob/f8f72b15598576f5870e49879e96fc5c127a6100/addons/stock_account/models/stock_move.py#L333-L343 [2]- https://github.com/odoo/odoo/blob/f8f72b15598576f5870e49879e96fc5c127a6100/addons/stock_account/models/product.py#L218 sentry-6993648057 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents a server error when using the “eCommerce Categories” option in the website mega menu. The menu now correctly detects the relevant mega menu element even when the first item inside it is not the expected one, making the website editor more reliable.
Original PR description
A server traceback would occur when clicking the "eCommerce Categories" toggle in the mega menu's style options. Steps to reproduce: 1. Go to the Website editor. 2. Add a mega menu to the page header. 3. Edit and Click on the mega menu's 4. In the sidebar, click the "eCommerce Categories" toggle. -> Traceback. Cause: When loading it was trying to find a specific class name (starting with `s_mega_menu_`) to identify the snippet. It was hardcoded to only look at the `firstElementChild` of the snippet's container. This assumption was too rigid. If the first element was a `<p>` tag or another element without the required class, the code would fail to find it. This resulted in an `undefined` value being sent to the server, causing the traceback. Solution: Use `querySelector` to search for any element with a class name containing `s_mega_menu_`. opw-5245777 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
We fixed an issue where offers created from the offer list could generate an invalid link. Now every offer gets a proper access token, so the link works reliably, including when opened outside the logged-in session. This prevents broken offer pages for candidates and employees.
Original PR description
- Go to Recruitment > Applications > All Applications. - Open an applicant form and click "Generate Offer". - Repeat a few times so that the "Offers" smart button shows a list view. - From the list…
- Go to Recruitment > Applications > All Applications. - Open an applicant form and click "Generate Offer". - Repeat a few times so that the "Offers" smart button shows a list view. - From the list view, click "New" to create an offer. - Compare both flows: * With "Generate Offer" button: the generated offer link has a valid token and works even in an incognito window. * With "New" button: the generated offer link has `token=False`, which leads to an invalid link. #### Issue In the first scenario, `action_generate_offer()` generates an `access_token` for the offer's link in `hr.applicant`. In the second scenario, no token was generated in `hr.contract.salary.offer`, so offers created via the "New" button end up with `access_token=False` in their links. #### Fix Add a compute to `access_token` in `hr.contract.salary.offer` to generate a token if there is no employee or if the employee on the offer has no linked user. #### Additional - Mark the field `access_token` as readonly. task-5051394 Forward-Port-Of: odoo/enterprise#93561
This fix improves the message shown when an accounting entry is not balanced. If several entries are affected, users will now see the full list instead of only the first one, making it easier to identify and resolve the issue.
Original PR description
The commit 3467b5971423f70581c6be2caf7f8a8d86ee70f1 intended to improve the error message in `_check_balanced()` by tailoring it based on the number of affected entries. However, in the case of multiple affected entries, the error was raised after the first iteration, preventing the full list of unbalanced entries from being collected and displayed to the user. no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236212
This fix ensures landed costs are only applied to the quantity that is still in stock, instead of increasing the value of goods that have already been delivered. It keeps inventory valuation accurate and prevents reports from showing inflated values for products no longer on hand.
Original PR description
## Issue: When adding landed costs to stock moves, the resulting move value was increased regardless of the quantity remaining in stock As a result, moves with no remaining quantity could still…
## Issue: When adding landed costs to stock moves, the resulting move value was increased regardless of the quantity remaining in stock As a result, moves with no remaining quantity could still receive additional value, incorrectly affecting products that are no longer in stock ## Cause: The valuation is determine using the `move._get_value()` function, which uses the standard price when there is no linked PO, Bill, or Credit Note However, it distributed the landed cost share based on the move itself, without considering whether the move’s quantity was still available in stock ## Steps to reproduce: - Create a product (Tracking: Quantity, category: AVCO) - Receive 2 units of the product. - Deliver 1 unit - Create a Landed Cost for the receipt with an additional cost of 100 $ - Open Inventory > Reporting > Move Analysis - Add Value in Measures - Look for the current month (add a product filter if needed) - You should have Quantity: 2 and Value: 50$ after the fix opw-5128570 Forward-Port-Of: odoo/odoo#232857 Forward-Port-Of: odoo/odoo#231936
This update stops the system from recording unnecessary field changes when using the salary configurator. It helps keep employee change history accurate and avoids confusing log entries during payroll setup.
Original PR description
We use a hack to force the tracking of some fields on the employee. It causes some problem when you work with the salary configurator as we don't want the changes logged in this case. The solution is to not track prepare the fields if there is a tracking disable in the context, like mail does.
This fix lets managers refuse a validated time-off allocation even if leave records already exist in that period. Previously, the system could wrongly block the refusal by linking those existing leaves to the newer allocation, making it harder to correct the record.
Original PR description
## Issue: When you have an allocation and set a leave for that period, if you add a new allocation for that period and you validate it, it will be impossible to Refuse this allocation later A…
## Issue: When you have an allocation and set a leave for that period, if you add a new allocation for that period and you validate it, it will be impossible to Refuse this allocation later A UserError was raised asking to remove the leave even if it should be linked to the first allocation created ## Cause: The `action_refuse()` method for `hr.leave.allocation` uses the `virtual_leaves_taken` value inside the `_get_consumed_leaves()` function's result That parameter is calculated for the allocation as far as it state is `validate`, for all the leaves in that time interval, including previously created leaves The leaves will be allocated to the last allocation created, so the last one can't be removed later As a result, the allocation is considered as already used by these pre-existing leaves, even if the leave can still be modified to return to the state prior to the allocation's validation ## Steps to reproduce: - Create an initial Allocation (that should end after the next created Allocation) - Create a Leave from 22/12/2025 to 31/12/2025 - Create an Allocation including the leave period (01/12/2025 to 31/12/2025) - Validate, then Refuse opw-4900686 Forward-Port-Of: odoo/odoo#235711 Forward-Port-Of: odoo/odoo#222171
This update fixes the Philippine Summary Lists of Sales and Purchases report so company customers now appear with their registered name again. It also ensures exported files show the correct name format for both companies and individuals, improving report accuracy and compliance.
Original PR description
**Steps to reproduce:** 1. Install the `Accounting` and `l10n_ph_reports` modules. 2. Create a contact with the company flag enabled. 3. Create an invoice using that contact. 4. Go to `Reporting →…
**Steps to reproduce:**
1. Install the `Accounting` and `l10n_ph_reports` modules.
2. Create a contact with the company flag enabled.
3. Create an invoice using that contact.
4. Go to `Reporting → Summary Lists of Sales and Purchases → Sales`.
**Observed behavior:**
* The `Registered Name` column in the report is blank for companies.
**Cause:**
* The query logic was incorrectly showing the registered name only when a last name was present. This issue arose due to the change in how company/individual differentiation is handled.
**Fix:**
* Update the query logic for the Odoo report:
- **Always display the registered name in the Odoo report**:
- If individual: show `First Name`, `Middle Name`, `Last Name`.
- If company: show `commercial_partner_id.name`.
- **For the export file**:
- If company: only show the registered name.
- If individual: show `First Name`, `Middle Name`, `Last Name`.
The fix ensures that **Registered Name** is always displayed in the report, and the export behaves as expected for both individuals and companies.
Note: spec provided by po ->
<img width="1662" height="431" alt="image" src="https://github.com/user-attachments/assets/a7a58a9e-b769-4815-ad0a-cef9c8e2eff7" />
opw-5143677This update fixes an issue where some Sendcloud delivery services could not show drop-off point selection during checkout. Customers can now choose a locker or service point on the map when the delivery method supports it, improving the delivery experience and preventing missing options at checkout.
Original PR description
Steps to reproduce ----- - Create a Sendcloud delivery method - Select a delivery service with "Locker or service point" as "Last mile" (eg "bpost @ bpack") > "Use Sendcloud locations" is set to…
Steps to reproduce ----- - Create a Sendcloud delivery method - Select a delivery service with "Locker or service point" as "Last mile" (eg "bpost @ bpack") > "Use Sendcloud locations" is set to false Cause ----- There is a problem with the values retrieved from the Sendcloud API call, more specifically the `available_functionalities` > `last_mile` value. The Sendcloud API (of both previous and current beta version) specifies the possible values to only be the following - `home_delivery` - `mailbox` - `pobox` - `service_point` - null https://api.sendcloud.dev/docs/sendcloud-public-api/shipping-options/operations/create-a-shipping-option https://api.sendcloud.dev/docs/sendcloud-public-api/branches/v2/shipping-products/operations/list-shipping-products However, it seems like they have added some new undocumented values `locker` and `locker_or_service_point`. To detect whether to use drop-off locations, we do https://github.com/odoo/enterprise/blob/5b64c63301bc814c7c9d99146af6a86d37563762/website_delivery_sendcloud/models/delivery_sendcloud.py#L51-L53 Where we compare the retrieved value with the string 'Service point' https://github.com/odoo/enterprise/blob/5b64c63301bc814c7c9d99146af6a86d37563762/website_delivery_sendcloud/models/delivery_sendcloud.py#L13 In our "Locker or service point" case, this does not work because the `in` operator makes a case sensitive comparison. Solution ----- Functionally, both lockers and service points work the same. The user should be prompted a map on which they choose where the delivery should be dropped off. So we can add `Locker` and `Locker or service point` as accepted values and enable the use of sendcloud locations for both. ----- Ticket: opw-5217796 Forward-Port-Of: odoo/enterprise#98875
This update corrects a missing reference in the Point of Sale cash move popup so new orders include the right configuration information. It helps avoid receipt printing problems when handling cash moves.
Original PR description
Before this commit, the cash move popup created an order that missing the config_id field, leading to potential issues in receipt printing. opw-5251257 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236203
This change fixes WebSocket timeout handling so stalled connections are detected and closed correctly. It improves reliability by making sure the system does not leave connections hanging when the other side stops responding.
Original PR description
This PR fixes several issues with WebSocket timeouts: - Waiting for more than one response was not handled properly, resulting in missed timeouts. - The closing handshake did not strictly follow the RFC when initiated on the server side (it closed without waiting for the other peer). - Close timeouts were not enforced (the connection was not terminated when the other peer did not respond to the close frame). Forward-Port-Of: odoo/odoo#236016 Forward-Port-Of: odoo/odoo#234881
This update prevents the website editor from crashing when a saved AI live chat snippet is added again from the custom blocks list. It improves the editing experience by making saved snippets reusable without error.
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-5227072This fix corrects how point of sale order line amounts are sent to the backend. When a product quantity is greater than 1, the tax-excluded line total now reflects the full line amount instead of just the unit price, which also ensures sales reports show the right totals.
Original PR description
Steps to reproduce ------------------ 1. Create a product with price 1, no need to add taxes, and add it to PoS 2. In PoS, select this product, and set the quantity to 2, the price is 2 as expected 3. Finalize the order 4. In the backend, open this order and observe that the "Tax Excl." for that line shows $1 instead of $2. While "Tax Incl." shows $2 as expected. The client has reproduced this issue in a different way, by printing the sales report for that order, he found out that the total is 1 instead of 2. Why it's happening ------------------ This issue was introduced in 9538698f13d5763b49b00f4c06a1a2afc0d6b39e. We are setting the field `price_subtotal` to the unit price of the product, and not to the actual price per line, i.e. we're ignoring the quantity!! The Fix ------- We now set the `price_subtotal` to `priceExcl` which takes into account the quantity on that line. opw-5242022
This update corrects several problems with totals shown in list views, especially for monetary and mixed-currency records. It also fixes a display alignment issue so summary values appear in the right place in lists.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change adds a database index to a key link used by the Vietnam Viettel e-invoicing feature. It helps Odoo find related records faster, improving performance and reducing delays in processes that rely on these invoice templates.
Original PR description
`TestIndex.test_enforce_index_on_one2many_inverse Traceback (most recent call last): AssertionError: The following fields should be indexed with a btree index, as they are inverse of an One2many field: - if the field is sparse -> 'btree_not_null' - if the field is Required or low fraction of False/NULL values -> True or 'btree' - if not sure -> 'btree_not_null': l10n_vn_edi_viettel.sinvoice.symbol.invoice_template_id (inverse of l10n_vn_edi_viettel.sinvoice.template.invoice_symbols_ids)` Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects how the point of sale control pad styles and layout are applied, so the buttons and payment options display consistently. It also removes an unnecessary empty section that could interfere with the layout, improving the reliability of the checkout screen.
Original PR description
In this commit: ------------------- - Removed conditional CSS logic, as the styles are required in all cases. - Updated the condition to display the third row with fast payment methods, preventing issues caused by unnecessary blank div. task: 5246635
This change corrects how currency rates are calculated in the Uruguay electronic invoicing process. Rates are now always converted relative to the Uruguayan Peso, ensuring consistent results regardless of the company’s own currency.
Original PR description
This PR fixes the currency rate calculation in the Uruguay EDI module to always compute the rate relative to UYU (Uruguayan Peso) regardless of the company's base currency. * Replaces the previous logic that calculated rates based on company currency with a direct UYU conversioni * Simplifies the rate calculation by removing the amount-based fallback logic * Ensures consistent UYU rate computation for all non-UYU currencies LATAM Task 1358 / Adhoc task 51716 Forward-Port-Of: odoo/enterprise#99587 Forward-Port-Of: odoo/enterprise#93144
This update adjusts the website builder test setup so it works reliably in Firefox. It prevents a test-only browser behavior from blocking the builder tests, helping ensure the website editing experience can be validated consistently across browsers.
Original PR description
In the website builder test suite, Chrome doesn't load the initial iframe (we load a dummy iframe instead) and never goes through `preparePublicRootReady` from the `WebsiteBuilderClientAction`. On the contrary, Firefox does load the initial iframe. We already have a partial fix for it in the html_builder test helpers (see `originalIframeLoaded`), but it stopped working at some point. As Firefox loads the iframe and goes through `preparePublicRootReady`, it re-assigns `this.publicRootReady` to a deferred that is never resolved in tests, which prevents any Hoot builder test from working. Solution: completely override `preparePublicRootReady` with an empty method in tests. task-5266212 Forward-Port-Of: odoo/odoo#235830
This fix restores the ability to edit the Stock report’s “On Hand” field in Studio without errors. It prevents a duplicate field setting from breaking the Studio side panel, so users can customize the view normally again.
Original PR description
### Steps to reproduce: - Go to Inventory > Reporting > Stock - Toggle studio and enable debug mode - Click on the "On Hand" column #### > UncaughtPromiseError > OwlError > Uncaught Promise: > Got…
### Steps to reproduce: - Go to Inventory > Reporting > Stock - Toggle studio and enable debug mode - Click on the "On Hand" column #### > UncaughtPromiseError > OwlError > Uncaught Promise: > Got duplicate key in t-foreach: /list[1]/field[x]_hide_trailing_zeros #### Note: We enabled debug mode to raise template rendering issues but without debug mode the template of the left studio panel is simply not rendered. ### Cause of the issue: The `qty_available` displayed in the `product.product` list view https://github.com/odoo/odoo/blob/12ec5d2d9cd93fffb10bf10326cf3cde7707ea0c/addons/stock/views/product_views.xml#L574-L575 is associated with a `stock_action_field` widget. However, since e4c51ad8a6da17339923875de7fa303544b717e1 this widget has become an hybrid entity able to support both the float and the monetary fields: https://github.com/odoo/odoo/blob/12ec5d2d9cd93fffb10bf10326cf3cde7707ea0c/addons/stock/static/src/fields/stock_action_field.js#L12-L22 The issue is due to the fact that the template of sudio component `TypeWidgetProperties` can not be rendered for our `qty_avaialble` field as it receives the `hide_trailing_zeros` boolean attribute twice in this `t-foreach`: https://github.com/odoo/enterprise/blob/4ba22ee091938d382fb79ef386b4761e4e15479a/web_studio/static/src/client_action/view_editor/interactive_editor/properties/type_widget_properties/type_widget_properties.xml#L23-L25 This happens because the `stock_action_field` adds it twice in its supportedOptions: https://github.com/odoo/odoo/blob/12ec5d2d9cd93fffb10bf10326cf3cde7707ea0c/addons/stock/static/src/fields/stock_action_field.js#L55-L67 once because of the `floatField.supportedOptions`: https://github.com/odoo/odoo/blob/12ec5d2d9cd93fffb10bf10326cf3cde7707ea0c/addons/web/static/src/views/fields/float/float_field.js#L119-L124 and once because of the `monetaryField.supportedOptions`: https://github.com/odoo/odoo/blob/12ec5d2d9cd93fffb10bf10326cf3cde7707ea0c/addons/web/static/src/views/fields/monetary/monetary_field.js#L113-L118 opw-5188594 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The shop editor now correctly previews 1:1 product thumbnails before saving. This makes image ratio changes easier to verify and helps ensure the chosen layout is applied as expected across shop-related pages.
Original PR description
Before this PR, the 1:1 aspect ratio option in the editor (/shop) showed no preview on hover and didn't apply correctly until saving. It treated 1:1 as a special case that removed all classes instead of applying an explicit one. This PR fixes the issue by adding explicit o_wsale_products_opt_thumb_1_1 class support. task-5123229 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Alternative Products section on the website now displays clean product names instead of including internal reference codes for certain products. This makes the product cards match the main product page and improves the customer shopping experience.
Original PR description
**Steps to reproduce:** 1. Install eCommerce. 2. Open a product > Sales Tab > Alternative Products 3. Add products with an internal reference (default_code) and Attributes. 4. Go to website > scroll…
**Steps to reproduce:**
1. Install eCommerce.
2. Open a product > Sales Tab > Alternative Products
3. Add products with an internal reference (default_code) and Attributes.
4. Go to website > scroll down to the alternative products section.
**Issue:**
- The "Alternative Products" snippet displays the product's internal reference
in the title.
- This occurs only for products with attributes and variants(attribute_line_ids)
- The behavior is inconsistent with the main product page, where only the
product name is shown
Cause :
- The QWeb template was accessing the product name through values['data']['_record'] (which is a product.template)
whose display_name includes internal reference (e.g., [E-COM06] Corner Desk Right Sit).
This occurs for products that have attribute_line_ids.
https://github.com/odoo/odoo/blob/f0a34badefd432e9c2ab36acaf018d20d0e342fe/addons/website_sale/data/product_snippet_template_data.xml#L17-L20
<img width="1920" height="458" alt="image" src="https://github.com/user-attachments/assets/c3088149-b6c8-4cd7-8db4-129f0282a09d" />
- However, values['data'] already contains a clean display_name
(e.g., Corner Desk Right Sit) i.e. as expected.
**Solution:**
- Updated the QWeb template to use the correct field from the prepared data:
`t-out="data.get('display_name') or product.display_name"`
- This ensures that the title displays a clean product name consistent with the
main product page, without the internal reference
**opw-5122632**The user group selection field now correctly displays placeholder entries that were previously ignored. This makes it possible to represent a "no group" choice as intended, improving accuracy when configuring user privileges.
Original PR description
Before this commit, privilege's placeholders were ignored in the res_users_group_ids field widget. Those placeholders were supposed to be added in the selection and act as a "no group" value. This commit fixes the issue. task~5275552 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures that package weight is calculated correctly when packages contain other packages. The package’s own base weight is now applied at every level, so shipping weights and related logistics calculations are more accurate.
Original PR description
When using multi-level packages, when the weight of the package is computed, the base weight of the package type is only counted for the top-level package, not for the children packages. Task-5166120 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes mail record existence checks update correctly when a record is deleted. It ensures the interface reacts immediately to changes instead of showing outdated information.
Original PR description
The `exists` function of mail records is not reactive. Indeed, it uses a symbol, stored on the proxy internal field which is not observed. This commit fixes the issue by storing it on the record and ensuring we write on the full proxy when the record is deleted. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236346 Forward-Port-Of: odoo/odoo#236042
The Recruitment app now displays the job position email field correctly in the kanban view. This small visual fix improves readability and makes the job card layout look consistent after adding an email alias.
Original PR description
Steps to reproduce: --------------------------- 1. Install the Recruitment app with demo data. 2. In Settings, add an Email Alias for the company. 3. Open the Recruitment app. 4. Click the Configure…
Steps to reproduce: --------------------------- 1. Install the Recruitment app with demo data. 2. In Settings, add an Email Alias for the company. 3. Open the Recruitment app. 4. Click the Configure button on the job position kanban card. 5. In the Job Position form view, add an email alias. 6. Use the breadcrumbs to navigate back to the job positions. Observation: --------------------------- The email field for the job position is misaligned in the kanban card. Issue: --------------------------- The `div` containing the email is missing a `justify-content-*` class https://github.com/odoo/odoo/blob/5ab45d45073463495e517aca9fd061415a73e893/addons/hr_recruitment/views/hr_job_views.xml#L77 Solution: --------------------------- Add the missing `justify-content-between` class to align the email properly. Before: <img width="1909" height="749" alt="before" src="https://github.com/user-attachments/assets/51790c71-f30d-4402-ae24-a5ccfb30ff9a" /> After: <img width="1914" height="697" alt="after" src="https://github.com/user-attachments/assets/711f83f6-208e-44c3-83e2-8b736c697a9d" /> opw-5246587
The VoIP keypad now correctly removes highlighted digits when using backspace, even if the selection starts at the first character. This restores expected editing behavior while keeping input handling safe and prevents users from being blocked by the earlier regression.
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#99655 Forward-Port-Of: odoo/enterprise#99358
When a sales order’s pricelist is changed and prices are refreshed, optional products will now be recalculated correctly. This prevents optional items from keeping outdated prices, which helps avoid pricing inconsistencies for sales teams and customers.
Original PR description
### Steps to reproduce: - Create a sale order with a SOL and an optional product - Preview the sale order and add the optional product to the order - Go back to edit mode and change the pricelist -…
### Steps to reproduce: - Create a sale order with a SOL and an optional product - Preview the sale order and add the optional product to the order - Go back to edit mode and change the pricelist - Click on 'Update Prices' - Notice the optional product price won't change ### Cause: When updating the prices of the SOLs we filter some lines that we won't recompute. Upon this commit https://github.com/odoo-dev/odoo/commit/2d919694d5c9588e0644d5ba82b15b9d3f762373 we remove the optional products from the recordset that will get price recomputation. If sale_subscription is installed we will set the product's prices to 0 https://github.com/odoo/enterprise/blob/85e0689ba12442e22e83f3337749c7ad2eb9d7d8/sale_subscription/models/sale_order.py#L674 so the price of the 'Optional product' SOL will change but will be equal to 0 ### Fix: An exception for the filtering has been introduced as we will recompute the price of the optional products only if the pricelist is getting changed opw-5058609 Forward-Port-Of: odoo/odoo#234968 Forward-Port-Of: odoo/odoo#230053
When a vendor bill has only one related landed cost, clicking the Landed Costs button now opens that record directly instead of first showing a list. This removes an extra click and makes the workflow faster and smoother for users.
Original PR description
## Before this commit: When a user clicked the Landed Costs smart button on a vendor bill, even if there was only a single landed cost, the system opened the list view first. The user then had to click again to open the form view, which was unnecessary and inconvenient. ## After this commit: The system now opens the landed cost form view directly if only one record exists, avoiding the unnecessary step of displaying the list view. > Task-5231913 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures chat sessions stay properly connected even when they are opened through alternate entry points, not just the usual sidebar or open actions. It helps prevent missed message updates in Discuss and Live Chat, improving reliability for users and support teams.
Original PR description
Discuss subscribes to channel the user is not a member of when it is displayed in the side bar or when `thread.open` is called. However, all flows are not covered. For example, chat hub opens chat windows without calling `thread.open`. So does the command palette. We shouldn't rely on specific flows, but instead detect when the correct conditions are met. This commit fixes this issue by adding a field on thread, that determines whether the subscription is required. When this field update, so does the bus subscription. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The small dot shown on calendar events is now easier to see when an event is unpublished or hatched. The styling was also moved so it works consistently in related views, including Planning even when the Calendar app is not installed.
Original PR description
When pills are hatched (unpublished event) in the calendar view (eg. planning) the `o_event_dot` is barely visible. Additionally the styling to display the dot as outlined on hatched event is wrongly scoped in `/calendar` with the calendar status styling. It should be in the view instead. Otherwise, for the planning module which doesn't depend on calendar, the styling is not applied if calendar is not installed, rendering the filled dot. task-3916768 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235978 Forward-Port-Of: odoo/odoo#235286
This update fixes an error that could block adding a user to a sales team when the team belongs to another company the user is allowed to access. It now uses the user’s permitted companies instead of only their default company, which makes multi-company membership work as expected without changing the underlying company setup.
Original PR description
### Steps to reproduce the issue: (Easier to reproduce client side with CRM installed) 0. Install crm 1. Create Second Company 2. Create New User with Current Company as Default Company and Second…
### Steps to reproduce the issue: (Easier to reproduce client side with CRM installed) 0. Install crm 1. Create Second Company 2. Create New User with Current Company as Default Company and Second Company in Allowed Companies 3. Create CRM Team belonging to Second Company 4. Add New User to Members of CRM Team 5. Receive error: > [New User] belongs to company [Current Company] and "Sales Team" (crm_team_id: [CRM Team]) belongs to another company. ### Explanation: `crm.team.member` is created when adding `res.users` to `crm.team.member_ids`. Contrary to `res.users`, a company_check is done when linking `crm.team` and `crm.team.member` together. `crm.team.member.company_id` is related to `user_id.company_id` and, in the case above, does not match `crm.team.company_id`, raising an error because of it. ### Fix reasoning: Removing restriction, as we want to avoid other multi-company issues by changing the behaviour. opw-4214192 --- @nd-dew note: Situation recap  So it was proposed to modify the field definition, seems to me that removing `check_company` from the field definition is a legal move, since it is an ORM level constraint (doesn't change db schema). However looking at the tests it seems like this is desired limitation. Note that https://github.com/odoo/odoo/pull/171079 introduced checking for allowed companies, but the **default company** still takes priority. Forward-Port-Of: odoo/odoo#189441
Users can now mention any member of a group chat even when writing inside a thread. This removes a communication limitation and makes threaded discussions in chat behave as expected.
Original PR description
Before this commit, when inside a thread of a group chat, it would not be possible to mention channel members that are not inside said thread. Steps to reproduce: 1. Create group chat 2. Create a thread 3. Try to mention -> can only mention self This commit fixes the issue by: 1. In the `get_mention_suggestions_from_channel`: correctly adding in the store all partners inside the parent channel 2. In the suggestion service: taking the `channel_member_ids` from the `parent_channel_id` when present task-5233010 Forward-Port-Of: odoo/odoo#235998 Forward-Port-Of: odoo/odoo#234887
This fix prevents the website sitemap from crashing when a record does not have a last update date. If no date is available, the sitemap now skips that field and continues working normally, restoring the previous behavior.
Original PR description
In some cases, write_date can be Falsy, causing the sitemap to crash with: > '>' not supported between instances of 'datetime.datetime' and 'bool' Restore previous behavior, if there is no write_date, the lastmod key is not set.
The import screen now shows the same formatting options for files ending in either .csv or .CSV. This makes the import experience more consistent and avoids confusion for users uploading CSV files with uppercase extensions.
Original PR description
Before this fix, the import side panel displayed the formatting options only when the uploaded file had a lowercase .csv extension. Files with an uppercase .CSV extension could still be imported but did not show the format selection section, leading to inconsistent behavior. This commit updates the condition to perform a case-insensitive comparison on the file extension. Task-5145031 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236348 Forward-Port-Of: odoo/odoo#235061
This change updates the payment methods Odoo enables for Mollie so they match what Mollie actually supports by default. It also removes a payment method that Mollie is phasing out, reducing setup confusion and avoiding unavailable options for customers.
Original PR description
**[FIX] payment_mollie: remove iDEAL from the default payment methods** When a new Mollie account is created, it only accepts card payments out of the box. In Odoo, both the Cards and iDEAL payment methods were activated by default upon enabling the payment provider, while iDEAL required manual activation from Mollie's dashboard. --- **[FIX] payment_mollie: remove Sofort from the linked payment methods** See https://help.mollie.com/hc/en-us/articles/20904206772626-SOFORT-Deprecation-30-September-2024ard. Forward-Port-Of: odoo/odoo#236182 Forward-Port-Of: odoo/odoo#236044
Customers who place a takeout order through self-ordering will now receive the confirmation email as expected. The email is sent from the server when the order is created, which avoids the previous issue where disconnected customers could not trigger it.
Original PR description
When using the takeout preset with the self order, we're supposed to send a confirmation email to the customer. Currently, this mail does not get sent. Steps to reproduce: ------------------- * Open…
When using the takeout preset with the self order, we're supposed to send a confirmation email to the customer. Currently, this mail does not get sent. Steps to reproduce: ------------------- * Open the Restaurant config, make it only use the takeout preset (by default) and enable self ordering + QR * Log out * Open the mobile menu * Make an order * Fill out the information for takeout (slot, name, mail) and continue * Check the mails > Nothing being sent Cause: ------------ The email is supposed to be sent after entering the takeout informations and selecting the button "continue". https://github.com/odoo/odoo/blob/aec27a7b4fbf6826842e7b5945ef0d5670bc0603/addons/pos_self_order/static/src/app/pages/cart_page/cart_page.js#L131-L135 The call to the db is made here: https://github.com/odoo/odoo/blob/aec27a7b4fbf6826842e7b5945ef0d5670bc0603/addons/pos_self_order/static/src/app/pages/cart_page/cart_page.js#L156-L162 Which utlimately resolves in calling: https://github.com/odoo/odoo/blob/aec27a7b4fbf6826842e7b5945ef0d5670bc0603/addons/point_of_sale/static/src/app/services/data_service.js#L526 This uses the call_kw route which requires the user to be connected. https://github.com/odoo/odoo/blob/aec27a7b4fbf6826842e7b5945ef0d5670bc0603/addons/web/controllers/dataset.py#L28-L29 However the usecase we describe is mainly used by non connected users. If a user is not connected we will never call `action_send_self_order_receipt` which sends the email. Why the fix: ------------ We do not want to use a public route to send the email. What we want is to send the email directly from the backend when the order is created. In order to achieve this we need to send the email given by the customer when sending the order. To do that we need to override `serializeForORM` as the email is a computed field. Currently we cannot send the receipt by email as we cannot render it from the backend. This is currently a limitation but does not induce a stepback compared to using a public route as the route to send the email would usually be executed before the payment of the order, in which case we didn't sent a receipt. opw-5164546 Forward-Port-Of: odoo/odoo#232975
When a stock quantity is increased, Odoo now reserves from available inventory records first instead of creating a generic line with only product and location. This makes the additional quantity follow normal reservation rules, improving accuracy in stock and manufacturing operations.
Original PR description
Increasing the quantity of a stock move will create a move line with the same data as the stock move (location and product), no lot, nor package. This commit make the increase of quantity mimic the reservation process by getting first the available quants. The move line are then created accordingly. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When website content generation runs into a known user-facing error, the system now records it as a warning instead of an error. This better matches the fact that users are already notified in the interface and avoids creating unnecessary error-level logs.
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
This change removes a Northern Ireland business-to-business tax setup that was no longer needed. When applicable, it now uses the standard domestic tax setup instead, reducing complexity and keeping tax configuration aligned.
Original PR description
After more verification, we found that the Northern Ireland B2B Fiscal Position was unnecessary and could be replaced by the domestic one. So this commit removes this fiscal position and replaces it if needed by the domestic one.
When support users open a visitor’s contact from live chat, the contact now opens in a way that keeps the navigation trail intact. This makes it easier to go back to the original chat session and continue working without losing context.
Original PR description
Previously, when we click on the "View Contact" button, the corresponding partner's form is opened but via a href link which does not preserve the breadcrumb. Purpose of this commit is to use the action service instead, to open the form view of the partner, which will preserve the breadcrumb so that navigating back to that session is handy. Part of Task-5190261
When the quantity of a stock move is increased, the system now updates the existing reservation correctly instead of behaving like a new line was created. This keeps stock handling more accurate and prevents test and workflow mismatches in barcode-related processes.
Original PR description
Increasing the quantity of a stock move will create a move line with the same data as the stock move (location and product), no lot, nor package. This commit correct some tests values because increasing the quantity on a stock move will increase the existing move line quantity instead of creating a new one.
This fix ensures the salary configurator applies the correct ATN-related payroll rules even when the payslip date falls outside the employee’s contract period. As a result, salary estimates and payroll calculations are more accurate and consistent.
Original PR description
The payslip date is in the current month of when the salary configurator is used which may be different from the date on the version. That would lead to have the payslip outside of the contracts date and not take the ATN into account.
This change removes a printer setting that was causing PDF labels to print misaligned on Zebra printers from Windows IoT devices. It restores the expected label layout so printed labels are accurate again.
Original PR description
Adding the argument "-dPDFFitPage" in the printer driver for the windows IoT broke the alignment when printing PDF labels on Zebra printers. Issue introduced in #232866 opw-5220275 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236228 Forward-Port-Of: odoo/odoo#236041
This change prevents upgrade failures when creating timesheet entries from helpdesk tickets. It ensures the correct analytic account is kept so the system no longer triggers the “At least one analytic account must be set” validation error.
Original PR description
When creating an analytic line from a helpdesk ticket, we assigned the account_id from the project's account_id during the upgrade. However, in the standard code, the account_id is later overridden and updated from ticket.analytic_account_id, which is null. As a result, the constraint "At least one analytic account must be set" is triggered. see: https://github.com/odoo/enterprise/blob/dcfef2cc462631f376a596a7c85ae483826835ad/helpdesk_timesheet/models/account_analytic_line.py#L119 Multiple upgrade request failed due to this. Forward-Port-Of: odoo/enterprise#99201
This change reduces memory usage when opening the "To Receive" view for warehouses with many transfers and quality checks. It prevents the system from loading unnecessary data into memory, avoiding crashes and improving stability for large operations.
Original PR description
The fields `quality_check_todo` and `quality_check_fail` are calculated for stock.picking records by iterating all checks of a stock.picking. This causes a problem when clicking the "To Receive"…
The fields `quality_check_todo` and `quality_check_fail` are calculated for stock.picking records by iterating all checks of a stock.picking. This causes a problem when clicking the "To Receive" button for a warehouse in the inventory app, in case there are many transfers each with many quality checks. The function will default to loading all data associated with quality checks in memory through field prefetching. However, since quality checks have too much data (particularly because of the HTML fields) associated with them, the cache can quickly bloat causing an OOM error and crashing the worker. This PR disables the prefetcher for quality checks before iterating them, preventing this issue from happening since we only need very light fields in the loop. For a specific customer (opw-5025162), this was the case. Benchmarks: | No. stock.picking | avg no. quality checks | peak memory before | peak memory after | | ----------------- | ---------------------- | ------------------ | ----------------- | | 25 | 20 | 2771 mb | 235 mb | opw-5025162 Forward-Port-Of: odoo/enterprise#95568
Users can now mark manufacturing work orders as done even when the related project’s accounting settings would previously block the action. This prevents an access error from stopping production progress in common manufacturing and timesheet setups.
Original PR description
[FIX] project_mrp_workorder_account: allow WO completion Steps to reproduce: - Enable Analytic Accounting. - Assign a project A to User A. - Create user B with Manufacturing User + Timesheet User…
[FIX] project_mrp_workorder_account: allow WO completion
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-5262213This update corrects how the salary contract module retrieves the employee work-time rate. It now uses the proper stored field, which prevents errors and ensures the displayed calculations are based on the right information.
Original PR description
The function _get_work_time_rate doesn't exist, but the information we need is in the field work_time_rate.
This update fixes an issue where filtering replenishment records with a zero ‘To Order’ value could still show items that actually needed ordering. It makes the displayed value and search results consistent, so users can trust the filter results in Inventory replenishment.
Original PR description
**Issue** In replenishment, filtering with `to_order = 0` does not correctly exclude records where `to_order != 0`. **Steps to reproduce** 1. Go to Inventory > Operations > Procurement >…
**Issue** In replenishment, filtering with `to_order = 0` does not correctly exclude records where `to_order != 0`. **Steps to reproduce** 1. Go to Inventory > Operations > Procurement > Replenishment 2. Create a replenishment with a forecast quantity smaller than the min and max quantity (without editing the To Order) 3. Apply a custom filter `to_order = 0` → Records with non-zero `to_order` are incorrectly included **Cause** `qty_to_order` was split into `qty_to_order_computed` and `qty_to_order_manual` in [this commit](https://github.com/odoo/odoo/commit/156bed3f430d706e13822bbd95d91c8dfd3ea42d#diff-0eb18a8d7773b5f99b402392188594178c3ba2004e4bcab26dbc84b1c8d7256a). In the [`_search_qty_to_order` method](https://github.com/odoo/odoo/blob/322c6d0468bf79e9d29e1375c49aa13d4a7b7a67/addons/stock/models/stock_orderpoint.py#L338), all records with `qty_to_order_manual = 0` are included. Since `qty_to_order_manual` defaults to 0 when untouched by the user, this causes incorrect results. Additionally, [`to_order`](https://github.com/odoo/odoo/blob/322c6d0468bf79e9d29e1375c49aa13d4a7b7a67/addons/stock/models/stock_orderpoint.py#L323) displays `qty_to_order_computed` if `qty_to_order_manual = 0`, creating inconsistency. **Solution** Fix the inconsistency by ignoring `qty_to_order_manual` when searching for zero `to_order` values. opw-5150643 Forward-Port-Of: odoo/odoo#234908
This change includes the database identifier with SMS requests sent to Odoo’s cloud service. It helps support teams more quickly identify and troubleshoot issues for customers when a problem occurs.
Original PR description
Send the db_uuid to IAP such that we can more easily debug and support our users in case of a problem. task-none Forward-Port-Of: odoo/odoo#235540 Forward-Port-Of: odoo/odoo#233912
This fix prevents a permission error that could block manufacturing users from marking a work order as done when the related project uses timesheets and analytic accounting. It improves the completion flow so production can continue without requiring extra accounting access.
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 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-5262213This update corrects how certain accounting template records are labeled behind the scenes. It helps ensure those records are associated with the right module, reducing the risk of setup or update issues for related accounting features.
Original PR description
Trying to fix the account_asset data records having `account` as a module while targeting the `account_asset` model that belongs to the `account_asset` model.
This change removes a unit test that belonged in a different module and depended on Enterprise-only fields. Removing it prevents test suite failures during builds and avoids keeping an invalid test in the standard codebase until it can be reintroduced in the right place.
Original PR description
The unit test `test_can_reset_deferred_invoice()` has several issues. 1. It should be in the `account_audit_trail` module, as the test requires this module. [Unit test documentation: modules](https://www.odoo.com/documentation/19.0/developer/tutorials/unit_tests.html#modules). 2. The test references fields from the Enterprise module `account_accountant`, `account.move.line.deferred_start_date` and `account.move.line.deferred_end_date`. This causes build tests to fail. As such, the test should be removed now and replaced later if necessary. Fixes [PR 235223](https://github.com/odoo/odoo/pull/235223) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235813