Wednesday, March 25, 2026
27 changes · saas-19.2
Enhancements to existing features
This update adapts the French accounting import process to changes in how data is delivered from the system. Instead of downloading entire files, data is now streamed, improving efficiency and reducing download times. This ensures accurate and timely reporting for French-speaking customers.
Original PR description
This commit aims to adapt the usage of 'account.fr.fec' to the changes made in community. In particular `fec_data` field is not used any more. and we use `_get_fec_stream` to stream the content of the file. task-5404142 Forward-Port-Of: odoo/enterprise#111153 Forward-Port-Of: odoo/enterprise#102783
Resolved issues and error corrections
This update replaces an older method for accessing configuration settings within the currency rate module. Using the recommended `get_str` method ensures consistent and reliable retrieval of settings, improving the stability and performance of the system. This change is a routine maintenance update.
Original PR description
https://github.com/odoo/odoo/pull/223180 removes the `get_param` method from `res.config_parameter`, which was used in the `currency_rate_live` module. This commit replaces it with the `get_str` method, which is the recommended way to retrieve configuration parameters in Odoo. No task ID Forward-Port-Of: odoo/enterprise#110975
Features or functions removed from Odoo
This update removes the automatic assignment of a VoIP provider to new users. Previously, users were linked to the first available provider, which created issues for systems with multiple providers. This change ensures a more appropriate 'no provider' default, simplifying setup for businesses with diverse VoIP options.
Original PR description
Following this Pull Request, users will not be linked to any VoIP provider by default. Prior to this Pull Request, users were linked to the first `voip.provider` record found. The rationale behind this behavior has been forgotten, but it was likely implemented to spare admins with a single provider from having to assign one. However, for databases with more than one provider, "nothing" is usually the relevant default. See also: [task-6023412](https://www.odoo.com/odoo/project.task/6023412) Forward-Port-Of: odoo/enterprise#111758
This update resolves a bug that prevented users accessing documents linked to their employees when using a secondary Odoo domain. The fix ensures that users are correctly directed to the appropriate domain based on their login location, improving document access for all users.
Original PR description
Steps to reproduce:
- Have two domains for your database (".odoo.com" and ".example.com")
- set the ".example.com" domain as your web base url
- login on the ".odoo.com" domain, go on an employee and click the documents smart button
-> you cannot see any documents because you are redirected on the ".example.com" domain on which you are not connected
opw-5857914
Forward-Port-Of: odoo/enterprise#110390
Forward-Port-Of: odoo/enterprise#107384This update ensures that future appraisals automatically disappear when an employee leaves the company. It also removes the employee from appraisal roles and archives their personal goals, streamlining the process and preventing outdated data from appearing.
Original PR description
Currently, when an employee leaves the company, their future appraisals remain active and can still be completed. This fix ensures that, upon employee departure: - all future appraisals are removed - the employee is removed from appraisals where they are an appraiser - all their personal goals are archived - only active (non-archived) appraisals are counted in the employee’s smart button task: 6036427
This update resolves a technical error that prevented users from successfully checking out timesheets within the Enterprise version of Odoo. The issue stemmed from an outdated reference to a renamed function, and this fix ensures a smooth and reliable check-out process. This improves usability for sales teams.
Original PR description
Steps to reproduce: - In the home menu of a database, click on the ActivityMenu at top of page (red dot) - Click check in - Click ActivityMenu (green dot) again and click check out Current behavior: - Traceback saying this.displayAllowBillable is not a function Expected behavior: - No error Note: displayAllowBillable was renamed to displayIsBillable in this commit https://github.com/odoo/enterprise/pull/110708 opw-6061392
This update corrects a rounding error in the US payslip PDF that was causing incorrect overtime rates for very short work durations (like seconds). The fix now calculates the rate directly from the work entry, ensuring accurate overtime pay is displayed. This improves the reliability of payroll reports.
Original PR description
The Rate column on the US payslip PDF is computed as amount / hours, but amount is a Monetary field rounded to 2 decimals. For small hour values (e.g. seconds from the attendance app), the rounding error causes us to compute the wrong rate. For example, working 6 seconds of overtime at an hourly rate of $26 with a 1.5x overtime multiplier results in this calculation: $26/hour * 1.5 * 0.00166667 hour = $0.065 ≈ $0.06 We then attempted to calculate the rate in reverse for the PDF: $0.06 / 0.00166667 hour = $35.9999 ≈ $36.00 Because of the rounding that happened, it doesn't show the expected $39/hour rate ($26 * 1.5). We now compute the rate directly from hourly_wage * multiplier on the work entry type instead. This is a manual forward-port of the work in Odoo 18 [1], to instead use the new amount_rate field on hr.work.entry.type instead. task-6052711 [1] https://github.com/odoo/enterprise/pull/111540 Forward-Port-Of: odoo/enterprise#111733
A recent update to Odoo Enterprise prevented new approval rules created through the Studio interface from being properly saved, leading to their deletion from the database. This issue arose during the upgrade from version 18.0 to 19.0 and has now been corrected. The fix ensures that newly created approval rules are correctly managed.
Original PR description
Server and automated actions created by the ORM for the purpose of revoking approval rights are created without `noupdate=True` which leads to said records being removed by the ORM becuase of not being found in the source. Such records created on the fly should have `noupdate=True` to prevent that from happening. This bug can be reproduced by going to Settings > Technical > User Interface > Studio Approval Rules and creating a new record from there and updating `web_studio`. The update will drop the record from the database. Issue originally detected in the upgrade process from 18.0 to 19.0. This fix will be complemented by an upgrade script that fixes erronous records. Forward-Port-Of: odoo/enterprise#110065
This update ensures that document creation times are displayed accurately for users, regardless of their location. Previously, times were inconsistent due to a failure to convert dates from UTC to the user's local timezone. Now, all times are correctly formatted, providing a more reliable and user-friendly experience.
Original PR description
Step to reproduce: 1. Install `documents` 2. Upload a document and open the tree view 3. Compare the field `Created On` and the time from the `Manage Versions` action Issue: - The displayed time is inconsistent between the tree view and the dialog Cause: - The datetime used in Manage Versions is formatted without converting it from UTC to the user’s timezone Solution: - Use timezone-aware datetime helpers so values are converted from UTC to the user’s timezone. Before: <img width="1328" height="81" alt="image" src="https://github.com/user-attachments/assets/2a02f03c-714d-417d-a805-fd0dd7c52753" /> <img width="636" height="297" alt="image" src="https://github.com/user-attachments/assets/c4514469-2f51-493f-8991-32371fb7f338" /> After: <img width="641" height="312" alt="image" src="https://github.com/user-attachments/assets/3979ece8-635a-4b54-9b53-d8b28b3336ec" /> opw-5467782 Forward-Port-Of: odoo/enterprise#104443
This update resolves an issue where reports were failing due to missing account IDs in migrated databases. The fix adds a backup system to automatically use account codes when XMLIDs are unavailable, ensuring reports run smoothly without warnings. This improves the reliability of financial reporting.
Original PR description
Description of the issue this commit addresses: On some migrated BE databases, account template refs a4121/a4521 are missing as XMLIDs. l10n_be_reports then fails to recover partner/reconcile account refs and logs warnings during post-init load. --- Desired behavior after this commit is merged: This commit adds a fallback in BE report chart template data to resolve a4121/a4521 by account code when XMLIDs are missing, preventing recovery warnings while keeping normal XMLID behavior unchanged. --- runbot-[233845](https://runbot.odoo.com/odoo/runbot.build.error/233845) Forward-Port-Of: odoo/enterprise#111325
This update fixes a potential issue where a user could indirectly change an employee's work email through salary configuration. Now, the work_email field is protected and won't be reset if the employee is linked to a user, ensuring data integrity and preventing unintended email updates.
Original PR description
Due to https://github.com/odoo/enterprise/pull/106974,the employee's work_email may be reset to False when creating or updating an offer. This behavior is acceptable if the employee does not have a linked user. However, if the employee is linked to a user, resetting work_email can allow a user to indirectly modify their own work_email through salary confi. To prevent this, we now ensure that work_email never changes if employee has a user linked to it. Steps to reproduce: - Hire an applicant from Recruitment (the employee has no work_email). - Set a random work_email and create a user for the employee. - Open the hired applicant and create a new offer to update the contract. - work_email should not be modified, even after new contract. task: 6033382 Forward-Port-Of: odoo/enterprise#111815 Forward-Port-Of: odoo/enterprise#110810
This update enables companies to create equity transactions in currencies other than the default USD. Previously, the system was locked to USD, limiting flexibility. Now, the equity currency can be set on the first transaction, ensuring accurate tracking regardless of the company's base currency.
Original PR description
### Issue: When a company is set in USD, it was not possible to create equity transactions in another currency (e.g., EUR) ### Cause: The equity_currency_id is initialized with the company currency at partner creation (or module installation) However, there was no way to override this value when creating transactions ### Fix: It is now possible to set the equity currency on the first transaction Subsequent transactions reuse this currency and the field becomes read-only ### Steps to reproduce: - Install `equity` with demo data (currency and equity_currency default to USD) - Enable the EUR currency - Create an equity transaction for a company - You can now choose EUR on this transaction - Create another transaction for the same company, the selector is hidden and the currency remains EUR opw-5382255 Forward-Port-Of: odoo/enterprise#108248
This update resolves an issue where only administrators could delete work entry types within the payroll module. Now, users with SUPERUSER permissions can delete these types, improving flexibility and reducing reliance on administrator intervention. This change ensures smoother management of payroll configurations.
Original PR description
Forward-Port-Of: odoo/enterprise#111967
This update corrects a minor issue where the system incorrectly interpreted empty strings as disabling Two-Factor Authentication (2FA). The change ensures that an empty secret field is now treated as the default, allowing 2FA to function correctly when it's not explicitly enabled. This improves the reliability of 2FA setup and usage.
Original PR description
Empty strings in secret mean that totp is not enabled. Remove support for the totp_secret = 'false'. If we don't have a secret, it should be empty (null or ''). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255536
This update fixes an issue where users couldn't properly filter records based on date and time fields within the CRM. The update ensures the system correctly recognizes and filters these fields, allowing for more accurate data searches and reporting. This enhancement improves the usability of the CRM for filtering customer data.
Original PR description
Steps: - Install crm - Add a propertie field date type - try to filter with this field - Invalid domain Currently tree_editor does not take into account if a path is a property field or not, with this commit there is a new `is_property` attribut in node opw-5906605 Forward-Port-Of: odoo/odoo#255605 Forward-Port-Of: odoo/odoo#250350
This update resolves a technical issue that caused an error when users accessed the project dashboard. Specifically, the system was incorrectly attempting to access data without checking if it existed, leading to a 'KeyError'. This fix ensures the dashboard functions correctly for all users, regardless of their group membership.
Original PR description
### Description of the issue/feature this PR addresses: If you create a custom group and not using project user group, if you click on "Dashboard" in the project, KeyError profitability_items appears. It appears because it accesses to panel_data without checking if panel_data is not empty. ### Current behavior before PR: Appear KeyError profitability_items ### Desired behavior after PR is merged: No error --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252687
This update resolves a gap in documentation for the Direct Deposit module within the l10n_us_account add-on. Previously, the module's integration lacked a link to the relevant direct deposit documentation. Now, a link has been added to res_config_settings_views.xml, ensuring users have easy access to the necessary information.
Original PR description
When the Direct Deposit module was merged, there was no documentation created yet. Now that it has been merged we will add the link to the right documentation. task-none Forward-Port-Of: odoo/odoo#255655
This update enhances the product viewing experience by adding a zoom feature to product images within the Product, Expenses, and Point of Sale modules. This allows users to more easily examine product details, leading to a better customer experience and potentially increased sales.
Original PR description
This PR enables the zoom feature for product images across the **Product**, **Expenses**, and **Point of Sale** modules. Currently, some product views display images without the zoom capability. This makes it difficult for users to inspect smaller details of a product. Enabling the `zoom` option on the `image_1920` widget provides a more consistent UI. ### **Changes** Added zoom to the following modules: **hr_expense** (product variant), **point_of_sale** (product view), and **product** (template and variant views). **Task ID: 6003499** Forward-Port-Of: odoo/odoo#255568
This update fixes a potential issue where groups could be incorrectly linked to inherited views, causing errors during upgrades. The change adds a validation rule to prevent this, ensuring groups are defined directly within view XML definitions for stability and to avoid confusing user configurations.
Original PR description
**Steps to Reproduce:** - Create a new database. - Install any module (for example, Payroll). - Go to Settings → Technical → Security → Groups. - Open any group and assign an inherited view in the…
**Steps to Reproduce:** - Create a new database. - Install any module (for example, Payroll). - Go to Settings → Technical → Security → Groups. - Open any group and assign an inherited view in the Views section. - Upgrade the module. **Issue:** - Odoo already prevents assigning groups directly on inherited view records in ir.ui.view. However, it is still possible to indirectly assign groups to inherited views through res.groups via the view_access relation. - This creates entries in ir_ui_view_group_rel and can trigger a ValidationError during module upgrades. As a result, users may unknowingly create invalid group-view relations, leading to errors and confusion. **Solution:** - Add a validation constraint on res.groups to prevent linking groups to inherited views via the view_access relation. - Raise a ValidationError when such an assignment is attempted, with the message: "Groups should instead be defined using the 'groups' attribute inside the view XML definition." This ensures that inherited views cannot be assigned to groups, avoiding invalid configurations and preventing errors during module upgrades. **opw-6015526** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255411 Forward-Port-Of: odoo/odoo#254849
This update corrects a problem where the QR code on printed POS receipts was sometimes pointing to the wrong order invoice. The fix ensures that unique QR codes are generated for each order, preventing incorrect data from being printed. This improves the accuracy of receipts and reduces potential errors.
Original PR description
**Step to reproduce:** - install "l10n_es_edi_verifactu_pos" - setup "ePOS printer" for a pos - open pos and settle a order below 400$ - notice we get l10n_es_edi_verifactu_qr_code in our receipt -…
**Step to reproduce:** - install "l10n_es_edi_verifactu_pos" - setup "ePOS printer" for a pos - open pos and settle a order below 400$ - notice we get l10n_es_edi_verifactu_qr_code in our receipt - click on "Print receipt" - repeat above steps for one more order **Observation:** - when we print the second order receipt, the QR still points to 1 order invoice **Issue:** - [getCacheKey](https://github.com/odoo/odoo/blob/0cee3350df09b06af77c879f0eba74bf6a8dd2c9/addons/point_of_sale/static/src/app/utils/html-to-image.js#L351C10-L355 ) was trimming query strings when generating cache keys. URLs like: ` http://localhost:9000/report/barcode/?barcode_type=QR&value=... ` were reduced to: ` http://localhost:9000/report/barcode/` - As a result, different QR code requests shared the same cache key. Subsequent requests reused the previously cached image instead of fetching a new one, producing incorrect QR codes for different orders. **Solution:** Add an `includeQueryParams` flag to `resourceToDataURL` so the full URL, including query parameters, is used as the cache key when needed. This ensures unique QR code URLs are cached and fetched correctly. opw-5455807 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251139
This update fixes a visual issue where long property names in the worksheet property selector were overlapping, creating a confusing user experience. The fix applies CSS to ensure labels are displayed correctly, resulting in a cleaner and more intuitive interface for configuring rules.
Original PR description
Before this commit: --------------------------------- Long property names in the worksheet properties dropdown (ModelFieldSelector) were overflowing and overlapping with the chatter, causing a poor…
Before this commit: --------------------------------- Long property names in the worksheet properties dropdown (ModelFieldSelector) were overflowing and overlapping with the chatter, causing a poor user experience and making it difficult to select and configure rules. Steps to reproduce: ------------------------- 1. Install the quality_control_worksheet module. 2. Create a new Control Point. 3. Set the Type to Worksheet and select a Worksheet Template. 4. Open the selected Worksheet Template and add a property with a very long name. 5. Return to the Control Point, create a rule, select Worksheet Properties, and choose the property with the long name. 6. Observe that long labels overflow and overlap with the chatter, making selection difficult. After this commit: -------------------------------- This fix applies CSS to properly handle long text, preventing layout issues and improving readability and usability, resulting in a smoother and more user-friendly experience. Before: <img width="1916" height="789" alt="image" src="https://github.com/user-attachments/assets/ec585c21-bcce-4fed-a847-db42511f5f69" /> After: <img width="1329" height="819" alt="image" src="https://github.com/user-attachments/assets/bb39e4bf-93b7-4885-80b2-ef75da8398f6" /> Enterprise PR: [110899](https://github.com/odoo/enterprise/pull/110899) Task Id: 5955976
A test failure related to order quantity synchronization in the Restaurant POS module was resolved. The fix ensures the test waits for backend synchronization to complete before updating order quantities, preventing incorrect data updates. This improves the reliability of the test and the overall POS functionality.
Original PR description
During the tour test `test_sync_lines_qty_update_ticket_screen`, the order line quantity was sometimes incorrect after navigating to the TicketScreen. When opening the TicketScreen and loading an order, the order is synchronized with the backend. A race condition could occur where the order was loaded with a certain quantity, triggering `sync_from_ui`, which takes some time to complete. During this delay, the test updated the order line quantity, but the sync response returned with the old quantity and overwrote the new value. To fix this, the tour now waits for `sync_from_ui` to complete after each `Chrome.clickOrders()` and `TicketScreen.loadSelectedOrder()`. Runbot error: 241916 --- Runbot Error: https://runbot.odoo.com/odoo/runbot.build.error/241916
This update resolves a bug that caused Odoo to crash when users added products to a list field while in edit mode. Specifically, the system was receiving incorrect data when adding products, leading to an error. This fix ensures a more stable and reliable experience when managing product lists.
Original PR description
When a record is in edit mode in an x2many list and the user presses a key while clicking "Add a product", onCellKeydownEditMode is called with record=null while editedRecord is set, causing a TypeError on record.dirty. Steps to reproduce: 1. Create a Sales Order 2. Click "Add a product" 3. While pressing the right arrow key, click "Add a product" again opw-6032870 Forward-Port-Of: odoo/odoo#255324 Forward-Port-Of: odoo/odoo#254881
This update ensures that email templates, like those used for invoices, correctly pass the specified 'Reply-To' address when sending emails. Previously, the system was overriding this setting, leading to misdirected replies. This change guarantees emails are sent with the intended recipient information.
Original PR description
Steps to reproduce: 1. Go to an Email Template (e.g., 'Invoice: Send by email') and set a specific 'Reply-To' address. 2. Open a posted Invoice and click the 'Send & Print' button. 3. Ensure the…
Steps to reproduce: 1. Go to an Email Template (e.g., 'Invoice: Send by email') and set a specific 'Reply-To' address. 2. Open a posted Invoice and click the 'Send & Print' button. 3. Ensure the 'Email' method is selected and click 'Send'. 4. Observe the sent email in the chatter or the mail queue. Observation: The 'Reply-To' header is overwritten by the system's catchall or author email, ignoring the template setting. Cause: The 'account.move.send' logic processes email data via the '_get_mail_params' method. This method manually constructs a dictionary of parameters to be passed to 'message_post'. However, it only explicitly includes a fixed set of fields (author_id, body, subject, partner_ids, and attachments), effectively filtering out the 'reply_to' value. When 'message_post' is called without this key, Odoo's mail thread logic defaults to the standard '_notify_get_reply_to' calculation, causing the custom template configuration to be lost. Solution: Update the '_get_mail_params' method to safely extract the 'reply_to' value from the move data and include it in the parameters dictionary passed to the mail engine. opw-5922963 Forward-Port-Of: odoo/odoo#255489 Forward-Port-Of: odoo/odoo#249116
This update resolves an issue where cash rounding was incorrectly applied during the consolidation of Point of Sale orders into invoices. Previously, when only non-cash payment methods were used, the system generated incorrect accounting entries. This fix ensures that cash rounding only occurs when a cash payment is involved, preventing errors and maintaining accurate financial records.
Original PR description
When consolidating POS orders into a single invoice, the cash rounding adjustment logic was triggered whenever cash rounding was enabled on the POS configuration, even if the payment methods were not cash.
In scenarios where only non-cash payment methods (card or customer account) were used, 'invoice.invoice_cash_rounding_id' could legitimately be unset as 'only_round_cash_method' is enabled. However, the rounding adjustment code still attempted to create a rounding line using accounts from this field.
This resulted in a NULL `account_id` on a rounding line ("Missing required account on accountable line")
This fix ensures that the rounding adjustment logic only executes when there is cash payment (meaning that 'invoice_cash_rounding_id' exsists).
Related to opw-5969706
Forward-Port-Of: odoo/odoo#251862This update addresses a performance issue during Odoo tests by proactively generating bundled files before test execution. Previously, these bundles were created on the fly, slowing down the testing process. This change ensures faster and more reliable test runs, contributing to overall system stability.
Original PR description
tl;dr: look for lazy loaded bundles and add them to the bundles' list to pregenerate before running tests to avoid generation on the fly. Forward-Port-Of: odoo/odoo#248256
This update corrects a visual issue where the grid layout on the website was missing a left border when viewed on smaller screens. The problem stemmed from a minor typo in a CSS selector. This ensures a consistent and professional appearance for all users, regardless of screen size.
Original PR description
On smaller viewports the sidebar is hidden and the grid misses a left border. It's because of a selector typo. task-6059942 <img width="845" height="925" alt="image" src="https://github.com/user-attachments/assets/9ebb8a04-c3ce-40fd-acfa-8a17fbc31e3a" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255318