Daily updates from Odoo
Thursday, February 5, 2026
48 changes · master
Security fixes and vulnerability patches
This update strengthens the security of Odoo Enterprise by limiting direct access to the core session object. Developers are now encouraged to use the session as a dictionary, reducing potential vulnerabilities and improving overall system stability. This change enhances the security posture of the application.
Original PR description
The session is a critical object. The goal of this commit is to limit its exposure. Developers should use the session as a dictionary (`MutableMapping`). Developers should (generally) not use internal logic that processes the session. To achieve this, this commit moves the methods from the `Session` class to make them module-level functions. Task-5882018
This update fixes a security vulnerability where temporary customer data credentials (RDTs) were being logged in application logs. This prevented sensitive information like buyer names and addresses from being exposed outside of controlled systems, reducing the risk of data breaches. The change prevents logging of sensitive data during certain operations.
Original PR description
Previously, the connector logged all SP-API responses for debugging purposes. When operation is `createRestrictedDataToken`, this would also log the `restrictedDataToken` in plaintext. RDTs are short-lived credentials that grant access to PII (buyer names, addresses, etc.) and should not appear in application logs. While the token is only stored in memory while in use, logs are frequently shared in support tickets, error reports, and monitoring systems without the same access controls, making credential exposure far more likely. This commit adds a parameter to disable logging for operations that return sensitive data. opw-5491878 Forward-Port-Of: odoo/enterprise#105178
New functionality added to Odoo
This update adds a markdown preview feature to documents, allowing users to see a formatted version of their content directly within the application. It leverages existing technology used in the AI module, streamlining the development process. This enhancement improves document readability and provides a more flexible editing experience.
Original PR description
Purpose ======= Add markdown preview and thumbnail in documents. This is implemented with the `markdown2` library, which is already used in the AI module. Task-5224024
This update adds the functionality to generate basic fiscal receipts for Italian businesses using their fiscal printers. This is a key step in ensuring compliance with Italian tax regulations and allows businesses to accurately record sales transactions for reporting purposes.
Original PR description
This commit add the basic receipt for the italian fiscal printer. Task-5114203
This update adds missing templates for Equity and Government checks within the Odoo Enterprise accounting reports. This ensures accurate and complete financial reporting, fulfilling a key requirement for compliance and data integrity. It builds upon previous work to fully implement the required reporting functionality.
Original PR description
Completes the work started in odoo/enterprise#88360. The Equity and Government check templates were missing and are added here to fully complete the data. task-5365677 Forward-Port-Of: odoo/enterprise#103954
Enhancements to existing features
This update integrates ARCA, a reliable currency rate provider, into Odoo Enterprise for Argentina. It now automatically fetches and displays Argentinian currency rates, ensuring accurate financial reporting and transactions for Argentinian companies. This change sets ARCA as the default rate provider for Argentinian businesses.
Original PR description
This PR adds ARCA as a new currency rate provider. It sets ARCA as default rate provider for companies having Argentina as their country. task-5224885
This update enhances the batch payment form by adding a total amount display and clearer error messages, particularly regarding mixed payment types. The design has been simplified by removing redundant columns and making certain fields optional, improving the overall user experience for managing batch payments.
Original PR description
This commit improves the batch payment form view: - Display the amount positive and add a 'Total' label in the footer. - Move the warning banner below the header (Buttons and State). - Set the 'Available ISO 20022 Priority' field to optional hidden by default. - Remove the 'Payment Method' column from the payment list. - Update the validation error to clearly indicate issues with mixed payment types. task-5502537
This update simplifies the process of creating invoices for Mexican tax purposes (l10n_mx_edi). It removes a confusing 'to define' option and adjusts requirements for payment methods, aligning with recent government regulations and reducing potential compliance issues. This change improves accuracy and reduces the risk of errors related to Mexican tax reporting.
Original PR description
There have been several problems with the government lately because users are doing to highly illegal things with Odoo, even us at Odoo have been doing this, and the government sends complaints In This Commit: - We remove 99-'por definir' from l10n_mx_edi.payment.method - Make Payment Way not required in the sale order and required in the invoice. - Swap the position of Payment Way and Payment Policy in the invoice view. - Remove the 'Force CFDI' button if the invoice is 'PUE.' task-5443707
This update enhances the accuracy of audit reports within the Odoo Enterprise accounting module. Specifically, it corrects errors that caused incorrect balances and adds necessary actions to automatically open related reports based on audit dates, streamlining the reporting process.
Original PR description
* Fix incorrect actions that lead to balances. * Add missing actions to open related reports. task-5246225
This update enhances the layout and persistence of the calendar and planning side panels within Odoo. The changes align the Gantt sidepanel's width with the calendar, improving the user experience and visual consistency. This update also incorporates adjustments to improve the overall functionality of these key modules.
Original PR description
*: knowledge, planning, timesheet_grid This commit adapts class names and knowledge custos to changes made in https://github.com/odoo/odoo/pull/245760 task-5807836
This update separates the user interface data from the core account report logic. This change optimizes the performance of account reports by reducing the amount of data processed by the UI, leading to faster loading times and a smoother user experience. It's a key improvement for users generating and viewing reports.
This update adjusts the layout of the POS order form by updating the underlying XPath expressions. This ensures the form correctly displays information after a recent design revamp, improving the user experience for point-of-sale operations. This change impacts the l10n_mx_edi_pos and l10n_pe_edi_pos modules.
Original PR description
*= l10n_mx_edi_pos, l10n_pe_edi_pos In this commit: ================ This commit adapts the existing xpath expressions to support the revamped POS order form view layout. Task-5481883 Related Comm. PR: https://github.com/odoo/odoo/pull/243453
This update enhances the initial user experience for the Documents module by revamping the onboarding tour to showcase new features and streamlining the process. It also includes UI adjustments to the document creation dialog, making it easier for users to get started with the system.
Original PR description
**Purpose:** Revamp the Documents onboarding tour to highlight newly added features. **Specifications:** - Add a dependency on Contacts - Revamp the onboarding tour to reflect the new features. - UI changes in select add document create dialog Task-5152401
This update streamlines quality check reporting by removing redundant fields and ensuring accurate recording of manufacturing order lot IDs. It also fixes a bug related to handling multiple lot numbers in quality wizards, enhancing the reliability of quality control processes.
Original PR description
Changes of note: * `finished_lot_ids` is removed from existing tests and replaced with `lot_ids` wherever it makes sense. * The MO's SN/lot id is written to every quality check it has, instead of just 'Register Production' ones. * 'Register Consumed Material' checks write 'Success' or 'Failure' to the result field like 'Pass – Fail' checks do, instead of the component name, UoM and SN/lot id like 'Register Byproducts' checks do. * Fix for a bug that triggers when the quality wizard is opened if the MO has more than one SN/lot id assigned. Task ID: [5025510](https://www.odoo.com/odoo/my-tasks/5025510)
This update allows users to select the desired label format (ZPL, PDF, or PNG) when sending labels through Sendcloud. This increased flexibility improves the compatibility and usability of shipping labels for various printing and receiving systems. It’s a small improvement that streamlines the label generation process.
Original PR description
Add a option to choose the label format in the parameters when requesting labels from Sendcloud (ZPL, PDF, PNG). Task 5392134
Resolved issues and error corrections
This update fixes an issue where the softphone couldn't be closed using the same key that opened it. The change adds the same hotkey attribute to the close button, restoring the expected user experience. This ensures users can consistently close the softphone.
Original PR description
Since [1] the softphone cannot be closed with the same hotkey that opens it. This commit restores this behavior by adding the same hotkey attribute to its close button. [1]: https://github.com/odoo/enterprise/commit/df1772e877a508150fd3f549526dec9d867354be
This update adjusts the layout of the bank journal dashboard to accommodate the Connect Bank button, ensuring it's always visible. A previous, unnecessary code block has been removed to streamline the process. This improves the user experience by providing consistent access to the Connect Bank feature.
Original PR description
[IMP] account_online_synchronization: Remove useless t-if/t-elif This commit removes an useless t-if/t-elif introduces by this commit [[1]]. It seems this is useless as we have the same code inside the t-if or the t-elif. Only the conditions are different. no task id [1]: https://github.com/odoo/enterprise/commit/5c879c9097a2f3ebaf7b7b751a95de8d8f95527a [IMP] account_online_synchronization: Wrapping connect bank in dashboard The aim of this commit is making sure we are wrapping the Connect Bank button in the bank journal dashboard when we don't have enough place for it. no task id Before: <img width="402" height="329" alt="connect bank before" src="https://github.com/user-attachments/assets/110e417c-72b1-4294-a7fa-abab865658b5" /> After: <img width="385" height="325" alt="connect bank after" src="https://github.com/user-attachments/assets/6222059a-d83a-4e98-a5db-e288369800b8" />
This update corrects a bug preventing sales order items within subcategories from being included in commission reports. The fix ensures that all sales, regardless of product category hierarchy, contribute to salesperson achievements. This improves the accuracy of commission calculations and reporting.
Original PR description
### Issue: Due to this issue, only products which are inside `plan_achievement.product_categ_id` itself are included in achievements, and products which are in subcategory are not considered. #### Steps to reproduce - Using demo data: 1- Create a commission plan and add Mitchell admin as a Salesperson. 2- In the plan, create a new achievement. Set category to saleable. 3- Create a a SO with Large Desk. confirm and invoice it. 4- Navigate back to to the created commission plan. 5- Open commissions from smart button. 6- The created SO is not included is not considered. Expected: The created SO should be included in commissions. ### Cause and Fix: This limitation is due to not taking category.parent_id into consideration. This can be fixed by checking if plan category parent_path is a prefix of product category parent_path. opw-5461732
This update resolves potential tour instability caused by synchronous assertions that failed when triggers weren't immediately available in the browser. By switching to asynchronous assertions, the tours now run more reliably and consistently across different environments. This improves the user experience and reduces unexpected tour interruptions.
Original PR description
How tours works ? ================= For each animationFrame, engine searchs the trigger in the DOM until it has been found, then the action (run) is direclty launched. Why it could be not work properly ? =================================== Most of time, assertions done in `run` are synchronous. And if the trigger was too generic or clearly present in the DOM (like body, .o_content,...) or was simply the trigger element is already in DOM, then the synchronous assertions can failed... because elements are not present in DOM yet. Then, either the trigger of this step must be more precise, either you use trigger and HOOT selector to make assertions. This can cause undeterministic errors. What we do ? ============ With this commit, we replace synchronous assertions in `run` step function by asynchronous assertions in the `trigger`.
This update enhances the user experience for managing sign requests within Odoo Enterprise. Key changes include a simplified list view, improved template naming logic, and a modernized 'Itsme' authentication dialog. These improvements streamline the signing process and provide a more intuitive interface for users.
Original PR description
- the user now can uncheck 'Sent By' column by in list view - Update template name logic: * Keep custom name if set * Automatically update based on first uploaded document otherwise - Localize signing date in kanban view - Show 'Download' as dropdown only if more than one document - Add 'Details' button to open form view - Improve itsme auth dialog ui task: 5429970
This update corrects a technical issue within the Odoo Enterprise payroll accounting module. The module was incorrectly referencing a dependency that caused test failures. By removing the outdated dependency, the module now functions correctly and ensures consistent payroll processing.
Original PR description
hr_payroll_account_iso20022 did not depend on hr_payroll_account but only on hr_payroll and account_iso20022. This was causing some errors in tests that were expecting hr_payroll_account to be installed. Runbot Error: 237797 Forward-Port-Of: odoo/enterprise#106165
This update fixes an issue where subscription invoices were being generated prematurely when a note or section was added to the subscription. The fix ensures that invoice dates align with the expected end-of-period billing, regardless of whether a note is present. This improves the accuracy of subscription billing and prevents unexpected invoice timing.
Original PR description
**Steps to reproduce** - Have a subscription service product with invoicing policy set to "Based on delivered quantity (manual)". - Create a new monhtly subscription with this product and add a section or a note. - Confirm the subscription. Actual: next invoice date is today. Expected: same as without section/note, next invoice date should be at end of the period. **Cause** `_is_postpaid_line` should only be called on actual product lines. Related: https://github.com/odoo/enterprise/commit/d8a7f7cc2d9d11e42ed24db1b0f7a3c08c7fac1c opw-5478394 Forward-Port-Of: odoo/enterprise#104892
This update resolves an issue preventing users from viewing Lazada order package status within Odoo. Previously, access was restricted to 'Administrator' sales users. The fix grants read access to the necessary `lazada.order.item` model for both sales and inventory users, ensuring accurate package tracking on Lazada.
Original PR description
Versions -------- - 19.0+ Steps ----- Two issues: 1. Create a new user with `Sales "User: Own Documents Only"` rights, and `Inventory "User"`. 2. Try to access any picking or sale order. Issue ----- ``` Failed to read field stock.move.lazada_order_item_ids You are not allowed to access 'Lazada Order Item' (lazada.order.item) records. This operation is allowed for the following groups: - Sales/Administrator Contact your administrator to request access if necessary. ``` Cause ----- Both the picking form view and the sale order form view need access to the `lazada.order.item` model to display the pacakge status on Lazada. However, all Lazada specific models are only accessible with Sales "Administrator" rights. Solution -------- Add read access to `lazada.order.item` for stock and sales users. Forward-Port-Of: odoo/enterprise#105889
This update resolves an issue where lengthy bank reconciliation names were being truncated and displayed as a long list of commas. The fix moves a key component, improving the clarity and readability of bank reconciliation statements for users. This ensures accurate and complete information is presented.
Original PR description
When we have a lot of reconciled names, it can happens that you just have a long list of comma. It's because the text truncate was misplaced. This commit will fix this by moving the text truncate no task id Forward-Port-Of: odoo/enterprise#106242 Forward-Port-Of: odoo/enterprise#105674
This update resolves an issue where a reordering rule would incorrectly attempt to update a manufacturing order that had been locked due to a quality check. The fix ensures that the system correctly handles locked MOs, preventing errors and maintaining data integrity. This improvement improves the reliability of the MRP process.
Original PR description
### Issue: In 18.0-18.2, for product with a Manufacturing BoM containing a Component, a WO and a Quality Point If a Reordering Rule is triggered, odoo try to add the newly ordered quantity to an…
### Issue: In 18.0-18.2, for product with a Manufacturing BoM containing a Component, a WO and a Quality Point If a Reordering Rule is triggered, odoo try to add the newly ordered quantity to an existing MO But if the MO is "locked" because a quality check has been performed, a Error is raised: ``` Odoo Warning You cannot update the quantity to do of an ongoing manufacturing order for which quality checks have been performed. ``` ### Steps to reproduce: - Create a product tracked by quantity - Add a BoM (1 component tracked by Quantity, 1 Operation with 1 Quality Point) - Create a Reordering Rule (Route: Manufacture, Trigger: Manual, Min/Max: 1) - Click on Order - Open the created MO and the Shop Floor (Remove the filters to see the WO) - Complete the Quality Point - Modify the Reordering Rule (Min/Max: 2) - Click on Order - the error should be raised ### Cause: The MO to update is retrieved here: https://github.com/odoo/odoo/blob/45184da06cf7b92a48e3e4e90bf8b285bdd9ad6a/addons/mrp/models/stock_rule.py#L53-L57 Using a domain defined in this function: https://github.com/odoo/odoo/blob/45184da06cf7b92a48e3e4e90bf8b285bdd9ad6a/addons/mrp/models/stock_rule.py#L130-L153 In 18.0-18.2, when validating a `quality check` from the Shop Floor while the WO is in `waiting` state, the MO remains in `confirmed` state This makes the domain match the current WO and MO, triggering `change_prod_qty` even though the MO is locked In 18.3–18.4, a similar issue can occur with multiple WOs when the first blocks the second and a `quality check` is performed on the latter The `blocked` state behaves like `waiting`, but the issue is avoided when using the Shop Floor because this commit ensures that clicking a card starts the timer and changes the state to `progress`: https://github.com/odoo/enterprise/pull/84425/commits/67c2127424ef3a1eb4794edd2c262b94ef186561 However, it could still theoretically be triggered under specific conditions In 19.0, the new stock.reference system (https://github.com/odoo/odoo/pull/212679) ensures the MO is detected as different, so a new one is always created opw-5012588 Forward-Port-Of: odoo/enterprise#104158 Forward-Port-Of: odoo/enterprise#101313
This update fixes an issue where recurring prices on ecommerce product pages were displayed with incorrect grammar, specifically using singular forms for billing periods longer than one. The change ensures prices are presented in a user-friendly and grammatically correct manner, enhancing the customer experience.
Original PR description
Issue: - On ecommerce product pages, recurring prices displayed incorrect grammar. - Billing periods greater than one were shown in singular form (e.g. 'Every 6 month' instead of 'Every 6 months'). Fix: - Updated recurring price display logic to use plural period labels when the billing period value is greater than one. Impact: - Recurring prices now display correct and user-friendly grammar. taskid-5529937 Forward-Port-Of: odoo/enterprise#105127
This update resolves a bug that caused incorrect schedule calculations when using planning-based work entries, particularly with material-type resources. The fix restricts schedule computations to only include planning slots for the employee creating the attendance, ensuring accurate time tracking and preventing scheduling conflicts.
Original PR description
Steps to reproduce: - Set the work entry source to planning for an employee. - Create an attendance for that employee. Issue: - Errors occurred when planning slots linked to material-type resources were included in schedule computation. Fix: - Restrict planning slots used for schedule computation to records whose employee_id belongs to self.ids. task-5476771 Forward-Port-Of: odoo/enterprise#103951
This update corrects an issue where project forms, accessed through SmartButtons, were initially displayed as uneditable. The fix removes a setting that was incorrectly preventing editing, ensuring users can now fully interact with project forms. The reason for this initial setting remains unclear.
Original PR description
Issue: When navigating to any form view related to an FSM Project via
SmartButtons, they are loaded as uneditable
Solution: Remove "edit":False in _update_action_context method
Note: It is unknown why this was added in the first place, since
removing it does not cause any crashes
opw-5413753
Forward-Port-Of: odoo/enterprise#105225This update corrects a discrepancy in a sales subscription test. The test previously incorrectly prioritized pricelists based on a default setting related to partner countries. The fix ensures consistent pricelist ordering, resolving a potential issue with subscription pricing and improving test reliability.
Original PR description
Versions -------- - 18.0+ Issue ----- Commit a840e4250666 changed a `sale_subscription` test as pricelist ordering was changed. Before, it was `sequence asc, id desc`, now it is `sequence asc, id asc`. However, in the updated tests, it expects the first pricelist created with sequence 4 to be before the second pricelist with sequence 2. This was only happening due to default pricelists getting set as the `specific_property_product_pricelist` if the partner has no country assigned to them. Solution -------- As the behavior is now identical for partners with or without a country assigned to them, we can resolved the test setup by giving both pricelists an identical sequence, making the ordering fall back on `id` like a840e4250666 intended. opw-5385213 Related: https://github.com/odoo/odoo/pull/241736 Forward-Port-Of: odoo/enterprise#105606 Forward-Port-Of: odoo/enterprise#103116
This update fixes an issue where malformed PDFs caused errors during the signature process. The system now attempts a more lenient PDF parsing method when the initial attempt fails, ensuring that more PDFs can be processed correctly. This improves the reliability of the signature workflow.
Original PR description
Before this commit, opening some malformed PDF failed during flattening because PyPDF2 strict parsing and form-field reads raised errors. After this commit, we try first parsing the PDF in the usual way and if we fail, we try again with strict=False. See https://pypdf.readthedocs.io/en/stable/user/robustness.html. task-5902859 Forward-Port-Of: odoo/enterprise#106276
This update resolves a technical issue that prevented printing from IoT printers within the Point of Sale system. The fix addressed an 'undefined' error, ensuring reliable printing functionality for users. This improvement enhances the overall POS experience.
Original PR description
This PR fixed "error: undefined" when printing via websocket with iot printers in point of sale task-5496890 Forward-Port-Of: odoo/enterprise#106284
This update fixes a critical issue where payslip calculations continued even when errors were detected. Now, the system correctly raises an error, providing clear guidance on resolving problems like missing contracts. This ensures accurate payroll processing and prevents incorrect calculations.
Original PR description
Bug: When there is an issue on a payslip with an error level, and we try to compute the sheet, the sheet is computed. Instead of computing, it should raise and the message should specify what errors need to be resolved first. Cause: When computing the sheet, we were calling the self._get_error_message() without using the result, which is a string. Fix: Actually raise a ValidationError and use the result of self._get_error_message() for the error message. Introducing the raise brought other problems because some code supposed to fail was running seamlessly fine. But now, the raise is called and those needed to be solved as well. The issue raised multiple times is the "No contract in the payslip period". Task: 5153497 Forward-Port-Of: odoo/enterprise#105482 Forward-Port-Of: odoo/enterprise#104137
This update fixes an issue where annual returns incorrectly used a fiscal year filter when company fiscal years differed from the standard civil year. Now, annual returns always adhere to the company's civil year, ensuring accurate reporting and a better user experience. This improves the reliability of financial data presented in reports.
Original PR description
When a company fiscal year differs from the civil year, the annual return incorrectly falls back to the report’s FY-aligned year filter. The return should always follow the civil year, so the fallback is skipped and the return period filter is shown instead. task-5511074 Forward-Port-Of: odoo/enterprise#104726
This update resolves an issue preventing legal validation of the annual VAT report XML export for the Luxembourg (LU) localization. The fix adds missing required fields based on Luxembourg tax regulations, ensuring accurate report generation and compliance. This impacts users generating the annual VAT declaration.
Original PR description
### Issue: The annual VAT report could not be legally validated because some mandatory parent fields were missing in the XML export ### Cause: This PR add some required fields:…
### Issue: The annual VAT report could not be legally validated because some mandatory parent fields were missing in the XML export ### Cause: This PR add some required fields: https://github.com/odoo/enterprise/pull/93357 However, for file validation, the following parent fields are mandatory if certain child fields are present: ``` - Field 129: Field 129 is mandatory if one of the following fields is filled : 771, 971, 772, 972, 774, 773, 973, 124, 128, 197 - Field 137: Field 137 is mandatory if one of the following fields is filled : 776, 976, 777, 977, 778, 978, 134, 136, 198 - Field 145: Field 145 is mandatory if one of the following fields is filled: 781, 981, 782, 982, 783, 983, 142, 144, 199 - Field 163: Field 163 is mandatory if one of the following fields is filled : 791, 991, 793, 993, 797, 795, 995, 158, 162, 200 - Field 175: Field 175 is mandatory if one of the following fields is filled: 396, 162 ``` 164 and 165 are also added according to this assertion: https://github.com/odoo/enterprise/blob/c93388741182f1873054557a6e7767186674fafa/l10n_lu_reports/models/l10n_lu_annual_tax_report.py#L167-L171 ### Note: This PR is related to the 18.0 PR: https://github.com/odoo/enterprise/pull/104785 It also fix issues in `_add_yearly_fields()` because the validation consider form as float instead of dict ### Steps to reproduce: - Install `l10n_lu_reports` and switch to LU company - Open the Tax Report `Annual VAT Declaration` - Export the XML - Notice that codes 396, 394 149, and 153 are present, but 129, 137, 145, 163 and 175 are missing opw-5119920 Forward-Port-Of: odoo/enterprise#106457 Forward-Port-Of: odoo/enterprise#105143
This update removes tax reports from the invoicing app to align with its intended purpose of providing basic invoicing features. Previously, the invoicing app was displaying tax reports, which are designed for accounting functionality. This change ensures users access the correct tools for invoicing while maintaining a streamlined experience.
Original PR description
Invoicing app is intended to provide basic invoicing features. Having the tax report shown allow the users to access return features that are intended for Accounting. Therefore, tax reports should be hidden in Invoicing and visible when accounting installed. task-5489532
This update resolves an issue where the softphone call list wasn't displaying correctly when a call session was missing. The fix ensures the ActionList is always rendered in CallInvitation and InCallView, providing a complete and functional call interface. This improves user experience and prevents missing call creation buttons.
Original PR description
We fix two problems: - With https://github.com/odoo/enterprise/pull/100630, a call session might be presented even it the associated call object is missing. In that case the session call is null. - With https://github.com/odoo/enterprise/pull/104426, when a call session is displayed and the call object is missing (i.e. the session call is null), the ActionList is not renderered and the button Create is missing. Here we improve the ActionList props validation and make it renderered in CallInvitation and InCallView even when the session call is null.
This update adjusts how product category names are handled within Odoo. Previously, complete category names were stored, but this has been removed. This change ensures data consistency and improves performance, particularly in reporting.
Original PR description
Adapt to product.category complete_name not being stored anymore Odoo PR: https://github.com/odoo/odoo/pull/236067 Upgrade PR: https://github.com/odoo/upgrade/pull/9279 task-4804824
This update resolves an issue where file uploads were incorrectly formatted as Base64 encoded data. Previously, this caused problems with importing files into the system. This change ensures files are handled correctly, improving the reliability of data import processes.
Original PR description
Like other Binary fields. https://github.com/odoo/odoo/pull/247189
This update fixes a bug in the automatic tour engine that prevented it from correctly identifying elements behind overlays like popovers and notifications. The change ensures the tour engine accurately avoids interacting with elements behind modals, improving the user experience and preventing potential issues with tour functionality.
Original PR description
Before this commit, the automatic tour engine checked whether the DOM contained a `.modal` and whether the trigger element was inside it, in order to avoid interacting with elements behind a modal. However, when the DOM also contained a popover or a notification, this check was skipped. With this commit, this logic has been improved to also take other overlay items into account. This improvement involves some fixes and adaptations in a few tours.
This update resolves an issue where subscriptions with zero-quantity lines resulted in invoices being incorrectly set to the subscription's start date. The fix ensures that invoice dates are accurately calculated, even when subscriptions include both positive and negative quantities, preventing incorrect billing.
Original PR description
### Issue: When creating a subscription with several lines whose quantities add up to zero, the next invoice date is not updated and set to the start date. ### Steps to reproduce: - Install…
### Issue: When creating a subscription with several lines whose quantities add up to zero, the next invoice date is not updated and set to the start date. ### Steps to reproduce: - Install 'sale_subscription' - Create a new Subscription with two lines and a tart data several months in the past - One with a quantity of 1 and a higher price - The other with a quantity of -1 - It can be the same service product with invoicing based on ordered quantity - Confirm the Subscription - Click "Create Invoice" and confirm the invoice - Back to the Subscription, the next invoice date was not updated. ### Cause: In `_get_max_invoiced_date()` to compute the invoiced periods we check the quantity corresponding to this period. But if an invoice has two lines with opposite quantities, they will cancel each other out at this line: https://github.com/odoo/enterprise/blob/c2ac44f492ec53083864f07ff5bfbff9458ddf2a/sale_subscription/models/account_move_line.py#L131 So the method will return not return the date in `invoice_dates`. Later, if `_get_max_invoiced_date()` returns nothing for `last_invoice_end_date` then `next_invoice_date` is set to `start_date`: https://github.com/odoo/enterprise/blob/c2ac44f492ec53083864f07ff5bfbff9458ddf2a/sale_subscription/models/account_move.py#L66-L67 ### Solution: The goal was to not include invoices that were fully refunded for the `last_invoice_end_date`. This is why `_get_max_invoiced_date()` substract the quantities from refunds. To make this work we can take the absolute value of the quantity returned by the compute method before giving it the wanted sign based on if it's an invoice or a refund. opw-5360930 Forward-Port-Of: odoo/enterprise#106364 Forward-Port-Of: odoo/enterprise#103705
This update resolves an issue where the printer selection wizard could generate errors when trying to use outdated printer records. The system now filters out printers that no longer match existing devices, ensuring a smoother and more reliable user experience. This prevents potential disruptions to business processes.
Original PR description
Printers saved by the selection wizard in local storage can correspond to records that no longer exist in the database (removed in the meantime). To avoid a traceback when creating the wizard with non- existing printers, we filter out the ones that don't correspond to any device. Forward-Port-Of: odoo/enterprise#106268
This update ensures that freight costs are now accurately included in the customs documents generated for international shipments. Previously, these costs were incorrectly set to zero, leading to potential inaccuracies in customs declarations. This change aligns with Sendcloud's API specifications and improves the accuracy of international delivery data.
Original PR description
Issue ----- For international deliveries, the customs document does not include the freight costs. Steps to reproduce ----- - Create an international sale (eg BE -> US) - Validate delivery - Open the commercial invoice > Freight costs is set to 0 Change ----- The `freight_costs` should be included in the `customs_information` field of the request (along with all customs-related data, as other fields have been deprecated) https://api.sendcloud.dev/docs/sendcloud-public-api/branches/v2/parcels/operations/create-a-parcel#:~:text=object%2E-,customs%5Finformation ----- Ticket: opw-5486742 Forward-Port-Of: odoo/enterprise#106387 Forward-Port-Of: odoo/enterprise#105543
This update resolves an error that occurred when employees were linked to multiple commission plans using the same payslip input. The fix ensures accurate currency conversion for commissions, preventing a system error and guaranteeing correct payslip generation for employees with multiple commission plans. This improves payroll accuracy and reliability.
Original PR description
Currently, an error occurs while generating a payslip for an employee who is linked to more than one commission plan using the same payslip input. **Steps to Reproduce:** 1. Install the…
Currently, an error occurs while generating a payslip for an employee who is linked to more than one commission plan using the same payslip input. **Steps to Reproduce:** 1. Install the hr_payroll_sale_commission module. 2. Create a user and link to an employee. Set a contract for the employee. 3. Create two commission plans for the same user: - Use the same Payslip Input in both plans. - Set the Target Frequency to "Monthly" for both. 4. Generate a payslip for the employee. Ref: [Video](https://drive.google.com/file/d/1HhtUL2xznS_Aoi9ePL0OJLdGaXU8ZFZR/view?usp=sharing) **Error:** `ValueError - Expected singleton: sale.commission.report(30026010100009, 40026010100009)` **Cause:** When multiple commission records belong to the same payslip input, it tries to convert the commission amount using `coms.commission`, where coms has multiple recordsets. This leads to a singleton error during currency conversion. **Fix:** This commit ensures the currency conversion is applied per commission and prevents the singleton error. sentry-7187854690 Forward-Port-Of: odoo/enterprise#106124 Forward-Port-Of: odoo/enterprise#104464
This update fixes an issue where WhatsApp messages to blacklisted numbers weren't being blocked correctly when the recipient's country differed from the sender's company country. The fix ensures that all blacklisted numbers, regardless of the recipient's location, are properly identified and blocked, improving communication security and compliance.
Original PR description
Sending a WhatsApp message to a blacklisted number fails to be blocked if the recipient's phone number country differs from the sender company's country. ### Steps to reproduce 1. Configure a…
Sending a WhatsApp message to a blacklisted number fails to be blocked if the recipient's phone number country differs from the sender company's country.
### Steps to reproduce
1. Configure a WhatsApp account.
2. Set the Company's country to Germany (+49).
3. Create a Contact with a Belgian phone number (e.g. +32456001122).
4. Send a template message to this contact.
5. Have the contact reply with "STOP" to opt-out (this correctly adds +32456001122 to the blacklist).
6. Send another message to the contact.
- Expected: The message is blocked.
- Actual: The message is sent successfully.
### Root cause
The blacklist search logic relies on implicit phone number sanitization which behaves incorrectly for international numbers without a `+` prefix.
1. `whatsapp.message` stores numbers as `CountryCode + NationalNumber` without a `+` (e.g. "32456001122").
2. `phone.blacklist` stores numbers in E.164 format with a `+` (e.g. "+32456001122").
3. When searching `phone.blacklist` with "32456001122", the system interprets it as a local number for the Company's country (Germany) because of the missing `+`.
4. It reformats the search term to German E.164 ("+4932456001122").
5. The query fails to match the actual blacklisted number ("+32456001122"), allowing the message to pass.
### Fix
Explicitly prepend a `+` to the recipient's number before searching the blacklist. This forces the validation logic to parse the number as international (E.164), bypassing the company-country bias and ensuring the search term matches the stored blacklisted number.
opw-5401789
Forward-Port-Of: odoo/enterprise#106395
Forward-Port-Of: odoo/enterprise#104556This update fixes an issue where move quantities weren't correctly updated after exiting a barcode MRP operation. Specifically, when adjusting component quantities, the system incorrectly displayed remaining quantities. The fix ensures accurate tracking of product movements during and after barcode-based manufacturing processes.
Original PR description
**Issue** When leaving the barcode MRP operation, `post_barcode_process()` may incorrectly update the move quantities. **Steps to reproduce** - Create a product with a BOM using a component with qty…
**Issue** When leaving the barcode MRP operation, `post_barcode_process()` may incorrectly update the move quantities. **Steps to reproduce** - Create a product with a BOM using a component with qty 6. - Create an MO producing qty 1. - Open the Barcode app > Manufacturing > open the MO (remove “MO Ready” filter if needed). - Click “+1”. - Edit the component qty from 6 to 3. - Exit the operation. - Re-enter the operation. -> The component shows 3/3 instead of 3/3 and 0/3. **Cause** On exit, `_onExit`: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/static/src/models/barcode_picking_model.js#L1489 calls `post_barcode_process()`, which triggers `split_uncompleted_moves`: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/models/stock_move.py#L16 correctly creating a `stock.move.line` with qty 3. However, `_truncate_overreserved_moves`: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/models/stock_move.py#L40 then reduces the move quantity to `max_reserved_qty = 3` and unreserves the remaining 3 units: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/models/stock_move.py#L49 This happens because the newly created move line is initialized with `reserved_uom_qty = 0`: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/static/src/models/barcode_picking_model.js#L1256 leading to `max_reserved_qty = quantity_done = 3 < move.quantity = 6`, while `move.product_uom_qty` is still 6. opw-5166763 Forward-Port-Of: odoo/enterprise#104199 Forward-Port-Of: odoo/enterprise#100314
This update resolves a CFDI validation error that occurred when generating payroll reports with no deductions configured. The fix ensures that the system correctly handles payroll structures without deductions, aligning with Mexican tax regulations. This prevents validation failures and ensures accurate CFDI reports.
Original PR description
…eductions Currently, if users modify the MX Payroll structure in order to have no deductions in the final payroll, CFDI validation for the payroll entry will fail. Steps to reproduce: - Set up…
…eductions
Currently, if users modify the MX Payroll structure in order to have no deductions in the final payroll, CFDI validation for the payroll entry will fail.
Steps to reproduce:
- Set up Payroll Structure "Mexico: Regular Pay" with Salary Rules:
- Used subsidy:
- Code: SUBSIDY
- Category: Allowance
- CFDI Concept: (O02) Employment Subsidy (Effectively Delivered to the Worker)
- Deduction:
- Code: DEDUCTION
- Category: Deduction
- CFDI Concept: (D04) Others
- Net Salary:
- Code: NET
- Category: Net
- CFDI Concept: (P01) Salaries, Wages, Stripes, and Day Labor
- Formula: `result = payslip.paid_amount`
- In Payroll > Payslips, Click 'New Off-Cycle'
- Select employee, compute sheet, create draft journal entry and post it
- Back to the payslip, mark as paid and generate CFDI
Issue:
CFDI Validation will fail with error
`Code : 301 Message : Error en complemento Nómina. [Error #NOM38] El atributo Nomina.TotalDeducciones, no debe existir. Folio: 0002. Serie: SLR/2025/12.`
It occurs because, according to the official specs [1] attribute `TotalDeducciones` should not be reported in case there are no deductions
[1] http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/GuiallenadoNomina311221.pdf
opw-5348789
Forward-Port-Of: odoo/enterprise#104311Code cleanup and technical improvements
This update replaces outdated HTML elements (`<a>` tags) with more appropriate `<button>` elements within the Odoo Notebook. This improves the user experience by ensuring interactive elements are correctly handled and aligns with standard web development practices. It's a minor refactoring that enhances usability.
Original PR description
This commit properly uses `<button>` element for interactive DOM elements instead of relying on a "hacky" and non-semantic `<a href="#">` (tl;dr: `<a>` HTML tag are for navigation, `<button>` are for interactivity). task-4380519
This update streamlines the integration of IoT devices into the MRP module. By consolidating related modules and maintaining a separate quality control module, the setup process is simplified and the option to install the separate quality app is preserved.
Original PR description
IoT integration into mrp was divided in four modules: `quality_iot`, `quality_control_iot`, `mrp_workorder_iot` and `quality_mrp_workorder_iot`. In order to simplify the integration, we merged `mrp_workorder_iot` and `quality_mrp_workorder_iot` into one single `mrp_iot` module, and kept `quality_control_iot` as a separate module. We also kept `quality_iot` as it's a base for `mrp_iot` and `quality_control_iot` to link IoT Devices `quality.check` and `quality.point` models. Note: the reason for not merging everything into `mrp_iot` is to allow NOT having to install the quality app (tech name: `quality_control`). see odoo/upgrade#8711 Task: 5215787