Daily updates from Odoo
Wednesday, May 20, 2026
60 changes · saas-19.3
Resolved issues and error corrections
A recent issue with the HTML editor was causing a technical error when selecting table headers. This fix updates the code to correctly identify both table data cells (`td`) and header cells (`th`), resolving the error and ensuring proper table selection functionality. This improves the overall stability and usability of the HTML editor.
Original PR description
### Steps to Reproduce : - Add a table (e.g., /table). - Turn the first row into table header. - Select all the cells of the table header. - Traceback occurs. ### Purpose of this PR: - Selecting a table header row caused a `Cannot read properties of null (reading 'getBoundingClientRect')` error because the table plugin only looked for `td` elements. This PR replaces hardcoded `td` selectors with the `isTableCell` helper to handle both `td` and `th` elements. task-6220287 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264670
This update fixes a validation error that occurred when using cash basis accounting with payable or receivable accounts. The change restricts users from selecting these account types as transition accounts, ensuring consistent and accurate accounting records. This prevents errors during invoice processing and improves overall system stability.
Original PR description
## **Issue** When a cash basis tax is configured with a payable/receivable transition account, tax journal items are generated on that account without a due date. Since payable/receivable accounts…
## **Issue** When a cash basis tax is configured with a payable/receivable transition account, tax journal items are generated on that account without a due date. Since payable/receivable accounts require a due date on journal items, this leads to a validation error during move creation: "Any journal item on a payable account must have a due date and vice versa." ## **Steps to reproduce:** 1. Install the Accounting and Inter-Company modules. 2. Create an additional company so that there are a total of two companies, then switch to Company 1. 3. Create a product with a price and assign a tax to it. 4. Navigate to Accounting → Configuration → Settings and enable Cash Basis accounting. 5. Go to Accounting → Configuration → Taxes and open the purchase tax (or the tax assigned to the product). 6. In the Tax Computation section, ensure that Group of Taxes is not selected. 7. Under the Advanced Options tab, set Tax Exigibility to Based on Payment. 8. Set the Cash Basis Transition Account to a payable account. 9. Open Company Settings, select Company 1, go to the Inter-Company Transactions section, and enable Synchronize invoices/bills. 10. Switch to Company 2 and create an invoice using the same product. Select the contact that is the partner of Company 1. 11. Confirm the invoice. The following error is raised: "Any journal item on a payable account must have a due date and vice versa." ## **With This Commit:** Added a domain on the Cash Basis Transition Account field to prevent users from selecting payable or receivable accounts, avoiding invalid configurations and runtime validation errors. opw-6189615 Forward-Port-Of: odoo/odoo#264777 Forward-Port-Of: odoo/odoo#263792
This update fixes a bug that allowed users to create multiple leave requests for the same day, even after approving and rejecting them. The fix ensures that the system accurately detects and prevents conflicting leave requests, improving data integrity and reducing potential scheduling errors. This change was made as part of a broader effort to enhance the reliability of the holiday calendar.
Original PR description
Steps to reproduce:- - Navigate to Time off Dashboard calendar view. - Create a leave. First approve it then refuse it. - Now on the same day create a leave and approve it. - Now re-approve the…
Steps to reproduce:- - Navigate to Time off Dashboard calendar view. - Create a leave. First approve it then refuse it. - Now on the same day create a leave and approve it. - Now re-approve the previously refused leave from step 2. - System will let user to create 2 leave of same types on same day! Cause:- In `_compute_dashboard_warning_message`, refused/cancelled leaves were excluded from warning computation. When approving a refused request, the warning message was not set, allowing the constraint check to pass even when conflicting approved requests existed for the same period. Fix:- 1. Refactored `_compute_dashboard_warning_message` to only compute warnings for active leaves (non-refused/cancelled) while still detecting conflicts with already approved requests 2. Updated `_check_date` constraint to skip validation for refused/ cancelled leaves, but enforce it when state changes to validate 3. Added 'state' to constraint triggers to ensure validation runs when approving previously refused requests task-[6181717](https://www.odoo.com/odoo/project/1251/tasks/6181717) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265192 Forward-Port-Of: odoo/odoo#262703
A technical issue where a 'Create Ticket' action was incorrectly appearing in WhatsApp conversations has been resolved. This change prevents users from attempting to create tickets through the sidebar, eliminating a potential error and improving the user experience. This was a minor fix.
Original PR description
The 'Create Ticket' action was incorrectly visible in the sidebar actions of WhatsApp conversations in Discuss. Clicking it caused a traceback because `owner.root` is not defined in the sidebar action context. This commit removes the action from sidebar actions. Task-[6220037](https://www.odoo.com/odoo/project/1519/tasks/6220037) Forward-Port-Of: odoo/enterprise#117571
This update addresses a problem where lazy translations weren't correctly loaded when using Markupsafe 3.0.0, leading to incorrect language display. The fix ensures translations are evaluated in the proper context, maintaining compatibility with older Markupsafe versions used across our different Ubuntu environments.
Original PR description
In Markupsafe 3.0.0, a refactoring [^1] aiming at simplifying speedups implementation had an impact on the encapsulated templates introduced in commit odoo/odoo@aab7b846cdb8e77701c5e84e81d9c95bd9cd0894. More precisely, the eventual subtitles containing most of the time lazy translation, those were not evaluated in the right context anymore leading to being unable to find the lang to translate into. This commit fixes it by forcing the evaluation of the translation at a point were the context makes sense and contains the right lang when using Markupsafe 3.0.0+ (used in Ubuntu Resolute), while maintaining compatibility with 2.1.5 (used in Ubuntu Noble and Debian Trixie). [^1]: https://github.com/pallets/markupsafe/commit/dcb170b127137880729ac66f03cb590fff562225 Forward-Port-Of: odoo/odoo#264023
This update corrects a problem where a view was incorrectly trying to modify a field that existed in a different part of the system. This prevented the base module from upgrading correctly. The fix ensures the correct inheritance path is used, resolving a parsing error and allowing the system to function as intended.
Original PR description
The `partner_pages_tree_view` was attempting to modify `activity_ids` field attributes, but this field is added by the mail module in a sibling inheritance branch…
The `partner_pages_tree_view` was attempting to modify `activity_ids` field attributes, but this field is added by the mail module in a sibling inheritance branch ([mail.res_partner_view_tree_inherit_mail]), making it unreachable from the [`partnership.view_res_partner_grade_tree`] ancestry chain:
```py
base.view_partner_tree → partnership.view_res_partner_grade_tree → partner_pages_tree_view
base.view_partner_tree → mail.res_partner_view_tree_inherit_mail ← activity_ids lives here
```
This caused a ParseError during base module upgrade:
```py
File "/home/odoo/odoo/odoo/odoo/tools/convert.py", line 639, in _tag_root
raise ParseError(msg) from None # Restart with "--log-handler odoo.tools.convert:DEBUG" for complete traceback
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
odoo.tools.convert.ParseError: while parsing /home/odoo/odoo/odoo/odoo/addons/base/views/res_partner_views.xml:13
Error while parsing or validating view:
Element '<field name="activity_ids">' cannot be located in parent view
View error context:
{'file': '/home/odoo/odoo/odoo/odoo/addons/base/views/res_partner_views.xml',
'line': 1,
'name': 'Partner Pages List',
'view': ir.ui.view(2148,),
'view.model': 'res.partner',
'view.parent': ir.ui.view(2108,),
'xmlid': 'website_crm_partner_assign.partner_pages_tree_view'}
```
**Steps to reproduce:**
- In a v19.1 db install `website_crm_partner_assign`
- Go to apps and search base module and click upgrade
**Fix:**
Make the partner view from partnership inherit from the one defined in mail instead of the one defined in base.
opw-6186684
[mail.res_partner_view_tree_inherit_mail]: https://github.com/odoo/odoo/blob/saas-19.3/addons/mail/views/res_partner_views.xml#L58C21-L67
[`partnership.view_res_partner_grade_tree`]: https://github.com/odoo/odoo/blob/f3b317310b84edb073009f7d15d7fec002f3ccf0/addons/partnership/views/res_partner_views.xml#L48-L57
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#264639This update prevents users from archiving Point of Sale (POS) configurations while an active sales session is running. This change ensures data consistency and avoids potential disruptions to sales transactions. The update includes a new test case to verify this protection.
Original PR description
Add 'active' to _get_forbidden_change_fields to block archiving a Point of Sale configuration while a session is still open. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247177 Forward-Port-Of: odoo/odoo#246760
This update fixes an issue preventing subcontracted products from automatically generating manufacturing orders during the replenishment process. The change ensures the correct routing logic is applied, improving the efficiency of stock replenishment for products using subcontracting. Task 6132290.
Original PR description
'product.replenish' default_get/_get_route_domain wrongly states that a manufacturing order can be created from a non-'normal' bill of material. This prevents the 'Manufacture' route from being proposed to subcontracted-only products. task: 6132290 Forward-Port-Of: odoo/odoo#260111
This update resolves an issue where the default prompt within the AI Documents account module was not updated after a recent code change. The fix ensures the prompt functions correctly, providing the expected AI assistance for document processing. This improves the usability of the AI Documents feature.
Original PR description
Bug === Since odoo/enterprise/pull/97362 we remove the code action to use a new type of action. But we forgot to update the code in the prompt modal. Task-6230554 Forward-Port-Of: odoo/enterprise#117715
This update resolves a minor issue where ActionList actions weren't correctly referencing the current context. This fix ensures that actions within ActionList displays and functions as intended, improving the overall user experience. It's a follow-up to a previous reported problem.
Original PR description
Follow-up of #265140.
This update fixes an issue where the displayed weekday in accrual plan levels was sometimes incorrect, showing Monday instead of the intended day. The change was necessary due to a difference in how Luxon handles weekday values (0-6 vs. 1-7). This ensures accurate representation of accrual plan schedules.
Original PR description
**Steps to reproduce:** 1. Install Time Off 2. Go to Accrual Plans and create a new plan with a milestone 3. Set frequency to Weekly and choose a day other than Monday (e.g., Tuesday) 4. Save and…
**Steps to reproduce:** 1. Install Time Off 2. Go to Accrual Plans and create a new plan with a milestone 3. Set frequency to Weekly and choose a day other than Monday (e.g., Tuesday) 4. Save and check the displayed weekday in the accrual plan level **Issue:** The displayed weekday is incorrect (e.g., shows Monday instead of Tuesday). **Cause:** Previously, the weekday value was directly displayed using: https://github.com/odoo/odoo/blob/b40184ab371f7a4708621ecf7f25b4e2daaae38d/addons/hr_holidays/views/hr_leave_accrual_views.xml#L212-L214 so no conversion was involved. Now, the value is processed using Luxon. However, the week_day field stores values from 0 (Monday) to 6 (Sunday), while Luxon expects ISO weekday numbers from 1 (Monday) to 7 (Sunday). This mismatch causes an off-by-one error during conversion. https://github.com/odoo/odoo/blob/1b3d0a3c2f794324f8b230a9ae19f097454e3bdd/addons/hr_holidays/models/hr_leave_accrual_plan_level.py#L54-L62 **Solution:** Adjust the value before passing it to Luxon by adding +1 to match ISO format. opw-6112614 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259054
This update fixes an issue where the Table of Contents (TOC) navigation bar wasn't updating with translated text after styling headings on the website. The fix ensures that translated headings are correctly displayed in the TOC, regardless of inline styling, improving the user experience across multiple languages.
Original PR description
Steps to reproduce: =================== 1. Enable a second language on the website 2. Add a Table of Content snippet to a page 3. Apply bold (or any inline style) to one of the headings, save 4.…
Steps to reproduce: =================== 1. Enable a second language on the website 2. Add a Table of Content snippet to a page 3. Apply bold (or any inline style) to one of the headings, save 4. Switch to the second language in translation mode 5. Translate the styled heading and save => The TOC navbar entry keeps showing the source text on reload. => Expected: navbar shows the translated heading text, unstyled. Cause: ====== When a TOC heading carries inline markup, the server emits the heading and the navbar entry as two independent translation terms with different `data-oe-translation-source-sha` values, even though their textContent matches. A translation written under the heading's sha therefore never reaches the navbar's slot. `handleToC` was meant to bridge that by aliasing the navbar span's sha to the heading's during translation-mode setup, but two issues prevented it from working in saas-18.4+: - The TOC navbar lives under `.o_not_editable`, so its translation spans were excluded from `findOEditable` and `handleToC` never ran on them. The class `o_translation_without_style` was never added, and the sha was never aliased. Solution: ========= - `prepareTranslation` iterates TOC navbar translation spans explicitly, so `handleToC` reaches them despite `findOEditable` skipping `.o_not_editable`. - `handleToC` always tags the navbar span with `o_translation_without_style` when a matching heading exists. - An `after_replication_handlers` hook flags every replicated unstyled-translation target as `.o_dirty`, so the replicated translation is included in the save. opw-5950228 Forward-Port-Of: odoo/odoo#263547 Forward-Port-Of: odoo/odoo#260378
This update fixes an error in the Luxembourg Annual VAT Declaration report that resulted in incorrect calculations for Appendix E 1a. The fix ensures that all necessary tax data is included accurately, leading to more reliable financial reporting. This improves the accuracy of VAT reporting for Luxembourg businesses.
Original PR description
### Issue: The formula `L10N_LU_TAX_163` in the Luxembourg Annual VAT Declaration was incorrect: - `L10N_LU_TAX_791.year_start` was added twice - `L10N_LU_TAX_993.year_start` was missing As a result, the computed total in Appendix E 1a was incorrect ### Steps to reproduce: - Install `l10n_lu_reports` - Open the `Report: Annual VAT Declaration (LU)` - Go to `Appendix E` - Use the `Start of Financial year` pencil icons to manually set values for fields `791` and `993` - Check the computed value of field `163` After the fix, both values are included exactly once in the formula opw-6158950 Forward-Port-Of: odoo/enterprise#117214
This update fixes a potential issue where incorrect data in payslips could trigger warnings. The change ensures that these warnings are handled more gracefully, preventing disruptions to payroll processing. This improves the stability and reliability of the HR payroll module.
Original PR description
…ta and versions Task: 6133111 Forward-Port-Of: odoo/enterprise#114778
This update resolves an issue where file downloads from Odoo were failing when the filename started with a tab character. The fix ensures that filenames with tab characters are now correctly processed, allowing users to download files from various sources, including ZIP archives.
Original PR description
**Steps to reproduce:** * Upload an XML file whose filename starts with a tab character (e.g. extracted from a ZIP that preserves the tab in the filename). * Go to Accounting > Vendor > Bills and import the XML file. * In the chatter, click the attached XML file to download it. **Observed behavior:** * A JavaScript error is raised in the browser console: `TypeError: invalid parameter format` * The file cannot be downloaded. **Cause:** * `PARAM_REGEXP` in `download.js` defines qdtext as `[\x20!\x23-\x5b\x5d-\x7e\x80-\xff]`, which excludes `\x09 (HT/tab)`. * Per RFC 2616, `qdtext = any TEXT` except `"`, and `TEXT` includes `LWS` which includes HT `(\x09)`, making `filename="\ttest.xml"` a valid Content-Disposition header. * The JS parser was incorrectly rejecting a valid header value. **Fix:** * Add `\x09` to the qdtext character class in `PARAM_REGEXP` in `download.js`, making the parser `RFC 2616` compliant. opw-6052996 Forward-Port-Of: odoo/odoo#265176
This update clarifies the extra costs associated with combo selections in the point-of-sale system. Previously, customers were unclear about additional charges, leading to confusion and inquiries. This change ensures accurate pricing is displayed, improving the customer experience and reducing potential misunderstandings.
Original PR description
The display for the extra price during the combo selection was not very clear. The customer were not aware of the additional cost that were applied when choosing some elements that were not included but extra. This led to customer asking cashier if there was a problem because they were paying "too much" when the computation was actually correct but not clear enough. task-id: 6142095 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261264 Forward-Port-Of: odoo/odoo#260705
A recent change in how sale orders are confirmed was causing stock move deadlines to be incorrectly set to the earliest lead time, rather than the individual line lead times. This meant deliveries were being scheduled too early. The fix removes the automatic assignment of a commitment date, allowing deadlines to be calculated correctly based on each order line's lead time.
Original PR description
Version: -------- - saas-19.1+ Step to reproduce: ---------------------- * Install *sale_management* and *stock* modules. * Create a Sale Order with at least two order lines. * Set different…
Version:
--------
- saas-19.1+
Step to reproduce:
----------------------
* Install *sale_management* and *stock* modules.
* Create a Sale Order with at least two order lines.
* Set different *Customer Lead Time* (it is optional hide by default)
on each line:
* Line A: 5 days
* Line B: 10 days
* Confirm the Sale Order.
* Open the generated Delivery Order.
* Enable the *Deadline* field on stock moves (it is optional hide by default).
* Check the *Deadline* value for each move
issue:
-----
* Both stock moves have the same *Deadline*, corresponding to the minimum
lead time (earliest date), instead of their respective values.
Root cause:
-----------
1. User confirms a Sale Order with two lines:
- Line A: customer_lead = 5 → _expected_date() = order_date + 5
- Line B: customer_lead = 10 → _expected_date() = order_date + 10
2. sale.order.action_confirm()
└─ Before calling `_action_confirm()`, the method set:
`order.commitment_date = order.expected_date`
where `expected_date = min(all line._expected_date()) = order_date + 5`
3. sale.order._action_confirm()
└─ calls order_line._action_launch_stock_rule()
https://github.com/odoo/odoo/blob/00edcf55380431c454857b2749f2fe4930b1e758/addons/sale_stock/models/sale_order.py#L209
4. sale.order.line._action_launch_stock_rule()
└─ per line: calls line._prepare_procurement_values()
5. sale.order.line._prepare_procurement_values()
└─ date_deadline = self.order_id.commitment_date or self._expected_date()
Because commitment_date was force-set in step 2, BOTH lines resolve to
order_date + 5 instead of their individual values.
https://github.com/odoo/odoo/blob/00edcf55380431c454857b2749f2fe4930b1e758/addons/sale_stock/models/sale_order_line.py#L281
NOTE:
------
This issue originates from changes introduced in task: https://www.odoo.com/odoo/project/966/tasks/4687135
That task aimed to add the Promise Date to Purchase Order Lines and, during
confirmation, assign it as the expected arrival date.
* This behavior works correctly in Purchase Orders because the Promise Date is
applied at the purchase order line level and aligned with each
line’s expected arrival date. It does not participate in the computation of
date_deadline.
- In the purchase flow:
The incoming stock move date_deadline is directly derived from each line’s
expected arrival date.
https://github.com/odoo/odoo/blob/00edcf55380431c454857b2749f2fe4930b1e758/addons/purchase_stock/models/purchase_order_line.py#L308
There is no dependency on a promise date.
As a result, deadlines remain per-line and accurate.
However, in the Sale Order flow, the same approach introduces an issue.
Here:
The Promise Date (commitment_date) exists at the order level, not at line level.
During confirmation, it is set using the minimum of all line expected dates.
The delivery stock move date_deadline depends on this commitment_date.
As a consequence:
Setting a single order-level promise date overrides all per-line expected dates.
All stock moves receive the same (minimum) deadline.
Additionally, this is not aligned with the business logic:
Example:
Line A → lead time = 5 days
Line B → lead time = 10 days
Current behavior sets deadline = min(5, 10) = 5 days for all moves,
which incorrectly forces later deliveries to be scheduled earlier than intended.
Solution:
---------
* Remove the automatic assignment of commitment_date = expected_date in action_confirm().
commitment_date is a user-defined promised delivery date and should not be
implicitly set during confirmation. By leaving it unset, procurement values
correctly fall back to line._expected_date(), restoring per-line deadline
computation.
---
opw-6106045
Forward-Port-Of: odoo/odoo#258911This update fixes an issue where freight charges were incorrectly applied to all pickings, particularly with backorders. The solution ensures freight costs are accurately reflected only in the initial, confirmed picking, aligning with how delivery costs should be invoiced to customers.
Original PR description
Commit 28b840b introduced logic to include `freight_costs` in the customs document generated bySendcloud. It introduced 2 new issues as a result: 1. When creating backorders, the `freight_costs` are…
Commit 28b840b introduced logic to include `freight_costs` in the customs document generated bySendcloud. It introduced 2 new issues as a result: 1. When creating backorders, the `freight_costs` are not divided but instead propagated to all of the pickings. 2. When there is no SO, we were taking the total value of all delivered goods, which doesn't make much sense considering the `freight_costs` field should be the cost of the delivery itself. Solution ----- For the first problem, there are a couple things to keep in mind: - the total `freight_costs` declared to the customs entity should be the amount invoiced to the customer - products can be added and removed from the picking after the SO has been confirmed - actual delivery cost can change between invoice date and actual delivery date - picking can be split into multiple packages at the user's discretion Considering all of the above, we will simply forward the invoiced amount with the first confirmed picking and none of the backorders. ----- Ticket: opw-6013387 Forward-Port-Of: odoo/enterprise#117115 Forward-Port-Of: odoo/enterprise#111304
This update fixes an issue preventing proper asset depreciation configuration within the l10n_mx module. The changes ensure accurate monthly depreciation calculations and correct linking of asset accounts, resolving errors in the automatic depreciation flow. This ensures compliance with Mexican accounting standards.
Original PR description
**Steps to reproduce:** * Install `l10n_mx` module. * Go to Accounting > Assets and create a new asset. * Attempt to select a Fixed Asset account in the corresponding field. **Observed behavior:** *…
**Steps to reproduce:** * Install `l10n_mx` module. * Go to Accounting > Assets and create a new asset. * Attempt to select a Fixed Asset account in the corresponding field. **Observed behavior:** * No existing Fixed Asset accounts correctly show up in the selection. * Even if an asset goes through by force-creating an account, the automatic depreciation flow fails because the depreciation models generate a single yearly entry instead of monthly, and the depreciation/expense accounts have incorrect account types. **Cause:** * The chart of accounts had Accumulated Depreciation template accounts (e.g., `171.05.01`) set to `expense_depreciation` instead of `asset_non_current`, rendering them unavailable for the Accumulated Depreciation field. * The Depreciation Expense accounts (e.g., `613.05.01`) were conversely set as `expense_direct_cost` instead of `expense_depreciation`. * The main Fixed Asset accounts (e.g., `156.01.01`) were completely missing the explicit mappings for `asset_depreciation_account_id` and `asset_expense_account_id` within the CSV definition. * The depreciation models in `account.depreciation.model-mx.csv` were configured with a `method_period` of `12`, resulting in yearly rather than standard monthly entries. **Fix:** * Modify `account.account-mx.csv` to convert all `171.xx/183.xx` accounts to `asset_non_current` and all `613.xx/614.xx` accounts to `expense_depreciation`. * Introduce the `asset_depreciation_account_id` and `asset_expense_account_id` columns into the `account.account-mx.csv` file, properly linking each Fixed Asset account to its correct depreciation targets. * Update `account.depreciation.model-mx.csv` to use a `method_period` of `1` (monthly) and convert the `method_number` logic from yearly durations to full month durations (12, 36, 60, and 120 months respectively) for creating accurately timed entries. opw-6091214 Forward-Port-Of: odoo/odoo#259781
This update ensures that all text within the MRP MPS component of Odoo Enterprise is properly prepared for internationalization (I18N). Previously, placeholder text was not translatable, and this change makes the system ready for localization into different languages. This improves the user experience for international customers.
Original PR description
Forward-Port-Of: odoo/enterprise#117750
This update resolves a visual issue where the SelectCreateDialog's control panel and list headers were disappearing. The fix restores the intended scrolling functionality, ensuring users can properly view and interact with the dialog. This was caused by a previous change that removed a key styling rule.
Original PR description
This commit fixes an issue where the SelectCreateDialog's control panel and list headers would scroll out of view, restoring the intended behavior introduced in https://github.com/odoo/odoo/pull/206433. The feature was inadvertently broken by https://github.com/odoo/odoo/pull/219972, which removed the `overflow: auto` rule from `o_content` elements outside of actions. To resolve this, the `overflow: auto` rule has been explicitly reapplied to the SelectCreateDialog content area. task-6214232 Forward-Port-Of: odoo/odoo#264965
This update resolves errors in the Live Chat dashboard that were causing incorrect data and preventing certain features from working. The change replaces a data field in the spreadsheet with a new percentage-based metric, ensuring accurate reporting and improved dashboard functionality. This fix enhances the reliability of Live Chat performance data.
Original PR description
* = spreadsheet_dashboard_im_livechat Before this commit, in the Live Chat dashboard: 1. Many cells would be in error state. 2. Clicking the "Sessions by Day of Week" header in order to access the pivot view would result in a traceback. This happens since [1], where the `rating` field of `im_livechat.report.channel` got converted from Integer to Selection, without updating the usage in the Dashboard spreadsheet. This causes the `varchar` `rating` field to be averaged, resulting in errors. This commit fixes the issues by: 1. Replacing `rating` for `rating_percentage` in the Dashboard spreadsheet. 2. Adding a `_read_group_select` that provides a value of `rating:avg` for backwards compatibility of existing spreadsheets. [1] https://github.com/odoo/odoo/pull/246279 task-6230207
This update resolves a test failure related to GS1 barcode scanning in the Point of Sale module. The fix ensures the system correctly interprets 14-digit GTIN-14 barcodes, which are standard for GS1 products, leading to accurate product addition to orders. This improves the reliability of barcode scanning during transactions.
Original PR description
The test_GS1_pos_barcodes_scan was failing because the "GS1 Variant Product" barcode was defined as a 13-digit string, while the tour scans it using the GS1 AI 01 (GTIN), which expects a 14-digit GTIN-14. By adding a leading zero to the barcode in the test setup, we align it with the GTIN-14 format parsed by the POS barcode parser during the scan, ensuring the product is correctly added to the order. runbot-error: 242323 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258547 Forward-Port-Of: odoo/odoo#258089
This update resolves a problem where backorders couldn't be created after merging production orders, leading to an error. The fix ensures that production groups are not deleted prematurely, preventing this issue. This improves the reliability of the backorder process.
Original PR description
# How to reproduce - Create 2 MO's A & B, both having the same product_id & bom_id - Split MO A into two MO's A1 & A2 - Merge MO's A1 & B # The issue MO A2 no longer has a production group (visible…
# How to reproduce - Create 2 MO's A & B, both having the same product_id & bom_id - Split MO A into two MO's A1 & A2 - Merge MO's A1 & B # The issue MO A2 no longer has a production group (visible via Studio). If the user tries to partially produce the MO and create a backorder, a traceback popup appears with : "ValueError: max() iterable argument is empty" # Cause The traceback is triggered because we use the `max()` function on `self.production_group_id.production_ids` when creating the backorder, but `production_ids` is an empty recordset since `production_group_id` is also empty. https://github.com/odoo/odoo/blob/0d8eaeeb971f2f670aebb1b72ed03f4a2d5e0105/addons/mrp/models/mrp_production.py#L1936 The production group is empty because when merging two MO's we delete it without paying attention to other remaining links. https://github.com/odoo/odoo/blob/394a30f8a2814d460cfe220b5017e7ac95d8cddc/addons/mrp/models/mrp_production.py#L2555 Note : the production groups were introduced by this commit (https://github.com/odoo/odoo/commit/2713876dbc70d3984e584a9037a2206dcda4e84a) # Proposed solution When merging, we unlink the original MO's from their production group. Then, we check every altered production group : if they are not linked to any MO anymore, we delete them. opw-6055376 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256600
This update ensures that the first product variant shown on the external website matches the order in which it appears on category pages and within the product configurator. Previously, the website wasn't consistently displaying the correct initial variant, leading to a potentially confusing customer experience. This fix corrects this issue.
Original PR description
When generating a product, set product.template.attribute.value sequences so that the variant that shows first in the external website is also first by _get_first_possible_variant_id(). This ensures the correct variant image appears on the shop category page and is pre-selected in the product configurator. Forward-Port-Of: odoo/enterprise#117701
This update ensures that UTM tracking parameters (like those used for marketing campaigns) are correctly processed when the website's cookies bar is displayed. Previously, these parameters weren't handled properly. This change improves the accuracy of marketing data collected through the cookies bar.
Original PR description
Since we've added the utm_reference parameter, it should be correctly handled in when the cookies bar is present Added in: https://github.com/odoo/odoo/pull/233963 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#265011
This update fixes a test for the HTML editor that was unreliable due to its dependence on timing and browser behavior. The change makes the test more stable and predictable, especially on slower computer systems, ensuring consistent test results.
Original PR description
Description of the issue this PR addresses: Previously the test relied on real timers, animation frames and simulateArrowKeyPress(), making it sensitive to browser scheduling, native selectionchange timing and CPU slowness. The test now: - use advanceTime() instead of real setTimeout() - Replace simulateArrowKeyPress() with manual selectionchange dispatch to make debounce scheduling deterministic and avoid relying on the browser's asynchronous native selectionchange dispatch. - Add patchWithCleanup + verifySteps to test actual debounce execution rather than DOM visibility timing, which is sensitive to rendering and brwoser scheduling variance. This removes timing races and stabilizes the test on slow CI workers. runbot-242466 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264893
This update resolves a crash during KSeF certificate authentication caused by Odoo not properly handling different certificate types. The fix automatically determines the correct identifier type, ensuring successful authentication and compliance with Polish tax regulations. This improves the reliability of the Odoo system for businesses using KSeF.
Original PR description
### Description of the issue/feature this PR addresses: **Issue**: During KSeF authentication, some foreign qualified certificates causes a crash with error _"Failed to authenticate with XAdES: 400…
### Description of the issue/feature this PR addresses: **Issue**: During KSeF authentication, some foreign qualified certificates causes a crash with error _"Failed to authenticate with XAdES: 400 Client Error: Bad Request for url: https://api.ksef.mf.gov.pl/v2/auth/xades-signature"_ This is due to Odoo not handling different `SubjectIdentifierType` **Solution**: Implement a try/except block to safely check for the NIP in the certificate's subject string, defaulting the identifier type to `certificateFingerprint` when the NIP is missing or a ValueError is caught. ### Current behavior before PR: The `SubjectIdentifierType` is hardcoded as `certificateSubject`, and does not handle `certificateFingerprint` at all. This causes there to be an error when trying to authenticate with the KSeF server using XAdES signature. ### Desired behavior after PR is merged: The sign_authentication_challenge method will now safely evaluate the subject string. It assigns `certificateSubject` only if the NIP is verified to be in the subject string. If the NIP is absent or a ValueError occurs during parsing, the system safely falls back to using `certificateFingerprint`. This prevents tracebacks and ensures the correct XML payload is sent to the KSeF server. Ticket [link](https://www.odoo.com/odoo/project.task/6125243) opw-6125243 Forward-Port-Of: odoo/odoo#264851
This update resolves an issue where product category images weren't showing correctly on website B when accessed without being logged into website A. The fix ensures category images use absolute URLs, bypassing domain-based access rules that were causing the display to fail. This improves the visual consistency of product categories across all websites.
Original PR description
Scenario: - set two website A and B with different domain - create an eCommerce category Y - create and publish a product with category Y, website B - drop category list widget in a page in website B - set in /odoo/system-parameters web.base.url to domain of website A - open the page in website B while being logged out of website A Result: the category Y image is dead. Cause: category images are using domain of "web.base.url", so if that corresponds to a website where the category is not shown (because of the access rule "Hide empty eCommerce categories to public/portal users") then the image will not be shown (unless we are a logged in internal user on the domain of "web.base.url"). Fix: use absolute URL without domain for category image, the same way it is done for other dynamic snippets (eg. Products). opw-6118004 Forward-Port-Of: odoo/odoo#260124
This update corrects a bug where a course would remain active even after all orderlines were removed, preventing table release. The fix automatically cleans up empty courses when the last orderline is deleted, ensuring the system functions correctly and tables can be released efficiently.
Original PR description
Steps to reproduce: - add a course - add a orderlines - remove orderlines - the course is still there - unable to release table Fix: Call cleanCourses after removeOrderline so empty unfired courses are automatically deleted when the last orderline of a course is removed. Task-6181153 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#262818
This update corrects a technical issue preventing Croatian invoices with alphanumeric premises labels (like 'v1') from processing correctly. The change adjusts a key system rule to accept these labels, ensuring invoices are properly generated and processed without errors. This resolves a previous traceback and improves invoice confirmation functionality.
Original PR description
### Description of the issue/feature this PR addresses: The business premises label on Croatian invoices can legitimately contain alphanumeric characters (e.g., "v1"), as noted in the field's…
### Description of the issue/feature this PR addresses: The business premises label on Croatian invoices can legitimately contain alphanumeric characters (e.g., "v1"), as noted in the field's tooltip. However, the regex pattern inside `_get_l10n_hr_fiscalization_number` used to extract the sequence parts strictly expected digits (`\d+`) for the premises label segment. Because of this, if an invoice was generated with an alphanumeric sequence like `INV-2026-0001/v1/1`, the regex failed to match and returned `False`, leading to a traceback when the system attempted to process the fiscalization number. This commit updates the regex to correctly accept alphanumeric characters for the premises label, ensuring the sequence parses successfully. opw-6129009 ### Steps to reproduce: - Settings > Users & Companies > Companies > New > set Address country to Croatia - Select the newly created Croatian company - Apps > Activate l10n_hr_edi module - Accounting > Configuration > Accounting > Journals > click Sales journal > change “Business premises label” to “v1” - Contacts > New > set Address country to Croatia - Accounting > Customers > Invoices > New > select the newly created contact and choose any product > Confirm ### Current behavior before PR: Traceback error when attempting to confirm an invoice when both the company and the customer have their country code set to 'HR'. This is because `_get_l10n_hr_fiscalization_number` does not accept alphabet characters in the premises label section of the regex. ### Desired behavior after PR is merged: - No traceback error when confirming the invoice - `_get_l10n_hr_fiscalization_number` correctly parses the fiscalization number Forward-Port-Of: odoo/odoo#263650
This update fixes a potential crash during bank statement imports caused by incorrect journal selection. The system now automatically validates currency and IBAN matches, ensuring the correct journal is used and preventing user errors. This improves the reliability and accuracy of importing bank statement data.
Original PR description
Behavior before: The import flow could crash with an "Expected singleton" error if multiple journals shared an IBAN. Additionally, the system blindly accepted the current context ('self') as the…
Behavior before:
The import flow could crash with an "Expected singleton" error if multiple
journals shared an IBAN. Additionally, the system blindly accepted the
current context ('self') as the target journal, even if its currency or
bank account mismatched the statement, often leading to avoidable
UserErrors.
Behavior after:
The system now validates 'self' against the statement's currency and IBAN
before assignment. If a mismatch is found, it automatically searches for
the correct journal. The search is now restricted by currency and includes
a limit=1 to prevent crashes and ensure accurate selection.
Root Cause:
In _find_additional_data(), 'journal = self' was assigned without validation.
Furthermore, the fallback search lacked a record limit and currency matching
logic, allowing multiple records to be returned when duplicates or
multi-currency setups existed.
Fix:
- Added validation for the initial 'self' candidate (currency and IBAN match).
- Refined the search domain to include currency matching (journal or
company fallback).
- Added limit=1 to the search to guarantee a singleton recordset.
opw-5462037
Forward-Port-Of: odoo/enterprise#117394
Forward-Port-Of: odoo/enterprise#115475This update aligns MPF contribution rules in Hong Kong with a standard age range (18 to under 65), ensuring accurate payroll calculations. It simplifies contribution eligibility checks and brings consistency across EEMC/ERMC contributions, resolving a previous inconsistency in reporting. This change improves the accuracy of MPF reporting and simplifies compliance.
Original PR description
### Before: - Mandatory MPF rules only checked the upper age bound (< 65 from period start). - Employees under 18 could still be considered eligible for EEMC/ERMC contributions. - eMPF reporting had a separate 16-year age check. - Employees younger than 16 were excluded from the eMPF report, even when they had voluntary contributions. ### After: - Mandatory MPF rules now apply a full age gate (18 to under 65) across the payslip period. - EEMC and ERMC use the same eligibility condition for consistent contribution behavior. - The eMPF reporting age check is now aligned to 18. - Employees under 18 remain excluded from eMPF reporting unless they have actual MPF contributions. - Under-18 employees with voluntary contributions are now included in the eMPF report, matching the existing over-65 voluntary contribution behavior. --- Task-6141664
A recent update (saas-19.3) introduced an unwanted gap between the Studio navigation bar and the apps section on the home page. This fix removes the problematic margin and adjusts spacing for the search input, restoring the intended visual appearance and preventing background exposure.
Original PR description
Since saas-19.3, an extra margin on the home menu introduced a visible gap between the Studio navbar and the apps section, exposing the background. This commit removes the margin from the o_home_menu and applies spacing to the search input instead. task-6175467 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue causing the Odoo tour to become unpredictable. The fix ensures the sliding panel fully closes before proceeding, preventing a race condition that previously disrupted the tour flow. This enhances the user experience and ensures consistent tour functionality.
Original PR description
This commit stabilizes the tour flow by ensuring the sliding panel is fully closed before proceeding to the next step. Issue: The tour steps selects a shape, which triggers [hideSlidingPanel]. That…
This commit stabilizes the tour flow by ensuring the sliding panel is fully closed before proceeding to the next step. Issue: The tour steps selects a shape, which triggers [hideSlidingPanel]. That function focuses a `BuilderButton` after a timeout. This introduced a race condition: if the timeout executes before the tour interacts with the `OverlayButtons`, the overlay gets hidden due to the `focusin` event registered on the builder (outside the iframe) [1], which ultimately hides the overlay buttons. The issue made the tour undeterministic following commit [2], which removed several intermediary steps between the shape selection and the failing step. Fix: Wait for the sliding panel to fully close before continuing the tour flow. [hideSlidingPanel]: https://github.com/odoo/odoo/blob/saas-19.3/addons/html_builder/static/src/core/building_blocks/builder_sliding_panel.js#L73-L81 [1]: https://github.com/odoo/odoo/blob/saas-19.3/addons/html_editor/static/src/core/selection_plugin.js#L265 [2]: https://github.com/odoo/odoo/commit/fa328f4e1798a9547e9df749c4144478357e1764 runbot-[242702](https://runbot.odoo.com/odoo/error/242702)
This update resolves an error that occurred when users removed the 'Source Entity Id Type' setting in the Super Contributions module. The fix ensures the system correctly handles this removal, preventing a data processing error and maintaining accurate reporting. This improves the stability of the Australian payroll functionality.
Original PR description
Currently an error occurs when the user removes the Source Entity Id Type on Super Contributions. **Steps to Reproduce:** - Install `l10n_au_hr_payroll_account` with demo data. - Switch to an…
Currently an error occurs when the user removes the Source Entity Id Type on Super Contributions. **Steps to Reproduce:** - Install `l10n_au_hr_payroll_account` with demo data. - Switch to an `Australian` company. - Go to `Payroll` > `Reporting` > `Australia` > `Super Contributions`. - Open an existing record or create a new one. - Remove the `Source Entity Id Type` value and click anywhere. `ValueError: Compute method failed to assign l10n_au.super.stream(<NewId origin=1>,).source_entity_id` After [change] in the selection field behavior, when the user removes the Source Entity Id Type, the compute method is triggered to compute the Source Entity ID. However, the condition in the compute method is not match, so no value is assigned. As a result, the method fails and raises an error. This commit ensures that if the condition is not match, the Source Entity ID is explicitly set to False. [1]- https://github.com/odoo/enterprise/blob/9d523d7aabffda277e1ef734caf2b0e434545dca/l10n_au_hr_payroll_account/models/l10n_au_super_stream.py#L61-L65 [change]: https://github.com/odoo/odoo/pull/214422/changes/8d2a42ac419fdf7943a0c11beb8c5de6c6f85bef Forward-Port-Of: odoo/enterprise#115466
This update resolves a usability issue in the composer where adding text to a seemingly blank line would hide it within the user signature. The fix moves the formatting code outside the signature container, preventing accidental text encapsulation and improving the composer's clarity for users. This ensures consistent and predictable signature behavior.
Original PR description
**Steps to reproduce:** - Go to the chatter of any record - Open the full composer - Empty line is present above the signature delimiter (`--`) - Adding text to this line will encapsulate it with the rest of the signature (and hide it by default in the message) **Issue:** Extra `<br>` was added to improve readability, but adding it this way (before the delimiter) can be confusing for the users as they can add text on what appears to be a normal empty line, that is actually hidden with the signature ellipsis. **Fix:** Moved the added `<br>` element outside the signature container for the full composer. The user can still find a way to modify the composer structure in a way that will hide part of the text (e.g. by typing just before the delimiter), but this limits the issue. related: https://github.com/odoo/odoo/commit/13a9c6f5010c3dee01aa0f66ed41b25f517a4a8c opw-6087042 Forward-Port-Of: odoo/odoo#257936
This update resolves an issue where archived sales teams were incorrectly showing up in the Sales Team dropdown when creating new opportunities within the CRM. The fix removes a redundant setting that was causing this behavior, ensuring accurate dropdown lists for active and archived teams. This improves the user experience and data consistency.
Original PR description
When you open a contact, click the Opportunities smart button, then click New and open the Sales Team dropdown, archived sales teams show up in the list. The same thing happens for the user, tags and…
When you open a contact, click the Opportunities smart button, then click New and open the Sales Team dropdown, archived sales teams show up in the list. The same thing happens for the user, tags and stage dropdowns. Creating an opportunity from the CRM app does not have this issue.
`res.partner.action_view_opportunity` sets `active_test: False` in the action context so archived opportunities show up in the list view. That context is passed down to the form opened from the action, and to every search the form runs to fill its dropdowns. So the dropdowns also return archived records.
The action's domain already has `('active', 'in', [True, False])`, which is enough to keep archived opportunities in the list on its own (the ORM only adds the "active = True" filter when `active` is not already in the domain). So we can just remove `active_test: False` from the context. This is what 18.0 was doing before https://github.com/odoo/odoo/commit/59feed9f26937ae8e2cab5cd7d2b6743ab6c0717 put the context flag back in.
The override in `website_crm_partner_assign` was setting `active_test: False` back on the action context for the same reason (so its extra search for assigned leads picks up archived ones). The flag is now applied locally on the `crm.lead` handle used for those searches, so archived leads are still found without polluting the action's context.
Steps to reproduce:
1. Archive a Sales Team in CRM > Configuration > Sales Teams
2. Open the Contacts app and pick any contact
3. Click the Opportunities smart button
4. Click "New" and open the Sales Team dropdown
=> Archived teams appear in the dropdown
Ticket [link](https://www.odoo.com/odoo/project.task/6134801)
opw-6134801
Forward-Port-Of: odoo/odoo#263283
Forward-Port-Of: odoo/odoo#261300This update ensures that donation confirmation emails are sent in the user's chosen website language, regardless of their anonymous status. Previously, emails were defaulted to English. This change improves the user experience and ensures consistent communication for all donors.
Original PR description
Steps to reproduce: =================== 1. Configure website with at least 1 language installed different from English. ex: English and French. 2. As anonymous user, change wehbsite language and make…
Steps to reproduce: =================== 1. Configure website with at least 1 language installed different from English. ex: English and French. 2. As anonymous user, change wehbsite language and make a donation via the donation snippet. 3. Check the outgoing confirmation email. => Email body is rendered in English. Cause: ====== The donation confirmation email rendered with `self.partner_id.lang`. For anonymous donors, `partner_id` is the website's shared public user partner, so every anonymous donor received the email in whatever language was set on that partner (or English if unset), regardless of the language they were browsing in. Solution: ========= `payment.transaction` already has a `partner_lang` field auto-filled from `partner.lang` at creation. - override it in the `/donation/transaction` controller with `request.env.lang` when the public partner is used, capturing the request language at donation time (also works later from `_cron_post_process`, which has no request context); - render `_send_donation_email` using `self.partner_lang` instead of `self.partner_id.lang`. opw-5875338 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264657 Forward-Port-Of: odoo/odoo#259351
This update fixes a minor error in the Odoo software's configuration for Mexican accounting. The change corrects a typo in the account group data, ensuring accurate reporting and compliance with Mexican tax regulations. This ensures the software functions correctly within the Mexican market.
Original PR description
Source: https://www.sat.gob.mx/minisitio/NormatividadRMFyRGCE/documentos2026/rgce/anexos/Anexo24delasRGCEpara2026.pdf opw-6174385 Forward-Port-Of: odoo/odoo#262549
This update prevents the system from wasting time attempting to create API keys for unreachable databases. Previously, errors would clutter the synchronization results and cause delays. Now, the system skips these databases, improving synchronization speed and user experience.
Original PR description
#### The aim of this commit is to: - avoid cluttering the user UI with "obvious" error. - avoid wasting up to 15s trying to create the key if we don't get any response. #### Context: When a db is unreachable, trying to create an api-key on it will result in an error. #### Before this commit: - The wizard showing the result of the synchronization would show the error for every single databases in which it encounters that error. If there are a lot, it would bloat the result. - An unresponsive db would waste 15s of our sync time in a synchronized process. If that happens multiple times, we could end up a lot of time waiting for no reason. #### After this commit: We don't try to create an api key for unreachable databases. task-id: [5945269](https://www.odoo.com/odoo/project.task/5945269) - follow up Forward-Port-Of: odoo/enterprise#117053
This update fixes a potential issue in the Point of Sale system by separating the waiter method. This change allows for more flexible error handling, particularly important for features like FDM where order validation needs to be paused during errors. It ensures the system can continue to function correctly even when issues arise.
Original PR description
In order to allow patching (in particular for FDM, where we don't want to finalize the validation of the order if there is an error), we extract the waiter method. see odoo/enterprise#104468 Forward-Port-Of: odoo/odoo#264974 Forward-Port-Of: odoo/odoo#244298
This update fixes an issue where the Point of Sale (PoS) displayed incorrect order totals due to delays in processing. The change ensures the correct order price is calculated and displayed on the feedback screen, preventing zero amounts and improving the user experience. It also includes safeguards to prevent order validation errors.
Original PR description
We now call manually `setOrderPrices` on order validation to ensure `amount_total` is set on the order before displaying the feedback screen which depends on it. The issue is that requests to the FdM delay the call to this method, making the PoS display `0` as the amount is `undefined` in the meantime. We also ensure the PoS doesn't finalize the validation if an error occurs. see odoo/odoo#244298 Forward-Port-Of: odoo/enterprise#117594 Forward-Port-Of: odoo/enterprise#104468
A test for multi-lot component consumption was failing due to a missing user group. This update explicitly grants the necessary 'lot tracking' group within the test environment, ensuring the test now passes correctly. This resolves a technical issue that could have impacted future development.
Original PR description
The test uses the stock move line detailed operations form and expects the `lot_id` field to be present in the view. Without demo data, the current user may not belong to the `stock.group_production_lot` group, causing the field to be absent from the rendered form view and the test to fail. Causing: `AssertionError: 'lot_id' was not found in the view` in line: https://github.com/odoo/odoo/blob/0442c66d26b0c23313f17c566b16e34e7b22c2b6/addons/mrp/tests/test_consume_component.py#L477 Grant the lot tracking group explicitly in the test setup. runbot-243588 Forward-Port-Of: odoo/odoo#263759
This update fixes a visual inconsistency in the CRM form view. Previously, MRR and AI probability fields were displayed on separate lines, causing misalignment across devices. Now, both fields are aligned on a single line for a cleaner and more consistent user experience on both desktop and mobile.
Original PR description
**Before this commit:** When recurring revenues were enabled in CRM, the MRR field was displayed across two lines instead of a single line as expected. In mobile view, the AI probability was displayed as a separate input field, instead of a same line. Commit: https://github.com/odoo/odoo/commit/cfef0dde9df8d1999e6aad0a28dbfd11049d19d8 **After this commit:** Updated the form view layout to display both the MRR and AI probability fields on a single line for better alignment and consistency across desktop and mobile views. Task-6128227
This update resolves an issue where Odoo was attempting to process GSTR2B attachments with missing file content, leading to errors. The change now verifies that the attachment's actual file data exists before processing, ensuring smoother return filing and preventing potential disruptions. This improves the reliability of the Invoicing reports.
Original PR description
There may be databases contained GSTR2B JSON attachments whose metadata was still present in `ir.attachment`, but whose underlying binary content was missing from the filestore. This caused the matching flow to attempt processing invalid JSON payloads instead of moving the return to `error_in_fetching`. The condition validating JSON attachments now also checks that the attachment raw content exists before adding it to the payload list. opw-6088082 Forward-Port-Of: odoo/enterprise#117083
This update corrects a technical error that prevented users from interacting with the 'Test' button within the IoT app. The issue stemmed from a data processing error, specifically an 'index out of range' error, which was preventing the button from functioning correctly. This fix ensures the 'Test' button operates as intended.
Original PR description
This PR fixes the following traceback when using "Test" button in the iot app: ``` 2026-05-18 07:48:36,248 22727 ERROR ? websocket: error from callback <bound method WebsocketClient.on_message of <WebsocketClient(Thread-6, started daemon 3995071456)>>: list index out of range 2026-05-18 07:48:36,249 22727 ERROR ? odoo.addons.iot_drivers.websocket_client: websocket received an error: list index out of range ``` opw-6226014 Forward-Port-Of: odoo/odoo#264897
This update resolves a limitation in the sale commission report's query, allowing it to handle significantly larger sales order IDs. By removing an unnecessary bit shift, the report now supports a much wider range of data, improving performance and scalability. This change ensures the report continues to function correctly with growing sales volumes.
Original PR description
The combined query for sale.commission.achievement.report originally performs several bitwise shifts, starting with the max AML ID. This is done to create a composite number ID for the combined IDs.…
The combined query for sale.commission.achievement.report originally performs several bitwise shifts, starting with the max AML ID. This is done to create a composite number ID for the combined IDs. `MAX(aml.id)::bigint <<20) | max(rules.id)::bigint <<10 | rules.user_id <<10` This shifts the max aml.id 40 bits to the left. Example: Let's say MAX(aml.id) = 1; we will set the other variables to 1, as they often have little impact on the total size of the number. 1 << 20 = 1048576 1048576 | 1 = 1048577 1048577 << 10 = 1099512676352 1099512676352 | 1 = 1099512676353 1099512676353 << 10 = 1152922604119523328 With this format, the highest guaranteed AML ID this query can handle is under 838,861. The last 10-bit shift is unnecessary and increases the result. If we remove the last shift, the AMD ID this query can handle becomes much higher. `MAX(aml.id)::bigint <<20) | max(rules.id)::bigint <<10 | rules.user_id` | | AML Max | RULES.ID Max |RULES.USER_ID Max| | --------------------- | ------ | ------ | ------ | | Before | 838,861 | 1,048,576 | 1,024 | | After | 858,993,459 |1,048,576 | 1,024| opw-6124026 Forward-Port-Of: odoo/enterprise#114711
This update fixes an issue where returned subcontracted products were incorrectly routed to the subcontractor's location instead of the user's stock. When returning products 'for exchange', the system now correctly directs returned items to the subcontractor's location and new deliveries to the user's stock, ensuring accurate inventory tracking during the subcontracting process. This prevents misallocation of stock and improves reporting accuracy.
Original PR description
## Issue When making a request for quotation for a subcontracted product and returning the delivery "for exchange", the new incoming delivery does not have the correct destination. Instead of having…
## Issue
When making a request for quotation for a subcontracted product and returning the delivery "for exchange", the new incoming delivery does not have the correct destination. Instead of having the stock of the user, the destination of the new incoming delivery is the same as its source: the subcontracting location.
<img width="1254" height="257" alt="5479900" src="https://github.com/user-attachments/assets/c7e6d392-8328-4a03-a71e-466e768f448b" />
## Steps to reproduce
1. Install MRP Subcontracting (`mrp_subcontracting`) and Purchase (`purchase`)
2. In Settings, enable *Subcontracting*
3. Create a Product P and a subcontracting BoM with Subcontractor S
4. Create a Request for Quotation
- Vendor: Subcontractor S
- Product: Product P (any quantity > 0)
5. Confirm the RFQ, receive the PO, validate the picking
6. On the validated picking, click *Return*, set the quantity of products to return, and click *Return for Exchange*
- This creates two new pickings, one to return the product(s) we received, and one to receive new products
7. Validate the two new pickings
8. **In Inventory > Reporting > Moves History, the very last `stock.move.line` has the same location in the *From* (`location_id`) and the *To* (`location_dest_id`) columns**
## Cause
The `location_dest_id` of the new `stock.move` is updated in `StockReturnPickingLine._prepare_move_default_values`.
https://github.com/odoo/odoo/blob/fb534f1eadcb8ef74e2ee6fd5b68872dddb978e3/addons/mrp_subcontracting/wizard/stock_picking_return.py#L20-L25
The condition added by https://github.com/odoo/odoo/commit/5404b426aac9 sets the destination of all returned subcontracted moves to the subcontractor location. This is incorrect when using "return for exchange", as in this case, the return move is directed towards the user's stock. In fact, when using "return for exchange", the following pickings are created:
| id | name | return_id | |
|:--:|--------------|:---------:|---|
| 1 | WH/IN/00001 | | Initial RFQ delivery |
| 2 | WH/OUT/00001 | 1 | Return of the initial RFQ delivery |
| 3 | WH/IN/00002 | 2 | New products delivery to replace the initial delivery. The stock.move.line of this stock.picking has a wrong `location_dest_id` |
## Fix
In the context of return for exchanges, the returned item must be directed to the *Subcontracting Location* while the new item must be directed to the *Stock*. In the `_prepare_move_default_values`, we should only set the `location_dest_it` to the subcontractor location for outgoing pickings.
opw-5479900
Forward-Port-Of: odoo/odoo#265071
Forward-Port-Of: odoo/odoo#245905This update fixes an issue where project update descriptions incorrectly showed inflated budget totals after budget revisions. The fix ensures that only the active, confirmed budget revision is used, providing accurate budget information for project updates. This improves the clarity and reliability of project financial reporting.
Original PR description
**Problem:** When a project analytic budget is revised, the project update description shows an inflated total budget — the sum of both the original and the revised amounts — instead of reflecting…
**Problem:** When a project analytic budget is revised, the project update description shows an inflated total budget — the sum of both the original and the revised amounts — instead of reflecting only the active (confirmed) revision. **Steps to reproduce:** 1. Create a project with an analytic account 2. Create an analytic budget of $10,000 and confirm it 3. Create a revision of that budget for $15,000 and confirm it 4. Create a new project update 5. The update shows "$25,000" as the total budget instead of "$15,000" **Current behavior:** The project update displays the sum of all budget revisions ($25,000), regardless of their state. **Expected behavior:** Only the active confirmed budget ($15,000) should be used. **Cause of the issue:** `_compute_budget` queries all `budget.line` records matching the project's analytic account without filtering by the parent `budget.analytic` state. When a budget is revised, the original transitions to state `revised` while the new one becomes `confirmed`. Because `_compute_budget` has no state filter, it sums both, producing an inflated `total_budget_amount`. This field is then used in the project update template to compute the displayed budget total and percentage. By contrast, `_get_budget_items` — used for the detail rows — already applies `state in ['confirmed', 'done']`, so the two methods were inconsistent. **Fix:** Applying the same state filter to `_compute_budget` as already present in `_get_budget_items` ensures both methods draw from the same set of active budgets, keeping the project update totals consistent with the budget detail rows. opw-6128855 Forward-Port-Of: odoo/enterprise#117490 Forward-Port-Of: odoo/enterprise#115285
This update clarifies the labels used for vehicle deductibility rates, ensuring they accurately represent the non-deductible portion. The previous labels were misleading, and this change improves the accuracy and clarity of financial reporting related to fleet vehicles.
Original PR description
The "Deductibility Rates" and "Deductibility (%)" labels are wrong for vehicles as they are supposed to represent the non-deductible part. This commit fixes these labels. task-6121629 Forward-Port-Of: odoo/enterprise#116878
A test was failing due to an unnecessary field ('tracking') in the product template data. This change removes the field from the point-of-sale module's demo data, resolving the test failure and ensuring consistent functionality. This ensures the point-of-sale module operates correctly.
Original PR description
Steps to reproduce: = - Install only the `point_of_sale` module. - Run `_getSplitOrderName`, `onClickLine` HOOT test. Issue: = - The test fails with the following error: - `Unknown field "tracking" on record id=25 in model "product.template"` Reason: = - The `stock` dependency was removed from `point_of_sale` and `tracking` field is defined in the `stock` module. Fix: = - Remove the `tracking` field from the `product.template` demo data in `point_of_sale`. - The field was unnecessary since its default value is already `none`. task-6229617 error-938075
This update resolves an issue where links between related blogs weren't correctly updated in Odoo. The fix ensures that all blog links are properly replaced after a blog is created, improving the overall user experience and content consistency.
Original PR description
Blogs that reference each other were not having their links properly replaced. This commit fixes it by making a second pass to replace the links once the blogs have been created
This update resolves an issue that prevented users from selecting multiple resources within the Planning app. The fix corrects a technical error that occurred when multiple resources were chosen, ensuring users can now efficiently manage resource assignments. This improves the usability of the Planning module.
Original PR description
Currently, selecting multiple resources in planning causes an error. ### **Steps to reproduce:** 1) Install Planning with demo data 2) Go to the Planning app and click on `New` 3) In the Resource field, open the dropdown, click Search More, select multiple records, then click Select ### **Error:** ``` TypeError: ResourceResource.get_materials_assigned_to_human_resources() takes 1 positional argument but 18 were given ``` ### **Root Cause:** At [1], a single argument is passed to `get_materials_assigned_to_human_resources`, but the field allows selecting multiple records, which leads to the error. [1]: https://github.com/odoo/enterprise/blob/8a843b69a59bc915fb6163aab03b144c2c93ac6b/planning/static/src/views/fields/many2many_avatar_resource/many2many_avatar_resource_field.js#L46C16-L50 ### **Fix:** Handle multiple records when calling `get_materials_assigned_to_human_resources`. **opw-6192072**
This update fixes an issue where the website search icon didn't function correctly on translated versions of the site (like French or Spanish). The change ensures the search bar opens consistently regardless of the user's selected language, improving the user experience across all supported languages.
Original PR description
Before this commit, clicking the search icon in the website header correctly opened the searchbar on the default language page, but failed on translated pages (e.g. FR, ES). Steps to reproduce: 1. Install a website with multiple languages enabled 2. Open the website in the default language (e.g. EN) 3. Click the search icon in the header -> Observe that the searchbar opens correctly 4. Switch to another language (e.g. FR or ES) 5. Click the same search icon -> Observe that nothing happens This commit updates the selector logic to properly target the search button regardless of the active website language. task-6226424
This update resolves an issue where branch companies couldn't access bank accounts configured for the parent company. Previously, attempts to pay invoices from a branch company resulted in an error. This change ensures branch companies have proper access to their associated bank accounts, allowing for seamless payments.
Original PR description
**Steps to reproduce:**
- Install Accounting
- Create a branch company
- From parent company, configure Bank journal:
=> set its "Bank Account Number" to a bank account having its company field set
- Switch to the branch company
- Create an invoice
- Confirm the invoice
- Try to pay from the invoice
**Issue:**
An Access Error is raised because the bank account used for the payment belongs to the parent company and the branch company doesn't have access to it.
opw-6001573
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#262173This update resolves an issue where PDFs containing JPG images were no longer readable after upgrading the pdf.js library. The team integrated OpenJPEG support, allowing Odoo to correctly process and display PDFs with JPG content, ensuring consistent PDF viewing functionality.
Original PR description
Following the update of pdf.js to v5.4, reading pdfs containing JPG files didn't work anymore: https://github.com/odoo/odoo/commit/5035107ef64a8c1ca1aae3a2b0de5bf8efa246f4 Taken from https://github.com/mozilla/pdf.js/blob/v5.4.394/external/openjpeg/openjpeg.wasm opw-6073568 Forward-Port-Of: odoo/odoo#260997
This update optimizes how Odoo handles changes to a partner's parent organization. Previously, updates could trigger unnecessary checks and errors. Now, the system only performs these checks when a true change to the parent ID occurs, resulting in faster and more reliable partner updates, especially through the API.
Original PR description
When updating a partner's parent_id, ensure the VAT check and move line updates are only triggered if the parent_id actually changes. This prevents unnecessary validations and side effects when writing the same parent_id value. This fix improves performance and avoids spurious errors when updating partners via the API. task-[6214466](https://www.odoo.com/odoo/project.task/6214466) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264175
This update optimizes the Point of Sale system by preventing unnecessary event triggers when no new products are created. Previously, a process triggered updates across many loyalty rewards even when no changes were made. This change improves performance and reduces redundant updates, leading to a smoother user experience.
Original PR description
Previously, `loadData` always fired the `"create"` event for every model in a batch, even when all records in that batch were updates (`createdIds = []`). Any listener registered on `"create"` would then be invoked with an empty ID list.
For example, `computeDiscountProductIdsForAllRewards` in pos_loyalty is subscribed to `product.product` "create". When called with `{ ids: [] }`, it still iterated over every `loyalty.reward` and rebuilt its `all_discount_product_ids` array — a no-op that triggered reactive updates across all rewards on every product scan.
The fix guards the `triggerEvents("create", ...)` call behind a `createdIds.length` check, so the event only fires when at least one record was actually created.
opw-6091501
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#264145This update prevents error messages from appearing when spreadsheets are unavailable, improving the user experience. The fix addresses a previous issue where changes required modifications to multiple parts of the system, which was deemed unreliable. This change simplifies the process and ensures consistent error handling.
Original PR description
The fix suggested in #81276 did not account for other spreadsheet models than a document as it required some modification in the component template. The same logic should then have been forwarded to other models (quality.check for instance] but that process is error prone. This revision changes the approach by handling the server error inside the abstract action so that no template modification is required. task-6208222 Forward-Port-Of: odoo/enterprise#117788 Forward-Port-Of: odoo/enterprise#117221