Daily updates from Odoo
Tuesday, August 5, 2025
48 changes
12 changes
Resolved issues and error corrections
Spanish Model 349 rectification reporting now excludes payments and other unrelated transactions when calculating corrected amounts. This ensures the tax report and official BOE export reflect only the impact of linked credit notes, reducing the risk of inaccurate regulatory filings.
Original PR description
# How to reproduce the issue With l10n_es fiscal position: - Create a bill in a previous period (e.g., amount 1000). Partially credit note this bill for 500. - Register a partial payment of 250 on…
# How to reproduce the issue With l10n_es fiscal position: - Create a bill in a previous period (e.g., amount 1000). Partially credit note this bill for 500. - Register a partial payment of 250 on this bill. - In the tax report, go to model 349. Under the Rectificationes section, the new rectified value will be 250. This is incorrect, as the rectifications in this report should only reflect the value of the original move from a past period after applying the credit note. Payments or other transactions should not impact this report. This commit adjusts the computation of the report (and the BOE export) to ensure that, instead of using `amount_residual` (which includes payments and other transactions), the report uses the sum of the credit notes linked to the move included in the rectification report. Also changed the test test_mod349_credit_note. The rectification section is supposed to show the adjusted amount after rectification. In the test a bill of 400 is fully refunded. Instead of 400, the report should show 0. (https://www.boe.es/buscar/doc.php?id=BOE-A-2010-5098 in TIPO DE REGISTRO 2: REGISTRO DE RECTIFICACIONES. in 153-165 Numérico Base Imponible Rectificada section) opw-4895636 Forward-Port-Of: odoo/enterprise#91350 Forward-Port-Of: odoo/enterprise#89431
This fix prevents an error when users clear the delivery field while processing a product return from a helpdesk ticket. It keeps the return workflow stable by waiting until a valid delivery is selected before recalculating related information.
Original PR description
step to reproduce : create a sales order with a service and a consumable product deliver the consumable product enable the 'returns' feature on your helpdesk team create a helpdesk ticket in this team select the customer and the SOL you created click on return empty the delivery field => traceback source of the issue : Setting the delivery_id field to false triggers a compute, in which an ensure one is later call on the delivery_id. Since the delivery is empty, it triggers an error. Solution : The field 'delivery_id' is required. So we can simply prevent the execution of the compute when the delivery is set to false and wait for the user to put a new value to trigger the compute correctly. task - 4935957 Forward-Port-Of: odoo/enterprise#90496
This update prevents partner grades from being automatically applied to child contacts when that behavior is not intended. It also fixes commission plans so they are not removed when a cancelled sale order is no longer relevant to the partner, helping preserve accurate partnership and commission data.
Original PR description
This reverts commit 14001a8a0216750be0c897d0e1bf31fccfc51c6a so that applying a grade no longer adds it to the children of the partner as well. This PR also fix the issue of a commission plan being removed even if the cancelled sale order was not used by the partner anymore. TASK-4985900 Forward-Port-Of: odoo/enterprise#91456
Customers can now choose supported shipping carriers at checkout when their cart includes combo products. The fix prevents combo products and zero-quantity order lines such as down payments from being incorrectly flagged as missing weight, reducing checkout and sales order errors.
Original PR description
\* = bpost, dhl{,_rest}, easypost, sendcloud, ups, usps{,_rest} Versions -------- - 18.0+ Steps ----- 1. Have a combo product Foo; 2. ensure the combo items have a weight set; 3. enable & publish a…
\* = bpost, dhl{,_rest}, easypost, sendcloud, ups, usps{,_rest}
Versions
--------
- 18.0+
Steps
-----
1. Have a combo product Foo;
2. ensure the combo items have a weight set;
3. enable & publish a shipping connector;
4. add combo product to cart;
5. go to checkout;
6. attempt to select shipping connector as delivery method.
A similar message appears when trying to add a delivery method to a backend order if the order has downpayment lines.
Issue
-----
> The estimated shipping price cannot be computed because the weight is missing for the following product(s): Foo
Cause
-----
The combo product doesn't have a weight, as it's not a discrete item, but a collection of multiple items.
The shipping connectors haven't been updated yet to account for this, and still expect every non-service product to have a weight.
Solution
--------
When looking for lines without weight, filter out products of type `combo` (similar to how `service` products are handled) using a new `_get_invalid_delivery_weight_liens` helper method, added to `sale.order.line`.
Also ignore lines where `product_qty` is zero, e.g. `display_type` lines & down payment lines.
Community PR: https://github.com/odoo/odoo/pull/221696
opw-4940973
Forward-Port-Of: odoo/enterprise#91243This fix ensures the Indian GST reports test can create the GSTR1 report without being blocked by access permissions. It helps keep automated validation stable for India localization reporting, reducing false build failures.
Original PR description
steps to reproduce: 1. Install l10n_in_reports module. 2. Run the test `TestReports.test_hsn_schema_change_gstr1_json`. this is required to avoid permission issues when creating the GSTR1 report in the test. build_error-223245 Forward-Port-Of: odoo/enterprise#90969 Forward-Port-Of: odoo/enterprise#89116
This fix removes duplicated rental planning logic so rental order lines use one consistent process for creating planning slots. It helps preserve expected rental scheduling behavior and reduces the risk of inconsistent planning results after recent changes.
Original PR description
Before this commit, since the merge of #91164, `_planning_slot_vals_list` method is duplicated in sale_renting_planning/models/sale_order_line.py file. This commit merges the both methods together to keep the behavior added in the one initially introduced before the fix merged.
Mexican point-of-sale refunds can now be completed when the refund is issued back to a gift card. This prevents checkout errors and correctly allows the gift card balance to be refilled during the refund process.
Original PR description
**Problem:** When trying to make a refund in Mexico, with a gift card in the order, the order should be refunded on said gift card. But when doing so, two problems arise: - In the case of a gift…
**Problem:** When trying to make a refund in Mexico, with a gift card in the order, the order should be refunded on said gift card. But when doing so, two problems arise: - In the case of a gift card, *line[2].refunded_orderline_id* is not set, so we are trying to read the property of an undefined variable. - Another problem is that the order can not have any line that have a positive subtotal in the case of a refund. This was not taking the gift cards into accounts, as it makes sense for them to be positive in such a case. **Steps to reproduce:** - Set your company to a Mexican company - Make a purchase for a gift card - Make another purchase for a random product - Start the refund process and enter the gift card code we created before - Try to finalize the purchase, a traceback appears - If we were not trying to read an undefined variable, the purchase would still not go through as some lines are positive in a refund **Why the fix:** When refunding with a gift card, we should refill the gift card by the order's cost instead. With this in mind, it makes sense for the gift card to have a positive price even though we are in the context of a refund, which usually only permits negative priced lines. opw-4892935 Forward-Port-Of: odoo/enterprise#91385 Forward-Port-Of: odoo/enterprise#89892
The stool demo data now uses the correct color attributes instead of mismatched material values. This makes the demo Bill of Materials and assembly steps clearer and prevents incorrect product variant links in demonstrations or testing.
Original PR description
Versions -------- - saas-18.4+ Steps ----- 1. Install demo data; 2. open the Stool BoM; 3. check assembly steps. Issue ----- Mismatch between product attribute colors & materials. Cause ----- Commit f7ad739fd4b4 updated product attribute demo data. It replaced color with materials, and didn't account for attribute ordering being alphabetical instead of by time of creation. Solution -------- Change material attributes back to color attributes for stool demo data, and order attributes alphabetically to prevent confusion. Also provide unique references to product attribute value records to ensure the correct attribute value gets linked to the BoM lines. opw-4989005
Subscription sales orders can now be previewed even when no salesperson is assigned. This prevents an error that blocked administrators from reviewing customer orders created through the website checkout.
Original PR description
**Steps to reproduce:** 1. Install sale_subscription, payment_demo and eCommerce 2. Go to Website → Configuration → Settings and clear the Salesperson field 3. Create a subscription product with…
**Steps to reproduce:** 1. Install sale_subscription, payment_demo and eCommerce 2. Go to Website → Configuration → Settings and clear the Salesperson field 3. Create a subscription product with recurring plan and publish it. 4. Place an order for this product as a portal user and complete payment. 5. Log back in as admin, open the related Sale Order, and click Preview **Issue:** A traceback occurs:- ```"ValueError: Expected singleton: res.users()"``` This happens in _prepare_partner_addresses because user_id is not set on the Sale Order. **Cause:** https://github.com/odoo/enterprise/blob/6b449769d4bf2cdf6517a026706fd6ea55832975/sale_subscription/controllers/portal.py#L233 The code calls has_group on order_sudo.user_id without checking if user_id exists, leading to an empty recordset and singleton error. **Solution:** Add a fallback to handle cases where user_id is not defined, defaulting to False for multiple_addresses_enabled. opw-4947508 Forward-Port-Of: odoo/enterprise#91013
Upsell invoices for yearly subscriptions now show the correct service period when billing is aligned to the start of a period. This prevents confusing invoice descriptions by separately accounting for the remaining current period and the next full billing period.
Original PR description
**Steps to Reproduce:** - Install `sale_subscription`. - Create a product (recurring product) with: - Type: Service - Invoicing Policy: Prepaid/Fixed Price - Create a subscription plan Yearly with: -…
**Steps to Reproduce:**
- Install `sale_subscription`.
- Create a product (recurring product) with:
- Type: Service
- Invoicing Policy: Prepaid/Fixed Price
- Create a subscription plan Yearly with:
- Billing Period: 1 year
- Align to period start: enabled
- Create and confirm a subscription for the product using the Yearly plan.
- Create and confirm the first invoice (shows remaining days like
185 days – 06/30/2025 to 12/31/2025 in product description).
- Create and confirm second invoice (check 1 year – 01/01/2026 to 12/31/2026).
- Go back to the subscription and create an upsell.
- Confirm the upsell and generate its invoice.
**Observation:**
- The upsell invoice line shows the wrong duration:
1 year (06/30/2025 to 12/31/2026).
- This is incorrect because the expected duration is:
185 days (from 06/30/2025 to 12/31/2025) + 1 year (01/01/2026 to 12/31/2026)
**Issue:**
- The duration calculation is based on the ratio of the first date and the end
date, but for the Upsell's ratio is always 1, so it considers fix duration,
i.e 1 year, 1 month
https://github.com/odoo/enterprise/blob/4bb43da79dba7ac1d0772fde814b3da6bade7db6/sale_subscription/models/sale_order_line.py#L346-L347
**Solution:**
- Corrected the logic to calculate the upsell duration by combining the remaining
current period (e.g., 185 days) with the standard 1-year period ratio.
Reference PR: https://github.com/odoo/enterprise/pull/68163/commits/cfed2d369960896f0f4d91a90eb24f3641627419
opw-4853426
Forward-Port-Of: odoo/enterprise#91362
Forward-Port-Of: odoo/enterprise#88963The Luxembourg and Romania reporting modules now only install automatically when the Accountant app is already selected. This avoids unexpectedly using the free app choice for Accountant when users choose another app in those countries.
Original PR description
When choosing one app free in these countries, Accountant is automatically installed. This should only be the case when Accountant is the one app free. Fix: Change the auto-install dependencies to ensure that these modules are only installed when Accountant is already installed. Forward-Port-Of: odoo/enterprise#91662 Forward-Port-Of: odoo/enterprise#91627
This fixes an issue where editing a signing template could replace a field popup title with the field's placeholder text. Users reusing templates will now see the correct field names or types, reducing confusion and preventing template corruption.
Original PR description
### Steps to reproduce:
- Create a document using a sign template.
- Add a new field or modify the placeholder of an existing one.
- Validate the changes.
- Notice title is replaced by the value entered in placeholder.
### Issue:
After editing a template that has already been used in a signed document, the title of each sign item popup is unexpectedly replaced with the value
entered in the placeholder for that item. This corrupts the template and results
in incorrect title of sign itme being shown when the template is reused.
### Cause:
The issue occurs because the title was being updated with the placeholder of that particular sign item.
### Solution:
Added a prop for title of sign item in SignCustomPopover so that we can make the title as name of the sign item or the type like ('Name', 'Text', 'Signature') rather than the placeholder of the sign item.
---
task-4872963
Forward-Port-Of: odoo/enterprise#91551
Forward-Port-Of: odoo/enterprise#9034818 changes
Resolved issues and error corrections
This update fixes visual issues in Odoo Studio after a recent styling change. Sidebar headers and report editor undo/redo buttons now display correctly, helping users work with a more consistent interface.
Upsell invoices for yearly subscriptions now show the correct billing duration when a current partial period is followed by a full renewal period. This prevents customers from seeing misleading invoice line descriptions and helps keep subscription billing clearer and more accurate.
Original PR description
**Steps to Reproduce:** - Install `sale_subscription`. - Create a product (recurring product) with: - Type: Service - Invoicing Policy: Prepaid/Fixed Price - Create a subscription plan Yearly with: -…
**Steps to Reproduce:**
- Install `sale_subscription`.
- Create a product (recurring product) with:
- Type: Service
- Invoicing Policy: Prepaid/Fixed Price
- Create a subscription plan Yearly with:
- Billing Period: 1 year
- Align to period start: enabled
- Create and confirm a subscription for the product using the Yearly plan.
- Create and confirm the first invoice (shows remaining days like
185 days – 06/30/2025 to 12/31/2025 in product description).
- Create and confirm second invoice (check 1 year – 01/01/2026 to 12/31/2026).
- Go back to the subscription and create an upsell.
- Confirm the upsell and generate its invoice.
**Observation:**
- The upsell invoice line shows the wrong duration:
1 year (06/30/2025 to 12/31/2026).
- This is incorrect because the expected duration is:
185 days (from 06/30/2025 to 12/31/2025) + 1 year (01/01/2026 to 12/31/2026)
**Issue:**
- The duration calculation is based on the ratio of the first date and the end
date, but for the Upsell's ratio is always 1, so it considers fix duration,
i.e 1 year, 1 month
https://github.com/odoo/enterprise/blob/4bb43da79dba7ac1d0772fde814b3da6bade7db6/sale_subscription/models/sale_order_line.py#L346-L347
**Solution:**
- Corrected the logic to calculate the upsell duration by combining the remaining
current period (e.g., 185 days) with the standard 1-year period ratio.
Reference PR: https://github.com/odoo/enterprise/pull/68163/commits/cfed2d369960896f0f4d91a90eb24f3641627419
opw-4853426
Forward-Port-Of: odoo/enterprise#91362
Forward-Port-Of: odoo/enterprise#88963Fixes an issue where Mexican point-of-sale refunds failed when a gift card was used. Refunds can now correctly reload the gift card balance, preventing checkout errors and allowing legitimate positive gift card lines during refund transactions.
Original PR description
**Problem:** When trying to make a refund in Mexico, with a gift card in the order, the order should be refunded on said gift card. But when doing so, two problems arise: - In the case of a gift…
**Problem:** When trying to make a refund in Mexico, with a gift card in the order, the order should be refunded on said gift card. But when doing so, two problems arise: - In the case of a gift card, *line[2].refunded_orderline_id* is not set, so we are trying to read the property of an undefined variable. - Another problem is that the order can not have any line that have a positive subtotal in the case of a refund. This was not taking the gift cards into accounts, as it makes sense for them to be positive in such a case. **Steps to reproduce:** - Set your company to a Mexican company - Make a purchase for a gift card - Make another purchase for a random product - Start the refund process and enter the gift card code we created before - Try to finalize the purchase, a traceback appears - If we were not trying to read an undefined variable, the purchase would still not go through as some lines are positive in a refund **Why the fix:** When refunding with a gift card, we should refill the gift card by the order's cost instead. With this in mind, it makes sense for the gift card to have a positive price even though we are in the context of a refund, which usually only permits negative priced lines. opw-4892935 Forward-Port-Of: odoo/enterprise#91385 Forward-Port-Of: odoo/enterprise#89892
Sale order previews for subscription purchases now work even when no salesperson is assigned. This prevents an error screen for administrators reviewing paid subscription orders, improving reliability in eCommerce subscription workflows.
Original PR description
**Steps to reproduce:** 1. Install sale_subscription, payment_demo and eCommerce 2. Go to Website → Configuration → Settings and clear the Salesperson field 3. Create a subscription product with…
**Steps to reproduce:** 1. Install sale_subscription, payment_demo and eCommerce 2. Go to Website → Configuration → Settings and clear the Salesperson field 3. Create a subscription product with recurring plan and publish it. 4. Place an order for this product as a portal user and complete payment. 5. Log back in as admin, open the related Sale Order, and click Preview **Issue:** A traceback occurs:- ```"ValueError: Expected singleton: res.users()"``` This happens in _prepare_partner_addresses because user_id is not set on the Sale Order. **Cause:** https://github.com/odoo/enterprise/blob/6b449769d4bf2cdf6517a026706fd6ea55832975/sale_subscription/controllers/portal.py#L233 The code calls has_group on order_sudo.user_id without checking if user_id exists, leading to an empty recordset and singleton error. **Solution:** Add a fallback to handle cases where user_id is not defined, defaulting to False for multiple_addresses_enabled. opw-4947508 Forward-Port-Of: odoo/enterprise#91013
This fix prevents WinBooks accounting imports from failing when imported data contains special tax accounts, missing journal references, or accounts later marked as deprecated. It helps businesses complete legacy accounting data imports more reliably without manual cleanup or interrupted migration workflows.
Original PR description
When importing a winbooks file the following issues and or inconsistencies may be found **Issue 1** We may import an account with CENTRALID 'V03' and code 45100000 Having this centralID means that it…
When importing a winbooks file the following issues and or inconsistencies may be found **Issue 1** We may import an account with CENTRALID 'V03' and code 45100000 Having this centralID means that it will be set as tax payable account id according to https://github.com/odoo/enterprise/blame/d8d4812414dba8825a1c785c29d00f7d0fd98360/account_winbooks_import/wizard/import_wizard.py#L174 However, this means it needs to be a `liability_payable` account with reconcile enable, in order to comply with the following check https://github.com/odoo/odoo/blame/ad6c9001b447f5ffebafe1581512f48708c7d746/addons/account/models/account_tax.py#L80 *Note* Even if we set it as liability_payable, the import may fail later on in case the same account is used in a sales move where those types of account are not allowed https://github.com/odoo/odoo/blame/1b657cf1e1ce43874a3ede307b2f8ad68216aa56/addons/account/models/account_move_line.py#L1247 A solution is to skip the `_check_payable_receivable` check for winbooks lines **Issue 2** Move line data may reference an unkown journal, causing a validation error because no journal is retrieved from the database and a move always need a journal **Issue 3** Account created during import may be marked for deprecation, which occurs at the end of the import process. However, if the account has been used in a tax repartition line, trying to set it as deprecated will raise an error. https://github.com/odoo/odoo/blame/2cdc41c012f637849ba030989ce928b6b1152e7e/addons/account/models/account_account.py#L1028 opw-4850314 Forward-Port-Of: odoo/enterprise#91581 Forward-Port-Of: odoo/enterprise#89426
This fix aligns ESG date range fields with the correct date-based behavior instead of datetime handling. It removes unnecessary browser console warnings without changing the visible user experience.
Original PR description
The widgets `esgDateRangeField` and `esgListDateRangeField` inherit respectively from `dateTimeField` and `listDateTimeField`. As their name implies, those widgets are made to handle datetime fields, whereas the esg widgets are used on dates. While it does not seem to make a functional difference, it produces a warning in the browser console. This PR makes the esg widgets inherit from the "date" counterpart instead. Forward-Port-Of: odoo/enterprise#91646
This fixes an issue where AI-related email template customization could fail when Odoo was used in a language other than English. The update makes the template override independent of translated text, improving reliability for multilingual customers.
Original PR description
Texts are translated before template compilation so xpaths that depend on text content fails on odoo instances that use language aside from EN. We are now searching for the div inside the content page beside the attachment_ids field to find the div to replace. OPW: 4964821 Forward-Port-Of: odoo/enterprise#90900
Users can now reorder folders within Company or My Drive without the system unnecessarily checking permissions for a parent folder that is not changing. This prevents avoidable errors and makes organizing document folders smoother.
Original PR description
Reproduce: 1/ Pick a folder under Company in the search panel 2/ Drag and drop it to reorder (still under COMPANY) No need to show/fetch rights of new parent folder when it is COMPANY or MY, overlooked in 939d7a3c. Task-4822908
Fixed an issue where editing a signing template could replace field popup titles with placeholder text. This keeps reused templates clear and prevents confusing labels such as custom placeholder values appearing where standard field names should be shown.
Original PR description
### Steps to reproduce:
- Create a document using a sign template.
- Add a new field or modify the placeholder of an existing one.
- Validate the changes.
- Notice title is replaced by the value entered in placeholder.
### Issue:
After editing a template that has already been used in a signed document, the title of each sign item popup is unexpectedly replaced with the value
entered in the placeholder for that item. This corrupts the template and results
in incorrect title of sign itme being shown when the template is reused.
### Cause:
The issue occurs because the title was being updated with the placeholder of that particular sign item.
### Solution:
Added a prop for title of sign item in SignCustomPopover so that we can make the title as name of the sign item or the type like ('Name', 'Text', 'Signature') rather than the placeholder of the sign item.
---
task-4872963
Forward-Port-Of: odoo/enterprise#91639
Forward-Port-Of: odoo/enterprise#90348This update improves accounting return workflows by preserving selected dates in the return creation wizard and keeping audit completion status in sync. It also adjusts period-locking behavior so audit returns are not incorrectly blocked, making audit-related processes smoother and less error-prone.
Fixed an issue where activities configured on a reconciliation model were not added to the related bank statement line when the model was triggered. This helps teams reliably follow up on reconciliation tasks as intended.
Original PR description
On a reco model, you can set an activity that should be applied on the statement line where the reco model is triggered. Before this commit the activity was not set. task-4954201 Forward-Port-Of: odoo/enterprise#90853 Forward-Port-Of: odoo/enterprise#90540
The India reporting module now creates the GSTR1 report with the required access rights during testing. This prevents permission-related build failures and helps keep GST reporting checks reliable.
Original PR description
steps to reproduce: 1. Install l10n_in_reports module. 2. Run the test `TestReports.test_hsn_schema_change_gstr1_json`. this is required to avoid permission issues when creating the GSTR1 report in the test. build_error-223245 Forward-Port-Of: odoo/enterprise#90969 Forward-Port-Of: odoo/enterprise#89116
This fix prevents the Barcode app from storing invalid empty values when scanning lot numbers during receipt processing. It avoids a crash when users scan multiple lots, helping warehouse teams continue receipt operations reliably.
Original PR description
## How to reproduce: https://github.com/user-attachments/assets/bf44f9fd-0402-4d70-8b55-5baf192d42e8 - Enable Consignment - On Receipt operation type, enable 'Use existing lots' - Create product P,…
## How to reproduce:
https://github.com/user-attachments/assets/bf44f9fd-0402-4d70-8b55-5baf192d42e8
- Enable Consignment
- On Receipt operation type, enable 'Use existing lots'
- Create product P, tracked by lot
- Create lot SN-001 & SN-002
- Add 1 unit on hand with lot SN-001
- Create Receipt for 10 units of P -> Confirm
- Open receipt on Barcode App
- Scan "SN-002" => 'undefined' value added to 'dbQuantCache'
- Scan "SN-001" => Uncaught Promise > quantsByLocation is not iterable (cannot read property undefined)
---
## Test result without fix:
```
2025-07-18 09:30:33,801 20801 ERROR oes_test_18 odoo.addons.stock_barcode.tests.test_barcode_client_action_picking: FAIL: TestPickingBarcodeClientAction.test_barcode_lazy_cache_scan_two_lots
Traceback (most recent call last):
File "/home/odoo/projects/odoo-src/multiverse/src/18.0/enterprise/stock_barcode/tests/test_barcode_client_action_picking.py", line 3508, in test_barcode_lazy_cache_scan_two_lots
self.start_tour(url, 'test_barcode_lazy_cache_scan_two_lots', login='admin')
File "/home/odoo/projects/odoo-src/multiverse/src/18.0/odoo/odoo/tests/common.py", line 2264, in start_tour
return self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs)
File "/home/odoo/projects/odoo-src/multiverse/src/18.0/odoo/odoo/tests/common.py", line 2235, in browser_js
self.fail('%s\n\n%s' % (message, error))
AssertionError: The test code "odoo.startTour('test_barcode_lazy_cache_scan_two_lots', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo/147/action-stock_barcode.stock_barcode_picking_client_action", "delayToCheckUndeterminisms": 0})" failed
TypeError: quantsByLocation is not iterable (cannot read property undefined)
at LazyBarcodeCache.getQuants (http://127.0.0.1:8565/web/assets/3d6bda7/web.assets_web.min.js:21482:279)
at BarcodePickingModel._processBarcode (http://127.0.0.1:8565/web/assets/3d6bda7/web.assets_web.min.js:21748:631)
at async http://127.0.0.1:8565/web/assets/3d6bda7/web.assets_web.min.js:21661:75
```
OPW-4942192
Forward-Port-Of: odoo/enterprise#91433
Forward-Port-Of: odoo/enterprise#90492This fix prevents barcode scanning from crashing on iOS when the scan confirmation sound cannot be played. It improves reliability by choosing a better-supported sound format and safely logging sound playback issues instead of interrupting the user.
Original PR description
Issue ----- On iOS 18.5, users can get a `NotSupportedError` when trying to scan a barcode from the (barcode) main menu. Steps to reproduce ----- - Open barcode - Click the center scan button - Scan…
Issue ----- On iOS 18.5, users can get a `NotSupportedError` when trying to scan a barcode from the (barcode) main menu. Steps to reproduce ----- - Open barcode - Click the center scan button - Scan a barcode --> Traceback Discussion ----- There are 2 issues occuring here. 1. We play either an ogg or mp3 file. However, the method to know if the format is supported by the browser returns one of 'probably', 'maybe', ''. https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/canPlayType#return_value This means that when we do https://github.com/odoo/enterprise/blob/70e5013ea022ed04ff27db71ea3ecccb55ae1f70/stock_barcode/static/src/main_menu/main_menu.js#L37 We might end up using ogg even if the browser doesn't actually support it, as 'maybe' is truthy. To reduce the risk of this happening, we can specify the codec as "vorbis" (all ogg files of Odoo are vorbis). This is already done in mail: https://github.com/odoo/odoo/blob/cd4c1d599ea9403ce3791e239ad765d946446a47/addons/mail/static/src/core/common/sound_effects_service.js#L46 2. The browser might not have the permission to play the sound. In such cases, the best we can do is try to play the sound and log potential errors. ----- Ticket: opw-4820022 Forward-Port-Of: odoo/enterprise#91579 Forward-Port-Of: odoo/enterprise#91158
The stool demo bill of materials now uses the correct color attributes instead of mismatched material values. This keeps demo assembly steps clear and accurate for users evaluating or testing manufacturing workflows.
Original PR description
Versions -------- - saas-18.4+ Steps ----- 1. Install demo data; 2. open the Stool BoM; 3. check assembly steps. Issue ----- Mismatch between product attribute colors & materials. Cause ----- Commit f7ad739fd4b4 updated product attribute demo data. It replaced color with materials, and didn't account for attribute ordering being alphabetical instead of by time of creation. Solution -------- Change material attributes back to color attributes for stool demo data, and order attributes alphabetically to prevent confusion. Also provide unique references to product attribute value records to ensure the correct attribute value gets linked to the BoM lines. opw-4989005 Forward-Port-Of: odoo/enterprise#91611
The Sign option in Documents no longer appears in the general Action menu for list views or folders by default. This prevents users from seeing a signing action unless it has been explicitly enabled for the folder, reducing confusion and keeping workflows aligned with configuration.
Original PR description
**Before this PR:** 'Sign' option is present in 'Action' button even if its not enabled via folder action in list view. And it is available for folders too. **Technical reason:** 'Sign' button was binded in list view via this commit: https://github.com/odoo/enterprise/commit/4254542e8fb4ce3b2b9b46c624d86f7fcac8df7b We don't need binding as we have a seperate flow in documents **After this PR:** 'Sign' option will only enabled when enabled in folder action. And will not be present in 'Action' button. Task-4829548
The salary configuration form now leaves the state field genuinely blank when no state is chosen. This prevents new employee records from being created with an unintended default state, improving data accuracy.
Original PR description
When using the salary config, the state (private_state_id) shows that no state is set, but the selector actually thinks the first element is selected. So when the employee is created, the state is set anyway. This forces the selector to not have anything selected by default. Task: 4904118 Forward-Port-Of: odoo/enterprise#89958
In Luxembourg and Romania localization flows, choosing a free app will no longer automatically install Accountant unless Accountant is the selected free app. This prevents unwanted app installations and keeps customer setups aligned with their choices.
Original PR description
When choosing one app free in these countries, Accountant is automatically installed. This should only be the case when Accountant is the one app free. Fix: Change the auto-install dependencies to ensure that these modules are only installed when Accountant is already installed. Forward-Port-Of: odoo/enterprise#91662 Forward-Port-Of: odoo/enterprise#91627
18 changes
Resolved issues and error corrections
This fix prevents the calendar work location setup from crashing when a user clears the date field. Employees and HR users can now avoid an unexpected error while setting remote work locations, improving reliability of the workflow.
Original PR description
Currently, an error occurs if the date is missing when setting a work location via the calendar. **Steps to reproduce:** - Install the `hr` module. - Activate the **Remote Work** feature from the…
Currently, an error occurs if the date is missing when setting a work location via the calendar. **Steps to reproduce:** - Install the `hr` module. - Activate the **Remote Work** feature from the employee settings. - Open the Calendar (Month view), hover over a date, and click **Set Location** (or location icon). - Remove the date in the wizard and unfocus the field. **Error:** `AttributeError - 'bool' object has no attribute 'strftime'` This error occurs when the `date` field is `False`, and `_compute_day_week_string` attempts to call `strftime()` on a boolean value - [1]. After addressing the compute function issue, saving the record without a date results in another issue during employee location setup, where `weekday()` is called on a boolean - [2]. [1] - https://github.com/odoo/odoo/blob/e787d0a642bd710a8a80f8abc660c3ff4a385740/addons/hr_homeworking/wizard/homework_location_wizard.py#L25 [2] - https://github.com/odoo/odoo/blob/e787d0a642bd710a8a80f8abc660c3ff4a385740/addons/hr_homeworking/wizard/homework_location_wizard.py#L35 This commit prevent the computation if the `date` field is not set. Sentry - 6658596690 Forward-Port-Of: odoo/odoo#213308
The invoicing dashboard now uses customer credit notes, rather than vendor credit notes, when calculating top countries, categories, products, and salespeople. It also excludes draft and cancelled entries when users open the Top Invoices view, improving the accuracy of reported sales information.
Original PR description
Problem:- In Invoicing Dashboard, in some parts we get wrong values because of wrongly set domain making dashboard consider Vendor Credit Note instead of Customer Credit Note. Before this commit:- - In Invoicing Dashboard, reports Top Countries, Top Categories, Top Products, and Top Salespeople considers Customer Invoice and Vendor Credit Note. - When clicked on Top Invoices, moves in draft and cancel state are also displayed. After this commit:- - In Invoicing Dashboard, reports Top Countries, Top Categories, Top Products, and Top Salespeople considers Customer Invoice and Customer Credit Note only. - When clicked on Top Invoices, moves in draft and cancel state are not displayed. task-4851920 Forward-Port-Of: odoo/odoo#213723
Point of Sale now blocks duplicate orders, order lines, and payments when requests happen at the same time. This helps keep sales records accurate and avoids duplicate charges or reporting errors.
Original PR description
Before this commit, it was possible for concurrent requests to create duplicate PoS orders, order lines, and payments. This was due to the absence of unique identifiers at the database level for these records during their creation. This commit addresses the issue by adding SQL unique constraints on the UUID fields for the `pos.order`, `pos.order.line`, and `pos.payment`. These database-level constraints ensure that any attempt to insert a duplicate record (based on its unique UUID) will be rejected, thereby preventing data duplication and maintaining transactional integrity. opw-4899804 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Grouped vendor bill payments made by check now keep each journal entry label aligned with its actual check number. This avoids duplicate or misleading check references in accounting records, improving payment traceability and reconciliation accuracy.
Original PR description
Steps to reproduce: 1. Install `accounting` and `account_check_printing` modules. 2. Configure a bank journal: - Enable the `Manual Numbering` option for checks. - Set an `Outstanding Payments…
Steps to reproduce: 1. Install `accounting` and `account_check_printing` modules. 2. Configure a bank journal: - Enable the `Manual Numbering` option for checks. - Set an `Outstanding Payments Account` for checks under the `outgoing payments` tab on the journal. - Ensure the Check Sequence is properly configured. 3. Create three vendor bills (two for the same vendor and one for a different vendor). 4. Go to the list view of vendor bills and select all three of them. 5. Click the `Pay` button and in the payment wizard: - Enable the `Group Payments` option. - Choose `Checks` as the payment method. - Confirm the wizard to register the payment. Observed Behavior: - Multiple payments are created simultaneously. - Each payment has its own check number (e.g., 0001, 0002), correctly assigned. - However, all the related journal entries (account.move) have journal item labels that incorrectly use the same check number (e.g., all journal items have label Check - 0001 instead of Check - 0001, Check - 0002, etc.). Issue: - Journal entries are created during payment creation `create()`, at which point the payments are still in draft state. - The check_number is only computed and the check sequence is incremented when the payment is posted `action_post()`. - As a result, all journal entries generated during draft state receive the same initial check number. Solution: - Override the `_get_trigger_fields_to_synchronize` method to include the `check number`, ensuring that any updates to the check number on a payment are also reflected in the related journal entries. opw-4886452
Survey timers now account for smaller differences between a user's device clock and the server clock. This prevents surveys from being submitted too early or accepted too late, reducing confusing errors and keeping timed surveys fair for all participants.
Original PR description
Description of the issue/feature this PR addresses: This commit addresses early submissions of surveys due to timer expiry. Differences in server/client clocks can leave the survey in an incorrect…
Description of the issue/feature this PR addresses: This commit addresses early submissions of surveys due to timer expiry. Differences in server/client clocks can leave the survey in an incorrect state. Current behavior before PR: The server, seeing a submission come before the time limit that was triggered by the client timer, lets the survey continue. Clients are receiving error messages when trying to do more submissions, which bump against the cheating prevention. This is true if the client is "ahead" of the server. Currently, a difference would only be addressed if above 5 s. This is not enough as the client being "ahead" by 1 s can cause this issue. This was detected in real use. Looking at server logs has led me to this cause. Here's a diagram that could help understand the issue with the current behaviour: <img width="455" alt="Survey Timer bug" src="https://github.com/user-attachments/assets/1804f848-ad4b-4b8a-97fe-7562b76ea66c" /> The above diagram shows how, for a survey with a 30 min timer, a 1 sec difference between the clocks can lead to an early submission. Desired behavior after PR is merged: The fix here is to tighten when to apply the time difference to when it is above 500 ms. This should help avoid the early submission bug but conversely also not allow late submissions, even below 5 s, making the timer fair across users. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220431 Forward-Port-Of: odoo/odoo#207485
Changing the journal on a payment no longer resets the selected partner to the journal company's partner. This prevents unintended data changes and lets users choose the correct partner when adjusting payment details.
Original PR description
Reproducing steps: - Create a payment and select a journal. - Partner is set to the journal's company partner. - Try to change the journal manually. Before this PR: - Partner is reset to the journal's company partner. - Cannot assign a different journal for the journal's company partner. After this PR: - Removed unwanted compute dependency. - Partner is no longer reset and can be changed manually. opw-4769153
This update fixes grammatical errors in invitation and password reset notifications. The change improves the clarity and professionalism of messages users receive during account signup and password recovery.
Original PR description
**Before this commit:** - The notifications for `Send an Invitation Email` and `Send Password Reset Instructions` contained grammatical mistakes. **After this commit:** - The grammatical mistakes have been corrected. task-4975439 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Opening a payment link for an unpaid invoice could fail because the payment amount was handled incorrectly. This update corrects that handling so customers can open payment links and proceed with payment without encountering an error.
Original PR description
Versions
--------
- 18.0+
Steps
-----
1. Go to Accounting/Invoicing;
2. open an unpaid invoice;
3. generate payment link;
4. open payment link.
Issue
-----
Traceback on a `ValueError`.
Cause
-----
Commit 5697493e00915 added a `amount and float('amount')`, trying to convert a string into a float.
Solution
--------
Convert the variable into a float instead.
opw-4996783Products received from purchase orders with a 100% discount are now valued at zero instead of using the product's standard price. This keeps inventory valuation aligned with the actual purchase cost and prevents overstated stock value.
Original PR description
**Current behavior:** Receiving some real-time valuated, non-standard cost product from an order with 100% discount will value the product at its `standard_price`. **Expected behavior:** Valuated at 0. **Steps to reproduce:** 1 Create an average cost, real-time valuated product with non-zero `standard_price` 2. Create a purchase order for some of the avco product, confirm and receive 3. Create and post the bill -> check valuation from inventory **Cause of the issue:** Currently from 6ba1106ae we will ignore a 100% discount in calculating `_get_gross_unit_price()`. **Fix:** Return 0 in this method if we are in a 100% discount case. opw-4862883 Forward-Port-Of: odoo/odoo#217726
Dropship delivery slips using the DIN 5008 layout no longer show the vendor's VAT beneath the customer's address. This prevents confusing or incorrect tax information from appearing on customer-facing delivery documents.
Original PR description
When printing the delivery slip of a dropship operation using the DIN 5008 layout, the customer's address is correctly displayed, but the VAT of the vendor is shown beneath it. This is misleading.…
When printing the delivery slip of a dropship operation using the DIN 5008 layout, the customer's address is correctly displayed, but the VAT of the vendor is shown beneath it. This is misleading. Actually we do not need vat at all.
**Step to reproduce:**
- Install `l10n_din5008_stock` and `sale_management`
- Go to setting
-> configure document layout -> set `DIN 5008` as layout
-> enable `dropshipping`
- Create a product, enable Purchase, and select Dropship route.
- Assign Azure Interior as the vendor in purchase tab.
- Create a SO with that product and Deco Addict as customer, confirm it
- Click on purchase smart button, confirm it, click on dropship smart button
- print delivery slip Observation: Below the customer's address, the vendor's VAT is printed.
**Issue:**
- issue lies in this condition
- `not (o.picking_type_id.code == 'outgoing' and main_address.id != o.partner_id.commercial_partner_id.id)`
- as `o.picking_type_id.code` is `dropship`
- here, condition evaluates to true, which incorrectly assumes the customer and vendor is same, and prints partner i.e vendor's VAT
**Fix:**
- no need to display vat,so we remove it
<img width="1519" height="244" alt="image" src="https://github.com/user-attachments/assets/d8630fa5-c568-4208-a97e-7e4ceb371109" />
**Before**
<img width="803" height="366" alt="image" src="https://github.com/user-attachments/assets/e2148bb0-7413-4efe-b312-ba7a577e0b62" />
**After**
<img width="615" height="244" alt="image" src="https://github.com/user-attachments/assets/526cfae3-4d8b-4755-b59c-54dfce79526c" />
opw-4929680
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#218757Printing an Indian eWaybill no longer fails when the government API response does not include an expiry date. The report now handles the missing date gracefully, helping users continue document printing without interruption.
Original PR description
**Backport of https://github.com/odoo/odoo/commit/074a7b74be59a77cb161b7de33317c970416e08a** Steps to reproduce: Traceback occurs when printing the eWaybill. When the eWaybill expiry date is not present in the JSON response, any usage of date.strftime(...) caused a traceback. This fix ensures the date is checked before formatting to prevent such errors. Possible issue due to when API fails to return the expiry date opw-4991251 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221750
Bank reconciliation now applies the configured analytic distribution when an early payment discount is recorded. This keeps discount-related accounting lines consistent with manually registered payments and improves accuracy of analytic reporting.
Original PR description
# Steps to reproduce: - Configure an early discount payment term (e.g., 2/7 Net 30). - Configure the analytic distribution model with the account used when a discount is granted (e.g., 657000 on the…
# Steps to reproduce: - Configure an early discount payment term (e.g., 2/7 Net 30). - Configure the analytic distribution model with the account used when a discount is granted (e.g., 657000 on the BE fiscal position). - Create an invoice using the early discount payment term. - On bank reconciliation, register the transaction taking into account the early payment discount (e.g., 98% of the invoice amount_total). On the third line with account 657000, corresponding to the early discount payment, the analytic distribution model does not apply. In contrast, when manually registering a payment for the invoice, the analytic is correctly applied. When the bank reconciliation lines are created, _lines_check_apply_early_payment_discount gets its values for the early payment lines from _get_invoice_counterpart_amls_for_early_payment_discount_per_payment_term_line, which does not check if there is an analytic distribution model. enterprise pr: https://github.com/odoo/enterprise/pull/90641 opw-4868986 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217933
The barcode scanner now handles invalid GS1 date values without causing an Odoo error. This improves reliability for users scanning barcodes that contain malformed or unexpected date information.
Original PR description
**Current behavior:** Traceback if an invalid date is input in the barcode scanner where a gs1 rule is matched and expects a numerical date representation. **Expected behavior:** No traceback **Steps to reproduce:** 1. enable gs1 nomenclature, scan a barcode from the main menu like: `15123456` -> `15` should preceed a date like: 'yy-mm-dd' opw-4825538 Forward-Port-Of: odoo/odoo#217663
The online shop now disables the Add to Cart button and shows a loading state while an item is being added. This helps prevent customers from accidentally adding the same product multiple times, reducing order mistakes and support issues.
Original PR description
This PR prevent users from clicking the "Add to Cart" button multiple times by adding a loading effect and disabling the button while the request is in progress. task-4979205
Adds test coverage to ensure early payment discounts created through bank reconciliation receive the correct analytic accounting details. This helps prevent inconsistencies between bank reconciliation and manual payment registration, improving financial reporting accuracy.
Original PR description
This commit adds a test for the following issue: - Configure an early discount payment term (e.g., 2/7 Net 30). - Configure the analytic distribution model with the account used when a discount is granted (e.g., 657000 on the BE fiscal position). - Create an invoice using the early discount payment term. - On bank reconciliation, register the transaction taking into account the early payment discount (e.g., 98% of the invoice amount_total). On the third line with account 657000, corresponding to the early discount payment, the analytic distribution model does not apply. In contrast, when manually registering a payment for the invoice, the analytic is correctly applied. community pr: https://github.com/odoo/odoo/pull/217933 opw-4868986 Forward-Port-Of: odoo/enterprise#90641
A small rounding difference could make eWallet payments appear slightly underpaid in Mexican point of sale orders, blocking users from reaching the payment screen. The fix treats tiny rounding differences correctly so valid payments can proceed as expected.
Original PR description
Before this commit, paying an order with eWallet could result in a small negative residual amount (due to tax calculation), instead of zero. This prevented users from proceeding to the payment screen. With this commit, the "lt" function is used to compare amounts while taking rounding precision into account, ensuring the residual is treated as zero when appropriate. opw-4867365
This fix updates the DHL delivery integration to send commodity code information using the field name expected by DHL's API. It helps prevent shipment creation issues when commodity codes are included, improving reliability for DHL Express deliveries.
Original PR description
Changed the field name in commodityCodes from `code` to `value` to match with DHL API documentation. Check ticket log notes for details of DHL documentation. opw-4892324 Forward-Port-Of: odoo/enterprise#91645
The update prevents hidden bank reconciliation widget models from appearing in model selection fields where they can cause errors. This avoids crashes in places like Knowledge when users configure properties and improves reliability without changing normal accounting workflows.
Original PR description
To reproduce this issue, just try to perform a name_search/search_count/etc.. on `BankRecWidget` for example: - Example of Steps in Knowledge: - Open knowledge - Create an article - Create another article in the first one (child) - Add a properties - Select `Bank reconciliation widget` in Model - Traceback `BankRecWidget` and `BankRecWidgetLine` use ```py _auto = False _table_query = "0” ``` to avoid being stored in db. This kind of model doesn't work with several methods of the model api, such as `search_count`, `name_search` etc... This commit will add a models blacklist via ir_model._is_valid_for_model_selector opw-4763713 Forward-Port-Of: odoo/enterprise#88352