Daily updates from Odoo
Monday, February 23, 2026
250 changes
43 changes
Resolved issues and error corrections
This update resolves an issue where the Planning calendar view would crash due to incorrect data validation in the sample data. The fix adapts the system to handle a 'false' value for a required field, preventing the crash. While a more comprehensive solution was considered, this quick fix ensures stability for sample data usage.
Original PR description
Go to the Planning calendar view and toggle filters such that there is no data displayed. Save the current filters as favorite. Then, reload and switch to the list view. Before this commit, in…
Go to the Planning calendar view and toggle filters such that there is no data displayed. Save the current filters as favorite. Then, reload and switch to the list view. Before this commit, in **debug mode**, the props validation of the ResourceTag component crashed, because it received `false` as value for the `type` props, which expected a `string`. The problem comes from the SampleServer, which only knows about the fields of the main model, but not those of co-models reachable from relational fields. In this case, there's a `resource_ids` many2many field on the main model whose relation is `resource.resource`, and there's a `type` selection field on that model. That field is required, so the code only expected `string` values, not `false`. But as the SampleModel doesn't know about that `type` field, it generates `false` as value. Ideally, the SampleModel should know about the whole field specs (main model + relations). However, even though that would be quite easily doable for kanban and list views (unity specs), it wouldn't be the case for the other views (the SampleServer is shared between all views using sample data). So it would require non trivial architectural changes to make this work. For that reasons, we went for the easy fix, which is to adapt the props definition to support `false`, as the value was actually already correctly handled by the Component itself. runbot error~239951 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a problem in the Hong Kong payroll calendar that was causing errors when creating employees. The system incorrectly used US company data, leading to workflow disruptions. The fix sets company IDs to 'False' to use the standard work entry type, ensuring correct functionality.
Original PR description
The resource calendar for Hong Kong doesn't work well at the moment. When the data is loaded, it picks the company from the env (usually a US one during db initialization) and the country from it. Using that country, it deduces the work entry type for the attendance_ids. At the moment, the result is that HK calendar ends up with US work entries, causing access errors in certain flow. (e.g. With hr_contract_salary installed you can no longer create employees). The solution is to explicitly set the company_ids to False as done in other countries to have the generic work entry set and bypass the issue.
This update fixes a usability issue with drag-and-drop functionality, particularly when using nested elements like dropdowns. The change ensures smaller elements are preferred when overlapping, leading to a smoother and more intuitive user experience. It addresses a previous bug where larger dropzones were incorrectly prioritized.
Original PR description
This commit improves the drag and drop functionality by detecting the closest elements when dragging. The previous implementation only calculated distance when the cursor was outside the rectangle,…
This commit improves the drag and drop functionality by detecting the closest elements when dragging. The previous implementation only calculated distance when the cursor was outside the rectangle, returning 0 for any position inside. This caused issues with nested dropdowns: when a small dropdown is inside a larger one, the quadrance of the larger one would be 0, but since for the smaller one it is actually harder to place it perfectly inside, the distance would be non-zero, so the larger one would be preferred. The new implementation: - Handles rectangle-to-rectangle overlap detection using center distances - For non overlapping rectangles, returns correct quadrance - Returns negative normalized overlap ratio for overlapping elements, preferring smaller elements with similar overlap percentages - Supports both point queries (x, y) and rectangle queries (x, y, width, height) Steps to see the issue: - Open Website and start editing - Drop the `s_banner` snippet - Try to drop a button (or any other inner element) next to the existing button in the snippet => The experience is not the most user-friendly Old implementation: https://github.com/user-attachments/assets/507c0402-b855-46a7-938d-8f05d905dd3e New implementation: https://github.com/user-attachments/assets/34b352b4-e08a-4a7f-a2b5-2702ee8e63ef It might not look like an improvement in the video, but it feels actually easier now when trying to drag and drop to a relatively small dropzone. task-5794898
This update corrects a technical error within the HR holidays module that was causing incorrect calculations of working intervals. Specifically, the system was incorrectly mixing employee and resource IDs, leading to inaccurate holiday scheduling. This fix ensures accurate holiday calculations for all employees and resources.
Original PR description
Employee and resource ids were the same during testing. These were mixed in the function. runbot-240926 Note: https://github.com/odoo/odoo/pull/248661 aims to avoid such errors in the future --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249839
This update fixes a bug where inactive accounts were excluded from key financial reports (P&L, Balance Sheet, Accounts Coverage). The change adjusts how the system searches for accounts, now correctly including inactive ones in these reports. This ensures more accurate financial reporting.
Original PR description
Purpose: In P&L, Balance Sheet and Accounts Coverage Report, inactive accounts are not considered. Root cause: `deprecated` field on `account.account` is replaced with `active`, and orm search by default returns only active records. Solution: add `active_test=False` in the context. task- 5906024 Forward-Port-Of: odoo/enterprise#106956
This update addresses an issue where vendor bills received via Peppol as XML were missing a PDF attachment. Now, Odoo automatically generates and attaches a PDF when one isn't provided, allowing users to easily preview and verify the bill data. This improves usability and data validation.
Original PR description
Some vendor bills received via Peppol as XML do not include an attached PDF, preventing users from previewing the document and verifying the values parsed by Odoo. This commit generates and attaches a PDF when the XML does not provide one. task-5500236 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245577
This update prevents unnecessary errors from being raised when the Codabox sync process (CRON) encounters temporary issues. Previously, repeated errors would disable the process, even if the servers were functioning again. Now, errors are only reported when manually triggering the sync, ensuring a smoother and more reliable experience.
Original PR description
In case of a failure/downtime from the IAP/Codabox servers, an error is currently being raised. Although this is useful when manually clicking the Fetch button to see what happens, in the context of a CRON it's much less desirable as multiple failures from a CRON will automatically disable it which is not useful as the servers might be back up later on. Now, instead, we only raise if we're not in a CRON environment. opw-5922549 Forward-Port-Of: odoo/enterprise#107798
This update resolves an issue where users within the 'Planning / User' group couldn't take open shifts. The fix ensures that the 'I Take It' button is consistently displayed for these users, allowing them to seamlessly accept shifts within the Planning app. This improves the usability of the Planning feature for all users.
Original PR description
## Issue In the Planning app, users within the *Planning / User* groups could not take open shifts. The button *"I Take It"* would not be displayed when clicking on the shift. ## Steps to reproduce…
## Issue
In the Planning app, users within the *Planning / User* groups could not take open shifts. The button *"I Take It"* would not be displayed when clicking on the shift.
## Steps to reproduce
1. Install the *Planning* (`planning`) app
2. In the Planning app, as an admin, create and publish an open shift
3. Log in as a *User*, open the *Planning* app, and click on the open shift
4. **The _"I Take It"_ button is not displayed**
When logging in as a user who is **not** part of the *Planning / User* group, the *I Take It* button is displayed.
## Cause
The condition for the *I Take It* button to be displayed is the following:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L282-L283
The condition that makes the button invisible is `not context.get('my_planning_action')`. When the user is part of *Planning / User*, the schedule they see when opening the *Planning* app is the *"Schedule by Resource"*, which has the following context:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L716
When a user who **is not** part of the *Plannig / User* group opens the *Planning* app, they see their own schedule, where the context is different than in the first case:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L636
Because the `my_planning_action` property is in the context (and all the other conditions are respected), the button is displayed.
opw-5451282
Forward-Port-Of: odoo/enterprise#104919This update ensures Odoo's Mexican payroll system accurately reflects the latest Social Security Law regarding minimum wage exemptions. Specifically, it correctly handles situations where an employee's earnings are below the minimum wage, zeroing out relevant deductions and tax contributions. This update maintains compliance and avoids potential errors in payroll reporting.
Original PR description
According to the Mexican Social Security Law, when an employee's total monthly earnings (including bonuses and commissions) are equal to or less than the monthly minimum wage (l10n_mx_daily_min_wage…
According to the Mexican Social Security Law, when an employee's total monthly earnings (including bonuses and commissions) are equal to or less than the monthly minimum wage (l10n_mx_daily_min_wage * 365 / 12), they are exempt from social security contributions and income tax, also they lost the subsidy benefit. - The next rules are zeroed out when the gross salary is equal or less than the minimum wage: - IMSS_EMPLOYEE: IMSS Total (Employee) - ISR: ISR (Income Tax) - SUBSIDY: Used Subsidy - IMSS_EMPLOYEE and ISR are omitted from the generated XML. - As the ISR is zero, the `totalDeducciones` attribute on the `nomina12:Nomina` node should be removed. - The SUBSIDY should be present in the `SubsidioCausado` attribute on the `nomina12:SubsidioAlEmpleo` node, but the `Importe` attribute on the `nomina12:OtroPago` node should be 0.0. This change requires updates to existing standard tests, as some previous test cases used amounts lower than the minimum wage. target: 19.0 task-5226971 Forward-Port-Of: odoo/enterprise#107712 Forward-Port-Of: odoo/enterprise#104668
This update significantly speeds up order processing within the Master Production Schedule (MPS) by optimizing how related product information is retrieved. Previously, the system was loading unnecessary data, leading to delays. Now, the system efficiently fetches only the required information, resulting in faster order fulfillment.
Original PR description
When traversing X2many fields (bom_ids, bom_line_ids) during prefetching in filtered, the _prefetch_ids data grew excessively. Prefetching bom lines pulled in IDs for lines belonging to all boms across all associated products, even though _skip_bom_line in this case only operates on the current product's context. Use prefetch() with no args to avoiding unnecessary record loading for unrelated boms. Benchmark: | |Before |After| |-----------------|-------|-----| |action_replenish |Timeout|577ms| Related ticket: opw-5928055 Forward-Port-Of: odoo/enterprise#107648
This update resolves a problem where CFDI-compliant invoices for Mexican companies were generating PDF reports with section lines that were too short, failing to properly display all invoice details. The fix ensures that the section line in the PDF accurately reflects the entire invoice, improving report accuracy and compliance. This impacts users generating invoices for Mexican businesses.
Original PR description
**STEP TO REPRODUCE** 1. Select a MX company. 2. Create an invoice for a MX company with a section. 3. Send the invoice via CFDI. 4. Notice the section line in the section pdf is no long enough and does not cover the lines below. opw-5501379 Forward-Port-Of: odoo/enterprise#106123
This update resolves a technical error that was preventing notifications from the signature field. The issue stemmed from a missing declaration in the notification service, which was causing an error. This fix ensures that signature field notifications function correctly.
Original PR description
The notification service is later used in this [method](https://github.com/odoo/odoo/blob/04f3473da52ec74f3955cadd58eb016537497d44/addons/web/static/src/views/fields/signature/signature_field.js#L120), but it was never declared so it was causing an error. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249143 Forward-Port-Of: odoo/odoo#248602
This update fixes an issue where OCR-extracted expense amounts weren't correctly converting to the company's standard currency (USD). The change ensures that the 'Total' amount accurately reflects the receipt's original currency value, improving the reliability of expense reporting. This prevents incorrect financial calculations.
Original PR description
Steps to reproduce: 1. Initialize an expense with a foreign currency (e.g., EUR). 2. Trigger OCR extraction on a receipt with a specific total. 3. Observe that both 'Total In Currency' and 'Total' (USD) are set to the same value. 4. The exchange rate is forced to 1.0, ignoring the system's exchange rate. Cause: The _fill_document_with_results method assigned the OCR total to both 'total_amount_currency' and 'total_amount' as a placeholder. This triggered the field's inverse logic during the write() call, causing Odoo to treat the input as a manual exchange rate override of 1:1. Solution: Remove the 1:1 placeholder assignment. The method now explicitly calculates 'total_amount' using the _convert() helper once the currency is identified, ensuring the company currency total reflects the actual system exchange rate. opw-5437611 Forward-Port-Of: odoo/enterprise#108089 Forward-Port-Of: odoo/enterprise#107534
This update fixes a bug preventing users from searching the Colombian Daily Journal (Libro Diario) effectively. Previously, report lines were missing key information, causing the search bar to not function. The fix ensures all journal entries are searchable by move, partner, account, and label, improving reporting accuracy.
Original PR description
Steps to reproduce: 1. Open the Colombian Daily Journal (Libro Diario). 2. Type a move name or partner in the search bar. 3. Observe that no results are returned. Cause: Report lines were generated with an empty 'name' attribute. The accounting report framework uses this field for client-side filtering. Empty names make the search bar non-functional. Solution: Populate the 'name' field with move, partner, account, and label data. This enables the frontend search bar to match against these strings. opw-5495558 Forward-Port-Of: odoo/enterprise#106179
This update addresses an issue where the search bar in the Odoo iOS app was incorrectly clearing input when using a Korean keyboard and Safari. The fix prevents premature processing of search values during IME composition, ensuring accurate search functionality. This improvement specifically targets iOS devices.
Original PR description
Safari does not reliably set `KeyboardEvent.isComposing` during IME composition (e.g. Korean). As a result, the search value was processed too early and got cleared while composition was still in progress. Interestingly, the issue could not be reproduced with the Japanese keyboard, which appeared to behave correctly. See [1]. This commit adds an early return while composing to prevent interpreting the value prematurely. Since this is a targeted fix, it is applied only on iOS. Steps to reproduce: - Configure a Korean keyboard on an iPhone - Open a Sale Order - Focus the search bar - Type a character, then type a second one to combine them - The search input value gets reset [1] https://github.com/odoo/odoo/pull/222151 opw-5448385 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249473
This update resolves an issue where products created through the Services and Materials view were incorrectly assigned a default 'no' expense policy. The fix ensures these products now default to the standard 'sales_price' policy, aligning with expected sales accounting practices. This improves data accuracy and simplifies product costing.
Original PR description
This commit fixes an issue where products created from the `Services and Materials` view were assigned the default `no` expense policy. They should instead default to `sales_price` task-5490517 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures that when a user unfollows a record in the inbox, all related notifications are automatically marked as read. This prevents a confusing situation where only one notification is marked as read, accurately reflecting the user's desire to stop following the conversation and improving the inbox's clarity.
Original PR description
**Description of the issue this PR addresses:** Previously, unfollowing a record from the inbox only marked the notification on which the action was performed as read. As a result, other unread notifications related to the same record remained in the inbox, even though unfollowing is a global action, indicating that the user is no longer interested in the entire conversation. **Desired behavior after PR is merged:** - Marks all notifications related to the same record as read when unfollowing from the inbox. - Ensures the inbox state accurately reflects the user’s intent to stop following the conversation. task-[5119331](https://www.odoo.com/odoo/project/1519/tasks/5119331) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an accounting error in Odoo's international tax reporting. Previously, the same account was used for both tax payable and receivable, leading to incorrect balance reporting. This change ensures that tax receivable balances are accurately reflected, improving accounting accuracy across various countries.
This update resolves an accounting error in the UK and Netherlands tax reporting by ensuring that tax receivable and payable accounts are distinct. Previously, the same account was used for both, leading to incorrect balance reporting. This change ensures accurate tax reporting and avoids potential accounting discrepancies.
This update improves the user experience by correcting the label for the GIF button within Odoo's email functionality. The change ensures a clearer and more intuitive way for users to attach GIFs to their emails. This is a minor improvement focused on usability.
Original PR description
task-5867464 (point 84) backport of https://github.com/odoo/odoo/pull/249459
This update resolves an incorrect reliance on Peppol BIS3 constraints within the RO and HR EDI modules. Previously, an unnecessary dependency caused issues with sending invoices, particularly to physical persons. This fix aligns the modules with the correct BIS3 specifications, ensuring proper invoice processing.
Original PR description
The CIUS RO and CIUS HR depends on the BIS3 which is fundamentally incorrect. This was probably made out of lazyness to redefine things that are almost the same in both these CIUS and the BIS3. Now, in previous PR [1], we added contraints for the Peppol BIS 3 that are impacting those formats. Indeed, the EndpointID can be empty in the context of CIUS RO and CIUS HR. In particular, it's breaking the sending to physical person at the moment. [1]: https://github.com/odoo/odoo/pull/246961 opw-5943698 Forward-Port-Of: odoo/odoo#249970 Forward-Port-Of: odoo/odoo#249089
This update resolves a bug where autofilling pivot cells with incorrect relational IDs caused the application to crash. The fix ensures that while the autofill process continues to function correctly, the associated tooltip functionality is stable, preventing unexpected errors. This improves the reliability of pivot table data entry.
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) Forward-Port-Of: odoo/enterprise#107807 Forward-Port-Of: odoo/enterprise#106601
This update significantly speeds up the loading of product pages by reducing unnecessary browser recalculations (reflows). The change optimizes how product variants are displayed, resulting in a 82% faster rendering and a 5.5x speedup, leading to a better customer experience.
Original PR description
**Issue:** Loading the shop page was slow due to excessive forced reflows. When a reflow occurs, the browser can't reuse the layout computed so far, and it's forced recalculate it again. **Cause:**…
**Issue:** Loading the shop page was slow due to excessive forced reflows. When a reflow occurs, the browser can't reuse the layout computed so far, and it's forced recalculate it again. **Cause:** In `updateVariantPreview`, the init loop wrote to the DOM (textContent, classList) then immediately read `offsetWidth` in the same iteration, forcing the browser to flush and recalculate layout once per product. This PR tackles the 2 areas of improvement identified: 1. Reduce reflows **number**. 2. Reduce reflows performance **cost**. [task-5177358](https://www.odoo.com/web#id=5177358&cids=1&menu_id=4720&action=333&active_id=1695&model=project.task&view_type=form) --- ### 1: Reduce reflows **number**. **Before this PR:** Phase 1 was a single loop mixing writes and reads, triggering N layout recalculations for N products on the page. | Performance Tab: CSS selectors & Advanced paint instr. active (slow) | |--------| | <img width="1847" height="650" alt="image" src="https://github.com/user-attachments/assets/91e86e91-1209-4865-bcbd-336f792664ed" /> | | Timing inflated by the debug environment | **After this PR** Phase 1 is split into two sub-loops. All writes first (1a) and all reads after (1b). So the browser flushes layout only once, regardless of product count, matching the batching pattern already used in phases 2 and 3. | Performance Tab: CSS selectors & Advanced paint instr. active (slow) | |--------| | <img width="1380" height="555" alt="image" src="https://github.com/user-attachments/assets/c0fefe32-d309-4fc8-a945-1a5f5c12b86e" /> | | Timing inflated by the debug environment | **Performance results** In a page with 21 products, 11 of which with variants, the number of reflows dropped from 12 to just 2, resulting on a 82% faster rendering, roughly a 5.5X speedup. --- ### 2: Reduce reflows performance **cost**. Reflows cannot be entirely avoided, but side-effects can be mitigated in CSS by instructing the browser how to react when this circumstance occurs. This PR add two rules to the products card: 1. `contain`: Tells the browser each product card is a layout containment boundary and inner changes "should not" affect elements outside. 2. `content-visibility`: Tells the browser to try skipping cards outside the viewport. Their layout will be eventually evaluated when cards scroll into view. **Performance result:** In a page with 21 products, 11 of which with variants, the performance cost of a single reflow dropped by 22%. _note: the browser is not obliged to honor these "suggestion" and may behave differently depending by the viewport size, the content and the browser itself._ --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249324
This update resolves an issue where users with the 'Project Manager' role couldn't access sale order lines, specifically within the inventory system. The fix adjusts security rules to ensure stock users, including those with the 'Project Manager' role, have the necessary permissions to view related sale order details. This improves usability for users managing stock and sales operations.
Original PR description
Users with the project_manager role and no access on sale cannot open stock moves Steps to reproduce: 1. Install Sales, Inventory and Project 2. Create a Sale order for any company with an address…
Users with the project_manager role and no access on sale cannot open stock moves Steps to reproduce: 1. Install Sales, Inventory and Project 2. Create a Sale order for any company with an address and any product and confirm it (a delivery should be automatically created) 3. Go to Settings > Users and open user Marc Demo 4. Set Marc Demo's role on Sales to "No" and on Project to "Administrator" 5. Log in as Marc Demo 6. Go to Inventory > Operations > Deliveries and try to access the delivery previously created 7. An error occurs Problem: https://github.com/odoo/odoo/blob/6b2d3af64a076654e04494972acc4c42d7c54bd8/addons/sale_stock/models/stock.py#L32-L38 stock.move's description is computed based on the related sale order lines which will cause an access error because users with role `project.group_project_manager` can only access sale order lines of projects or tasks because of this rule: https://github.com/odoo/odoo/blob/3909bef741ebb5c879beb383c395e1a310ba78eb/addons/sale_project/security/sale_project_security.xml#L4-L13 even though the group `stock.group_stock_user` are expected to always have read access to sale order lines because of this right: https://github.com/odoo/odoo/blob/3909bef741ebb5c879beb383c395e1a310ba78eb/addons/sale_stock/security/ir.model.access.csv#L6 Note that the issue doesn't happen when the user is a sale user because of this rule that adds the rights on sale order lines: https://github.com/odoo/odoo/blob/3909bef741ebb5c879beb383c395e1a310ba78eb/addons/sale/security/ir_rules.xml#L78-L83 This fix also solves the issue for `mrp.group_mrp_user` because they inherit the group `stock.group_stock_user`: https://github.com/odoo/odoo/blob/cda011dc8590773f6c3a26f4ae9d5242a3147024/addons/mrp/security/mrp_security.xml#L11-L16 Therefore the rule on `project.group_project_manager` needs to be overridden when the user is a stock user Solution: Create a record rule with a truthy domain to force stock users to have access to sale order lines even if other rules remove this access opw-5492232 Forward-Port-Of: odoo/odoo#247529
This update fixes a visual issue where date pickers displayed arrows in the wrong direction when the website was viewed in RTL languages like Arabic. The fix ensures that date pickers correctly align with the language direction, providing a consistent and user-friendly experience for all users.
Original PR description
### Steps to reproduce: - Download Rental and eCommerce apps. - Install an RTL language (e.g., Arabic) on the website. - Create a rental and go to website. - Try to pick a date for the rental. ###…
### Steps to reproduce: - Download Rental and eCommerce apps. - Install an RTL language (e.g., Arabic) on the website. - Create a rental and go to website. - Try to pick a date for the rental. ### Issue: When the website is viewed in an RTL language, the navigation arrows of the date picker are displayed in the wrong direction. This happens because the date picker is not inside `o_rtl` component, but inside `o-main-components-container` component. So, when `o_rtl` is called in css (for example): https://github.com/odoo/odoo/blob/2264f330859b79010b227e3a9fda1075de8ed4e8/addons/web/static/lib/odoo_ui_icons/style.css#L67-L76 Since the arrows are not inside `o_rtl`, the transformation doesn't apply to them. ### Solution: The `o_rtl` class has been appended to `o-main-components-container` class in case of a RTL language, so that had the css file contain rules for `o_rtl`, they would be applied automatically. opw-5498615 Forward-Port-Of: odoo/odoo#249541 Forward-Port-Of: odoo/odoo#246190
This update fixes a bug where the MO search filter was unintentionally cleared when clicking the header of a manufacturing order. The change ensures that the filter remains active after interacting with the workorder, improving usability and streamlining the shopfloor search process. This resolves an issue caused by a previous update related to barcode scanning.
Original PR description
### Steps to reproduce: - Download MRP app. - Create a product and its corresponding BOM (including at least a single operation) - Create and confirm a manufacturing order for 1 unit of that product…
### Steps to reproduce: - Download MRP app. - Create a product and its corresponding BOM (including at least a single operation) - Create and confirm a manufacturing order for 1 unit of that product - Click on the Shop Floor smart button > Click on the header of the MO - The MO filter applied on the shopfloor search bar is removed ### Issue: The MO search filter is removed after you click the header of the workorder order. This bug was introduced by another commit https://github.com/odoo/enterprise/pull/94584/changes/c83ab24a8d037a339db8067c7e9794cba5c16eab to remove the filter when a workorder's barcode is scanned. Hence, https://github.com/odoo/enterprise/blob/67ff37a830202afb8c8914da6f7bc8d4972eefd4/mrp_workorder/static/src/mrp_display/mrp_display_record.js#L289-L292 the change resulted in the filter being removed every time the header is clicked. In the case where a user clicks to start the workorder, we need to keep the filter. ### Fix: Based on https://github.com/odoo/enterprise/blob/67ff37a830202afb8c8914da6f7bc8d4972eefd4/mrp_workorder/static/src/mrp_display/mrp_display_record.xml#L6-L8 `onClickHeader()` is called every time a shopfloor record is clicked, which (based on the reference in the previous section) removes the filter, then calls `startWorking()`. By removing `this.env.searchModel.removeMOFilter()` from this method, it's ensured that clicks preserve the user's current search context. For https://github.com/odoo/enterprise/blob/67ff37a830202afb8c8914da6f7bc8d4972eefd4/mrp_workorder/static/src/mrp_display/mrp_display.js#L248-L250 since the original workflow of removing the filter in case of a barcode scan should be kept, moving `removeMOFilter()` call here with the appropriate reference of `workorder.component.env.searchModel`matches the expected behaviour. opw-5877418 Forward-Port-Of: odoo/enterprise#107121
This update resolves a visual glitch preventing live chat visitors on mobile from adding reactions. The fix removes an outdated override of quick action counts, allowing the emoji picker to display properly. This ensures a smoother and more functional live chat experience for all users.
Original PR description
Before this commit, live chat visitors in mobile could not add a message reaction due to visual glitch. This happens because there's an override in livechat to show 3 quick message actions rather…
Before this commit, live chat visitors in mobile could not add a message reaction due to visual glitch. This happens because there's an override in livechat to show 3 quick message actions rather than 4, and this patch also applies in mobile where there's only 1 with the "..." button. The "Add reaction" message action in mobile, when shown as a quick action, is buggy: click on it glitches the visual of message in a way that disrupt the viewing of message... And this doesn't show the emoji picker. This commit fixes the issue by removing the override of quick action count of live chat visitors. This overrides was added a long time ago when the "Add reaction" and "View reactions" had the same icon, and playing with the amount of quick actions was a way to avoid showing these 2 actions as quick actions with similar icons [1]. Also quick actions in chat window has been tweaked to show 2 actions at most in desktop, which is the best presentation in chat window. Removal of the override let it use this better quick action count. [1]: https://github.com/odoo/odoo/pull/140335 Task-5953287 Before / After <img width="399" height="767" alt="Screenshot 2026-02-19 at 17 41 21" src="https://github.com/user-attachments/assets/4f1fb8e7-fa0b-4c8c-8f41-552432224064" /> <img width="401" height="771" alt="Screenshot 2026-02-19 at 17 56 20" src="https://github.com/user-attachments/assets/5aadc9df-d858-49ec-b894-d2c424396f54" /> Forward-Port-Of: odoo/odoo#249776 Forward-Port-Of: odoo/odoo#249550
This update fixes an issue where formatting links would create duplicate links and introduce formatting inconsistencies. The changes ensure links are treated as single units, wrapping selected text in a `<font>` tag for formatting, and also addresses issues with color classes and block splitting to improve the overall link editing experience.
Original PR description
Before this commit: when formatting partially a link, the link is split at the selection and formatted. This causes duplicated links. After this commit: we consider links are unsplittable, thus…
Before this commit: when formatting partially a link, the link is split at the selection and formatted. This causes duplicated links. After this commit: we consider links are unsplittable, thus formatting on links will wrap the selected part in a <font> tag. commit 2: [FIX] html_editor: solve infinite loop of links with color class Before this commit: we have a fix https://github.com/odoo/odoo/commit/96bc421d30f34a8bfc10dde93c2f283809a8a3e3 which to be able to remove the style classes in the link element After this commit: We don't consider the style class in the link element as `hasColor`, because the style classes come from the template code, which is hard-coded xml. Removing them, the user won't be able to add it back. For example, on a product page, edit the `Terms and conditions` link, do nothing and save, the muted color is forced removed. Note that another fix https://github.com/odoo/odoo/commit/f5fc55f19f89041c8391ff81b127ffce0898f89f is also removed cause it was a fix for https://github.com/odoo/odoo/commit/96bc421d30f34a8bfc10dde93c2f283809a8a3e3. The tests belonging to https://github.com/odoo/odoo/commit/96bc421d30f34a8bfc10dde93c2f283809a8a3e3 are adapted, and those of https://github.com/odoo/odoo/commit/f5fc55f19f89041c8391ff81b127ffce0898f89f are kept as future safeguards of list coloring. commit 3: [FIX] html_editor: extra check on targetnode when splitting blocks Before this commit: we only check if the current block to be split is splittable, but not the target node. After this commit: if the current block is splittable but the current target node is not, we won't split the block but insert a <br> commit 4: [FIX] html_editor: properly fill inlineAncestors when formatting Before this commit: when the parent node of the current node is unsplittable, the `inlineAncestors` stays empty. After this commit: we handle this case and push the parent node in the list when the parent node is fully selected. We also add a fully selected predicate in link_plugin for the case when the selection includes all the content (except for zws) of a non-button link task-5244810 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249470 Forward-Port-Of: odoo/odoo#241871
This update resolves an issue where formatted text in course quiz descriptions was incorrectly displayed as raw HTML tags after a page refresh. The fix ensures that quiz descriptions are properly rendered, regardless of whether they are loaded initially or retrieved from a cached version. This improves the user experience for course content.
Original PR description
When a user navigates away from a course quiz page and comes back, the quiz data is retrieved from a local cache to avoid reloading it. However, the caching mechanism stores the field as a String. As a result, when the data is restored from the cache, it escapes the HTML tags, displaying them to the user instead of rendering the formatting. This commit ensures that the markup is re-applied to the description when retrieving the quiz from the cache. Steps to reproduce: 1. Open a Course Slide that has a Quiz with a formatted description (e.g., bold text). 2. Navigate to the next Slide. 3. Navigate back to the previous Slide. 4. The description now displays raw HTML tags (e.g., `<b>text</b>`) instead of the formatted text. Task-5452792 Forward-Port-Of: odoo/odoo#242489
This update resolves a visual bug where folded option groups within the email editor were incorrectly displayed. The fix ensures that option groups are hidden when folded, improving the user experience and preventing confusing displays. This enhancement maintains a clean and organized email creation interface.
Original PR description
Commit 64d35ccd6fade9e0473686b8484f561b5f4215ce added folding of groups of options, but the customization to the options container made in `mass_mailing` removed the condition to hide the group if folded. This commit fixes the replacing content to take into account the whether the groupd is currently folded. Steps to reproduce: - Open the mail editor for a html mail - Click on an element with option, that has an ancestor with option - Bug: the group of options for the ancestor appears, but has the "folded" indicator task-5959568
This update fixes a synchronization issue within the point-of-sale and pos_restaurant modules, ensuring that tours accurately wait for order updates before proceeding. Previously, reopening a table could overwrite local orders with server versions. This enhancement provides a smoother and more reliable tour experience for users.
Original PR description
point_of_sale, pos_restaurant This fix ensures that the tour waits for the order to fully sync before proceeding to the next step when clickPlanButton is triggered. This prevents the local order from being overwritten by the server version when the table is reopened. runbot-23878, runbot-238529, runbot-238892 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a technical issue preventing users from correctly adding documents through the document creation dialog in the Enterprise version of Odoo. The fix involved correcting a broken XPath expression, ensuring the dialog functions as intended and improving the user experience. This ensures seamless document integration for Enterprise users.
Original PR description
task-5952598
This update fixes a usability issue in the channel invitation feature by repositioning the 'Generate a new link' button. Previously, its placement led to accidental clicks, but the change ensures users more naturally access this key function. This improves the overall user experience and efficiency.
Original PR description
The channel invitation has a new feature to generate a new link. Before this commit, this was placed as an icon button next to the copy clipboard. While this looks like a good placement at first,…
The channel invitation has a new feature to generate a new link. Before this commit, this was placed as an icon button next to the copy clipboard. While this looks like a good placement at first, there is some UX issues: this doesn't feel as natural as before to copy link in clipboard. This happens because the save to clipboard was the last item, therefore it felt extremely easy to just click on it. With the new button, the generate new link is at the end, and so we are more prone to click on the renew link button than the save to clipboard. Even with the primary button, the placement of save to clipboard requires more precision than we'd expect from such a heavily used button. This commit fixes the issue by moving the "Generate a new link" below, with the "Access restricted to" text. Justifications are: - Other positions next to input felt off, whether swap order with save to clipboard or renew button as prefix of input. - This button is niche, so being below matches more the niche usage of the feature. - Overall UI of channel invitation feels more balanced. - Moving to bottom allows to put plain text on button, making it clearer what this button means. Before / After <img width="626" height="243" alt="Screenshot 2026-02-23 at 15 42 46" src="https://github.com/user-attachments/assets/01bbf9b6-6fda-4981-8191-a09598e98af8" /> <img width="618" height="251" alt="Screenshot 2026-02-23 at 15 42 25" src="https://github.com/user-attachments/assets/21a797c7-c61e-404f-afe0-fcb4eefe177e" />
This update ensures that tracking values are consistently and accurately recorded during HR employee updates, regardless of user access permissions. By preparing values as an administrator, the system avoids potential tracking issues and crashes, particularly when tracking sign requests. This improves data reliability and prevents disruptions in key HR processes.
Original PR description
When prepating initial value to track value changes, do it as sudo. Indeed user access rights should not prevent from checking tracking. Use case: hr employee update triggers an update on version…
When prepating initial value to track value changes, do it as sudo. Indeed user access rights should not prevent from checking tracking. Use case: hr employee update triggers an update on version records. On version model sign requests are tracked, but their access is limited to sign members. Tracking should not crash at that point. When finalizing, "new" value of tracking is also computed as sudo. We hence ensure that all values (pre and post) are computed the same way and independently from implemented ACLs. Reproduce steps: run 'test_employee_deletion'. It was not visible before adding a manual flush, as cr was still in "no tracking" mode (precommit data kept from creation in setupclass). Task-5935695 ([mail, various] Cleanup and test tracking usage) Prepares Task-3645865 ([mail] In-body tracking) Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves several issues that were causing crashes during tracking improvements, particularly within the Helpdesk and Payroll modules. The changes focus on accurate time tracking, eliminating unnecessary test manipulations, and addressing multi-mode compatibility problems, ultimately enhancing the reliability of our tracking features.
This update resolves an issue where the description field for new tasks was being duplicated within the project form. The root cause was a default field content being incorrectly appended. This change ensures that task descriptions are displayed accurately and consistently, improving the user experience when viewing project details.
Original PR description
Steps to reproduce: =================== 1. Go to website > contact us page 2. Submit a new task with description. 3. View the Description in the project app. -> The description field is already shown in the form by default. You will find another time it is repeated. Cause: ====== The default field content is always appended to the form content. Solution: ========= Avoid adding description to the description field content. opw-5868382 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246952
This update fixes an issue where non-admin users couldn't use the Purchase Order Suggest feature. The fix ensures that users with purchase permissions can now correctly suggest products, resolving an AccessError and improving usability. This allows for more efficient purchase order creation.
Original PR description
**Issue:** Non-admin users get an AccessError as follows ```doesn't have 'create' access to: - Default Values, Based on (Purchase Order Suggest) (ir.default: 45)... ``` when using the Purchase Order…
**Issue:** Non-admin users get an AccessError as follows ```doesn't have 'create' access to: - Default Values, Based on (Purchase Order Suggest) (ir.default: 45)... ``` when using the Purchase Order Suggest wizard. **Cause:** The `ir_default_user_rule` record rule restricts non-admin users to only create/modify ir.default records where `user_id = user.id` However, in `_save_values_for_vendor` method: https://github.com/odoo/odoo/blob/6b8a8196c63275eead6709bb20002df0be12a059/addons/purchase_stock/wizard/purchase_order_suggest.py#L199-L204 `ir.default.set()` is called without setting the `user_id` parameter, which defaults to an attempt to create a global default: what only admins can do. **Steps to reproduce:** - create a non-admin user with purchase user permissions. - log in as that user and create a Purchase Order - add products to the catalog and click "Suggest. - configure suggest parameters and click "Compute" (Note: compute is only enabled when estimated_price > 0) An AccessError occurs opw-5076647 Forward-Port-Of: odoo/odoo#236743 Forward-Port-Of: odoo/odoo#227643
This update improves the speed of changing order stages in the Point of Sale (POS) system. By separating customer display calculations and optimizing database queries, the process is now significantly faster, especially when multiple orders are being prepared. This enhances the user experience for POS staff.
Original PR description
Before this commit when a lot of orders were in the preparation display and when clicking on an order to change its stage, it was very slow because we were doing the customer display computation directly. Now we compute customer display data in a separate RPC call, and we only call it when the customer display receives a notification of new orders, which makes the stage change much faster. The `_get_pos_orders` is updated to avoid an O(n²) loop; The `_get_open_orderlines_in_display` is updated to avoid deep joins. Forward-Port-Of: odoo/enterprise#107727
This update adds a new setting to mail activity types, allowing administrators to control visibility related to KPI providers. This change improves the flexibility and control over how mail activities are configured within the Odoo system. The change was implemented to address a missing configuration option.
Original PR description
Introduced in ff941e6555c12918803db4a72511c9381cc58c31, the field `kpi_provider_visibility` was not added to the form view. With this commit, we add the field to the form view, so that the value can be changed by the administrator of the database. Task-id: [5167740](https://www.odoo.com/odoo/project.task/5167740) Forward-Port-Of: odoo/odoo#249252
This update resolves an issue preventing custom event form fields from being added. Previously, changes to the attendee registration process caused errors when attempting to convert data types. The fix allows for more flexible customization of event forms, ensuring that third-party modules can easily add and manage additional attendee information without disrupting the core registration flow.
Original PR description
Before the addition of identification questions like "name", "email", and "phone" in the commit [1] as event questions instead of having them static, we could add custom data, such as fields for the address, with static inputs in the form. After that addition, it's no longer possible because the registration gives us the following error when trying to convert data that isn't a M2o ID or an Integer value:
invalid literal for int() with base 10
By adding the check for the field's type, we can still add custom fields with static fields in the template, as an alternative, given that there's no question type for other fields.
[1]: https://github.com/odoo/odoo/commit/6b8daa880c
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#244378This update resolves an issue where delivery and invoicing addresses weren't being displayed on certain reports (specifically the 'lines' report). The fix ensures that address information is now correctly rendered, providing users with complete delivery and invoicing details. This improves the accuracy and usability of reports.
Original PR description
The `information_block` is always false on the `external_layout_lines` this means that when a delivery address and invoicing address is specified they are not rendered. Reviews the spacing of the bubble layout `information_block` task-5951799 Part of task-5949213 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249436
This update corrects a bug that caused attendee registration answers to disappear when using the POS. The issue stemmed from how the system handled related data, leading to lost information. The fix simplifies the data handling process to ensure all registration answers are correctly recorded.
Original PR description
In [1], a refactoring of the POS framework was done, but in the process some overlooked behaviors induced a complete loss of the answers given in the registration process, as long as they do not…
In [1], a refactoring of the POS framework was done, but in the process some overlooked behaviors induced a complete loss of the answers given in the registration process, as long as they do not include an answer to a 'selection' question. STEPS ===== 0. Create a new event with a few questions (no 'selection' one) 1. Add tickets so that you can buy one in the POS 2. Go in the POS (reload data if needed) 3. Buy a ticket and fill the attendee form (answer to all questions) 4. Continue the POS flow and pay for your ticket. 5. Go back to the back-end and event > attendees 6. Check your new attendee: no answers are linked to the record. ISSUE ===== TLDR - Two fields have the same comodel on event.registration. This breaks the use of inverseMap as both are loaded in the pos. As they are treated sequentially when connecting related records, hidden side effects occur when both are not set. Details: This effect is due to two main issues. First, after [1], we compute the whole model reference relations using processModelDefs method, that accounts for inverse relations of o2m, m2o fields and provides an inverseMap to be used in several places, notably on creation or deletion of relational records from the POS. However, pos_event presents a peculiar situation, as registrations have two o2m fields, both loaded in _load_pos_data_fields, that are linked to the model event.registration.answer: registration_answer_ids and registration_answer_choice_ids, a subset of the first, just with a domain to only include answers of 'selection' questions. Meaning that the inverseMap will only use one of the two, in this case registration_answer_choice_ids. In turn, this means that any update of registration_id on the answer model will update that field, even if the original update was done on registration_answer_ids... Secondly, one could notice that this should still work, as the inverseMap is used in all places, we should just update the records through the field registration_answer_choice_ids. So why does it not work and why are all answers removed? Because both fields are loaded in _load_pos_data_fields, and in _sanitazeRawData we use getFields to know which fields to update and to connect (for relations on the model), both being returned. This means that independantly of the create values for the registration in addProductToOrder in pos_event, the 'framework' will still have two fields to connect and will do so sequentially, one field at the time. But in the _connect logic, if a field has no value given at creation, then the 'CLEAR' command is used, as this would mean we remove the content of the relational field. But in this case, this means that as both answer fields try to update registration_id through registration_answer_choice_ids, if no value is given at creation in that field, then we clear existing ones, for instance those we just linked through the creation values in the first field registration_answer_ids, as we basically empty registration_id on those records. The answers will also be deleted of the indexedDB because of the condition in databaseTable (no linked registration -> can be removed) FIX === Remove registration_answer_choice_ids from the loaded data, as it is not used anywhere except in the registration creation values. As it is a subset of the other field registration_answer_ids, only keep that one instead. Update the creation values to only use that field. Note that this seems to highlight a limitation when it comes to having more than one o2m field on a model loaded at the same time in POS. [1] odoo/odoo@a80a39f2ad16baf474553574c79d55948f86c453 Task-4919080 Forward-Port-Of: odoo/odoo#231293
This update improves how Odoo identifies companies in Malaysia based on their VAT registration numbers. Specifically, if a VAT number starts with 'IG', the system now correctly flags the record as not representing a company. This ensures accurate accounting and reporting for Malaysian businesses.
Original PR description
In this commit: - For Malaysia, TIN is distinguishable between an individual and a company by prefix - if vat starts with 'IG', 'is_company' should remain False Task [link](https://www.odoo.com/odoo/project.task/5912436) task-5912436 Forward-Port-Of: odoo/odoo#247937
7 changes
Resolved issues and error corrections
This update resolves an issue where users with the 'Project Manager' role couldn't access sales order details related to deliveries. The fix adjusts security rules to ensure stock users, including those with the 'Project Manager' role, have the necessary permissions to view sale order lines. This ensures smooth operation for users managing inventory and sales.
Original PR description
Users with the project_manager role and no access on sale cannot open stock moves Steps to reproduce: 1. Install Sales, Inventory and Project 2. Create a Sale order for any company with an address…
Users with the project_manager role and no access on sale cannot open stock moves Steps to reproduce: 1. Install Sales, Inventory and Project 2. Create a Sale order for any company with an address and any product and confirm it (a delivery should be automatically created) 3. Go to Settings > Users and open user Marc Demo 4. Set Marc Demo's role on Sales to "No" and on Project to "Administrator" 5. Log in as Marc Demo 6. Go to Inventory > Operations > Deliveries and try to access the delivery previously created 7. An error occurs Problem: https://github.com/odoo/odoo/blob/6b2d3af64a076654e04494972acc4c42d7c54bd8/addons/sale_stock/models/stock.py#L32-L38 stock.move's description is computed based on the related sale order lines which will cause an access error because users with role `project.group_project_manager` can only access sale order lines of projects or tasks because of this rule: https://github.com/odoo/odoo/blob/3909bef741ebb5c879beb383c395e1a310ba78eb/addons/sale_project/security/sale_project_security.xml#L4-L13 even though the group `stock.group_stock_user` are expected to always have read access to sale order lines because of this right: https://github.com/odoo/odoo/blob/3909bef741ebb5c879beb383c395e1a310ba78eb/addons/sale_stock/security/ir.model.access.csv#L6 Note that the issue doesn't happen when the user is a sale user because of this rule that adds the rights on sale order lines: https://github.com/odoo/odoo/blob/3909bef741ebb5c879beb383c395e1a310ba78eb/addons/sale/security/ir_rules.xml#L78-L83 This fix also solves the issue for `mrp.group_mrp_user` because they inherit the group `stock.group_stock_user`: https://github.com/odoo/odoo/blob/cda011dc8590773f6c3a26f4ae9d5242a3147024/addons/mrp/security/mrp_security.xml#L11-L16 Therefore the rule on `project.group_project_manager` needs to be overridden when the user is a stock user Solution: Create a record rule with a truthy domain to force stock users to have access to sale order lines even if other rules remove this access opw-5492232 Forward-Port-Of: odoo/odoo#247529
This update fixes a visual issue where date picker arrows appeared mirrored when the website was displayed in RTL languages like Arabic. The fix ensures that date pickers correctly align with the user's language direction, improving usability for international users. This was achieved by adding the necessary styling to the main container component.
Original PR description
### Steps to reproduce: - Download Rental and eCommerce apps. - Install an RTL language (e.g., Arabic) on the website. - Create a rental and go to website. - Try to pick a date for the rental. ###…
### Steps to reproduce: - Download Rental and eCommerce apps. - Install an RTL language (e.g., Arabic) on the website. - Create a rental and go to website. - Try to pick a date for the rental. ### Issue: When the website is viewed in an RTL language, the navigation arrows of the date picker are displayed in the wrong direction. This happens because the date picker is not inside `o_rtl` component, but inside `o-main-components-container` component. So, when `o_rtl` is called in css (for example): https://github.com/odoo/odoo/blob/2264f330859b79010b227e3a9fda1075de8ed4e8/addons/web/static/lib/odoo_ui_icons/style.css#L67-L76 Since the arrows are not inside `o_rtl`, the transformation doesn't apply to them. ### Solution: The `o_rtl` class has been appended to `o-main-components-container` class in case of a RTL language, so that had the css file contain rules for `o_rtl`, they would be applied automatically. opw-5498615 Forward-Port-Of: odoo/odoo#249541 Forward-Port-Of: odoo/odoo#246190
This update ensures the MO filter remains active in the shopfloor search bar after a user clicks on a manufacturing order's header. Previously, clicking the header would remove the filter, causing inconvenience. This fix corrects a bug introduced during a previous update related to barcode scanning, maintaining the user's intended search context.
Original PR description
### Steps to reproduce: - Download MRP app. - Create a product and its corresponding BOM (including at least a single operation) - Create and confirm a manufacturing order for 1 unit of that product…
### Steps to reproduce: - Download MRP app. - Create a product and its corresponding BOM (including at least a single operation) - Create and confirm a manufacturing order for 1 unit of that product - Click on the Shop Floor smart button > Click on the header of the MO - The MO filter applied on the shopfloor search bar is removed ### Issue: The MO search filter is removed after you click the header of the workorder order. This bug was introduced by another commit https://github.com/odoo/enterprise/pull/94584/changes/c83ab24a8d037a339db8067c7e9794cba5c16eab to remove the filter when a workorder's barcode is scanned. Hence, https://github.com/odoo/enterprise/blob/67ff37a830202afb8c8914da6f7bc8d4972eefd4/mrp_workorder/static/src/mrp_display/mrp_display_record.js#L289-L292 the change resulted in the filter being removed every time the header is clicked. In the case where a user clicks to start the workorder, we need to keep the filter. ### Fix: Based on https://github.com/odoo/enterprise/blob/67ff37a830202afb8c8914da6f7bc8d4972eefd4/mrp_workorder/static/src/mrp_display/mrp_display_record.xml#L6-L8 `onClickHeader()` is called every time a shopfloor record is clicked, which (based on the reference in the previous section) removes the filter, then calls `startWorking()`. By removing `this.env.searchModel.removeMOFilter()` from this method, it's ensured that clicks preserve the user's current search context. For https://github.com/odoo/enterprise/blob/67ff37a830202afb8c8914da6f7bc8d4972eefd4/mrp_workorder/static/src/mrp_display/mrp_display.js#L248-L250 since the original workflow of removing the filter in case of a barcode scan should be kept, moving `removeMOFilter()` call here with the appropriate reference of `workorder.component.env.searchModel`matches the expected behaviour. opw-5877418 Forward-Port-Of: odoo/enterprise#107121
This 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 receipts, particularly when the purchase currency differs from the company currency, preventing receipt validation failures.
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#248883
Forward-Port-Of: odoo/odoo#236276This update fixes an issue where the company tolerance time wasn't being applied correctly when an employee had multiple attendance entries for the same day. Previously, overtime was incorrectly calculated, even when the total hours were within the tolerance. This change ensures accurate overtime calculations based on the defined company tolerance, preventing unintended extra time payments.
Original PR description
_ ## Short functional explanation of the error When an employee enters multiple attendances for a single day, the company tolerance time isn't computed correctly. ## Reproduction Steps 1. Go to…
_ ## Short functional explanation of the error When an employee enters multiple attendances for a single day, the company tolerance time isn't computed correctly. ## Reproduction Steps 1. Go to attendances. 2. Click on configuration and scroll down to the Extra Hours section. Set a Tolerance Time in Favor of Company of 15 minutes. 3. Create 2 attendances for the same employee: one attendance from 8 to 15 for example, and a second one from 16 to 18:12. ### Expected behavior As the overtime entered is 12 minutes, which is inferior to the company tolerance time of 15 minutes, no extra time should be computed. ### Unexpected behavior 12 minutes of overtime are computed. ## Origin of the issue Let's say we enter 2 different shifts for the same day. Our work day should be 8 hours, and the sum of both shifts reaches 8 hours or more. We shouldn't have any overtime. However, in the code, the overtime is negative. This is compensated by, in our case, the post-work time: in our case, our overtime duration will be equal to -1, but our post-work time will be equal to 1.2. Both cancel each other, and in the end we obtain 0.2 of overtime, which corresponds to our 10 minutes overtime. However, in this code: https://github.com/odoo/odoo/blob/afcbd98594c9f7007f03a343ea40ea122b955459/addons/hr_attendance/models/hr_attendance.py#L374-L380 it isn't computed that way: because post-work time is 1.2, which is above our company tolerance time of 15 minutes (0.25 in the code), we will always be in the case where we exceed the tolerance time. Hence, we have to "flatten" the overtime duration and the post-work time before reaching that piece of code. note: the same bug exists for the employee tolerance time, which is corrected in this commit. __ opw-5136861 --- Forward-Port-Of: odoo/odoo#244339 Forward-Port-Of: odoo/odoo#242517
This update significantly improves the speed of our product pages by reducing unnecessary browser recalculations (reflows). By optimizing how product variants are displayed, we've achieved a 5.5x performance increase, leading to a smoother and more responsive shopping experience for customers. This change focuses on efficiency and performance.
Original PR description
**Issue:** Loading the shop page was slow due to excessive forced reflows. When a reflow occurs, the browser can't reuse the layout computed so far, and it's forced recalculate it again. **Cause:**…
**Issue:** Loading the shop page was slow due to excessive forced reflows. When a reflow occurs, the browser can't reuse the layout computed so far, and it's forced recalculate it again. **Cause:** In `updateVariantPreview`, the init loop wrote to the DOM (textContent, classList) then immediately read `offsetWidth` in the same iteration, forcing the browser to flush and recalculate layout once per product. This PR tackles the 2 areas of improvement identified: 1. Reduce reflows **number**. 2. Reduce reflows performance **cost**. [task-5177358](https://www.odoo.com/web#id=5177358&cids=1&menu_id=4720&action=333&active_id=1695&model=project.task&view_type=form) --- ### 1: Reduce reflows **number**. **Before this PR:** Phase 1 was a single loop mixing writes and reads, triggering N layout recalculations for N products on the page. | Performance Tab: CSS selectors & Advanced paint instr. active (slow) | |--------| | <img width="1847" height="650" alt="image" src="https://github.com/user-attachments/assets/91e86e91-1209-4865-bcbd-336f792664ed" /> | | Timing inflated by the debug environment | **After this PR** Phase 1 is split into two sub-loops. All writes first (1a) and all reads after (1b). So the browser flushes layout only once, regardless of product count, matching the batching pattern already used in phases 2 and 3. | Performance Tab: CSS selectors & Advanced paint instr. active (slow) | |--------| | <img width="1380" height="555" alt="image" src="https://github.com/user-attachments/assets/c0fefe32-d309-4fc8-a945-1a5f5c12b86e" /> | | Timing inflated by the debug environment | **Performance results** In a page with 21 products, 11 of which with variants, the number of reflows dropped from 12 to just 2, resulting on a 82% faster rendering, roughly a 5.5X speedup. --- ### 2: Reduce reflows performance **cost**. Reflows cannot be entirely avoided, but side-effects can be mitigated in CSS by instructing the browser how to react when this circumstance occurs. This PR add two rules to the products card: 1. `contain`: Tells the browser each product card is a layout containment boundary and inner changes "should not" affect elements outside. 2. `content-visibility`: Tells the browser to try skipping cards outside the viewport. Their layout will be eventually evaluated when cards scroll into view. **Performance result:** In a page with 21 products, 11 of which with variants, the performance cost of a single reflow dropped by 22%. _note: the browser is not obliged to honor these "suggestion" and may behave differently depending by the viewport size, the content and the browser itself._ --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249324
This update fixes an issue where non-admin users were blocked from using the Purchase Order Suggest feature. The fix ensures that users with purchase user permissions can now correctly suggest products, improving efficiency for all users. This resolves a previous access restriction within the system.
Original PR description
**Issue:** Non-admin users get an AccessError as follows ```doesn't have 'create' access to: - Default Values, Based on (Purchase Order Suggest) (ir.default: 45)... ``` when using the Purchase Order…
**Issue:** Non-admin users get an AccessError as follows ```doesn't have 'create' access to: - Default Values, Based on (Purchase Order Suggest) (ir.default: 45)... ``` when using the Purchase Order Suggest wizard. **Cause:** The `ir_default_user_rule` record rule restricts non-admin users to only create/modify ir.default records where `user_id = user.id` However, in `_save_values_for_vendor` method: https://github.com/odoo/odoo/blob/6b8a8196c63275eead6709bb20002df0be12a059/addons/purchase_stock/wizard/purchase_order_suggest.py#L199-L204 `ir.default.set()` is called without setting the `user_id` parameter, which defaults to an attempt to create a global default: what only admins can do. **Steps to reproduce:** - create a non-admin user with purchase user permissions. - log in as that user and create a Purchase Order - add products to the catalog and click "Suggest. - configure suggest parameters and click "Compute" (Note: compute is only enabled when estimated_price > 0) An AccessError occurs opw-5076647 Forward-Port-Of: odoo/odoo#236743 Forward-Port-Of: odoo/odoo#227643
4 changes
Resolved issues and error corrections
This update corrects a previous issue where GL reports were incorrectly filtering based on AML labels instead of account names. Previously, searching for an account wouldn't always return the correct lines. This change ensures GL reports accurately filter by the specified account name, improving report accuracy and usability.
Original PR description
Since 235a5160d13296328b79e4092a8b88a733628268, the GL reports line names are set from the amls name instead of the account name. This leads to wrong behavior when trying to filter the GL, either by using the search bar or opening the GL from a P&L line. Steps: - Create a move with a line using account 442000 for example - Create another move with no line using 442000 account - Set label of one line to be containing "442000" - Go to GL and input '442000' in the search bar -> The line with label '442000' in displayed This commit set the report line's name from the account name instead of the aml's name opw-5070801
This update resolves an issue where data related to Dian tax calculations (l10n_co_dian) was being reset unexpectedly. The fix ensures that key data elements are properly flushed, maintaining accurate accounting records for users in Colombia. This improves the reliability of financial reporting.
Original PR description
task-5500236
This update ensures that the order of selection options within Odoo Sign templates is consistently preserved. Previously, the system scrambled option order due to a technical issue. The fix replaces an unordered data processing method with one that maintains the original user-defined sequence, improving template usability.
Original PR description
Steps to reproduce: 1. Open a Sign template. 2. Drag a 'Selection' field onto the document. 3. In the popover, type options in a specific order (e.g., Delta, Alpha, Beta). 4. Click save. 5. Re-open or inspect the data 6. observe the order is scrambled based on Database ID. Cause: The Python method used `list(set())` which is an unordered collection, losing the user's input sequence. Furthermore, the final `search().ids` call returned records sorted by primary key (ID) rather than the provided list order. Solution: Replace `set()` with `dict.fromkeys()` to deduplicate while preserving input order. opw-5896373
This update resolves an issue where the 'Update Rental Prices' button disappeared after saving a rental order. The fix re-introduced a necessary field to ensure the button remains visible, allowing users to accurately adjust rental periods and prices. This improves the usability of the rental order management process.
Original PR description
Steps to produce: --- - Install `sale_renting` module. - Rental > Open any order > Change the rental period. - Save the record. Issue: --- - After saving the order, the `Update Rental Prices` button becomes invisible. Root cause: --- - The field `show_update_duration`, which controls the visibility of the button, is not present in the view. As a result, when the record is saved, the field is not included in the form data and its value is not properly maintained, causing the button to become invisible. - The field is removed from the view in this [commit]. Solution: --- - Added the `show_update_duration` field to the view to ensure its value is properly maintained. This allows the `Update Rental Prices` button to remain visible when applicable. [commit]: https://github.com/odoo/enterprise/commit/b90bbdef10a7a37fb065626ba995811ab388c7a1 opw-5937145 --- Forward-Port-Of: odoo/enterprise#107621
15 changes
Resolved issues and error corrections
This update ensures that all event registration answers, including free-text responses, are correctly synchronized during the payment process. Previously, only selection-based answers were sent, leading to data loss. This fix corrects a technical issue related to how event registration data is handled, improving the reliability of event ticket sales through POS.
Original PR description
## Steps to reproduce: - Configure event registration with only free-text fields (no selection field). - Open the POS, add an event ticket product, and fill in the registration form. - Click Payment…
## Steps to reproduce: - Configure event registration with only free-text fields (no selection field). - Open the POS, add an event ticket product, and fill in the registration form. - Click Payment and validate the order. ## Issue: - Registration answers were only sent to the backend when at least one selection-type question was filled. - When no selection field was present, free-text answers were not synced at all. ## Reason: - The `registration_answer_ids` and `registration_answer_choice_ids` One2many fields on EventRegistration both point to the same `registration_id` Many2one field on EventRegistrationAnswer. https://github.com/odoo/odoo/blob/c738d049fe09101bd14dce0710c2659a4a6eca39/addons/event/models/event_registration.py#L83-L85 - This caused data loss during the POS model synchronization, as entries were overwritten in the `inverseMap`. https://github.com/odoo/odoo/blob/c738d049fe09101bd14dce0710c2659a4a6eca39/addons/point_of_sale/static/src/app/models/related_models/model_defs.js#L59-L75 ## Fix: - Send all registration answers (free-text and selection-based) exclusively via `registration_answer_choice_ids`. task-5438565
This update corrects a minor oversight in the system's invoice matching tolerance settings. The change ensures accurate reconciliation of bank statements with invoices, preventing potential discrepancies and improving financial reporting. This fix addresses a technical detail that could have impacted data accuracy.
Original PR description
During this commit:https://github.com/odoo/enterprise/commit/15d26e62f14bb0224712a1712b47ebe16c3b8702 we forgot to change one part of the hardcoded tolerance. task-5952881
This update prevents test instability caused by unintentionally adding methods to models during testing. The change ensures that tests run reliably by enforcing the use of patchers for test-specific method modifications, avoiding conflicts between tests. This improves overall system stability and reduces the risk of unexpected behavior.
Original PR description
Setting methods on models during tests and not removing them afterwards can cause misbehaviour of other tests. Setting mock or test-specific methods is not an issue but it should be done via patchers. https://runbot.odoo.com/odoo/error/237983 Forward-Port-Of: odoo/odoo#249005 Forward-Port-Of: odoo/odoo#247151
This update resolves an issue where test patches within Odoo models were causing instability. The team has moved these patches to the instance level, aligning with best practices and addressing a detection error. This improves the reliability of our testing process.
Original PR description
Otherwise they trip the on-test-side-effect-detector (at least in its current incarnation). Forward-Port-Of: odoo/enterprise#107653 Forward-Port-Of: odoo/enterprise#106948
This update resolves a problem where products weren't loading correctly when switching between companies within the POS Loyalty module. The fix prevents errors caused by trying to load products directly, ensuring all products are accessible regardless of the company setting. This improves the reliability of the POS Loyalty system.
Original PR description
Step to reproduce - install `pos_loyalty` and have two companies - for this record: `loyalty.gift_card_product_50` set company_id = company1 - switch to company b and start pos Observation: - no products are loaded Cause: - `browse()` was used to load records `gift_card_product_50` and `ewallet_product_50` - when any of them is restricted on one company it fails to load whole model Fix: - Instead of directly loading them, we use `search()` to avoid `AccessError` so that rest of the products can be loaded. - Gift card is still not shown as expected opw-5449466 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a previous issue where searching for archived accounts didn't display their associated journal entries. Now, users can view all journal items, regardless of whether an account is archived, providing a more complete financial record. This improves reporting and analysis accuracy.
Original PR description
This commit makes it possible to see the journal items for archived account when searching for the account. Previously, when searching for an account that is archived, its journal items weren't shown. task-5905559 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a bug where internal users were incorrectly assigned as suppliers when forwarding supplier invoices. This issue was causing disruptions in the OCR (Optical Character Recognition) process, which relies on automatic data population from invoices. The fix ensures invoices are correctly linked to existing suppliers, maintaining the integrity of the OCR workflow.
Original PR description
Currently we have an issue with OCR flow, where if internal users forward an email from an internal email address, the internal user is added as vendor Steps to reproduce: - Setup email alias for journal "Purchases" - From an internal user email, forward a supplier bill to the vendor bill alias Issue: If the supplier is not already a registered partner, the bill will be created with the internal user set as partner. This will break OCR flow where the missing document fields will be auto populated from the bill opw-5487368
This update resolves an issue where stock quantities were being rounded incorrectly when scanning barcodes on delivery orders. Specifically, the system was adding too little stock, leading to discrepancies in order fulfillment. This ensures more accurate stock tracking and reduces the risk of order errors.
Original PR description
To reproduce the issue: - Create a stock quantity of product1 for example of 275.84 kg in PACK1 - Create a delivery order of 3.6 kg - Go to the delivery order on stock barcode - Scan PACK1 - The new line is created as 272.2399999999 Forward-Port-Of: odoo/enterprise#107933 Forward-Port-Of: odoo/enterprise#89300
This update resolves an issue preventing custom fields from being added to attendee registration forms. Previously, a change in the system required a specific data type for registration fields, causing errors. This fix allows for more flexible customization of the registration process, enabling developers to easily add and manage additional attendee information without impacting core functionality.
Original PR description
Before the addition of identification questions like "name", "email", and "phone" in the commit [1] as event questions instead of having them static, we could add custom data, such as fields for the address, with static inputs in the form. After that addition, it's no longer possible because the registration gives us the following error when trying to convert data that isn't a M2o ID or an Integer value:
invalid literal for int() with base 10
By adding the check for the field's type, we can still add custom fields with static fields in the template, as an alternative, given that there's no question type for other fields.
[1]: https://github.com/odoo/odoo/commit/6b8daa880c
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#244378This update fixes an issue where the phone number input field on mobile devices was difficult to edit due to overlapping buttons. The fix hides the utility button labels, allowing the input field to take up the full screen width and improving the user experience. This ensures consistent and easy phone number entry on mobile.
Original PR description
Steps to reproduce: 1. Install `contacts` 2. Create an individual contact with a phone number 3. Try to edit the phone number on the mobile Issue: - Unable to edit in mobile view Cause: - On mobile…
Steps to reproduce:
1. Install `contacts`
2. Create an individual contact with a phone number
3. Try to edit the phone number on the mobile
Issue:
- Unable to edit in mobile view
Cause:
- On mobile devices, the utility buttons (Call, SMS, WhatsApp) inside the phone widget consume significant horizontal space. Due to the flex layout, this forces the actual phone input field to shrink too much, making it hard/impossible to view or edit the number.
Solution:
- Hide the text labels of the utility buttons to save space, showing only the icons
- make input's width 100% on mobile screens in partner form
<table>
<thead>
<tr>
<th>Before</th>
<th>After</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">
<img
src="https://github.com/user-attachments/assets/a620d417-119e-4e28-a62b-f63031e72598"
alt="Before"
width="500"
/>
</td>
<td align="center">
<img width="500" height="354" alt="image" src="https://github.com/user-attachments/assets/6adc4c77-767d-491d-a468-8463c0f77666" />
</td>
</tr>
</tbody>
</table>
opw-5489021This update ensures inactive taxes are accurately displayed in fiscal position mappings. Previously, inactive taxes were inconsistently shown, causing potential reporting issues. The fix corrects a discrepancy in how tax information is accessed, ensuring accurate fiscal position calculations.
Original PR description
Observed issue: inactive taxes are shown in "Replaces" `original_tax_ids` field if the form view of a tax is opened through "Configuration"->"Taxes", but not shown under "Replaces" in a fiscal position tree view, nor are they shown in the same "Replaces" field of the tax form view when opened from the fiscal position tree view. Cause: the fiscal position link calls `action_open_related_taxes` on partner (path `/account.tax/[id]`), while the "Configuration"->"Taxes" calls `action_tax_form` on tax (path `/taxes/[id]`), which has additional context element `'active_test': False` among others. Solution: adding the context to the fiscal position action produces the desired behavior, but it might break something else as it affects the whole view. task-5917667 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug where the AI Composer was incorrectly displaying an out-of-office banner when the user was on leave. The fix prevents the AI thread from defaulting to the user as a correspondent, ensuring the banner only appears when a real person is unavailable.
Original PR description
**Purpose of this PR:** `ai_composer` threads were falling back to self-chat correspondent logic, - `if 0 correspondents and channel_member_ids.length === 1 -> return that only member (self-chat fallback)`. so `thread.correspondent` became the current user. this made _**out-of-office banner appear**_ on AI conversations when self is on leave. before: <img width="406" height="162" alt="image" src="https://github.com/user-attachments/assets/bb45a084-5de1-4eea-8f72-a3cf5a9012c8" /> after: <img width="391" height="192" alt="image" src="https://github.com/user-attachments/assets/743b12d8-465f-419f-83e3-b92df78af3c4" /> task-4882415
This update ensures that internal users viewing message links within slides are consistently directed to the backend form view, aligning with other portal documents. Previously, internal users were incorrectly redirected to the website page. This change maintains a unified user experience across all portal content.
Original PR description
Since #202555, a message link in slides redirects internal users to the website page if it's published. To ensure consistency with other documents in the portal, this commit redirects internal users to the backend form view of the slides. Portal and public users continue to be redirected to the published website page. Forward-Port-Of: odoo/odoo#249720
This update corrects a previous issue where the system incorrectly predicted taxes on imported invoices. Now, the system accurately uses the tax information directly from the XML invoice file, ensuring correct tax calculations. This improves the reliability of our invoicing process.
Original PR description
Context: When importing an XML invoice or vendor bill, the tax prediction was based on the customer’s invoice history. Example: if the imported invoice contains an item found in the history with two taxes (6% and 21%), the prediction would return both taxes (6% and 21%), even though only one tax is present in the XML file. The actual tax data present in the imported XML was not taken into account. After this commit, the prediction is more rigorous and correctly relies on the tax information provided in the XML (restricted search domain) task-5503126 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249307 Forward-Port-Of: odoo/odoo#246308
This update resolves a crash in the Delivery Slip report when printed in languages other than English. The issue stemmed from the report using English labels for key fields. The fix now correctly uses the technical field names for tracking information, ensuring the report functions reliably across all supported languages.
Original PR description
Steps to reproduce: 1. Switch the partner language to Spanish. 2. Print the Delivery Slip. 3. The report crashes due to translated XPath anchors. Cause: XPath targeted hardcoded English strings 'Tracking Number' and 'Total Weight'. Solution: Target technical fields o.carrier_tracking_ref and o.shipping_weight instead of text labels. opw-5493498 Forward-Port-Of: odoo/odoo#248679
3 changes
Resolved issues and error corrections
This update fixes an issue where the VAT Book download was only generating for the primary company. Now, when multiple branches with the same CUIT are selected, the VAT Book will include data for all of them, ensuring accurate reporting for multi-branch businesses. This improves the reliability of tax reporting for our Argentinian clients.
Original PR description
#### Issues: VAT Book should download for all selected companies with same CUIT as the current one. #### Step to reproduce: - In a company in Argentina ("Parent Company") - Create a branch "Child…
#### Issues:
VAT Book should download for all selected companies with same CUIT as the current one.
#### Step to reproduce:
- In a company in Argentina ("Parent Company")
- Create a branch "Child Company A" with no CUID
- Create a branch "Child Company B" with a different CUID than parent
- Go to "Child Company A"
- Either:
- i. Select both "Parent Company" and "Child Company A" but not "Child Company B"
- ii. Select all 3 "Parent Company", "Child Company A" and "Child Company B"
- In Accounting > Report > Tax Return :
- Download the VAT Book (wheel > "VAT book(ZIP)")
#### Current behavior:
i. Get Invalid Operation
ii. Download the VAT Book for "Parent Company" only
#### Expected behavior:
- Download the VAT Book for both "Parent Company" and "Child Company A"
A previous call to get_options provide the client with the info about which selected companies have the same CUIT as the current company. Therefore companies in the options are the correct ones.
opw-5385585This update corrects a bug where OCR processing was incorrectly applied to split expenses, leading to increased usage of paid image processing services (IAP) and unexpected costs for users. The fix ensures OCR is only performed on the original expense document, optimizing resource usage and preventing unnecessary charges, especially when automatic digitization is active.
Original PR description
OCR should only be performed on the original document. Enabling it on splits leads to redundant OCR requests and unnecessary IAP credit consumption. This is particularly important when automatic digitization is enabled, as it triggers a paid request for every split generated, leading to unexpected costs for the user. The same bug was fixed in version 19.0 and up (commit 0688575), but it couldn't be backported as the `split_expense_origin_id` field doesn't exist in version 18.0. opw-[5930791](https://www.odoo.com/odoo/project/2068/tasks/5930791) Forward-Port-Of: odoo/enterprise#107789
This update fixes an issue in the barcode picking interface where users were repeatedly prompted to confirm the addition of multiple extra products. Now, the confirmation dialog opens only once and dynamically updates with selected items, streamlining the process and reducing user frustration. This improves efficiency when picking multiple items via barcode.
Original PR description
When adding extra products in the barcode picking interface, the confirmation dialog did not handle correctly the scan of multiple extra items. Before: Scanning multiple extra products successively opened (mutex + promise) the dialog multiple times. The user had to confirm/cancel each extra product addition one by one. After: The dialog is now only opened once and updated when scanning multiple extra products before confirming. The user can select/deselect the extra products to add before validating. [opw-5193269](https://www.odoo.com/odoo/project/49/tasks/5193269) Forward-Port-Of: odoo/enterprise#104932
3 changes
Resolved issues and error corrections
This update resolves a bug in a test tour for the payroll attendance module. The tour was incorrectly triggering a search that caused unexpected behavior. The fix streamlines the tour process by directly selecting the correct employee, eliminating unnecessary searching and ensuring consistent test results.
Original PR description
runbot-error-id~238494
This update resolves a technical issue that previously caused the AI field cron job to fail. By correctly handling expected exceptions, the cron job is now more reliable and stable, ensuring consistent operation of the AI field functionality. This improves the overall performance and dependability of the Enterprise module.
Original PR description
This commit updates the exception handling to correctly catch the expected exception. Task-5894552
This update resolves a bug in the Peruvian reporting module's test cases. A recent change introduced incorrect tax settings into test expense accounts, causing test failures. This commit corrects the default expense account used in tests, ensuring accurate test results and maintaining the integrity of the reporting functionality.
Original PR description
In the community PR for l10n_pe https://github.com/odoo/odoo/pull/240831 , some new expense accounts are added and some existing accounts are modified. This change added default tax to the expense accounts which was being used in test cases for `l10n_pe_reports_lib`. Due to this, a new tax line was added in line_ids, and certain tests were failing since tax line was not at all taken into consideration. This commit updates default expense account to another account without any default tax for tests. Task [link](https://www.odoo.com/odoo/project.task/5149253) task-5149253
6 changes
Resolved issues and error corrections
This update resolves an issue where the 'Update Rental Prices' button disappeared after saving a rental order. The fix adds a field to the view that ensures the button remains visible when a rental period is changed and the order is saved. This ensures users can easily adjust rental prices as needed.
Original PR description
Steps to produce: --- - Install `sale_renting` module. - Rental > Open any order > Change the rental period. - Save the record. Issue: --- - After saving the order, the `Update Rental Prices` button becomes invisible. Root cause: --- - The field `show_update_duration`, which controls the visibility of the button, is not present in the view. As a result, when the record is saved, the field is not included in the form data and its value is not properly maintained, causing the button to become invisible. - The field is removed from the view in this [commit]. Solution: --- - Added the `show_update_duration` field to the view to ensure its value is properly maintained. This allows the `Update Rental Prices` button to remain visible when applicable. [commit]: https://github.com/odoo/enterprise/commit/b90bbdef10a7a37fb065626ba995811ab388c7a1 opw-5937145 --- Forward-Port-Of: odoo/enterprise#107621
This update fixes an issue where the total hours displayed in the Gantt chart were incorrect when an employee's calendar was set to a timezone different from UTC. The change ensures that working hours are accurately calculated and displayed, regardless of the employee's timezone, improving planning accuracy.
Original PR description
### Issue: Having a calendar with a timezone different from utc and looking at the planning gantt view, the hours displayed in the "Total" row are wrong. ### Steps to reproduce: - Have an employee…
### Issue: Having a calendar with a timezone different from utc and looking at the planning gantt view, the hours displayed in the "Total" row are wrong. ### Steps to reproduce: - Have an employee with a calendar in "Europe/Brussels" and working from 8 to 17 - In planning add a line for this employee - Display the gantt view on a day - Create a shift for this employee from 8 to 17 - In the "Total" row, the first hour is not counted ### Cause: To compute the values displayed in the Total row, we take the intersection of the shift and the working hours from the calendar. ([src](https://github.com/odoo/enterprise/blob/2b887d094c66be7aebd92fbf735b1852f5dde4b5/planning/static/src/views/planning_gantt/planning_gantt_renderer.js#L318)) But the working hours from the calendar are given in UTC for this computation (without conversion), this result in a discrepancy between the actual hours of the calendar (with timezone conversion) and the one given to compute the total row. ### Solution: `resource_work_intervals()` returns the work intervals with the calendar hours and the resource timezone. In our case, only the hours are interesting (the previous code replaced the timezone by UTC). We need to convert them from the calendar timezone to UTC. So the first thing to do is remove the timezone from `resource_work_interval` then we localize it in the calendar timezone and to finish we convert it to UTC. opw-5564749
This update fixes an issue where work entries created from attendance archives were incorrectly including existing entries on the same day, leading to inaccurate work duration data. The change ensures that work entries accurately reflect the correct duration for each date, resolving a potential reporting discrepancy. This improves the reliability of time tracking data.
Original PR description
Current behavior: work entries created from attendance archive "included" existing work entries on the same day, even when they do not overlap in time frame. This happens because the attendance intervals are created from records in self, not all attendances on a given day Expected behavior: work entries should reflect the correct duration for a date. opw-5499002 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects an issue related to how onboarding worksheet fields are handled during Odoo upgrades. Moving these fields from XML to Python required setting `noupdate=1` to prevent upgrade errors. Without this change, the system would encounter upgrade problems, leading to a specific error message during the upgrade process.
Original PR description
In the `industry_fsm_report` and `quality_control_worksheet` modules, worksheet fields created during onboarding was moved from XML to Python…
In the `industry_fsm_report` and `quality_control_worksheet` modules, worksheet fields created during onboarding was moved from XML to Python (https://github.com/odoo/enterprise/commit/d619aa4d0d042be3f899b777081b7fb90f851c84). They were noupdate=1 before moving to Python ([quality_control_worksheet](https://github.com/odoo/enterprise/blob/d619aa4d0d042be3f899b777081b7fb90f851c84/quality_control_worksheet/data/quality_worksheet_demo.xml#L3), [industry_fsm_report](https://github.com/odoo/enterprise/blob/d619aa4d0d042be3f899b777081b7fb90f851c84/industry_fsm_report/data/fsm_report_demo.xml#L3)). The issue is without this patch, the dbs which loaded those fields in version `19.0` will have referencing xmlid because of this PR #84602, with noupdate=0. On the other side as they do not have record in xml files, during the upgrade to > 19.0 it will introduce an issue like this: ``` odoo.upgrade.util.exceptions.UpgradeError: 💥 It looks like you forgot to call `util.remove_field` on the following fields: x_project_task_worksheet_template_2.x_worker_signature 2026-02-15 20:17:38,149 23 INFO db_3904048 odoo.service.server: Initiating shutdown ``` tbg-2468
This update resolves an issue that prevented users from clicking the Work Entries button when overtime records lacked a 'Stop' time. The fix corrects a comparison error between a date and a boolean value, ensuring the button functionality is consistently available. This improves the reliability of the HR module.
Original PR description
Clicking the Work Entries smart button raises a traceback when an overtime record has no Stop (time_stop). Steps to reproduce the error: - Install ``hr_work_entry_attendance`` module with demo data - Activate developer mode - Create an Employee A > Settings > Set Default Ruleset in Overtime Ruleset In Payroll Tab, Work Entry Source: ``Attendances`` and set Contract - Create an overtime attendance > Save > Open the Overtime Details > Unset the ``Stop(time_stop)`` > Save - Open Employee A > Click on Work Entries smart button Traceback: ```py TypeError: '<' not supported between instances of 'bool' and 'datetime.datetime' ``` https://github.com/odoo/enterprise/blob/56c3723a925f718ba39d11cde12933542ebcd7c1/hr_work_entry_attendance/models/hr_version.py#L49-L52 When ``stop(time_stop)`` is unset in the overtime, ``ot.time_stop`` is False, causing ``min()`` to compare a ``datetime`` with ``False``, which raises the above traceback. sentry-7169332615
This update resolves an issue where tasks remained linked to sales orders even without a corresponding sales order item. Now, users can properly unlink tasks from sales orders, preventing billing issues and streamlining workflow. This ensures tasks can be easily managed and associated with new sales orders when needed.
Original PR description
Currently, a task remains linked to its original sales order even when it has no sales order item. This prevents users to not bill a task and temporarily detach it from a sales order until it can be…
Currently, a task remains linked to its original sales order even when it has no sales order item. This prevents users to not bill a task and temporarily detach it from a sales order until it can be linked to a new one. **Steps to produce:** * Install Sales, Project * Products > Virtual Home Staging > Create On Order > Project and Task * Create and confirm quotation with that product. * Tasks > Empty Sale Order Item Field **Observed Behavior:** * Sale Order is still linked to the task despite sale order line has been unlinked from that task. **Root cause:** * Compute method [1] only detaches the sale order if the customer has been changed. **Solution:** * Only detach the sale order when there are no sale order items and the record is not a field service task. * Field service tasks should always keep the sale order linked so materials can still be added to the existing sale order, even when the task is non-billable (i.e., no sale order line is linked). This logic is handled by the compute override at [2], which reassigns the sale order when needed. [1]: https://github.com/odoo/odoo/blob/3f4e45ecaca46a98c904536658728a1f1571bdbd/addons/sale_project/models/project.py#L916-L935 [2] https://github.com/odoo/enterprise/blob/6658581828dcdc43ffc5823814a05cb936cd0500/industry_fsm_sale/models/project_task.py#L178-L194 Related community PR: https://github.com/odoo/odoo/pull/241446 opw-5215989 Forward-Port-Of: odoo/enterprise#107716 Forward-Port-Of: odoo/enterprise#103487
14 changes
Resolved issues and error corrections
This update ensures self-order transactions in our POS system now adhere to the same data validation rules as regular POS orders. This enhances data accuracy and reliability, reducing potential errors and improving the overall customer experience. The change applies to several POS modules including online payments and restaurant ordering.
Original PR description
*: pos_online_payment_self_order, pos_restaurant, pos_self_order This commit improves the data validation of pos self order by using the same validation as the one used for regular pos order.
This update fixes a minor typo in the Odoo warning message displayed when a Python external dependency is not found on PyPI. The corrected message ensures a more professional user experience and avoids confusion. This change improves the clarity of error messages for developers and users.
Original PR description
Description of the issue/feature this PR addresses:
Fixes typo "o" should be "to"
Current behavior before PR:
Warning text is shown as `python external dependency on 'jwt' does not appear o be a valid PyPI package. Using a PyPI package name is recommended.` when having in `__manifest__.py` : ` "external_dependencies": {"python": ["jwt"]},`
Desired behavior after PR is merged:
Warning text without typo : `python external dependency on 'jwt' does not appear `**to**` be a valid PyPI package. Using a PyPI package name is recommended`
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update reverses a recent change that was incorrectly removing accented characters from legal names used for Mexican VAT (EDI) processing. The SAT now allows all characters, so we're restoring the original behavior, requiring users to input the correct, legally registered name. This ensures full user control and avoids blocking legitimate transactions.
Original PR description
An accent sanitization feature was introduced in Odoo 18 [1]. It was done because it appeared the SAT replaced certain characters with their unaccented counterpart, but it's not the case. At least…
An accent sanitization feature was introduced in Odoo 18 [1]. It was done because it appeared the SAT replaced certain characters with their unaccented counterpart, but it's not the case. At least today, the SAT allows all characters (pointed out in [2]). This explains why in the past 6 months this feature has been slowly undone [3][4][5], character by character, after customers run into issues. The approach can not work, so we go back to the name with the accents the user puts on the partner. Users need to put the correct, legally registered name in Odoo. If it doesn't work then they can adapt it as needed. This way the user is in full control, and we don't block them. This reverts the whole accent sanitization saga: - Revert "[FIX] l10n_mx_edi - More accented characters accepted by SAT", this reverts commit 46cc41ddd258e80372478a746ea79d154a5931d9. - Revert "[FIX] l10n_mx_edi: Fix accents in legal name", this reverts commit dcbd8797667b5be88f48045e48da86ac42db362c. - Revert "[FIX] l10n_mx_edi: Fix accents in legal name", this reverts commit 32b8333fd3f813ec3188394c2634129e3fbfe31d. - Revert "[FIX] l10n_mx_edi: Fix accents in legal name", this reverts commit 05ed1fb9059bd1459e38dc00b041cada6bf06ac4. This also removes the unused frozendict import to make "Check Style" happy. opw-5915515 [1] https://github.com/odoo/enterprise/pull/95207 [2] https://github.com/odoo/enterprise/pull/107960 [3] https://github.com/odoo/enterprise/pull/96043 [4] https://github.com/odoo/enterprise/pull/106557 [5] https://github.com/odoo/enterprise/pull/107677 Closes odoo/enterprise#107960
This update prevents users from canceling subscriptions if they don't have access to the associated invoices. Previously, a sales representative could cancel a subscription even if they lacked visibility of the invoices. Now, the system correctly prevents cancellation until the sales representative has access to the invoice details, ensuring accurate subscription management.
Original PR description
Before this commit, when a user had access to an invoiced subscription but not to the invoiced, he could cancel the subscription. Step to reproduce: - create a subscription in company A, with a pricelist available in company B. Sales person A belong to company A. - invoice the subscription and confirm the invoice - update the company (company B) and sales person of the subscription (B). The new salesperon don't see the invoice in the stat button. After this commit salesperson B can't cancel the subscription. task-5907345
This update corrects an issue where Brazilian fiscal positions were incorrectly inherited across companies, leading to errors. Now, fiscal positions are properly isolated based on the company where they are created, ensuring accurate reporting and calculations for Brazilian customers. This resolves inconsistencies and prevents errors when managing fiscal settings.
Original PR description
Issue ===== The fiscal position defined on a partner was not properly isolated per company, leading to cross-company inconsistencies and errors. Steps to Reproduce ================== 1. Install…
Issue ===== The fiscal position defined on a partner was not properly isolated per company, leading to cross-company inconsistencies and errors. Steps to Reproduce ================== 1. Install `industry_fsm_sale` and `l10n_br`. 2. In the US company: - Create a Brazilian customer. - Set a fiscal position on the customer. 3. Switch to the Brazilian company: - Open the same customer. - Set a fiscal position on the customer. 4. Still in the Brazilian company: - Create a task for that customer in the Field Service app. - Add a product to the task. Result ====== An error is raised because the fiscal position from the US company is used, which is not valid for the Brazilian company. Root Cause ========== When reading the fiscal position from the partner, the value is fetched in the environment of the company in which the partner record was originally created (US company). If no company is explicitly specified, the fiscal position is read in that original environment, even when the user is operating under the Brazilian company. Solution ======== Explicitly enforce the current company context when reading the fiscal position from the partner to ensure the correct company-specific value is used. opw-5270522 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where shipping capacity percentages were incorrectly calculated across multiple batch transfers. The change ensures that each batch's capacity is accurately determined, aligning with the displayed values and improving the reliability of dispatch management. This impacts how users view and manage batch transfers.
Original PR description
## Issue Before This PR: The fields `used_weight_percentage` and `used_volume_percentage` in the list view were showing incorrect values. These fields were incorrectly aggregating totals across all…
## Issue Before This PR: The fields `used_weight_percentage` and `used_volume_percentage` in the list view were showing incorrect values. These fields were incorrectly aggregating totals across all batches, as the calculation of `estimated_shipping_weight` and `estimated_shipping_volume` was not handled per batch, resulting in wrong percentages. ## Steps to Reproduce: - install inventory module and enable settings for batch transfers and dispatch management, - add two batch records with vehicles assigned (having weight or volume capacity), and transfers having products with weight or volume defined - Observe different values of weight % or volume %, in form and list view. ## Cause of the Issue: In the method `_compute_estimated_shipping_capacity` the computation loop referenced all records together, causing totals to be shared across batches. ## With This PR: Each batch now computes its own estimated shipping weight and volume correctly, ensuring correct per-batch values consistent with the form view and match what users see when opening individual records. Backport of [commit](https://github.com/odoo/odoo/pull/227166/changes/a709e84d8357a622198a8ac0a0199af9b16f56e7)
This update resolves a minor issue where a typo appeared in the logs for the Belgian Codabox localization module. This ensures accurate logging for reporting and troubleshooting, maintaining the integrity of financial data. The change is purely a technical correction.
Original PR description
This commit will fix a typo in the log. no task id
This update fixes an issue where deactivated withholding taxes were still being calculated in payments. The fix ensures that payments accurately reflect only active withholding taxes, preventing incorrect financial reporting. The change was made by filtering the tax fetch function to prioritize active taxes.
Original PR description
# How to reproduce - Install the l10n_ar_withholding module - Pick a Vendor and add a Purchase Withholding tax in the accounting tab - Go into configuration and disable that tax - Create a Vendor Bill with that Vendor - Confirm the bill and create a payment # The problem The deactivated tax is still computed in the payment # Why The function that fetches the withholding taxes does not check if the taxes are active or not # The fix I though of 2 solution : - Add an override to remove the taxes from the Vendor when they are deactivated - Add a filter to the fetch function to check if the taxes are active I chose the 2nd solution as it is the least invasive one. opw-5917257
A bug was preventing users from correctly saving approval domain rules within the web_studio interface. This issue stemmed from how domain data was being formatted between Python and JavaScript. The fix ensures that domain rules are saved accurately, resolving a potential disruption in automated email workflows.
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 Forward-Port-Of: odoo/enterprise#107432
This update corrects a reporting issue with Italian invoices (l10n_it) by ensuring the total invoice amount (`ImportoTotaleDocumento`) is always displayed in EUR, as required by Italian tax regulations. This change aligns with government guidelines and avoids potential compliance problems.
Original PR description
With an `l10n_it` company: - Create an invoice in a foreign currency and export the XML. In the XML, the field `ImportoTotaleDocumento` is expressed in the invoice currency, while `Divisa` is set to…
With an `l10n_it` company: - Create an invoice in a foreign currency and export the XML. In the XML, the field `ImportoTotaleDocumento` is expressed in the invoice currency, while `Divisa` is set to the company currency. `ImportoTotaleDocumento` must be expressed in EUR, as stated in the following document: https://www.agenziaentrate.gov.it/portale/documents/20143/0/10FAQ+pubblicate+il+19+luglio+2019+(aggiornate+il+1+luglio+2021).pdf/6e8acb34-b7c5-730e-6a39-79c0a296e02b > L'art. 21, comma 2, lettera l) del d.P.R. n. 633/72 specifica che > “aliquota, ammontare dell'imposta e dell'imponibile con arrotondamento al centesimo di euro”. > Conseguentemente, se la fattura è emessa da soggetti residenti o stabiliti il codice da inserire nel campo `<Divisa>` > deve essere obbligatoriamente “EUR”. > Article 21, paragraph 2, letter (l) of Presidential Decree No. 633/72 specifies that > “the tax rate, the amount of the tax, and the taxable amount must be stated with rounding to the euro cent.” > Consequently, if the invoice is issued by resident or established taxpayers, the code to be entered in the `<Divisa>` > field must mandatorily be “EUR”. As a result, we now use the **company currency amount** for the `ImportoTotaleDocumento` field (assuming the company currency is always EUR for `l10n_it`). Ticket [link](https://www.odoo.com/odoo/project.task/5913088) opw-5913088 Forward-Port-Of: odoo/odoo#247537
This update corrects a previous issue where cost of goods expense lines incorrectly used the product's analytic account instead of the distribution model. The fix ensures that the analytic account aligns with the user-defined distribution model, providing more accurate profitability reporting, especially for sales linked to projects.
Original PR description
Steps: - Activate automatic accounting - Create a product P: • Storable, track inventory • Set a cost • Product category FIFO, automated valuation - Activate analytic accounting - Create a…
Steps: - Activate automatic accounting - Create a product P: • Storable, track inventory • Set a cost • Product category FIFO, automated valuation - Activate analytic accounting - Create a distribution model for that applies to expense account - Create an invoice for product P, set an analytic (different from the one set on the model above) - Confirm -> On the cogs expense line, the analytic account is the one from the product line, it should be the one set on distribution model Cause: The analytic distribution is forced to the same value as the product line at the creation of cogs lines. Fix: Adding a helper to know if we need to force the value of analytic distribution or leave it to the compute method. This is especially needed for invoices that are originated by a sale order linked to a project, since we calculate profitability items regarding the project's distribution. Note: This is an issue that has been addressed several times in differents way, the reason of this fix is that we think that user should rely on distribution models: if they want a distribution to be applied on the cogs line, they should create a distribution model that meet their needs. opw-5193666
This update corrects an issue where manually created stock transfers without a procurement group were incorrectly merged into existing transfers. The change ensures each transfer creates its own operation, preventing data inconsistencies and improving the accuracy of multi-step stock workflows. This resolves a problem where unrelated receipts were grouped together.
Original PR description
*: purchase_stock Issue Before This Commit: ====================== In a `multi-step` configuration, while validating a transfer that has no `procurement group`, its next operation (Input → QC →…
*: purchase_stock Issue Before This Commit: ====================== In a `multi-step` configuration, while validating a transfer that has no `procurement group`, its next operation (Input → QC → Stock) is merged into an existing transfer that also lacks a procurement group, even when the transfers are manually created and not generated from a Sales or Purchase Order. This results in unrelated transfers being grouped together. Steps to Reproduce: ====================== - Install the `stock` module. - Configure the warehouse to use `three-step reception`. - Create and validate two receipts for Product A (qty 10) with Vendor A. - `Observation`: the next transfers for both receipts are merged into a single transfer, even though both receipts were created manually and not generated from any same source document like PO/SO. Cause of the Issue: ====================== In the `_search_picking_for_assignation()` method, when no `group_id` is defined on a move, the system still attempts to find an existing picking using the `partner_id`. Additionally, in the `_key_assign_picking()` method, moves without a `group_id` are grouped based on their `partner_id`. As a result, validating multiple manually created receipts sharing the `same vendor` causes them to be incorrectly merged into the `same next transfer`, since they do not share a common procurement group. After this Commit: ====================== The `_search_picking_for_assignation()` method now skips searching for existing pickings when moves lack a `procurement.group`. The `_key_assign_picking()` method groups moves by their `originating picking` instead of the partner, preventing merges between unrelated transfers without a procurement group. This ensures each manual transfer creates its `own next operation` in multi-step routes. Task-ID: 5242340
This update corrects a test case within the quality control module to accurately reflect recent changes in how Odoo handles picking moves. Specifically, the test now correctly assesses scenarios where multiple shipments are merged into a single transfer when a procurement group is defined. This ensures the quality control process aligns with the latest functionality.
Original PR description
Fix the test case to align with the updated picking move merge behavior, where the next transfer merges into an existing one only when a procurement group (group_id) is set TaskID-5242340
This update resolves an issue where the timesheet grid incorrectly displayed 'Weekly Overtime' instead of 'Total Overtime' when hovering over the total overtime cell in the month view. Renaming the display ensures accurate reporting of all overtime periods (day, week, or month).
Original PR description
### Issue: When displaying the month in the grid view and hovering the bottom right cell, where the total overtime is displayed, it shows "Weekly overtime". ### Steps to reproduce: - Open Timesheet app - In "My Timesheet", display the grid in day or month - Hover the bottom right cell - It displays "Weekly Overtime" ### Solution: Rename it to "Total overtime" to handle all periods (day, week, month). opw-5502864
5 changes
Resolved issues and error corrections
This update resolves a random failure within the website editor's tour feature. The issue stemmed from inconsistencies in how the tour service triggered events compared to real user interactions. Adding a simple delay ensures the system correctly detects the necessary actions, preventing the tour from prematurely ending.
Original PR description
Steps to reproduce
==================
Run the test test_15_website_link_tools a bunch of times. It will eventually fail.
It happens every time if we add the following step after the "Reselect the first image" or the "Re-select image." step:
```js
{
trigger: "body",
run: async function() {
const { promise, resolve } = Promise.withResolvers()
setTimeout(resolve, 500)
return promise
}
},
```
It will fail when checking if the link toolbar is present
Cause of the issue
==================
In 17.0, the tour service doesn't trigger exactly the same events as a real user.
In this case, a selectionchange event is trigger causing the linkpopover to disappear
https://github.com/odoo/odoo/blob/6f7baa97db91f9a447257c3762febf4bd8a04800/addons/web_editor/static/src/js/wysiwyg/wysiwyg.js#L2963-L2977
Solution
========
We can set and focus the selection on the after clicking on it.
runbot-237703This update fixes inaccuracies in Bulgarian tax names and adjusts the default purchase tax rate from 20% PTC to 20% FTC, aligning with current Bulgarian regulations. This ensures accurate tax calculations and reporting for Bulgarian businesses using the Odoo system.
Original PR description
Fixing incorrect tax names and changing the default purchase tax to 20% FTC instead of 20% PTC. task-5935754
This update fixes an issue where the payment term for Mexican CFDI exports was sometimes rendered in English instead of Spanish, leading to potential duplicate filings with the SAT. By explicitly setting the Spanish context, this change guarantees consistent and compliant CFDI XML generation, preventing errors and streamlining the export process.
Original PR description
The CFDI 4.0 field CondicionesDePago is derived from the payment term name, but its rendered value depends on the language context active at XML generation time. Even when the user language is…
The CFDI 4.0 field CondicionesDePago is derived from the payment term name, but its rendered value depends on the language context active at XML generation time. Even when the user language is Spanish, this field may still be rendered in English (e.g. "Immediate Payment") due to context loss during the CFDI rendering process or during XML regeneration. This behavior becomes especially problematic in scenarios with PAC intermittency. A stamping request may be successfully processed by the SAT but time out in Odoo, and a subsequent retry can regenerate the CFDI using a different language context. As a result, two CFDIs with identical fiscal data but different textual content (English vs Spanish) can be generated, potentially leading to duplicated CFDIs registered in the SAT. To ensure deterministic and compliant XML generation, the payment term name is now explicitly evaluated under the es_MX context when rendering the CFDI. This guarantees stable Spanish content for Mexican CFDI textual fields, regardless of user language or transient context changes during the EDI flow. This follows the same rationale as odoo/enterprise@f75a04fa954d, where a lost language context during XML rendering caused inconsistencies between the XML and the expected Mexican CFDI content. Forward-Port-Of: odoo/enterprise#105588
This update corrects a discrepancy in the Romanian tax reports to align with the latest government regulations. Specifically, VAT rates and certain tax amounts have been updated to reflect the current 19-21% and 5%/9%/11% structures. Inactive taxes were also adjusted to ensure accurate report generation.
Original PR description
Romanian VAT has increased from 19% to 21% and from 5%/9% to 11%, some taxes were added previously to the module but they were not reflected in the tax report, also other taxes were missing in order for the report to replicate the current up to date version issued by the romanian government.
This update fixes an issue where lot numbers weren't consistently displayed in POS sales orders when products were tracked by lot and stored in multiple locations. The fix ensures that the correct lot number is accurately reflected for all product lines within the order, improving inventory accuracy and order fulfillment. It also addresses a related issue with stock movement processing during POS closure.
Original PR description
When opening an SO in POS that has a product tracked by lot that is split into several location, the lot number will only appear in one of the line and not the others Steps to reproduce:…
When opening an SO in POS that has a product tracked by lot that is split into several location, the lot number will only appear in one of the line and not the others Steps to reproduce: ------------------- 1. Create a Product A tracked by lot, create lot 111 and add 1 unit to location A and another one to location B 1. Create a sales order 2. Add two units of the product to the sale order 3. Confirm the sales order 4. Open the transfer, make the transfer retrieve the product from several location with the same lot. 5. Save the transfer 6. Open the sales order in POS 7. Load the SN/lots -> Two line of qty 1 appear for the product A but only the first one has the lot number Additional Issue: 8. Change the number of the product for the first line to 2 and erase the second line 9. Confirm and Pay 10. Close POS 11. Open move lines for this product (Inventory>product>In/out) -> It moves 2 product from one location (when there is only product) Observation: ------------- When loading the SO in POS, we will retrieve the SO: https://github.com/odoo/odoo/blob/cb1f5d9c6db64b9ace9b7aa46bd6f94e4462176b/addons/pos_sale/static/src/app/order_management_screen/sale_order_management_screen/sale_order_management_screen.js#L104 While retrieving the SO, we will also retrieve the SOL, with additional information: https://github.com/odoo/odoo/blob/d9b2e5ee730a4e79586bfd3f09adfb794d2dc1f3/addons/pos_sale/models/sale_order.py#L79 -> Issue is that when several moves_line have the sale lot_id.name, their quantity will be overwritten. Addition Issue : When closing pos, all the move will be processed, when processing those moves, the origin only check if the quantity is more than 0 and not if there is enought units. https://github.com/odoo/odoo/blob/cb1f5d9c6db64b9ace9b7aa46bd6f94e4462176b/addons/point_of_sale/models/stock_picking.py#L293-L297 opw-5347992