Monday, February 16, 2026
18 changes · saas-19.1
New functionality added to Odoo
This update adds pre-built email snippets to the mass_mailing builder, making it faster and easier for users to create professional emails. Alongside this, UX improvements and bug fixes enhance the builder's usability and performance. These changes streamline the email creation process and improve the overall user experience.
Original PR description
## [IMP] mass_mailing: add new snippets This commit adds several ready-to-use snippets to the mail editor in `mass_mailing` to reduce the time and effort required to build emails. These snippets…
## [IMP] mass_mailing: add new snippets This commit adds several ready-to-use snippets to the mail editor in `mass_mailing` to reduce the time and effort required to build emails. These snippets provide immediate, usable building blocks and help users understand the editor's capabilities without needing to explore or fine-tune block options first. To further improve discoverability and relevance, the snippet categories are slightly reorganized and some existing snippets are revamped to better reflect common email use cases. Finally, this commit adds a new snippet tile in the main editor panel, allowing users to quickly drag and drop an icon into their email. ## [IMP] *: UX Fixes and improvements to mass_mailing builder This commit fixes some UX issues and improves upon the already in place options and snippets. These fixes allow for a better usage of the builder and user-friendlier options for some of the snippets. We reintroduced the PowerButtonsPlugin inside the mass_mailing builder which needed adjustments for the position computations and the calls to the position updates. The position computations didn't take into account that the editable can be inside an iframe. This means that the reference position between an editable in the proper document and an iframe's document could be different as the local overlay doesn't sit at the same position. In the case of the iframe, the local overlay sits right beside the iframe which means that we need to not take into account the buttons position when computing the style attribute. A compensation for the iframeElement's DOMRect was thus added to it when in this case. We also added the editable as permanent part of the scrollable elements inside the `PositionPlugin`. This enables the fullscreen mode to handle scrolling to update the position of the buttons. This commit also removes some usages of the d-flex class as the `display: flex` css property isn't well supported inside email client. Thus, we are starting the cleaning process so that the convert_inline can have an easier job converting the email to a client-friendly format. Task-5380615 Co-authored-by: Thomas Josse (THJO) <thjo@odoo.com> Co-authored-by: Julien Banken (JBN) <jbn@odoo.com> Forward-Port-Of: odoo/odoo#243331
Enhancements to existing features
This update enhances the handling of Romanian tax invoices from the ANAF. Now, the system automatically downloads and attaches the official PDF version of the invoice, providing accountants with a visual document for comparison and compliance. This eliminates the previous reliance solely on XML data.
Original PR description
### Before For bills from the Romanian ANAF we only downloaded an XML and imported the data. There is no visual aid for the accountant to see and compare the received document. ### Now We use the ANAF service to get the official "PDF" version of the invoice. This is requested for any new bill we get through ANAF that doesn't already contain a pdf from the vendor and it is set as the main attachment. task-5877171 Forward-Port-Of: odoo/odoo#248373 Forward-Port-Of: odoo/odoo#247382
Resolved issues and error corrections
This update ensures that pickings are automatically created when validating POS orders linked to sale orders. Previously, stock levels weren't updated correctly if pickings were scheduled for the end of a POS session. This fix provides more accurate stock management for point-of-sale transactions.
Original PR description
Before this commit, when validating a POS order linked to a sale order, if the Inventory Management was configured to create pickings at the end of the session, no picking was created for the order, and the sale order stock was not updated. This commit fixes this issue by ensuring that the picking is created for the imported sale orders in real time. opw-5423113 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248424 Forward-Port-Of: odoo/odoo#244739
This update enhances the payroll dashboard for Swiss users by tailoring warnings to specific Swiss requirements. It now displays warnings related to missing or incorrect data within Swiss employee and company records, ensuring accurate payroll processing. This improves data integrity and compliance for our Swiss customers.
Original PR description
This PR improves the payroll dashboard for Switzerland by: 1- Disabling the generic warnings as they are currently irrelevant to Switzerland. 2- Add new warnings for the missing/invalidity of some needed fields in swiss employees and companies. Task: 5856084 Forward-Port-Of: odoo/enterprise#105148
This update corrects a flaw in the forecasting system that previously didn't account for materials used in production. Now, daily demand calculations accurately reflect the consumption of components within manufacturing orders, leading to more reliable inventory predictions. This ensures better production planning and reduces potential stockouts.
Original PR description
The daily demand in forecasting does not take into consideration the product that are used for production. Steps to reproduce: ------------------- * Install stock and mrp * Create a tracked Product…
The daily demand in forecasting does not take into consideration the product that are used for production. Steps to reproduce: ------------------- * Install stock and mrp * Create a tracked Product "Component" with RR * Add some "on hand quantity" * Create Product "Product" with a BOM that use "Component" * Create a manufacturing order for "Product" and confirm it * Go back on the RR of "Component" and use "resplenishment information" button (small i) -> Daily demand does not reflect the "Component" used for manufacturing. Observation: ------------- When Opening the resplenishment information, the daily_demand is calculated: https://github.com/odoo/odoo/blob/c38346ccc3e44670b76bfb010795bdfa7004b532/addons/stock/wizard/stock_replenishment_info.py#L177 For that calculation quantity_out is used, obtained just before: https://github.com/odoo/odoo/blob/c38346ccc3e44670b76bfb010795bdfa7004b532/addons/stock/wizard/stock_replenishment_info.py#L164-L167 Since it only consider moves that goes directly to the client, it will not take into consideration products that are used for production. opw-5497584 Forward-Port-Of: odoo/odoo#246125
This update fixes an issue where the HTML editor toolbar remained visible on mobile devices when the side menu or a popover was open. Now, the toolbar disappears automatically when these elements are active, providing a cleaner and more user-friendly mobile experience. This enhancement ensures a better workflow for users editing content on their phones.
Original PR description
In mobile, when the side menu or a popover is opened, the toolbar remains displayed above the keyboard. This commit hides the mobile toolbar while such elements are opened. Steps to reproduce: - In mobile, go to a "To do" note - Put cursor inside text to display the toolbar - Open the hamburger menu => The toolbar remained displayed on top of the side menu - Open the gear menu => The toolbar remained displayed while the menu was opened task-5222582 Forward-Port-Of: odoo/odoo#247389 Forward-Port-Of: odoo/odoo#241611
This update resolves an issue where users could incorrectly modify attendance records. The change now prevents unauthorized updates to attendance data, ensuring data integrity and accuracy. Added test coverage to confirm the fix.
Original PR description
Closes [odoo/odoo#226007](https://github.com/odoo/odoo/issues/226007). Description of the issue/feature this PR addresses: Prevents a user from updating their attendance record by changing the employee to the one whose attendance is not managed by the current user. Current behavior before PR: - Assign the Officer Group of Attendance group to a user. - Assign the user as the attendance manager of itself. - Login with that user. - Create an attendance record for the employee and save it. - Try to change the employee and save; an error will be thrown as expected. - Go to the Attendance menu; the record will still be saved. Desired behavior after PR is merged: This commit ensures that un-allowed write does not take place + test coverage added. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243719 Forward-Port-Of: odoo/odoo#226335
This pull request fixes a problem where invoice descriptions were not consistently displayed when printing invoices, particularly with factur-x e-invoices. The update ensures that both the custom description and product names are correctly printed, improving invoice accuracy and compliance. This resolves issues reported by users importing factur-x invoices.
Original PR description
**Issue 1** Steps to reproduce: - Create a new invoice - Add an invoice line, with just a description - Save - On the same line, add any product - Print Issue: Only the custom description will be visible on the line opw-5471809 --- **Issue 2** Steps to reproduce: - Import factur-x e-invoice - Print pdf Issue: Only product name will be printed, even if the invoice record include the complete description opw-5471809 Forward-Port-Of: odoo/odoo#248010
This update resolves a memory issue that occurred when Odoo processed large amounts of email data. The fix optimizes how recordsets are handled, preventing excessive memory allocation and ensuring stable performance, particularly when dealing with many records. This improves the overall reliability of Odoo's email functionality.
Original PR description
**Issue Description :** In _mail_group_by_operation_for_mail_message_operation [function](https://github.com/odoo/odoo/blob/a1f4c98ec025cb36b218072f5557c93d5f329929/addons/mail/models/models.py#L77).…
**Issue Description :**
In _mail_group_by_operation_for_mail_message_operation [function](https://github.com/odoo/odoo/blob/a1f4c98ec025cb36b218072f5557c93d5f329929/addons/mail/models/models.py#L77).
The memory error occurred due to recordset concatenation triggered by: [operation_documents[record_operation] += record](https://github.com/odoo/odoo/blob/a1f4c98ec025cb36b218072f5557c93d5f329929/addons/mail/models/models.py#L83)
This resulted in repeated recordset concatenations inside a loop. Since recordsets are immutable, each concatenation [creates a new recordset](https://github.com/odoo/odoo/blob/a1f4c98ec025cb36b218072f5557c93d5f329929/odoo/orm/models.py#L5874) and reallocates the underlying tuple of IDs. When processing a large number of records this caused memory growth.
**Solution:**
Replace iterative recordset concatenation.
- Collect record IDs using Python sets (O(1) insertion).
- Build recordsets once per operation after the loop.
- Apply with_prefetch() only once per operation.
**Traceback:**
```
File "/home/odoo/src/odoo/saas-19.1/addons/mail/models/mail_message.py",
line 397, in _search
allowed_ids.update(self._find_allowed_doc_ids(model_ids))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.1/addons/mail/models/mail_message.py",
line 428, in _find_allowed_doc_ids
operation_res_ids =
records_all._mail_group_by_operation_for_mail_message_operation('read')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.1/addons/mail/models/models.py", line 83,
in _mail_group_by_operation_for_mail_message_operation
operation_documents[record_operation] += record
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/models.py", line 5851, in
__add__
return self.concat(other)
^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/models.py", line 5864, in concat
ids.extend(arg._ids)
MemoryError
```
opw-[5915534]
upg-[3878714]
tgb - 2445
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prA recent update prevented the accidental removal of content within HTML editor sections. Previously, pressing 'Delete' after selecting all content could unexpectedly clear the entire section, even when it was designed to be non-editable. This fix ensures that only intended content is removed, improving stability and user experience.
Original PR description
**Steps to reproduce:** - Drop a dynamic snippet, for example Recent Blogs → “Latest Stories”. - Click on the section title. - Press Ctrl + A. - Press Delete. **Description of the issue:** - The content part is removed even though it is inside a contenteditable false container. doing discard after it crash the page. **Cause:** - In `removeNode`, there is no check to prevent removal of children of a contenteditable false element. - As a result, if a contenteditable false element itself is unremovable, the parent node is preserved, but its children are still removed. **Solution:** - In `removeNode`, add a check to return false if node is not `isNodeEditable`. task-5858259 Forward-Port-Of: odoo/odoo#245463
This update significantly speeds up the inventory valuation report by optimizing how it calculates inventory values. Previously, the system was performing redundant calculations, leading to slow performance. This change eliminates unnecessary steps and batching processes, resulting in a faster and more efficient report generation.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247625
This update resolves an issue where changes made to website translations weren't consistently saved. Now, when editing a translation in one language and switching to another, all delayed translation versions are properly saved, ensuring accurate display across languages. This improves the user experience and data consistency for multilingual websites.
Original PR description
Scenario: - have two languages on website - drop a snippet on a page in main language - go to secondary language => you see the previous page version, and a notification with `Click on…
Scenario: - have two languages on website - drop a snippet on a page in main language - go to secondary language => you see the previous page version, and a notification with `Click on "Edit/Translate" to apply changes made on default language.` is shown - click on Edit: Translate => you see the version with the change from main language applied - save without doing a change Result: nothing is saved Expectation: delayed translations that we are seeing when editing translation should be saved. Cause: Delayed translation (draft version from change of main language) on website were added or disabled with: - 2d08f97c0778469b409fca23f2be5f5a98ce3df8 (October 2023) in 17.0 added the delay translation feature - 0e0a74f8c5fc9f45311e629a76608c6c986d635d (December 2023) in 17.0 disabled the feature - 03a85b13b2c46ef7174123d902e95d5103031c6c (September 2025) in 19.0 enabled the feature again Currently delayed translations are only updated if there is a part of that translation that has been edited and is dirty. Fix: when we save translations, we should also save o_delay_translation that are not dirty. These translations if there is a delayed translation will publish the delayed translation. opw-5187670 opw-5240423 opw-5250497 opw-5254832 opw-5344412 opw-5347408 opw-5419427 opw-5424761 opw-5892371 Forward-Port-Of: odoo/odoo#238696
This update resolves an issue where users with limited inventory access experienced an error when validating recurring product deliveries. The fix ensures the system correctly retrieves necessary invoice information, preventing access restrictions that were blocking the validation process. This improves the reliability of recurring subscription deliveries.
Original PR description
When a user that only has inventory access right validate a delivery that has an recurring product it will trigger an access right error. Steps to reproduce: ------------------- * Install sales,…
When a user that only has inventory access right validate a delivery that has an recurring product it will trigger an access right error. Steps to reproduce: ------------------- * Install sales, inventory, subscription, * Create a subscription product * Create and validate a sale order with this product and a recurring plan * Connect to Odoo with an user that only has inventory user right * Validate the delivery -> Access Error Observation: ------------- When we validate the delivery,we call button_validate that will call [_action_done](https://github.com/odoo/odoo/blob/93fa6d9fff63534cfa9251e21fc82797d8b83468/addons/stock/models/stock_picking.py#L1427) During this we try retrieve invoices information [here](https://github.com/odoo/enterprise/commit/b07b1c47c97bb6d6da9fa61dacb5cba66aff2a16#diff-dbf7b40a6942fbcc81ebc4c3009a8a37a5a620cffac74889bd0ff2bccd52b1e3R30-R36). The issue is that this user doesn't have access right to several records: * sol.order_id.invoice_ids -> sale.order.invoice_ids * sol.order_id.last_invoice_date -> sale.subscription.plan opw-5869446 Forward-Port-Of: odoo/enterprise#106623
This update resolves an issue where users were encountering an error when editing reconciled invoice lines within the bank statement reconciliation process. The fix initializes necessary variables to prevent a runtime error, ensuring users can successfully adjust reconciled amounts and maintain accurate bank statement records.
Original PR description
Currently, an error occurs when user edits a reconciled line. **Steps to Reproduce([Video](https://drive.google.com/file/d/18dSAsZCl---wfCkMBfyo9LviTqgq3qpK/view)):** - Install the `Accounting`…
Currently, an error occurs when user edits a reconciled line. **Steps to Reproduce([Video](https://drive.google.com/file/d/18dSAsZCl---wfCkMBfyo9LviTqgq3qpK/view)):** - Install the `Accounting` module. - Create an `invoice` with an `invoice line` having an amount greater than zero. - `Confirm` the invoice. - Go to the `Bank journal` and create a `statement line` with the same amount as the invoice. - Click `Reconcile` on that `statement line` and select the newly `created invoice line`. - Click the `pencil icon` to edit the line, enter a `positive amount` in the Balance field, and save. `UnboundLocalError: local variable 'original_base_lines' referenced before assignment` The error occurs because, when a specific condition [1] becomes true, the variables original_base_lines and original_tax_lines are expected to be defined. However, if reconciled_lines_ids is present in move_line_to_edit, these variables are never initialized and are later referenced, causing the UnboundLocalError [2]. This commit ensures that original_base_lines and original_tax_lines are initialized to None, which prevents the error. [1]- https://github.com/odoo/enterprise/blob/fa4bbc20f25ec12c609ebbf37885e48900619de5/account_accountant/models/account_bank_statement.py#L1393-L1394 [2]- https://github.com/odoo/enterprise/blob/fa4bbc20f25ec12c609ebbf37885e48900619de5/account_accountant/models/account_bank_statement.py#L1410-L1411 sentry-7189027839 Forward-Port-Of: odoo/enterprise#104432
This update corrects a bug that prevented invoices with product lines having a price of zero in the Mexican (mx) tax module from being saved. The fix ensures that required tax object fields are correctly populated, resolving a critical issue for users creating invoices with zero-priced items. This improves invoice creation functionality for mx clients.
Original PR description
**PROBLEM** If you create an invoice, and add a line with a product with a price of 0, you cannot save the invoice. **STEP TO REPRODUCE** 1. On a mx company, create an invoice for a mx client. 2. Add a line with a product with a price of 0. 3. Try saving the invoice, it will fails. **CAUSE** Field `l10n_mx_edi_tax_object` is required on invoice line with mx company. However, for lines with a price of 0, it is not set by `_compute_l10n_mx_edi_tax_object` because `_l10n_mx_edi_cfdi_invoice_line_ids()` filters them. opw-5402045 Forward-Port-Of: odoo/enterprise#103981
This update resolves a bug that prevented the infinite scrolling of VoIP call history in Chrome. The fix addresses an issue with how the system detects the end of the scrolling area, ensuring all recent calls are displayed correctly. This improvement ensures a seamless user experience for accessing call history.
Original PR description
Since [1], the voip calls infinite scrolling does not work anymore. Steps to reproduce: - Make sure to have at least 14 recent calls - Open the softphone - Go to the recent/history tab - Scroll to…
Since [1], the voip calls infinite scrolling does not work anymore. Steps to reproduce: - Make sure to have at least 14 recent calls - Open the softphone - Go to the recent/history tab - Scroll to the end => You are stuck seeing only the 13 last calls. This was a Chrome-only issue, it works on Firefox. Weirdly, the infinite scrolling works on the contact tab on Chrome too, although this is the exact same implementation and configuration. This is due to the unreliable behavior of IntersectionObserver regarding 0x0 elements. The infinite scrolling implementation in VoIP relies on the visibility of a "dummy" `<span/>` added at the end of the tab. That element has no width or height, making the implementation unreliable. As a stable minimal fix, this restores the feature by making the element have a width and height, without any visual/behavior changes thanks to negative margins and no pointer events on the item. Note that [1] disabled a test that was testing the feature. This commit of course re-enables it. [1]: https://github.com/odoo/enterprise/commit/52b3065993c41c6b7c65dda586a66fdd865b3afd Forward-Port-Of: odoo/enterprise#106658
This update fixes a previous error where work accident entries were incorrectly being paid on employee payslips. The change adds the necessary entry type to the payroll data, ensuring accurate calculations and proper compensation for work accidents. This resolves a potential financial discrepancy.
Original PR description
The unpaid work accident work entry type was added, but not included in `unpaid_work_entry_type_ids`, causing it to be paid by mistake. Add it to `unpaid_work_entry_type_ids` for the following structures: - structure_type_employee_cp200 - structure_type_employee_cp200_pfi Task: 5484866
This update resolves several issues impacting the accuracy of Single Touch Payroll reporting in Australia, specifically related to opening balances and year-to-date calculations. The changes include rounding monetary amounts to the correct currency precision and correcting date discrepancies, ensuring compliance and reliable financial data.
Original PR description
- Unable to import opening balances when zeroed out. This should not require Previous Payroll and BMS IDs - Float creates an overflow while computing the YTD sums, which results in too many digits in decimal places. Round all monetary amounts reported to the rounding precision of the currency. - Issues with run date and submit dates for the prior fiscal year. - Fix payslips computation on update actions post finalisation Task - 5685790 Forward-Port-Of: odoo/enterprise#105952