Daily updates from Odoo
Monday, February 16, 2026
131 changes
37 changes
Resolved issues and error corrections
This update ensures that pickings are automatically created when validating POS orders linked to sale orders. Previously, stock levels weren't updated correctly if pickings were scheduled for the end of a POS session. This fix provides more accurate stock management for point-of-sale transactions.
Original PR description
Before this commit, when validating a POS order linked to a sale order, if the Inventory Management was configured to create pickings at the end of the session, no picking was created for the order, and the sale order stock was not updated. This commit fixes this issue by ensuring that the picking is created for the imported sale orders in real time. opw-5423113 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248424 Forward-Port-Of: odoo/odoo#244739
This update fixes an issue where the record count wasn't correctly displayed alongside group labels in list views. Previously, the count was appearing in unrelated columns, creating a confusing user experience. This change ensures the grouped record count is now consistently shown next to the group label, improving clarity and usability.
Original PR description
Currently, when applying a `Group By` filter in `list views`, the record count is displayed far from the group label. **Steps to reproduce:** - Open `Apps` and switch to the list view. - Apply a…
Currently, when applying a `Group By` filter in `list views`, the record count is displayed far from the group label. **Steps to reproduce:** - Open `Apps` and switch to the list view. - Apply a `Group By` filter (e.g., Author). - Observe where the grouped record count is displayed. **Observation:** The total number of records is rendered under unrelated columns rather than being displayed next to the group label. **Root Cause:** After commit [1], the `ms-auto` class at [2] causes the `group count` to be moved away from the group label. **Fix:** This commit ensures that the grouped record count is displayed next to the group label, consistent with previous versions. **Before:** <img width="1909" height="466" alt="5438766_before" src="https://github.com/user-attachments/assets/3ac44b19-2dad-4f01-ab78-8f456405e4d5" /> **After:** <img width="1905" height="453" alt="5438766_after" src="https://github.com/user-attachments/assets/ce0143e5-feeb-49ee-8d42-5235add669e4" /> [1]: https://github.com/odoo/odoo/pull/235250/commits/963696f4839b3043226ac118bf6a4ae8e8e92823 [2]: https://github.com/odoo/odoo/blob/25c372b254cec8635bb73b04c7729530f8a08e72/addons/web/static/src/views/list/list_renderer.xml#L247 opw-5438766
This update resolves a minor issue that prevented the application from functioning correctly when using the Ukrainian language. The fix addresses a problem with how the system retrieves language patterns, ensuring a more reliable experience for users in Ukrainian. This change improves overall application stability.
Original PR description
**Steps to Reproduce:** 1. Install `stock_fleet` module (with demo data). 2. Set the **Ukrainian** language for the user. 3. Open Fleet > Vehicle > Click Category Error: `KeyError: '2'` **Cause:** Babel's CLDR list patterns for some locales (e.g., Ukrainian 'unit-short') do not include the two-item pattern key, so when babel's `format_list` attempts to access patterns, it will raise an error. **Fix:** This commit wraps the call in a try/except that handles KeyError and retries formatting with the 'standard' style to avoid the crash. Forward-Port-Of: odoo/odoo#248519 Forward-Port-Of: odoo/odoo#248228
This update fixes a potential crash in the Italian EDI invoicing process when invoices are created with zero amounts in a foreign currency (like USD). The issue stemmed from a division-by-zero error during currency conversion. The fix ensures the system handles zero amounts gracefully, preventing errors and ensuring invoices can be generated correctly.
Original PR description
**Steps to reproduce:** 1. Install the `l10n_it_edi` and switch to IT company 2. Go to Accounting → Invoice. 3. Create an invoice add partner and change the currency to USD 4. Add a product and apply tax and discount of 100% and confirm 3. Click on Send **Issue:** A ZeroDivisionError is raised during the Italian EDI XML generation. `ZeroDivisionError: float division by zero` **Cause:** The conversion rate is computed by dividing `amount_total` by `amount_total_signed` without handling the case where `amount_total_signed` is `0.0`. **Solution:** Skip the conversion rate computation when the signed total amount is zero, preventing the division by zero **opw-5481821** Forward-Port-Of: odoo/odoo#245087 Forward-Port-Of: odoo/odoo#244423
This update corrects a previous issue where taxes related to GST, TDS, and TCS registration remained active even after the registration settings were disabled. Now, when a user removes these registrations, the associated taxes are automatically deactivated, ensuring accurate tax calculations and compliance. This simplifies tax management for users.
Original PR description
Before this PR: - When enabling TDS, TCS, or GST registration from settings, related taxes are activated, but when disabling these settings, the taxes remain active. After this PR: - When disabling TDS, TCS, or GST registration, all related taxes are deactivated. task-5456351 Forward-Port-Of: odoo/odoo#242030
This update corrects a flaw in the forecasting system that previously didn't account for materials used in production. Now, daily demand calculations accurately reflect the consumption of components within manufacturing orders, leading to more reliable inventory predictions. This ensures better production planning and reduces potential stockouts.
Original PR description
The daily demand in forecasting does not take into consideration the product that are used for production. Steps to reproduce: ------------------- * Install stock and mrp * Create a tracked Product…
The daily demand in forecasting does not take into consideration the product that are used for production. Steps to reproduce: ------------------- * Install stock and mrp * Create a tracked Product "Component" with RR * Add some "on hand quantity" * Create Product "Product" with a BOM that use "Component" * Create a manufacturing order for "Product" and confirm it * Go back on the RR of "Component" and use "resplenishment information" button (small i) -> Daily demand does not reflect the "Component" used for manufacturing. Observation: ------------- When Opening the resplenishment information, the daily_demand is calculated: https://github.com/odoo/odoo/blob/c38346ccc3e44670b76bfb010795bdfa7004b532/addons/stock/wizard/stock_replenishment_info.py#L177 For that calculation quantity_out is used, obtained just before: https://github.com/odoo/odoo/blob/c38346ccc3e44670b76bfb010795bdfa7004b532/addons/stock/wizard/stock_replenishment_info.py#L164-L167 Since it only consider moves that goes directly to the client, it will not take into consideration products that are used for production. opw-5497584 Forward-Port-Of: odoo/odoo#246125
This update fixes an issue where the total amount for invoice sections was incorrectly positioned in the PDF reports for the l10n_in tax module in Russia. The change adds the necessary column to align with product HSN/SAC reporting, ensuring accurate invoice summaries. This improves the clarity and accuracy of invoices generated for Russian businesses.
Original PR description
How to reproduce : - With l10n_in company - Create Invoice - Add section - Add product under section - Confirm invoice - Print to pdf The problem : The value for the total amount of the section is in the wrong column (the one to the left) Why : The l10n_in module adds a column in the report for the HSN/SAC of the products. It correctly did for the products and the table title but not for the sections. opw-5879828 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246768
This update fixes an issue where the HTML editor toolbar remained visible on mobile devices when the side menu or a popover was open. Now, the toolbar disappears automatically when these elements are active, providing a cleaner and more user-friendly mobile experience. This enhancement ensures a better workflow for users editing content on their phones.
Original PR description
In mobile, when the side menu or a popover is opened, the toolbar remains displayed above the keyboard. This commit hides the mobile toolbar while such elements are opened. Steps to reproduce: - In mobile, go to a "To do" note - Put cursor inside text to display the toolbar - Open the hamburger menu => The toolbar remained displayed on top of the side menu - Open the gear menu => The toolbar remained displayed while the menu was opened task-5222582 Forward-Port-Of: odoo/odoo#247389 Forward-Port-Of: odoo/odoo#241611
This update resolves an issue where users could incorrectly modify attendance records. The change now prevents unauthorized updates to attendance data, ensuring data integrity and accuracy. Added test coverage to confirm the fix.
Original PR description
Closes [odoo/odoo#226007](https://github.com/odoo/odoo/issues/226007). Description of the issue/feature this PR addresses: Prevents a user from updating their attendance record by changing the employee to the one whose attendance is not managed by the current user. Current behavior before PR: - Assign the Officer Group of Attendance group to a user. - Assign the user as the attendance manager of itself. - Login with that user. - Create an attendance record for the employee and save it. - Try to change the employee and save; an error will be thrown as expected. - Go to the Attendance menu; the record will still be saved. Desired behavior after PR is merged: This commit ensures that un-allowed write does not take place + test coverage added. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243719 Forward-Port-Of: odoo/odoo#226335
This pull request fixes a problem where invoice descriptions were not consistently displayed when printing invoices, particularly with factur-x e-invoices. The update ensures that both the custom description and product names are correctly printed, improving invoice accuracy and compliance. This resolves issues reported by users importing factur-x invoices.
Original PR description
**Issue 1** Steps to reproduce: - Create a new invoice - Add an invoice line, with just a description - Save - On the same line, add any product - Print Issue: Only the custom description will be visible on the line opw-5471809 --- **Issue 2** Steps to reproduce: - Import factur-x e-invoice - Print pdf Issue: Only product name will be printed, even if the invoice record include the complete description opw-5471809 Forward-Port-Of: odoo/odoo#248010
This update resolves a memory issue that occurred when Odoo processed large amounts of email data. The fix optimizes how recordsets are handled, preventing excessive memory allocation and ensuring stable performance, particularly when dealing with many records. This improves the overall reliability of Odoo's email functionality.
Original PR description
**Issue Description :** In _mail_group_by_operation_for_mail_message_operation [function](https://github.com/odoo/odoo/blob/a1f4c98ec025cb36b218072f5557c93d5f329929/addons/mail/models/models.py#L77).…
**Issue Description :**
In _mail_group_by_operation_for_mail_message_operation [function](https://github.com/odoo/odoo/blob/a1f4c98ec025cb36b218072f5557c93d5f329929/addons/mail/models/models.py#L77).
The memory error occurred due to recordset concatenation triggered by: [operation_documents[record_operation] += record](https://github.com/odoo/odoo/blob/a1f4c98ec025cb36b218072f5557c93d5f329929/addons/mail/models/models.py#L83)
This resulted in repeated recordset concatenations inside a loop. Since recordsets are immutable, each concatenation [creates a new recordset](https://github.com/odoo/odoo/blob/a1f4c98ec025cb36b218072f5557c93d5f329929/odoo/orm/models.py#L5874) and reallocates the underlying tuple of IDs. When processing a large number of records this caused memory growth.
**Solution:**
Replace iterative recordset concatenation.
- Collect record IDs using Python sets (O(1) insertion).
- Build recordsets once per operation after the loop.
- Apply with_prefetch() only once per operation.
**Traceback:**
```
File "/home/odoo/src/odoo/saas-19.1/addons/mail/models/mail_message.py",
line 397, in _search
allowed_ids.update(self._find_allowed_doc_ids(model_ids))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.1/addons/mail/models/mail_message.py",
line 428, in _find_allowed_doc_ids
operation_res_ids =
records_all._mail_group_by_operation_for_mail_message_operation('read')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.1/addons/mail/models/models.py", line 83,
in _mail_group_by_operation_for_mail_message_operation
operation_documents[record_operation] += record
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/models.py", line 5851, in
__add__
return self.concat(other)
^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/models.py", line 5864, in concat
ids.extend(arg._ids)
MemoryError
```
opw-[5915534]
upg-[3878714]
tgb - 2445
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-prThis update resolves a visual bug where product arrows within snippets were incorrectly positioned, particularly when the snippet was set to full width. The fix ensures arrows appear correctly regardless of snippet size or scrolling mode, improving the overall presentation of product listings on the website. This enhances the user experience and consistency of product displays.
Original PR description
*: website_sale Since commit [1], the position of the arrows in the product snippet was broken when they were set to appear at the bottom. It also fixes the arrow positioning when the snippet is set…
*: website_sale Since commit [1], the position of the arrows in the product snippet was broken when they were set to appear at the bottom. It also fixes the arrow positioning when the snippet is set to full width, with the title displayed on the side and "Scrolling Mode" set to "All." This commit correctly adjusts the arrow positioning. [1]: https://github.com/odoo/odoo/commit/54fde5da6c229a7173c5b4c042b3330598db3904 task-5935743 | Before | After | |--------|--------| | <img width="1617" height="635" alt="Capture d’écran 2026-02-13 à 09 40 36" src="https://github.com/user-attachments/assets/21e3545c-e243-4ee7-9fd5-51ca06b8c496" /> | <img width="1620" height="664" alt="Capture d’écran 2026-02-13 à 09 39 14" src="https://github.com/user-attachments/assets/6dcdfc0f-6dc8-4293-9d23-ea36d19fc2b4" /> | | <img width="1921" height="719" alt="Capture d’écran 2026-02-13 à 11 12 22" src="https://github.com/user-attachments/assets/8916438c-8108-43ec-a70a-aba8c83ba881" /> | <img width="1918" height="654" alt="Capture d’écran 2026-02-13 à 11 17 21" src="https://github.com/user-attachments/assets/df872f4a-5674-4fff-a0de-b6c99f30acb2" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue preventing users from correctly updating map addresses within the website. The fix eliminates an infinite loop that occurred when changing map locations, ensuring accurate map displays after address modifications. This improves the user experience when using the Google Maps integration.
Original PR description
When we add the google map block and try to change the address, we're unable to do so because of the infinite loop. The issue is due to the onPlaceChanged call inside the onPlaceChanged. We'll use commitPlace instead to commit place's coordinates, then re-render the map to reflect it. Steps to reproduce: 1. Add a google map block. 2. Try to change the address. It doesn't work due to the maximum call size exceeded due to infinite loop. opw-5386094 Forward-Port-Of: odoo/odoo#243679
This update fixes an issue where resetting dynamic colors in SVG illustrations would cause the images to disappear. Now, resetting the color palette restores the correct theme colors, ensuring SVG images remain visible and functional after color adjustments. This improves the user experience when customizing website visuals.
Original PR description
Steps to reproduce: - Insert a media library SVG illustration. - Change one of its Dynamic Colors. - Click the reset button in the colorpicker. => The SVG disappears. Before this commit, resetting a dynamic SVG color could send an empty color value and the image failed to render. After this commit, resetting restores the theme palette colors so the SVG stays visible. task-5868584 Forward-Port-Of: odoo/odoo#248092 Forward-Port-Of: odoo/odoo#245778
This update fixes an issue where the split screen in the restaurant POS module incorrectly showed discount information. The fix ensures that the correct discount value (as a percentage) is displayed, resolving a confusing user experience. This improves accuracy and clarity when splitting bills.
Original PR description
Steps: --- - Configure Restaurant with a global discount. - Open a session and add products. - Apply a global discount. - Open the control buttons and click Split. Issue: --- - The split screen displays the text `With [Object Object]% discount`. Cause: --- - The discount object was rendered directly instead of its value. Fix: --- - Display the correct discount value based on its type. task-5905885 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A recent update prevented the accidental removal of content within HTML editor sections. Previously, pressing 'Delete' after selecting all content could unexpectedly clear the entire section, even when it was designed to be non-editable. This fix ensures that only intended content is removed, improving stability and user experience.
Original PR description
**Steps to reproduce:** - Drop a dynamic snippet, for example Recent Blogs → “Latest Stories”. - Click on the section title. - Press Ctrl + A. - Press Delete. **Description of the issue:** - The content part is removed even though it is inside a contenteditable false container. doing discard after it crash the page. **Cause:** - In `removeNode`, there is no check to prevent removal of children of a contenteditable false element. - As a result, if a contenteditable false element itself is unremovable, the parent node is preserved, but its children are still removed. **Solution:** - In `removeNode`, add a check to return false if node is not `isNodeEditable`. task-5858259 Forward-Port-Of: odoo/odoo#245463
This update fixes an issue where the code editor lost focus after changing the syntax highlighting language. Now, users can seamlessly switch languages without needing to manually re-enter the code. This improves the user experience and efficiency when working with code snippets.
Original PR description
**Description of the issue:** - When a user changes the language of a syntax-highlighted code block, the editor loses focus from the code input. As a result, the user must manually click back into…
**Description of the issue:** - When a user changes the language of a syntax-highlighted code block, the editor loses focus from the code input. As a result, the user must manually click back into the code block to continue typing **Steps to reproduce:** - Insert a syntax-highlighted code block. - Click the language dropdown to change the syntax highlighting language. - Select a different language from the dropdown. The language dropdown closes correctly after selection. Focus does not return to the code block input. Instead, focus remains on the dropdown button. **Cause:** - Although focus is explicitly set back to the code block input after selecting a language, closing the dropdown restores focus to the element that was active when the dropdown was opened . As a result, the input does not receive focus. **Solution:** - For the language selector dropdown, set focusToggleOnClosed = false so that closing the dropdown does not restore focus to the dropdown button. - For the copy button, prevent focus on pointerdown. task-5785595 Forward-Port-Of: odoo/odoo#245161
This update corrects a technical issue where website controllers could incorrectly link to irrelevant model types, leading to potential errors. By restricting controller bindings to concrete models, we’ve enhanced the stability and performance of the Odoo website. This change ensures data integrity and a smoother user experience.
Original PR description
Before this commit, a website_controller_page could be bound to any sort of model. For some of them this was irrelevant or plain wrong: - transient models: they are not pointing to anything relevant business wise - abstract: they cannot even have records, and most of them are mixin - _auto = False: Those are models with a table which is a custom one. The heuristics here is to say that records are not "real" ones. Also, most of these tables are sqlViews or something similar Business wise there were errors because of this, so this commit introduces a constraint that forbids the above use cases. sentry-6842596566 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#246115
This update significantly speeds up the inventory valuation report by optimizing how it calculates inventory values. Previously, the system was performing redundant calculations, leading to slow performance. This change eliminates unnecessary steps and batching processes, resulting in a faster and more efficient report generation.
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 Forward-Port-Of: odoo/odoo#247625
This update adds a system setting to automatically delete old device logs, helping to manage database storage and improve performance. Administrators can now define how long session data is retained, ensuring efficient log management. Careful consideration of database backups is required when setting this retention period.
Original PR description
The res.device.log table contains a huge amount of data. It makes sense to provide a way for administrators to garbage collect these logs according to their retention policy. The `ir.config_parameter` to determine the retention policy is `base.res_device_log_retention_days`. With the hard GC configured, a log will be deleted if its last activity has exceeded the number of days specified in the system parameter. This can remove all traces of a session identifier. The parameter must be chosen judiciously according to the database backups. Note: Put more information in the logs, as this data may be deleted. Task-5928301
This update resolves an issue where Point of Sale would crash when a user created an order containing a combo with an archived product. The fix prevents the system from attempting to access data from the archived product, ensuring a stable Point of Sale experience. This improves reliability for users managing product inventories.
Original PR description
Steps to reproduce: - Archive a product used in a combo. - Open Point of Sale. - Create a new order. - A blank screen appears (error in console) Cause: - The system attempts to access fields of an archived product included in a combo choice. Fix: - Skip loading the combo choice whose product is archived. Task-5936290
This update addresses a recent failure in the automated testing for the Employee Holiday Report. The fix involves ensuring a necessary table is always initialized, resolving an issue identified in a previous Odoo bug report. This ensures the report functionality continues to operate correctly.
Original PR description
Since odoo/odoo#215798 , Click All test has been failing, this commit aims to fix it by introducing a proper _init function to ensure the table exists at any time task-5907217 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where changes made to website translations weren't consistently saved. Now, when editing a translation in one language and switching to another, all delayed translation versions are properly saved, ensuring accurate display across languages. This improves the user experience and data consistency for multilingual websites.
Original PR description
Scenario: - have two languages on website - drop a snippet on a page in main language - go to secondary language => you see the previous page version, and a notification with `Click on…
Scenario: - have two languages on website - drop a snippet on a page in main language - go to secondary language => you see the previous page version, and a notification with `Click on "Edit/Translate" to apply changes made on default language.` is shown - click on Edit: Translate => you see the version with the change from main language applied - save without doing a change Result: nothing is saved Expectation: delayed translations that we are seeing when editing translation should be saved. Cause: Delayed translation (draft version from change of main language) on website were added or disabled with: - 2d08f97c0778469b409fca23f2be5f5a98ce3df8 (October 2023) in 17.0 added the delay translation feature - 0e0a74f8c5fc9f45311e629a76608c6c986d635d (December 2023) in 17.0 disabled the feature - 03a85b13b2c46ef7174123d902e95d5103031c6c (September 2025) in 19.0 enabled the feature again Currently delayed translations are only updated if there is a part of that translation that has been edited and is dirty. Fix: when we save translations, we should also save o_delay_translation that are not dirty. These translations if there is a delayed translation will publish the delayed translation. opw-5187670 opw-5240423 opw-5250497 opw-5254832 opw-5344412 opw-5347408 opw-5419427 opw-5424761 opw-5892371 Forward-Port-Of: odoo/odoo#238696
This update resolves a minor issue in the HTML editor that could occasionally cause errors. The fix uses a technique called 'optional chaining' to safely access the previous sibling element, preventing the error when the element is missing. This improves the overall stability and reliability of the HTML editor.
Original PR description
Before this commit: in rectifySelection, the focusTarget can be null and causing an error when calling the previousSibling After this commit: now we do an optional chaining(?.) on previousSibling task-5481248 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248595
This update resolves a problem where font family settings in the mass mailing editor weren't consistently applied. The fix ensures that changes made through the Design Tab correctly override font styles, providing users with greater control over the appearance of their emails. This improves the overall user experience and design flexibility.
Original PR description
There is an issue where some editor descendants have a rule overriding their `font-family` which has more precedence than the inherited `font-family` from the Design Tab. How to reproduce: - create a new mass_mailing - add a text snippet - select all text and change e.g. the `font-size` - open the Design Tab and change the `font-family` of paragraphs Issue: - the text `font-family` does not change Resolution: Fix a css rule applying on every element that is not a `fa` element so that it only applies on the `o_layout` element to let the Design Tab override the `font-family` for specific elements (e.g. `<p>`, `<a>`, ...). task-5869568 Forward-Port-Of: odoo/odoo#245304
This update fixes a technical error in the l10n_hr module where tax group receivable accounts were incorrectly linked to payable accounts. This misconfiguration was preventing accurate tax reporting and financial calculations. The change ensures proper accounting for tax groups, resolving a potential reporting issue.
Original PR description
The receivable accounts were wrongly setup where the receivable account of the tax group was set with the payable account, ... task-5045769 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248842
This update resolves an issue where users with limited inventory access experienced an error when validating recurring product deliveries. The fix ensures the system correctly retrieves necessary invoice information, preventing access restrictions that were blocking the validation process. This improves the reliability of recurring subscription deliveries.
Original PR description
When a user that only has inventory access right validate a delivery that has an recurring product it will trigger an access right error. Steps to reproduce: ------------------- * Install sales,…
When a user that only has inventory access right validate a delivery that has an recurring product it will trigger an access right error. Steps to reproduce: ------------------- * Install sales, inventory, subscription, * Create a subscription product * Create and validate a sale order with this product and a recurring plan * Connect to Odoo with an user that only has inventory user right * Validate the delivery -> Access Error Observation: ------------- When we validate the delivery,we call button_validate that will call [_action_done](https://github.com/odoo/odoo/blob/93fa6d9fff63534cfa9251e21fc82797d8b83468/addons/stock/models/stock_picking.py#L1427) During this we try retrieve invoices information [here](https://github.com/odoo/enterprise/commit/b07b1c47c97bb6d6da9fa61dacb5cba66aff2a16#diff-dbf7b40a6942fbcc81ebc4c3009a8a37a5a620cffac74889bd0ff2bccd52b1e3R30-R36). The issue is that this user doesn't have access right to several records: * sol.order_id.invoice_ids -> sale.order.invoice_ids * sol.order_id.last_invoice_date -> sale.subscription.plan opw-5869446 Forward-Port-Of: odoo/enterprise#106623
This update resolves an issue where users were encountering an error when editing reconciled invoice lines within the bank statement reconciliation process. The fix initializes necessary variables to prevent a runtime error, ensuring users can successfully adjust reconciled amounts and maintain accurate bank statement records.
Original PR description
Currently, an error occurs when user edits a reconciled line. **Steps to Reproduce([Video](https://drive.google.com/file/d/18dSAsZCl---wfCkMBfyo9LviTqgq3qpK/view)):** - Install the `Accounting`…
Currently, an error occurs when user edits a reconciled line. **Steps to Reproduce([Video](https://drive.google.com/file/d/18dSAsZCl---wfCkMBfyo9LviTqgq3qpK/view)):** - Install the `Accounting` module. - Create an `invoice` with an `invoice line` having an amount greater than zero. - `Confirm` the invoice. - Go to the `Bank journal` and create a `statement line` with the same amount as the invoice. - Click `Reconcile` on that `statement line` and select the newly `created invoice line`. - Click the `pencil icon` to edit the line, enter a `positive amount` in the Balance field, and save. `UnboundLocalError: local variable 'original_base_lines' referenced before assignment` The error occurs because, when a specific condition [1] becomes true, the variables original_base_lines and original_tax_lines are expected to be defined. However, if reconciled_lines_ids is present in move_line_to_edit, these variables are never initialized and are later referenced, causing the UnboundLocalError [2]. This commit ensures that original_base_lines and original_tax_lines are initialized to None, which prevents the error. [1]- https://github.com/odoo/enterprise/blob/fa4bbc20f25ec12c609ebbf37885e48900619de5/account_accountant/models/account_bank_statement.py#L1393-L1394 [2]- https://github.com/odoo/enterprise/blob/fa4bbc20f25ec12c609ebbf37885e48900619de5/account_accountant/models/account_bank_statement.py#L1410-L1411 sentry-7189027839 Forward-Port-Of: odoo/enterprise#104432
This update corrects a bug that prevented invoices with product lines having a price of zero in the Mexican (mx) tax module from being saved. The fix ensures that required tax object fields are correctly populated, resolving a critical issue for users creating invoices with zero-priced items. This improves invoice creation functionality for mx clients.
Original PR description
**PROBLEM** If you create an invoice, and add a line with a product with a price of 0, you cannot save the invoice. **STEP TO REPRODUCE** 1. On a mx company, create an invoice for a mx client. 2. Add a line with a product with a price of 0. 3. Try saving the invoice, it will fails. **CAUSE** Field `l10n_mx_edi_tax_object` is required on invoice line with mx company. However, for lines with a price of 0, it is not set by `_compute_l10n_mx_edi_tax_object` because `_l10n_mx_edi_cfdi_invoice_line_ids()` filters them. opw-5402045 Forward-Port-Of: odoo/enterprise#103981
This update corrects an issue where rental order display names were failing due to incorrect data being used. The fix ensures consistent and accurate partner name display by utilizing the `display_name` field, preventing errors when contact names are missing.
Original PR description
Steps to produce: --- - Install `sale_renting` and `contacts` modules. - Go to contact and open `yourcompany` record. - Add a new contact of type Delivery and save (leave the name empty). - Go to…
Steps to produce: --- - Install `sale_renting` and `contacts` modules. - Go to contact and open `yourcompany` record. - Add a new contact of type Delivery and save (leave the name empty). - Go to Rental > New Order. - Select YourCompany, Delivery as the customer. - Add a rental product and confirm the order. - Open the Schedule view. Traceback: --- `TypeError: sequence item 0: expected str instance, bool found`. Root cause: --- - At [1], the system tries to use the customer's name when computing the display name. However, in this case, the delivery contact has no name, resulting in a False value. This False value is then included in the description list, causing the TypeError when joining the sequence. Solution: --- - Use the partner's `display_name` instead of `name`. The `name` field can be `False` in some cases. The `display_name` field is a computed field that always provides a valid, formatted string by using fallback values such as the company name, parent name, or contact type. This ensures consistency and prevents errors [1] https://github.com/odoo/enterprise/blob/f5fea1d7b40e42b7bc1c323cc9613b1aa347da09/sale_renting/models/sale_order_line.py#L61 opw-5914084 --- Forward-Port-Of: odoo/enterprise#106827
This update resolves an issue where the version of the l10n_be_hr_payroll module was incorrectly referenced. This fix ensures accurate tracking and deployment of the payroll module, maintaining the stability and reliability of financial reporting within Odoo Enterprise. It's a routine maintenance update.
Original PR description
Forward-Port-Of: odoo/enterprise#107482
This update reverses a recent change that exposed sensitive time-off type information to all users within the time-off overview. The change was causing a security vulnerability by displaying private time off details. This fix restores the previous system where time-off colors were based on type, ensuring data privacy.
Original PR description
This commit reverts back the change done to gantt color of time-off overview to be based on time off type instead of employee, which made private information (time off type) available to everyone. Task: 5868354
This update corrects a flaw in the VoIP unit tests by replacing a misleading selector with a more accurate one. The change ensures the tests reliably check for expected conditions, and also streamlines the test code by removing unnecessary assertions. This improves the overall stability of the VoIP functionality.
Original PR description
Introduced by [1]. The use of `:value()` is always truthy, making that assertion useless in the related unit test. Replaced by `:empty` as intended and took the opportunity to remove the non-required extra assertion around that code. [1]: https://github.com/odoo/enterprise/commit/0ff7c35c266c547ed3cc63155ffba54727d43c07
This update resolves a bug that prevented the infinite scrolling of VoIP call history in Chrome. The fix addresses an issue with how the system detects the end of the scrolling area, ensuring all recent calls are displayed correctly. This improvement ensures a seamless user experience for accessing call history.
Original PR description
Since [1], the voip calls infinite scrolling does not work anymore. Steps to reproduce: - Make sure to have at least 14 recent calls - Open the softphone - Go to the recent/history tab - Scroll to…
Since [1], the voip calls infinite scrolling does not work anymore. Steps to reproduce: - Make sure to have at least 14 recent calls - Open the softphone - Go to the recent/history tab - Scroll to the end => You are stuck seeing only the 13 last calls. This was a Chrome-only issue, it works on Firefox. Weirdly, the infinite scrolling works on the contact tab on Chrome too, although this is the exact same implementation and configuration. This is due to the unreliable behavior of IntersectionObserver regarding 0x0 elements. The infinite scrolling implementation in VoIP relies on the visibility of a "dummy" `<span/>` added at the end of the tab. That element has no width or height, making the implementation unreliable. As a stable minimal fix, this restores the feature by making the element have a width and height, without any visual/behavior changes thanks to negative margins and no pointer events on the item. Note that [1] disabled a test that was testing the feature. This commit of course re-enables it. [1]: https://github.com/odoo/enterprise/commit/52b3065993c41c6b7c65dda586a66fdd865b3afd Forward-Port-Of: odoo/enterprise#106658
This update fixes an issue where the month displayed on global invoices linked to POS orders was incorrectly reflecting the invoice creation date instead of the order date. This ensures accurate reporting and compliance with Mexican tax regulations. The fix corrects the 'Meses' attribute in the generated XML.
Original PR description
**PROBLEM** In accounting, if you create a global invoice with an invoice, the attribute `Meses` will be the month of the invoice date. In POS, if you do the same with an order, the attribute `Meses` will be equal to the month the day we create the global invoice, instead of the month of the order date. This is wrong. **STEP TO REPRODUCE** 1. Have an order from the month before (not sure how to do this on a runbot). 2. Create a global invoice. 3. Check the generated xml, and notice the month is wrong. opw-5381607 Forward-Port-Of: odoo/enterprise#107362 Forward-Port-Of: odoo/enterprise#106856
This update corrects a display issue where percentage fields in HR contracts were showing decimal values (e.g., 0.25%) instead of the intended percentage format (e.g., 25%). The underlying calculations remain accurate, and this change ensures a more user-friendly experience when viewing and editing these values. No data was changed.
Original PR description
Percentage fields are stored as a decimal in the DB (0.25) but represent a percent value (25%) The calculations are correct but the display to the user shows 0.25%, this PR fixes that without modifying the values stored on the database task-5350196
This update fixes a previous error where work accident entries were incorrectly being paid on employee payslips. The change adds the necessary entry type to the payroll data, ensuring accurate calculations and proper compensation for work accidents. This resolves a potential financial discrepancy.
Original PR description
The unpaid work accident work entry type was added, but not included in `unpaid_work_entry_type_ids`, causing it to be paid by mistake. Add it to `unpaid_work_entry_type_ids` for the following structures: - structure_type_employee_cp200 - structure_type_employee_cp200_pfi Task: 5484866
7 changes
Resolved issues and error corrections
This update resolves an error that occurred when users attempted to edit reconciled bank statement lines. The fix initializes necessary variables to prevent a runtime error, ensuring the bank reconciliation process functions correctly. This improves stability and prevents data inconsistencies.
Original PR description
Currently, an error occurs when user edits a reconciled line. **Steps to Reproduce([Video](https://drive.google.com/file/d/18dSAsZCl---wfCkMBfyo9LviTqgq3qpK/view)):** - Install the `Accounting`…
Currently, an error occurs when user edits a reconciled line. **Steps to Reproduce([Video](https://drive.google.com/file/d/18dSAsZCl---wfCkMBfyo9LviTqgq3qpK/view)):** - Install the `Accounting` module. - Create an `invoice` with an `invoice line` having an amount greater than zero. - `Confirm` the invoice. - Go to the `Bank journal` and create a `statement line` with the same amount as the invoice. - Click `Reconcile` on that `statement line` and select the newly `created invoice line`. - Click the `pencil icon` to edit the line, enter a `positive amount` in the Balance field, and save. `UnboundLocalError: local variable 'original_base_lines' referenced before assignment` The error occurs because, when a specific condition [1] becomes true, the variables original_base_lines and original_tax_lines are expected to be defined. However, if reconciled_lines_ids is present in move_line_to_edit, these variables are never initialized and are later referenced, causing the UnboundLocalError [2]. This commit ensures that original_base_lines and original_tax_lines are initialized to None, which prevents the error. [1]- https://github.com/odoo/enterprise/blob/fa4bbc20f25ec12c609ebbf37885e48900619de5/account_accountant/models/account_bank_statement.py#L1393-L1394 [2]- https://github.com/odoo/enterprise/blob/fa4bbc20f25ec12c609ebbf37885e48900619de5/account_accountant/models/account_bank_statement.py#L1410-L1411 sentry-7189027839 Forward-Port-Of: odoo/enterprise#104432
This update fixes an issue where the activity menu in web_studio was incorrectly displaying all records for custom models, rather than just those associated with the current user. Now, clicking the activity menu will only show records with activities assigned to the user, improving the user experience and data accuracy.
Original PR description
After commit odoo/odoo@5c5fbc10b7024c7227f03e37897d421bba64df82 , actions spawned by the activities menu have their domain managed by dynamic <filter /> rather than a plain readonly domain. Before this commit, clicking on the activity menu to go to a custom model showed every record, not just ones with activities after this commit, only records with activities assigned to the current user are showed opw-5778806 Forward-Port-Of: odoo/enterprise#106622
This update adjusts the calculation of sickness relapse periods for the Belgian payroll module (l10n_be_hr_payroll). Starting January 1, 2026, the allowed relapse period between sick leaves will increase from 14 to 56 days, aligning with new Belgian tax regulations. This change ensures accurate payroll processing for employees in Belgium.
Original PR description
**Spec :-** Since 01/01/2026, the period between two sick time off to consider it as a relapse has been increased from 14 days to 56 days. **Implementation :-** . Update sickness relapse period from 14 to 56 days if the leave starts from 2026 . Add corresponding tests task-5476174 Forward-Port-Of: odoo/enterprise#104769
This update ensures that the preparation display in the backend accurately reflects changes when a POS order is cancelled or deleted. Specifically, related preparation orders and data are now properly removed, maintaining data consistency and a more accurate view of order history.
Original PR description
**In this commit:** Ensure the preparation display UI is updated when a POS order is cancelled or deleted from the backend. - On order cancellation, the preparation display is refreshed accordingly. - On order deletion, related preparation orders, lines, and states are removed via notify call. Task-5373116 Related: https://github.com/odoo/odoo/pull/240523
This update resolves an issue where Employee Officers were experiencing access errors when editing employee records. By restricting access to salary offer information to HR Managers, the system now prevents unauthorized data access and ensures data security. This allows Employee Officers to continue their work without interruption.
Original PR description
Before: - Editing an employee form as an Employee Officer triggered an AccessError due to mail tracking attempting to read salary_offer_ids on hr.version. After: - salary_offer_ids is now restricted to HR Managers, preventing unauthorized reads during tracking when saving the employee form. Impact: - Employee Officers can edit employee records without encountering access errors. - Access to salary offers remains limited to appropriate managerial roles. Task: 5404676
This update corrects a critical issue in Australian payroll calculations by ensuring tax rules use the correct employee version (historical data) instead of current employee information. This prevents inaccuracies when generating payslips for past periods, particularly with changes to employee tax settings, and guarantees accurate withholding and deductions.
Original PR description
Since the introduction of the employee versioning system, using `employee.field_name` in salary rules is no longer accurate for computations involving historical or specific periods. Accessing fields…
Since the introduction of the employee versioning system, using `employee.field_name` in salary rules is no longer accurate for computations involving historical or specific periods. Accessing fields directly on the `employee` record returns the current values. This creates an issue when a future version exists. For example, if a new version is created for February 2026 with an updated Child Support amount, generating a delayed payslip for January 2026 would incorrectly use the February value (current state) instead of the January value (historical state). This commit updates the Python compute logic in the Australian salary rules to use `version.field_name` instead of `employee.field_name`. The `version` object ensures the data used corresponds strictly to the payslip's period. The following rules/fields are updated to use the version object: - Tax Treatment Category - Additional Withholding Amount - Extra Pay - TFN Declaration - Medicare (Reduction, Exemption, and Levy) - Training Loans - NAT 3093 Amount (Tax Offset) - Child Support (Garnishee and Deduction) A test case is added to verify that a payslip correctly retrieves the child support amount from the version valid during the payslip period, ignoring future updates. Task-5002697
This update resolves a minor issue related to the calculation of scale certificates for European VAT compliance. It synchronizes a key checksum value following a recent fix in the main Odoo project. This ensures accurate reporting and adherence to regulatory requirements.
Original PR description
This commit simply updates the expected scale checksum after the fix in the community PR odoo/odoo#248413. Forward-Port-Of: odoo/enterprise#107445 Forward-Port-Of: odoo/enterprise#107241
19 changes
Resolved issues and error corrections
This update fixes an issue where combo products were incorrectly calculating their total price, resulting in double-billing. The fix ensures that remaining combo amounts are accurately divided by the combo quantity, preventing inflated prices for zero-priced items. This ensures accurate pricing for combo orders.
Original PR description
Step to reproduce: - create two products with 0 price, A and B - create combo choice 'combo' with A and B, with max 2 items , free 2 items - create a combo product "test combo" with this combo choice, set price=40 - start pos and select this product - in combo product selector dialog, select same product 2 time and confirm Observation: - the total price is 80 (double then expected) in product screen Cause: - Remaining combo amount is assigned to the last line unit price. - For zero-price items, remaining amount equals combo price. - as `Total = qty × unit price`, as qty =2 it duplicates the combo price. Fix: - Since we assign unit price, divide remaining amount by combo qty. opw-5868831 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a previous issue where taxes related to GST, TDS, and TCS registration remained active even after the registration settings were disabled. Now, when a user disables these registrations, the associated taxes are automatically deactivated, ensuring accurate tax calculations and compliance. This improves the system's consistency and reduces potential errors.
Original PR description
Before this PR: - When enabling TDS, TCS, or GST registration from settings, related taxes are activated, but when disabling these settings, the taxes remain active. After this PR: - When disabling TDS, TCS, or GST registration, all related taxes are deactivated. task-5456351 Forward-Port-Of: odoo/odoo#242030
This update fixes an issue where the shipping weight for deliveries wasn't accurately calculated when products were placed into packages. The fix ensures that the total weight, including packaged items, is correctly computed, improving the accuracy of shipping costs and order fulfillment. This resolves a bug related to how the system handles product weights within packages.
Original PR description
Steps to reproduce: - Enable “Packaging” in Inventory settings. - Create a storable product “P1” with: - weight: 10 kg - Create a delivery picking: - Add one unit of P1 - Mark as “To Do” - Set…
Steps to reproduce:
- Enable “Packaging” in Inventory settings.
- Create a storable product “P1” with:
- weight: 10 kg
- Create a delivery picking:
- Add one unit of P1
- Mark as “To Do”
- Set quantity to 1 → the move becomes assigned and the picking weight is correctly computed to 10
- Click “Put in Pack” → a package is created with `shipping_weight = 0`, and the picking weight incorrectly computed to 0
Problem:
- `picking.shipping_weight` is computed as: `weight_bulk` + sum(`pack.shipping_weight or pack.weight`) https://github.com/odoo/odoo/blob/17.0/addons/stock_delivery/models/stock_picking.py#L72-L79
- Once the product is placed in a package:
- `weight_bulk` becomes 0 (because Total weight of products which are not in a package). https://github.com/odoo/odoo/blob/17.0/addons/stock_delivery/models/stock_picking.py#L96
- `pack.shipping_weight` is 0 on creation.
- The fallback `pack.weight` is 0 because its compute depends on the `picking_id` in context. Without this context, the compute uses only quants https://github.com/odoo/odoo/blob/f7c033eff7b7bc83d6d18fc5e4df320f43ae5021/addons/delivery/models/stock_quant_package.py#L11-L13
opw-5357843
Forward-Port-Of: odoo/odoo#245223
Forward-Port-Of: odoo/odoo#238917This update fixes a technical issue where certain elements with directives were incorrectly identified as translatable. This change ensures that only elements intended for translation are processed, improving the accuracy of our translation system and preventing potential translation errors. It addresses a previously missed directive, enhancing the overall quality of translated content.
Original PR description
Nodes with directives must not be included inside a translatable span. But the function `translatable` missed the directive `groups` (without `t-`), and the class `o_translate_inline` should only override the predicate about the element's tag. Forward-Port-Of: odoo/odoo#246354
This pull request fixes a problem where descriptions and product names were not consistently displayed on invoices during printing, particularly when importing factur-x e-invoices. The update ensures that the full invoice description is printed correctly, regardless of the input source, improving invoice accuracy and compliance.
Original PR description
**Issue 1** Steps to reproduce: - Create a new invoice - Add an invoice line, with just a description - Save - On the same line, add any product - Print Issue: Only the custom description will be visible on the line opw-5471809 --- **Issue 2** Steps to reproduce: - Import factur-x e-invoice - Print pdf Issue: Only product name will be printed, even if the invoice record include the complete description opw-5471809 Forward-Port-Of: odoo/odoo#248010
This update resolves a delay of 1 second when reading data from the Toledo scale. Previously, the system waited for a timeout. Now, it reads the scale data until the end of the response is reached, ensuring faster and more reliable data transmission. This improves the overall performance of the scale integration.
Original PR description
Before this commit, the `_get_raw_response` method would wait until the read timed out (1 second) before returning the response. After this commit, for the Toledo scale we instead read until we reach a `\r` character, which is at the end of the response. This eliminates the 1 second delay. Enterprise: https://github.com/odoo/enterprise/pull/107241 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248599 Forward-Port-Of: odoo/odoo#248413
This update fixes an issue where Italian company information (like VAT number and address) wasn't being correctly transferred when creating a company from an ecommerce order. This ensures accurate reporting and compliance for Italian businesses using Odoo, resolving a previous data discrepancy.
Original PR description
**STEP TO REPRODUCE** 1. Create a ecommerce order on a shop page of a italian company. 2. Goes to the checkout page, enter info (company_name, l10n_it_codice_fiscale, l10n_it_pa_index). 3. On the contact created, click on create company. 4. Notice l10n_it fields are not propagated to the company. opw-5477372 Forward-Port-Of: odoo/odoo#248317 Forward-Port-Of: odoo/odoo#246785
This update fixes an issue where the working time assigned to tasks wasn't correctly calculated when switching between companies, particularly when public holidays were involved. Now, the system accurately considers company-specific holidays and the time difference between task assignment and stage changes to determine the correct working time.
Original PR description
__ Fix after revert bf9729e997b15777a981ac258b0088107804fbe6 __ Let's say we have 2 companies: company A and company B. We create a public time off of a few days starting before today and ending 2…
__ Fix after revert bf9729e997b15777a981ac258b0088107804fbe6 __ Let's say we have 2 companies: company A and company B. We create a public time off of a few days starting before today and ending 2 days later in company A, then switch back to company B. In company B, we create a project and a task, and assign this task. The working time to assign will stay at 0. 1. Switch to company A and create a timeoff starting before today and ending later. 2. Switch back to company B. Create a project, a stage and a task. 3. Enable the debugger. 4. The field Working Time to Assign is invisible by default, so open studio, click on View, and check Show Invisible Elements. 5. Click on the tab Extra info and on the block Working time to assign. Uncheck Invisible. 6. Close studio and assign someone to the task. Make sure that you do this operation at a different time than the one recorded for the last stage change. The hours under Working Time to Assign should compute the difference between the last time the task got its stage changed and the time of assignation Nothing happens When computing the working time to assign, we also take into consideration leaves: if this happened during public holidays, we consider that it took no working time to get assigned. However, when a holiday is set in another company, the Working Time to Assign duration will be impacted, as the domain to retrieve the corresponding leaves is the following: https://github.com/odoo/odoo/blob/c7e965a61b7ce856c2daa8e2574cf4c60caf7a20/addons/resource/models/resource_calendar.py#L537-L546 The company isn't taken into account in the domain, applying the holiday for every company. __ opw-5222883 Forward-Port-Of: odoo/odoo#246994
This update resolves an issue where importing EDI invoices with products restricted to different companies would fail. The fix ensures products are correctly identified during import, preventing 'Incompatible company' errors and improving the reliability of invoice processing within multi-company Odoo environments.
Original PR description
In a multi-company environment, importing an EDI invoice could fail if a line contains a product restricted to another company. The error "Incompatible company on records" was raised because company consistency rules were applied.
Example steps to reproduce:
- Create two Italian companies, A and B
- In company A, create a product with default code or barcode "TEST"
- This can also occur using the barcode and the “Vendor Product code” from the Purchase supplier.
- Restrict this product to company A
- Create an EDI invoice in company A with this product for company B as customer
- Import the invoice in company B, which would fail
This fix adds a search domain to correctly find products during import
opw-5496912
Forward-Port-Of: odoo/odoo#248623
Forward-Port-Of: odoo/odoo#248149This update resolves an issue where purchase receipts for kits with different unit of measure categories would fail due to a calculation error. The fix ensures accurate quantity calculations for kit products during currency conversions, allowing receipts to post correctly.
Original PR description
Steps to reproduce ------------------ 1. Enable Units of Measure and Automatic Valuation. 2. Create: Product KIT, stockable, UoM category Unit, UoM = Units. BoM for KIT with at least one component…
Steps to reproduce
------------------
1. Enable Units of Measure and Automatic Valuation.
2. Create:
Product KIT, stockable, UoM category Unit, UoM = Units.
BoM for KIT with at least one component whose UoM is in a different
category (e.g. m from Length).
3. Go to the product's category and set the Costing Method to Average
Cost (AVCO) and the Inventory Valuation to Automated.
4. Create a PO for KIT in a currency different from the company currency.
5. Confirm the PO and validate the receipt.
Issue
-----
Validating the receipt raises:
> The unit of measure m defined on the order line doesn't belong to the
> same category as the unit of measure kit defined on the product…
If you keep the PO currency equal to the company currency, the same kit
and BoM work and the receipt posts correctly.
Cause of the issue
------------------
Validating the receipt will call the `_action_done` of stock.move's and generate the related accounting entries. During this call and the currency of the PO is different from the company currency the `_generate_valuation_lines_data` will call the `_get_currency_convert_date` method:
https://github.com/odoo/odoo/blob/751d54207c6214a25a5a1def57137e2f2f9106e3/addons/purchase_stock/models/stock_move.py#L134-L140
This call will in turn call the `_get_qty_received_without_self`:
https://github.com/odoo/odoo/blob/751d54207c6214a25a5a1def57137e2f2f9106e3/addons/purchase_stock/models/stock_move.py#L121-L122
which was not written to handle kit products since it assumes that the product of the PO is the same as the one of the related move:
https://github.com/odoo/odoo/blob/751d54207c6214a25a5a1def57137e2f2f9106e3/addons/purchase_stock/models/stock_move.py#L102-L108
Fix
---
The qty_received is relevant to the _get_currency_convert_date as the method compares the qty_invoiced with the qty_received to determine whether to use the Invoice Date (when qty_invoiced > qty_received) or the Receipt Date.
https://github.com/odoo/odoo/blob/888e086dc6c7823b07993e90f70e2849e988fa7a/addons/purchase_stock/models/stock_move.py#L122-L126
For kits, `qty_received` must be calculated by aggregating component
moves to accurately determine this status. Since the standard logic
crashes due to UoM mismatch, the override in `purchase_mrp` is
necessary to provide the correct quantity for this date selection.
opw-5030761
Forward-Port-Of: odoo/odoo#248318
Forward-Port-Of: odoo/odoo#236276This update resolves an issue where users could trigger a system error when entering non-numeric values in the serial/lot number field. By changing the field type to 'number' and adding a keypress handler, the system now correctly validates input, ensuring smooth serial number generation and preventing disruptions to the stock management process.
Original PR description
Issue before this commit: ========================= When generating serial/lot numbers, if a user enters a `string value (e.g. "dhha" or ".")` in the `Number of SN` field of the Generate Serials/Lots…
Issue before this commit: ========================= When generating serial/lot numbers, if a user enters a `string value (e.g. "dhha" or ".")` in the `Number of SN` field of the Generate Serials/Lots wizard, a traceback is raised: `InvalidNumberError: "dhha" is not a correct number`. Steps to Reproduce: ========================= - Install the "stock" module. - Create a receipt for a serial-tracked product. - Open the detailed operations. - Click on "Generate Serials/Lots". - Enter a string value in the "Number of SN" field. Result: A traceback is raised with: InvalidNumberError: `"dhha" is not a correct number.` Cause of the issue: ========================= The [next_serial_count input](https://github.com/odoo/odoo/blob/17.0/addons/stock/static/src/widgets/lots_dialog.xml#L36) field is defined as type="text", which allows users to enter string values, even though the field represents a numeric count. The value is later processed using [parseInteger](https://github.com/odoo/odoo/blob/17.0/addons/stock/static/src/widgets/generate_serial.js#L33), which throws an error when the input is not a valid integer string, [Here](https://github.com/odoo/odoo/blob/17.0/addons/web/static/src/views/fields/parsers.js#L139). With This Commit: ========================= The input type is changed from type="text" to type="number", ensuring that only numeric values can be entered. This prevents invalid input and avoids the traceback when generating serial or lot numbers. Additionally, a `t-on-keydown` handler is added to prevent entering a `dot (.)`, ensuring that only integer values are allowed. Forward-Port-Of: odoo/odoo#248529 Forward-Port-Of: odoo/odoo#248221
This update fixes an issue where website controllers could be incorrectly linked to irrelevant model types, leading to potential errors. By restricting controller bindings to concrete models, we've enhanced the stability and performance of the Odoo website. This change ensures data integrity and a more reliable user experience.
Original PR description
Before this commit, a website_controller_page could be bound to any sort of model. For some of them this was irrelevant or plain wrong: - transient models: they are not pointing to anything relevant business wise - abstract: they cannot even have records, and most of them are mixin - _auto = False: Those are models with a table which is a custom one. The heuristics here is to say that records are not "real" ones. Also, most of these tables are sqlViews or something similar Business wise there were errors because of this, so this commit introduces a constraint that forbids the above use cases. sentry-6842596566 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#246115
This update fixes an issue where product names and prices in the Arabic version of the Product Catalog were misaligned. The change uses a specific styling technique to ensure text aligns correctly in RTL (right-to-left) layouts, providing a better user experience for Arabic-speaking customers. This resolves a visual inconsistency and improves readability.
Original PR description
Steps to reproduce: 1. Switch the user language to Arabic. 2. Open the Product Catalog from a Sales/Purchase order. 3. Observe that the Name, Internal Reference, and Price collapse into a single line with inconsistent ordering due to unmanaged horizontal inline flow. Cause: The use of generic span elements inside a portal encourages horizontal inline flow that fails to mirror correctly in RTL without explicit flex instructions. Solution: Update the Order Line portal template to use 'd-inline-flex' and 'align-items-baseline'. This treats the price and reference as a logical unit that respects the global direction and ensures consistent text alignment in both English and Arabic. opw-5867434
This update resolves a minor issue in the HTML editor that could occasionally cause errors. The fix uses a technique called 'optional chaining' to safely handle situations where the previous sibling element might not exist, preventing the error and improving overall stability. This ensures a smoother experience for users working with the editor.
Original PR description
Before this commit: in rectifySelection, the focusTarget can be null and causing an error when calling the previousSibling After this commit: now we do an optional chaining(?.) on previousSibling task-5481248 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248595
This update fixes a discrepancy in how the 'Meses' month attribute is populated for global invoices and POS orders. Previously, the month was incorrectly tied to the invoice creation date, not the order date. This ensures accurate reporting and compliance with Mexican tax regulations.
Original PR description
**PROBLEM** In accounting, if you create a global invoice with an invoice, the attribute `Meses` will be the month of the invoice date. In POS, if you do the same with an order, the attribute `Meses` will be equal to the month the day we create the global invoice, instead of the month of the order date. This is wrong. **STEP TO REPRODUCE** 1. Have an order from the month before (not sure how to do this on a runbot). 2. Create a global invoice. 3. Check the generated xml, and notice the month is wrong. opw-5381607 Forward-Port-Of: odoo/enterprise#106856
This update corrects a problem where automatic bank statement data from Codabox contained extra spaces in the payment reference field. By removing these spaces, the system now correctly processes and interprets payment information, ensuring accurate accounting records. This improves data reliability and avoids potential errors.
Original PR description
Before this commit, when we do the creation of the automatic reco models, it was possible that the payment ref ended with a lot of empty spaces. To avoid that, we now strip the payment ref before the creation of the reco model. Data coming from codabox where wrongly formatted since the payment ref could have space at the end or the start and even in the middle. By using a split join we solve that issue. task-5926548
This update resolves a minor issue related to the calculation of scale certificates for European VAT compliance. It reflects a recent fix implemented in the main Odoo project, ensuring accurate reporting. This change improves the reliability of our EU VAT reporting.
Original PR description
This commit simply updates the expected scale checksum after the fix in the community PR odoo/odoo#248413. Forward-Port-Of: odoo/enterprise#107390 Forward-Port-Of: odoo/enterprise#107241
This update strengthens the automatic reconciliation of bank statements by ensuring time limits are consistently enforced during imports. Previously, imports could run indefinitely, leading to timeouts. Now, the system automatically limits the import process to the relevant company, preventing long processing times and improving reliability.
Original PR description
The aim of this commit is to prevent a csv import to timeout by applying the `limit_time` parameter for real. We also added the `company_id` parameter to the caller to maximize the chances of…
The aim of this commit is to prevent a csv import to timeout by applying the `limit_time` parameter for real. We also added the `company_id` parameter to the caller to maximize the chances of processing the lines of the statement being imported first. Context: 1) `_cron_try_auto_reconcile_statement_lines` was modified a few times in the last months with the bank reco widget revamping, the perf issues, etc. During that revamp, the timing limitation was made irrelevant if a `batch_size` wasn't provided. While it makes sense that the time limitation is irrelevant without a batch, not raising an error resulted in the client code letting the caller think the time limitation will be applied. Instead, we could provide a default batch_size. 2) The `company_id` parameter wasn't set which combined with no batch_size results in trying to reconcile the entire accounting from every company to which the user has access. Before this commit: - The limit_time parameter is ignored if the `batch_size` parameter isn't provided processing everything in the current transaction. - The company_id parameter wasn't set resulting in trying to reconcile the whole accounting from all accessible companies in the current transaction. After this commit: - We provide a default `batch_size` of 100 and thus we really apply the timing - We provide the `company_id` parameter to limit the reconciliation to the company of the statement. opw-4890008
This update adjusts the calculation of sickness relapse periods for the Belgian payroll module. Starting January 1, 2026, the allowed relapse period between sick leaves will increase from 14 to 56 days, aligning with new Belgian tax regulations. This ensures accurate payroll processing for employees on sick leave.
Original PR description
**Spec :-** Since 01/01/2026, the period between two sick time off to consider it as a relapse has been increased from 14 days to 56 days. **Implementation :-** . Update sickness relapse period from 14 to 56 days if the leave starts from 2026 . Add corresponding tests task-5476174 Forward-Port-Of: odoo/enterprise#104769
3 changes
Resolved issues and error corrections
This update fixes a bug where tags and followers weren't being carried over when renewing subscriptions. Now, tags added to a subscription will be reflected on the renewed subscription, and followers will be correctly associated. This ensures consistent tracking and management of subscriptions.
Original PR description
This commit is a backport of https://github.com/odoo/enterprise/commit/245759ef82250a8eb32f38853e5c5f6aac841823 and https://github.com/odoo/enterprise/commit/a35d64133cc3c598c66fcadc2310b0118a678424.…
This commit is a backport of https://github.com/odoo/enterprise/commit/245759ef82250a8eb32f38853e5c5f6aac841823 and https://github.com/odoo/enterprise/commit/a35d64133cc3c598c66fcadc2310b0118a678424.
## Issue
When renewing a subscription, the tags and followers are not copied from the original subscription to the new one.
## Steps to reproduce
1. Install *Subscriptions* (`sale_subscription`)
2. Create a confirm a subscription S
- Any *Customer*
- Any *Recurring Plan*
- Any Product
- In the *Other Info* tab, add a tag T
3. There should be two followers on the subscription S: the creator of the subscription, and the customer. If it is not the case, add at least one follower.
3. Create and confirm an invoice for subscription S
4. Back on the subscription S, click *Renew*
5. **The tag T is missing on the new subscription. Also, the followers were not copied from subscription S.**
## Cause & Fix
### Tags
In `SaleOrder._prepare_upsell_renew_order_values`, tags are not part of the `values` generated when renewing a subscription:
https://github.com/odoo/enterprise/blob/a650fb74fd79965a6f0e441e61d8977c599057e6/sale_subscription/models/sale_order.py#L1149-L1171
They were added by https://github.com/odoo/enterprise/commit/245759ef82250a8eb32f38853e5c5f6aac841823:
https://github.com/odoo/enterprise/blob/245759ef82250a8eb32f38853e5c5f6aac841823/sale_subscription/models/sale_order.py#L1173-L1175
### Followers
Similarly to the tags, followers were not added/subscribed to the subscription when generating the renewed subscription. This was fixed by https://github.com/odoo/enterprise/commit/a35d64133cc3c598c66fcadc2310b0118a678424, by creating and calling the `_subscribe_followers_to_new_order(order)` after creating the new subscription (`order`):
https://github.com/odoo/enterprise/blob/a35d64133cc3c598c66fcadc2310b0118a678424/sale_subscription/models/sale_order.py#L956-L958
https://github.com/odoo/enterprise/blob/a35d64133cc3c598c66fcadc2310b0118a678424/sale_subscription/models/sale_order.py#L2147-L2157
opw-5478071
Forward-Port-Of: odoo/enterprise#107230This update fixes an issue where the month displayed on global invoices linked to POS orders was incorrectly reflecting the invoice creation date instead of the order date. This ensures accurate reporting and compliance with Mexican tax regulations. The fix corrects the 'Meses' attribute in the generated XML.
Original PR description
**PROBLEM** In accounting, if you create a global invoice with an invoice, the attribute `Meses` will be the month of the invoice date. In POS, if you do the same with an order, the attribute `Meses` will be equal to the month the day we create the global invoice, instead of the month of the order date. This is wrong. **STEP TO REPRODUCE** 1. Have an order from the month before (not sure how to do this on a runbot). 2. Create a global invoice. 3. Check the generated xml, and notice the month is wrong. opw-5381607 Forward-Port-Of: odoo/enterprise#106856
This update adjusts the calculation of sickness relapse periods for employees in Belgium, aligning with a new tax regulation effective January 1, 2026. The relapse period between sick leaves is now 56 days instead of 14, ensuring accurate payroll processing and compliance. This change was implemented with new tests to guarantee correct functionality.
Original PR description
**Spec :-** Since 01/01/2026, the period between two sick time off to consider it as a relapse has been increased from 14 days to 56 days. **Implementation :-** . Update sickness relapse period from 14 to 56 days if the leave starts from 2026 . Add corresponding tests task-5476174 Forward-Port-Of: odoo/enterprise#104769
3 changes
Resolved issues and error corrections
This update resolves an issue where global discounts on sales orders using Avalara Brazil weren't correctly calculating tax totals. The change improves the accuracy of discount application by cleaning up tax calculations before applying the discount, ensuring the discount is applied to the correct price unit.
Original PR description
This commit df08643 introduces support for global discounts for tax calculation at Avalara Brazil. When using global discounts from 'sale.order.discount' wizard, the lines weren't adding up to the amount specified. This new commit targets to fix that by cleaning up taxes before applying a discount, this way to have the target amount as price unit and avoid to depend on the taxes. target: master task-3452935
This update corrects an access error that prevented users with limited inventory permissions from validating recurring product deliveries. The issue stemmed from a lack of necessary access rights to retrieve invoice information, specifically related to subscription plans. This fix ensures all users can properly validate recurring deliveries.
Original PR description
When a user that only has inventory access right validate a delivery that has an recurring product it will trigger an access right error. Steps to reproduce: ------------------- * Install sales,…
When a user that only has inventory access right validate a delivery that has an recurring product it will trigger an access right error. Steps to reproduce: ------------------- * Install sales, inventory, subscription, * Create a subscription product * Create and validate a sale order with this product and a recurring plan * Connect to Odoo with an user that only has inventory user right * Validate the delivery -> Access Error Observation: ------------- When we validate the delivery,we call button_validate that will call [_action_done](https://github.com/odoo/odoo/blob/93fa6d9fff63534cfa9251e21fc82797d8b83468/addons/stock/models/stock_picking.py#L1427) During this we try retrieve invoices information [here](https://github.com/odoo/enterprise/commit/b07b1c47c97bb6d6da9fa61dacb5cba66aff2a16#diff-dbf7b40a6942fbcc81ebc4c3009a8a37a5a620cffac74889bd0ff2bccd52b1e3R30-R36). The issue is that this user doesn't have access right to several records: * sol.order_id.invoice_ids -> sale.order.invoice_ids * sol.order_id.last_invoice_date -> sale.subscription.plan opw-5869446 Forward-Port-Of: odoo/enterprise#106623
This update corrects a calculation error in how mobility budgets are determined for employee contracts, specifically in Belgium. The change implements an iterative method to ensure budgets align with legal minimums, maximums, and wage rates, leading to more accurate and compliant payroll processing.
Original PR description
We implement in this PR the iterative computation method of mobility budget. Given an employer cost, we find the wage and mobility budget such that mobility budget amount respect legal constraints of minimum and maximum and rate with respect to wage Forward-Port-Of: odoo/enterprise#106754
10 changes
Resolved issues and error corrections
This update enables archiving of Indian Goods and Services Tax (GST) returns regardless of their state, aligning with Indian regulatory requirements. The change includes a technical update to improve flexibility and prevent further processing of archived returns, ensuring compliance and streamlining the accounting workflow.
Original PR description
Previously, the Archive action was only available in the `new` state. However, the Indian GST workflow requires returns to be archivable in any state. This commit: - Introduces a computed boolean to control the visibility of the Archive action, making the behavior extensible for localizations. - Updates the Indian localization to allow archiving in all states. - Hides functional action buttons on archived GSTR returns to prevent further processing. task-5247758
This update resolves an issue where users encountered an error when editing reconciled invoice lines in the Bank journal. The fix initializes necessary variables to avoid a runtime error, ensuring users can successfully adjust reconciled amounts without disruption.
Original PR description
Currently, an error occurs when user edits a reconciled line. **Steps to Reproduce([Video](https://drive.google.com/file/d/18dSAsZCl---wfCkMBfyo9LviTqgq3qpK/view)):** - Install the `Accounting`…
Currently, an error occurs when user edits a reconciled line. **Steps to Reproduce([Video](https://drive.google.com/file/d/18dSAsZCl---wfCkMBfyo9LviTqgq3qpK/view)):** - Install the `Accounting` module. - Create an `invoice` with an `invoice line` having an amount greater than zero. - `Confirm` the invoice. - Go to the `Bank journal` and create a `statement line` with the same amount as the invoice. - Click `Reconcile` on that `statement line` and select the newly `created invoice line`. - Click the `pencil icon` to edit the line, enter a `positive amount` in the Balance field, and save. `UnboundLocalError: local variable 'original_base_lines' referenced before assignment` The error occurs because, when a specific condition [1] becomes true, the variables original_base_lines and original_tax_lines are expected to be defined. However, if reconciled_lines_ids is present in move_line_to_edit, these variables are never initialized and are later referenced, causing the UnboundLocalError [2]. This commit ensures that original_base_lines and original_tax_lines are initialized to None, which prevents the error. [1]- https://github.com/odoo/enterprise/blob/fa4bbc20f25ec12c609ebbf37885e48900619de5/account_accountant/models/account_bank_statement.py#L1393-L1394 [2]- https://github.com/odoo/enterprise/blob/fa4bbc20f25ec12c609ebbf37885e48900619de5/account_accountant/models/account_bank_statement.py#L1410-L1411 sentry-7189027839 Forward-Port-Of: odoo/enterprise#104432
This update resolves a bug that prevented users from saving invoices in Mexico when a line item had a price of zero. The fix ensures that required tax object fields are correctly populated for all invoice lines, regardless of price, to comply with Mexican tax regulations. This ensures invoices can be properly processed and submitted.
Original PR description
**PROBLEM** If you create an invoice, and add a line with a product with a price of 0, you cannot save the invoice. **STEP TO REPRODUCE** 1. On a mx company, create an invoice for a mx client. 2. Add a line with a product with a price of 0. 3. Try saving the invoice, it will fails. **CAUSE** Field `l10n_mx_edi_tax_object` is required on invoice line with mx company. However, for lines with a price of 0, it is not set by `_compute_l10n_mx_edi_tax_object` because `_l10n_mx_edi_cfdi_invoice_line_ids()` filters them. opw-5402045 Forward-Port-Of: odoo/enterprise#103981
This update resolves an issue where the Employer File Number field was hidden in the payroll settings after installing the l10n_hk_hr_payroll_empf module. The fix removes the setting that previously obscured this important data, ensuring it's now readily accessible for payroll processing.
Original PR description
Issue: - Employer File Number was hidden in Payroll settings after installing the l10n_hk_hr_payroll_empf module. Fix: - Removed the setting that hid the Employer File Number field. task-5476454
This update fixes a translation error in the ARCA (AFIP) error message displayed when validating Argentine electronic invoices. The message has been corrected to accurately reflect the issue: that the invoice date cannot be before the last validated invoice. This ensures proper invoice processing and compliance with Argentine tax regulations.
Original PR description
WSFE error 10016-1 must be "The invoice date cannot be before the last invoice validated in AFIP." instead of "The invoice date cannot be after the last invoice validated in AFIP". Steps to reproduce: validate argentinean customer electronic invoice with invoice date before than the last invoice date validated in ARCA. Task Adhoc side: 44290 Task latam: 1376 Forward-Port-Of: odoo/enterprise#106305
This update corrects a bug where the activity menu in web_studio was displaying all records for custom models, regardless of whether they had associated activities. Now, the menu only shows records with activities assigned to the current user, ensuring a more focused and relevant experience. This improves data efficiency and user experience.
Original PR description
After commit odoo/odoo@5c5fbc10b7024c7227f03e37897d421bba64df82 , actions spawned by the activities menu have their domain managed by dynamic <filter /> rather than a plain readonly domain. Before this commit, clicking on the activity menu to go to a custom model showed every record, not just ones with activities after this commit, only records with activities assigned to the current user are showed opw-5778806 Forward-Port-Of: odoo/enterprise#106622
This update corrects a bug that occurred when KPIs shared the same label but had different identifiers. The fix ensures accurate sorting of KPIs by utilizing a more robust method within the sorting process, preventing a data comparison error. This improves the stability and reliability of KPI synchronization.
Original PR description
When two KPIs have different identifiers but the same label, the call to `sorted` on a list of (priority, label, dict) tuples was wrong. As the two first criteria were the same, the comparison was made on the dict, which is not comparable, leading to the following error:
TypeError: '<' not supported between instances of 'dict' and 'dict'
With this commit, we instead use the `key=` argument to `sorted` in order to build the `(priority, label)` tuples, which is cleaner.
OPW-[5932549](https://www.odoo.com/odoo/project.task/5932549)This update resolves a technical issue preventing successful keyboard layout changes when using Odoo's IoT device functionality. Previously, an error (traceback) occurred during this process, disrupting user workflows. This fix ensures keyboard layouts update correctly, improving the reliability of the IoT device integration.
Original PR description
Steps to reproduce: - Connect an IoT box - Connect a USB keyboard to the IoT box - In the Odoo backend, attempt to change the keyboard layout of the keyboard device EXPECTED behaviour: Layout is updated successfully ACTUAL behaviour: Traceback occurs
This update resolves an issue with how versioning was handled in the l10n_be_hr_payroll module. The fix ensures accurate tracking of updates and compatibility within the Odoo Enterprise system. This improves the stability and reliability of payroll calculations for Belgian businesses.
This update resolves an issue where Employee Officers were encountering access errors when editing employee records due to unauthorized access to salary offer data. The change restricts access to salary offers to HR Managers, ensuring data security and allowing Employee Officers to continue their work without interruption.
Original PR description
Before: - Editing an employee form as an Employee Officer triggered an AccessError due to mail tracking attempting to read salary_offer_ids on hr.version. After: - salary_offer_ids is now restricted to HR Managers, preventing unauthorized reads during tracking when saving the employee form. Impact: - Employee Officers can edit employee records without encountering access errors. - Access to salary offers remains limited to appropriate managerial roles. Task: 5404676 Forward-Port-Of: odoo/enterprise#103095
13 changes
Resolved issues and error corrections
This update resolves an issue where generating lots on picking receipts would fail when users entered non-numeric values (like letters) for quantity. The fix ensures that the system handles invalid input gracefully, preventing errors and allowing users to correctly generate lots. This improves the reliability of the stock management process.
Original PR description
Currently, an error occurs when user tries to generate lots on a picking receipt for a product that is tracked by lots. Steps to replicate: - Install `stock` and create a product `test` tracked `by…
Currently, an error occurs when user tries to generate lots on a picking receipt for a product that is tracked by lots.
Steps to replicate:
- Install `stock` and create a product `test` tracked `by lots`.
- Open Inventory > Operation > Receipts , create a new one with product `test` and quantity 3.
- Open the form view of the stock move for `test` using the `view` button.
- Click `Generate Serials/Lots` and type `a` in `Quantity received` and click generate. (Error-1 will occur.)
- Click `Generate Serials/Lots` and type `a` in `Quantity per lot` and click generate. (Error-2 will occur.)
Error-1 :
```
File '/home/odoo/odoo18/community/addons/stock/models/stock_move.py', line 1055, in generate_lot_qty
line_count = int(quantity // qty_per_lot)
~~~~~~~~~^^~~~~~~~~~~~~
TypeError: unsupported operand type(s) for //: 'NoneType' and 'int'
```
Error-2 :
```
File '/home/odoo/odoo18/community/addons/stock/models/stock_move.py', line 1053, in generate_lot_qty
if qty_per_lot <= 0:
^^^^^^^^^^^^^^^^
TypeError: '<=' not supported between instances of 'NoneType' and 'int'
```
Cause:
- As the user typed in alphabets the [parsefloat] returns `NaN` which will be translated to `None` python side.
- As quantity is received as None the [line1] raises Error-1.
- As qty_per_lot is recieved as None the [line2] raises Error-2.
Solution:
- Raised Usererror when quantity received or quantity per lot is either negative or not a number.
[parsefloat]: https://github.com/odoo/odoo/blob/2da791df55762ae4dc1c06d2a43fad25b09dc11b/addons/stock/static/src/widgets/generate_serial.js#L50-L51
[line1]: https://github.com/odoo/odoo/blob/2da791df55762ae4dc1c06d2a43fad25b09dc11b/addons/stock/models/stock_move.py#L1001
[line2]: https://github.com/odoo/odoo/blob/2da791df55762ae4dc1c06d2a43fad25b09dc11b/addons/stock/models/stock_move.py#L999
related-sentry-7254849206
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update fixes an inconsistency in how stock availability is calculated for online shopping carts. Previously, a duplicate process was causing inaccurate stock counts, leading to potential issues with order fulfillment. Now, the system correctly utilizes the standard stock availability calculation, ensuring accurate inventory information for customers.
Original PR description
**Description of the issue:** _get_cart_and_free_qty duplicates inline the same logic already provided by _get_product_available_qty, bypassing the intended extension point. **Current behavior:**…
**Description of the issue:**
_get_cart_and_free_qty duplicates inline the same logic already provided by _get_product_available_qty, bypassing the intended extension point.
**Current behavior:**
_all_product_available delegates to _get_product_available_qty, but _get_cart_and_free_qty calls free_qty directly, causing inconsistent stock availability results within the same cart flow.
**Desired behavior:**
_get_cart_and_free_qty delegates to _get_product_available_qty, making it the single extension point for all stock availability queries in the cart.
@tecnativa TT60862
@carlosdauden @pedrobaeza
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves an issue where loyalty points weren't correctly reflected when opening orders in trusted POS systems. The fix updates the loyalty ticket screen to automatically apply rewards after loading an order, ensuring accurate point tracking across all POS locations. This improves the customer experience and data accuracy.
Original PR description
Step to reproduce: - Create a loyalty program for a specific product as for 1 $ spent gets 1 point - Have a trusted pos for our main shop (both pos should have each other as trusted) - Create an order from the main pos , select a partner (notice we get LPs) - save the order - Open the order in the trusted pos - we do not see the loyalty points Cause: - currently, when loading a order in trusted pos, there is no trigger to update rewards for selected order Fix: - the ticket screen in loyalty has been patched to update rewards after loading a order opw-5412744 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a bug in the Point of Sale system where kit products (phantom BOMs) incorrectly prompted for lot/serial numbers. Now, stock movements for kit products are handled correctly based on their components, eliminating the unnecessary popup and ensuring accurate inventory tracking. This improves the user experience when selling kits.
Original PR description
Selling a kit product (phantom BOM) that was tracked by lots in the Point of Sale incorrectly opened the lot/serial popup for the kit line. Only the kit's components should drive stock moves and…
Selling a kit product (phantom BOM) that was tracked by lots in the Point of Sale incorrectly opened the lot/serial popup for the kit line. Only the kit's components should drive stock moves and lots; the kit product itself must not require a lot on the order line. Steps to reproduce: ------------------- * Create a product "Kit" with tracking = By Lots. * Create a phantom BOM (type Kit) for that product with a component that is also tracked by lots; add stock and a lot for the component. * Open a POS session and add the kit product to the order. > Observation: The Lot/Serial Number(s) Required popup appears for the kit product. After payment, stock moves are correctly created for the components (and their lots), so the popup on the kit line is wrong. Why the fix: ------------ POS was using product.tracking only when deciding to show the lot popup, and did not treat phantom-kit products differently. With pos_mrp, stock moves for a kit line come from the BOM components, not from the kit product, so the frontend must not ask for a lot on the kit line. We add a computed flag pos_has_phantom_bom on product.product in pos_mrp and make isTracked() return false when that flag is set so the lot popup is skipped for kit products. opw-5917964
This update resolves an issue where applying multiple gift cards from the same program caused an infinite page reload during checkout. The fix addresses a discrepancy in how discount lines are handled, specifically separating logic for percent and per-point rewards to ensure accurate synchronization and a smoother checkout experience. This improves the reliability of gift card usage.
Original PR description
### Issue: Applying multi gift card from the same program results in an infinite reload cycle. #### Steps to reproduce: 1- Create a gift card program and generate two gift cards. 2- In eCommerce add…
### Issue: Applying multi gift card from the same program results in an infinite reload cycle. #### Steps to reproduce: 1- Create a gift card program and generate two gift cards. 2- In eCommerce add a deliverable product to cart. 3- Open cart and add both gift card codes. 4- Click on checkout to navigate to delivery step. The page is going to keep refreshing. ### Cause: The reload is supposed to sync the discount lines in the back-end with the discount lines displayed during checkout. If the number of lines don't match, a reload is triggered.: https://github.com/odoo/odoo/blob/7462ec423e8b106a5175a71ac009176d16cdf225/addons/website_sale_loyalty/static/src/js/checkout.js#L22-L24 After the fix #191132, discount lines are grouped by `reward_id`. This is done because in the back-end, by applying a single percent discount, separate lines are created per product lines with different taxes, while in front-end there is still single line. However, that fix doesn't consider that a SO might have multiple lines of the same reward: ewallet, gift_card ### Fix: This can be fixed by separating logic of groupable lines which are the lines with `percent` mode, with `per-point` mode lines. Discount is the only mode that might be added to multiple lines separately, keeping #191132 fix, and `per-point` is the only mode that might be applied multiple times per reward (in ewallet and gift_card). opw-5485912
This update fixes an issue where multiple packages being returned through a delivery process were incorrectly treated as a single shipment. Now, the system accurately recognizes and manages multiple incoming shipments during a return-re-delivery flow, ensuring accurate tracking and labeling. This improves the efficiency of our delivery operations.
Original PR description
Issue ----- When doing delivery -> return -> re-delivery, only one label is received even when there are mutliple packages to be "re-delivered". Steps to reproduce ----- - Create a UPS delivery -…
Issue ----- When doing delivery -> return -> re-delivery, only one label is received even when there are mutliple packages to be "re-delivered". Steps to reproduce ----- - Create a UPS delivery - Multiple packages - Validate transfer - Return - Validate IN - Return again - Add the UPS under the "additional info" tab - Ensure still multiple packages - Validate OUT Cause ----- When preparing the shipping data, we go through https://github.com/odoo/enterprise/blob/913e55abc4a9aa58509aa2a60d378fb552de554d/delivery_ups_rest/models/delivery_ups.py#L120-L121 which leads us to do https://github.com/odoo/odoo/blob/89733b0e4d1e9a57dd25f552db4e6330a6b14cdf/addons/stock_delivery/models/delivery_carrier.py#L142-L155 so we end up with a single package to send to the delivery service. The reason `is_return_picking` is true is because the compute method only checks for an existing move with an `origin_returned_move_id`. https://github.com/odoo/odoo/blob/89733b0e4d1e9a57dd25f552db4e6330a6b14cdf/addons/stock_delivery/models/stock_picking.py#L53-L58 From a delivery flow perspective, it doesn't make much sense to consider outgoing shipments as returns. ----- Ticket: opw-5866100
This update fixes an issue where Point of Sale session messages were consistently displayed in English, regardless of the user's selected language. The fix ensures that all cash-related messages within POS sessions are translated accurately based on the user's language preference, improving the user experience for international customers.
Original PR description
**Problem:** When opening or closing a POS session, chatter messages display untranslated English text regardless of the user's language setting. **Steps to reproduce:** 1. Set user language to any non-English language (e.g., Spanish) 2. Open a POS session and register cash in/out operations 3. Close the session 4. Check the chatter messages - labels appear in English **Current behavior:** Messages display in English: "Opening cash difference", "Opening cash expected", "Opening cash counted", "Closing difference", etc. **Expected behavior:** Messages should be translated according to the user's language setting. **Cause of the issue:** The hardcoded strings were not wrapped in the translation function `_()`, preventing them from being translated. **Fix:** Wrap the concatenated strings with `_()` to enable proper translation of all cash details messages. opw-5185310
This update resolves an issue where loyalty reward products were sometimes hidden within the Point of Sale (PoS) system. This change ensures that reward products are always visible and selectable during transactions, improving the customer experience and preventing lost sales. The fix was implemented as part of a standard bug fix process.
Original PR description
Before this commit, a product used as a loyalty reward could be hidden in the PoS. opw-5918550 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue preventing users in Argentina from completing the checkout process due to missing localization fields. The fix addresses a generic 'missing fields' error by ensuring required Argentinian tax information is correctly populated during the address form. This improves the user experience for Argentinian customers.
Original PR description
### Issue: Cannot get passed the address form in `ar` localization. #### Steps to reproduce: 1- Set up a company with Argentinian localization. 2- Set the portal user to this company. 3- Add an…
### Issue: Cannot get passed the address form in `ar` localization. #### Steps to reproduce: 1- Set up a company with Argentinian localization. 2- Set the portal user to this company. 3- Add an address and set country to `Argentina`. 4- Assign website to Argentinian company; 5- As the portal user, add something to cart. 6- go to checkout, and save the address. You will get the error that some fields are missing. ### Cause: This issue is partially fixed in https://github.com/odoo/odoo/pull/239998. However, there are three issues left: 1. That fix doesn't show the error regarding 'Identification and AFIP Resposibility Types' when we have `use_delivery_as_billing`. As a result a generic error `some fields are missing` is shown. 2. `can_edit_vat` is used in: https://github.com/odoo/odoo/blob/5b39cdceb84758f767b83b741be927c1a7cfac7a/addons/l10n_ar_website_sale/views/templates.xml#L7-L9 https://github.com/odoo/odoo/blob/5b39cdceb84758f767b83b741be927c1a7cfac7a/addons/l10n_ar_website_sale/views/templates.xml#L32-L35 This needs to also consider `l10n_ar_afip_responsibility_type_id` and `l10n_latam_identification_type_id` being set. 3. Also we need to make sure `Identification Number` which is `vat` is set if we want to prevent it from being modified. opw-5376149
This update enhances the accuracy of payment reference validation by tailoring checks to the bank account's country. Previously, a single global check caused issues with differing country formats. Now, the system validates references against the correct country, falling back to a standard ISO check if the country isn't supported, ensuring more reliable payment processing.
Original PR description
Currently, when initiating a payment, we check if the reference is a structured one by using `is_valid_structured_reference` which checks the validity of the structure accross all supported countries. This can lead to issues when it matches formats accepted by other countries but not the one of the bank account. With this commit, we replace this check by a call to a new function that checks the structure validity according to the country of the bank account, with a fallback to the generic check (ISO 11649) if the country is not supported. opw-5387269
This update resolves an issue where attendance managers couldn't edit their subordinates' attendance records. The fix ensures both managers and officers can now modify attendance data, improving workflow efficiency. Additionally, the tests have been updated for greater reliability.
Original PR description
The commit https://github.com/odoo/odoo/commit/d115cca1296c0bd20a2875bdaadf2a9136c33dda introduced the opportunity for attendance managers to edit their subordinates attendances, but the condition was lacking parenthesis, leading to an unexpected behaviour. This commit changes the condition so that it is possible both for a manager and an officer to do the edition. It also rewrite the tests in order to be more thorough. No related task Forward-Port-Of: odoo/odoo#248471
This update optimizes how Odoo retrieves usable direct debit mandates, resulting in a significant speed improvement. By adding an index and restructuring the query, the process is now 10 times faster, leading to quicker invoice processing. This change primarily addresses a performance bottleneck related to mandate retrieval.
Original PR description
affected versions: 16, 17 The query for `_sdd_get_usable_mandate` is far from optimal. An EXPLAIN ANALYZE shows some pain points that we address in this PR:…
affected versions: 16, 17 The query for `_sdd_get_usable_mandate` is far from optimal. An EXPLAIN ANALYZE shows some pain points that we address in this PR: https://explain.dalibo.com/plan/c4eddda16fa4cf39 - Indexing `sdd_mandate` in `account.move` lets the subquery use an Index Scan instead of a full-table Seq Scan. - Without changing the logic of the subquery it is now way more performant using NOT EXISTS, which avoids the Aggregate node and enables early exit. These two minor changes yield a ~10x speedup in our tests. (probably there's more performance to gain, although this seems to be an issue that will cease on later versions) Some captures on performance over ~2000 payments. Before, a big chunk of the time was spent retrieving the mandate. The more operations the larger the time: <img width="1246" height="655" alt="image" src="https://github.com/user-attachments/assets/3b6695e1-dbb0-46fa-a22c-fba0e9c2ec2b" /> Now over the same amount of payments, the mandates retrievement isn't that troubling anymore: <img width="1050" height="609" alt="image" src="https://github.com/user-attachments/assets/63ad88d1-51a0-4607-ae50-8022cf4cffc7" /> cc @moduon MT-11292 fyi @yajo Forward-Port-Of: odoo/enterprise#97410
This update fixes an issue where duplicate DateV identifiers could be assigned to partners, even after archiving. The change ensures that DateV IDs are unique across all partners, including archived ones, preventing data inconsistencies. This improves data accuracy for German reporting.
Original PR description
Currently, it is possible to set a DateV identifier on a partner even if it is already assigned to an archived partner. This leads to duplicate identifiers if the archived partner is later…
Currently, it is possible to set a DateV identifier on a partner even if it is already assigned to an archived partner. This leads to duplicate identifiers if the archived partner is later unarchived. ### **Steps to reproduce:** 1) Install **l10n_de_reports, Contacts** App with Demo Data. 2) Switch to a **DE company**. 3) Create a contact 'Test-A' and set `'DateV Vendor' to 123456789` in the **Accounting Section**. 4) Archive 'Test-A'. 5) Create 'Test-B' and set `'DateV Vendor' to 123456789`. 6) Unarchive 'Test-A'. ### **Observed Behavior:** 'Test-B' is created successfully. After step 6, both 'Test-A' and 'Test-B' are active with the same DateV identifier. ### **Expected Behavior:** A validation error should be raised when trying to save 'Test-B', stating that the identifier is already defined. ### **Root Cause:** Since [this commit](https://github.com/odoo/enterprise/commit/733c4ba1fd5558891ffdbc67066c3a3a5938e2f0), company-dependent fields are stored as JSONB in the database. Due to this improvement, the previous SQL constraint (which enforced uniqueness across all records) was removed and replaced with a Python constraint. However, the new Python constraint utilizes `search_count`, which by default filters out archived records (`active=False`). This allows the reuse of identifiers belonging to archived partners, breaking the uniqueness requirement that existed in previous versions. Fix: Update the `_check_datev_identifier` and `_check_datev_identifier_customer` constraints to use `with_context(active_test=False)`. This ensures that the uniqueness check considers all partners, including archived ones. opw-5474106
8 changes
Resolved issues and error corrections
This update adjusts the Odoo installation process to maintain compatibility across different versions. Specifically, it addresses a change in how the 'base' module is handled in Odoo 18.2, ensuring a smoother installation experience. This change ensures consistent behavior regardless of the Odoo version being used.
Original PR description
Starting in 18.2 the skip-auto-install is not working as in 17.0 because base is not marked as to install another way. The detailed explanation: https://github.com/odoo/odoo/pull/239044#discussion_r2603384580 This commit just makes the logic and code consistent in all versions even if this is not needed in 17.0
This update enhances accounting reports by allowing users to filter data across multiple journals simultaneously. Previously, filtering was limited to a single journal. This change provides greater flexibility and accuracy when analyzing financial data.
Original PR description
In accounting reports, we want to be able to filter on multiples journals if needed. This filter will allow us to do this. Using `context['search_default_journal_id'] = journal_ids` doesn't work as only the first id is passed to the filter. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where FedEx freight service requests were failing due to missing information required by the FedEx API. Specifically, the system was missing a 'bookingConfirmationNumber' field, leading to validation errors. This fix ensures accurate rate retrieval and delivery validation for FedEx freight services.
Original PR description
Issue ----- Fedex freights services require extra information not present in the db, so requests will not be accepted by the API. A rate can be retrieved but the delivery cannot by validated by users as they get a `SHIPMENT.LOADCOUNT.INVALID` error. This is due to the lack of a `expressFreightDetail` entry in the request sent to the Fedex API. This `expressFreightDetail` field should contain some information which Odoo does not have a way to retrieve, such as a `bookingConfirmationNumber`. API details: https://developer.fedex.com/api/en-us/catalog/ship/v1/docs.html#:~:text=expressFreightDetail Feedback 5913471 ----- Ticket: opw-5876616
This update resolves a technical issue that caused a 500 error when users accessed appointment information URLs with incorrect parameters. The fix ensures a smoother booking experience by gracefully handling missing data, preventing errors and improving overall stability. This change impacts the appointment booking process.
Original PR description
Steps to reproduce: 1. Install 'appointment' module. 2. Set up any regular appointment. 3. Instead of following the steps for booking, try to access an info url with wrong parameters, e.g.: just /info or /info?allday=0 4. Observe a 500 error due to missing parameters. Issue: When accesing the /info route with the missing parameters of 'date_time' and 'duration' which are exepected to be always present, a 500 error is raised. Solution: We could gracefully handle this issue by redirecting the user if the proper values are not present in the URL parameters. opw-5412775
This update resolves an issue where autofilling pivot cells with invalid relational IDs would cause a crash. The fix ensures that autofill functionality continues to work while preventing the associated tooltip from triggering a system error. This improves the reliability and usability of the pivot table feature.
Original PR description
If you try to autofill a pivot cell that has an invalid relational id in its domain (eg. `=PIVOT.HEADER(1, "stage_id", 99999999)`), the autofill actually works but the tooltip make everything crash. Task: [5913754](https://www.odoo.com/web#id=5913754&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form)
This update reverts a recent change that caused all upsell quotes to be canceled, disrupting legitimate business processes. The previous update incorrectly used a function that resulted in errors and unintended cancellations. This reversion restores the correct quote handling functionality.
Original PR description
…mmit/55b6bbe27cc31abcaee40cd4a196e087fdfd4ce5 This commit introduced an issue. All upsell quote were canceled and no filtering was done on "alternative quotes". As a result it could disrupt legit business flow. Moreover, action_cancel was called instead of _action_cancell which can lead to ValueError: Expected singleton as action_cancel can require single record sometimes.
A bug was preventing users from correctly saving approval domain rules within the web studio interface. This was caused by an incompatibility between how Python and JavaScript represent boolean values. The update replaces a flawed method of converting domains to strings with a more reliable approach, ensuring approval rules are saved accurately.
Original PR description
Steps to reproduce ================== - Install web_studio,sale_management - Open a form view in sale - Open studio - Click on the "Send by email" button - Add an approval rule - Add a domain by clicking on the filter icon - Use the not set operator - Confirm - Click on the filter icon again - Confirm => ValueError: malformed node or string on line 1: <ast.Name object at 0x79ff4c7b7f50> Cause of the issue ================== JSON.stringify was used to pass the domain as a string to the DomainSelectorDialog. This doesn't work for boolean as they don't have the same representation in JavaScript as opposed to Python. Solution ======== Use the Domain().toString function opw-5923585
This update ensures that CODA file transactions are correctly split according to the journal settings, even when processed automatically through the Odoo cron job. Previously, the cron job bypassed this splitting logic, leading to incorrect accounting. This fix resolves a discrepancy between manual and automated import methods.
Original PR description
When importing CODA files manually, transactions are correctly split according to the journal configuration. However, when processed via the cron, the splitting logic is bypassed because the journal recordset is empty at the time of parsing. This occurs because the journal is identified only after the file has been parsed, which is too late for the cron flow. This commit ensures the journal is available early enough to respect the "Split Transactions" setting regardless of the import method. opw-4954539