Thursday, January 8, 2026
52 changes · saas-19.1
Enhancements to existing features
This update simplifies the invoicing process by removing the unnecessary confirmation popup that appeared when updating taxes and accounts after changing a customer's information. This change streamlines the workflow for users, making it faster and easier to manage invoices. It's a minor improvement focused on usability.
Original PR description
This commit removes the confirmation popup when pressing "update taxes and accounts" in invoices after changing the partner. task-5324619 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236277
Resolved issues and error corrections
This update corrects an issue where the item name sent to the SInvoice system was incomplete, missing descriptions or failing to include product details. The fix ensures that all line item information, including descriptions and default units, are accurately transmitted, improving data consistency with the SInvoice system. This resolves a potential data discrepancy impacting invoice processing.
Original PR description
Currently, the item name in the data sent to the SInvoice system is comprised only of the product name on the line. This brings a few issues that should be corrected: - Any description set on the line on top of the product won't be sent - If there is no product, the required item name will be set to False - If there is no product, the required unit name will be set to False too To fix these issues, we will: - Use the line name directly and not the product name and; - Default to 'Units' for the unit name in all cases where it wouldn't be set. task-5438691 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241503
This update resolves an issue where the pivot table export feature would fail when no data was provided. The system now correctly responds with an error message (422) indicating invalid data, preventing the export process from crashing. This ensures a smoother user experience when generating pivot reports.
Original PR description
Currently an exception is generated when controlled `/web/pivot/export_xlsx' tries to export xlsx with empty data. `KeyError: 'title'` This PR resolves the issue by raising an `UnprocessableEntity` exception when empty data is provided. The resulting 422 response indicates that the server understood the request and its syntax, but cannot process it because the data is invalid. sentry-6321555617 Forward-Port-Of: odoo/odoo#242511 Forward-Port-Of: odoo/odoo#241415
This update resolves an issue where users without administrator permissions encountered errors when opening duplicated reports within the Studio feature. The fix prevents a critical error by ensuring the system handles permission restrictions gracefully, improving the user experience for all users.
Original PR description
When a user opens a duplicated report in Studio after their administrator rights are removed, a traceback is raised. Steps to reproduce the error: - Install ``account`` and ``web_studio`` - Login as…
When a user opens a duplicated report in Studio after their administrator rights are removed, a traceback is raised. Steps to reproduce the error: - Install ``account`` and ``web_studio`` - Login as Mitchell Admin > grant Administrator and Invoicing Administrator rights to Mark Demo - Login as Mark Demo in incognito tab > Open invoices > Open studio > Reports > duplicate any report - Login as Mitchell Admin, remove administrator right of Marc Demo - In Mark Demo, Open the duplicated report Traceback: ```py UnboundLocalError: cannot access local variable 'studio_view' where it is not associated with a value ``` https://github.com/odoo/enterprise/blob/58dc97cb5a7185dc2acd801bb3af0e6c35add0b6/web_studio/controllers/report.py#L379 The bug occurs because ``_get_and_write_studio_view()`` method performs a search on ``ir.ui.view`` before returning ``studio_view``. For users without the required permissions, this ``search()`` raises an AccessError. https://github.com/odoo/enterprise/blob/58dc97cb5a7185dc2acd801bb3af0e6c35add0b6/web_studio/controllers/report.py#L393-L400 Since this exception is raised before the assignment completes, the local variable ``studio_view`` is never bound. However, the finally block of ``deactivate_studio_view`` is always executed and attempts to access ``studio_view.active``, resulting in an ``UnboundLocalError``. sentry-7149350379 Forward-Port-Of: odoo/enterprise#103017
This update resolves a bug that prevented users from assigning statements to multiple bank lines within the Bank Reconciliation widget. The fix ensures the system handles multiple selections correctly, preventing a technical error that occurred during data assignment. This improves the usability of the Bank Reconciliation feature.
Original PR description
An error occurs when a user tries to assign a Statement to multiple selected lines in the Bank Statement list view. Steps to reproduce: 1) Install Accounting with demo data. 2) Open the Bank…
An error occurs when a user tries to assign a Statement to multiple selected lines in the Bank Statement list view. Steps to reproduce: 1) Install Accounting with demo data. 2) Open the Bank Reconciliation widget. 3) Switch to the List view. 4) Select multiple statement lines. 5) Click on the 'Statement' field to assign a statement to the selected lines. Error: `TypeError: Cannot read properties of undefined (reading 'root')` Root Cause: The `BankRecMany2OneMultiID` component attempts to access `active_ids` through `this.env.model.root` (see [1]). During re-rendering, the value of `this.env.model` becomes undefined, which leads to the error. Fix: Add a check for the existence of `this.env.model` in the getter to avoid accessing `root` on an undefined model. [1]- https://github.com/odoo/enterprise/blob/c194bee0e48db407288e3c402e71840af299568d/account_accountant/static/src/components/bank_reconciliation/list_view/list_view_many2one_multi_edit.js#L14 opw-5403564 Forward-Port-Of: odoo/enterprise#103338 Forward-Port-Of: odoo/enterprise#101792
This update resolves a visual bug where long date ranges in Field Service tasks caused the kanban card layout to break. The fix ensures the date range widget stays within the card boundaries, maintaining a consistent and usable display. This improves the overall user experience when scheduling tasks with extended timelines.
Original PR description
Steps to reproduce: ---------------------------- 1. Install Field Service module 2. Open any task from Field service module 3. In the Planned date field set a wide range spanning years, for example:…
Steps to reproduce: ---------------------------- 1. Install Field Service module 2. Open any task from Field service module 3. In the Planned date field set a wide range spanning years, for example: Dec 16, 2024, 1:30 PM → Oct 13, 2026, 6:00 PM. 4. Go back to kanban view 5. Adjust display to around 360 px Observation: ---------------------------- The planned date daterange widget overflows and extends outside the kanban card, breaking the card layout and visual containment. Issue: ---------------------------- The daterange widget's parent container did not enforce a width, so the widget could grow beyond the kanban card boundary when a long date range was used. Solution: ---------------------------- Add the w-100 class to the daterange container div to enforce full-width layout within the kanban card. Before: <img width="584" height="529" alt="before_css" src="https://github.com/user-attachments/assets/e89302b0-975c-47eb-91ec-89dbfe813493" /> After: <img width="561" height="528" alt="after_css" src="https://github.com/user-attachments/assets/48b60a78-18da-4504-98ef-a9c4013b107b" /> opw-5219941 Forward-Port-Of: odoo/enterprise#102093
This update corrects a technical issue where duplicate template keys were generated for report views, potentially causing conflicts and incorrect customizations. By ensuring unique keys across all report templates, this fix prevents data inconsistencies and ensures accurate report generation.
Original PR description
Before this commit: ------------------------- The sequence used in the template key was computed based only on the last active template. If the next sequence number corresponded to an inactive…
Before this commit: ------------------------- The sequence used in the template key was computed based only on the last active template. If the next sequence number corresponded to an inactive template, the system could end up generating duplicate template keys — one for the inactive template and one for the newly created active template. After this commit: ----------------------- The sequence for the template key is now computed based on the last template, regardless of whether it is active or inactive. This ensures that template keys remain unique across all report templates. Why this commit: ----------------------- if a template is inactive, the report engine should raise an error. However, because duplicate template keys were being generated, the inactive template could silently fall back to the active template with the same key, preventing the expected exception and bringing customization of one report to another. Additionally, if the inactive template is later corrected and reactivated, both reports would still reference the same template (the one with the smaller ID) because they shared identical template keys. This fix prevents such conflicts by ensuring unique template key generation. Forward-Port-Of: odoo/enterprise#101894
This update resolves a validation error that occurred when creating new leave requests in the l10n_fr_hr_holidays module. The issue stemmed from incorrect default settings in the company's time off configuration, specifically a missing reference to a standard leave type. The fix ensures this field is correctly populated, preventing the validation error and allowing users to create leave requests without issue.
Original PR description
**Steps to reproduce:** - Install l10n_fr_hr_holidays module. - Go to Time Off > Configuration > Settings. - Company Paid Time Off field should blank. - Employee `resource_calendar_id` is not same as company's. - Create new leave > a validation error will occur. **Cause:** - The demo data for 'res.company' did not correctly set the `l10n_fr_reference_leave_type` field. - 'l10n_fr_reference_leave_type' field should be required. **Fix:** - Updated demo record to correctly assign `l10n_fr_reference_leave_type` field. - Set the `l10n_fr_reference_leave_type` field as required. Task - 5139488 Forward-Port-Of: odoo/odoo#242390 Forward-Port-Of: odoo/odoo#231385
This update resolves a technical issue preventing the correct installation of the Mauritius localization module for Odoo. The fix adds a necessary configuration setting to the module's manifest file, ensuring seamless integration and functionality after installation. This resolves a reported error preventing users from properly setting up the Mauritius fiscal localization.
Original PR description
Steps to reproduce: 1. Install 'accountant' 2. Create a new company without a country and switch to that company 3. Accounting > Configuration > Fiscal Localization 4. Select Mauritius and save Issue: It gives a traceback: KeyError: 'mu' Cause: 'auto_install' is not present in the manifest file. Solution: Add 'auto_install': ['account'] in the manifest as it is done in other localization modules. opw-5231064 Forward-Port-Of: odoo/odoo#240170 Forward-Port-Of: odoo/odoo#236207
This update fixes a cluttered appraisal form view issue that occurred when a large number of appraisal templates were used. The team removed a complex widget and switched to a simpler, searchable dropdown, resulting in a cleaner and more user-friendly experience for managing appraisals.
Original PR description
Steps to reproduce: - Install the hr_appraisal module. - Open the form view of an appraisal when more than 100 appraisal templates exist. Issue: When the appraisal form view is opened with a large number of templates, the view becomes cluttered because all templates are displayed at once. Fix: This PR removes the widget and reverts to a standard related field with a searchable dropdown, improving readability and usability. task-5438146 Forward-Port-Of: odoo/enterprise#102866
This update fixes an error that occurred when deleting the 'Default 48 hours/week' working schedule and running the payroll update cron job. The issue stemmed from a mismatch between the deleted schedule's reference and the payroll data, preventing accurate updates. This ensures payroll data is consistently updated correctly.
Original PR description
When the ``Default 48 hours/week`` working schedule is deleted and the ``Payroll: Update data`` cron runs, a traceback is raised. Steps to reproduce the error: - Install ``l10n_mx_hr_payroll`` module…
When the ``Default 48 hours/week`` working schedule is deleted and
the ``Payroll: Update data`` cron runs, a traceback is raised.
Steps to reproduce the error:
- Install ``l10n_mx_hr_payroll`` module with demo data
- Switch to ``INNOVACION VALOR Y DESARROLLO SA SA`` company
- Go to Employees > Configuration > Settings > Change Company Working Hours
- Go to Working Schedules > Delete ``Default 48 hours/week`` working schedule
- Run the ``Payroll: Update data`` cron
Traceback:
```py
ValueError: External ID not found in the system: l10n_mx_hr_payroll.resource_calendar_def_48h
ParseError: while parsing /home/odoo/src/enterprise/l10n_mx_hr_payroll/data/hr_payroll_structure_type_data.xml:3, somewhere inside <record id="l10n_mx_employee" model="hr.payroll.structure.type">
<field name="name">Mexico: Employee</field>
<field name="default_resource_calendar_id" ref="l10n_mx_hr_payroll.resource_calendar_def_48h"/>
<field name="country_id" ref="base.mx"/>
</record>
```
The ``Payroll: Update data`` cron updates payroll data that references the ``Default 48 hours/week`` working schedule.
If the user has deleted this working schedule, the external ID no longer exists, leading to the above traceback.
sentry-7166574553
Forward-Port-Of: odoo/enterprise#103323This update fixes a potential confusion in the sales details report by ensuring payment orders are consistently displayed. The report now sorts by payment method and session, making it easier for users to understand sales transactions and improve reporting accuracy. This change enhances the overall usability of the sales reporting feature.
Original PR description
Before this commit, payment order was not guaranteed and could confuse users reviewing sales details report, especially as the cash register lines are ordered before. This commit orders the results by payment method and session to make the output more readable. opw-5240864 Forward-Port-Of: odoo/odoo#242387 Forward-Port-Of: odoo/odoo#237040
This update resolves an issue where images weren't appearing in email marketing campaigns. The fix ensures images are fully loaded before their dimensions are determined, preventing them from being rendered as invisible. This improves the visual quality of emails sent through the Email Marketing module.
Original PR description
Problem: When sending an email marketing, some images are not visible in the received email. Cause: After 354b8f60dbabcfac690d90bf657592e1347e4f86, we clone the `editable`, append it to…
Problem: When sending an email marketing, some images are not visible in the received email. Cause: After 354b8f60dbabcfac690d90bf657592e1347e4f86, we clone the `editable`, append it to `processingContainer`, and call `toInline` on it. During `toInline`, images with the `.card-img-top` class are queried and their size is fixed using `getComputedStyle`. Because the editable is freshly cloned, images may not be loaded yet. Calling `getComputedStyle` on an unloaded image returns a height of `0`, which results in images being rendered as invisible. Solution: After cloning the editable, wait for all images inside it to finish loading before running `toInline`. This ensures `getComputedStyle` returns the correct dimensions. Steps to reproduce: - Open Email Marketing. - Add a Columns snippet with images. - Send the email. - Observe that the received email is missing some images. opw-5215534 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240530
This update resolves an issue where grouped Kanban cards were displaying incorrectly due to a change in the Kanban template design. The team removed a specific CSS class that was causing the misalignment, ensuring all Kanban cards are displayed at the correct height. This improves the visual consistency of the knowledge articles.
Original PR description
Since commit https://github.com/odoo/enterprise/pull/70460 and the reworking of the Kanban templates, the h-100 class was no longer correct. This PR fixes the issue by removing this class. task-5439265 Forward-Port-Of: odoo/enterprise#102801
This update resolves a technical glitch that prevented users from consistently selecting product variants during the subscription add-to-cart process. The fix utilizes a 'click' action instead of a 'check' action, ensuring all variant options are reliably available, improving the user experience.
Original PR description
In this commit we fix undeterministic error in tour sale_subscription_add_to_cart. We can see on https://runbot.odoo.com/odoo/error/234505 that variant white can not be always selected. For that we prefer use click action instead of check action. Forward-Port-Of: odoo/enterprise#103458
This update resolves an issue where email invitations in Discuss channels were incorrectly displayed with a 'removed' message. The fix ensures the message type is set to 'user_notification', preventing the misleading display and improving the user experience. This change ensures invitations are correctly presented within the Discuss channel.
Original PR description
Steps to reproduce: * Open a public Discuss channel. * Invite an external user by email. * Refresh the page. An email-related message is fetched and displayed as `this message has been removed`. This happens because the message is created with `message_type = 'email_outgoing'`, even though it is conceptually a user notification and not meant to be rendered as an email in Discuss channels. This commit fixes the issue by setting the correct `message_type` (`user_notification`) instead of `email_outgoing`, ensuring the message is not displayed in Discuss, avoiding a misleading removed message. Task-5438936 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241112
This update fixes an issue where gray color selections in the website builder's color picker weren't updating correctly. Now, changes to gray hues and saturation are accurately reflected in the color picker, ensuring consistent branding and design across the website. This improves the visual consistency of customer-facing websites.
Original PR description
Steps to reproduce: - Open Website Builder. - Go to Theme > Advanced. - Change the grays hue or saturation. - Open a color picker and check the gray swatches. Before this commit, gray swatches kept using the default palette after changing the grays hue or saturation. After this commit, gray swatches reflect the customized grays. Forward-Port-Of: odoo/odoo#242562
This update resolves a potential crash in the mass mailing module that could occur when the ThemeSelectorIframe component was removed before its resources were fully loaded. The fix ensures the code can still access the iframe element, preventing unexpected errors and improving stability. This enhances the reliability of mass email campaigns.
Original PR description
Prior to this commit, if the `ThemeSelectorIframe` component was destroyed in the time it took to get its bundle and load its CSSSheets, there could be a crash because the iframe would not be in the dom anymore and it would not be possible to use the `iframeRef.el`.
This update fixes an issue where string values entered in the web_studio field editor were incorrectly formatted with extra quotes and slashes. Now, string values are correctly displayed and saved, ensuring accurate configuration of fields within the studio interface.
Original PR description
Have a field widget with an option of type "string" (supportedOption meta field of the widget) In studio, change the value for that option. Before this commit, the value appeared in the input as escaped: there were supplementary quotes and slashes After this commit, the string value is correctly displayed. Forward-Port-Of: odoo/enterprise#103476 Forward-Port-Of: odoo/enterprise#103364
This update resolves an issue where duplicating an invoice from a sales order would incorrectly link both the original and duplicate invoices with the same source document. The fix prevents the automatic copying of the source document during the duplication process, ensuring each invoice has its own unique link to the original sales order.
Original PR description
### Issue: When opening an invoice from a Sale Order and duplicating it, the Source Document (invoice_origin) was also copied As a result, both the original and duplicated invoice showed the same…
### Issue: When opening an invoice from a Sale Order and duplicating it, the Source Document (invoice_origin) was also copied As a result, both the original and duplicated invoice showed the same Sale Order in the Source Document field ### Cause: The `action_view_invoice` method adds `default_invoice_origin` in the context, causing the `copy` function to set `invoice_origin` The field invoice_origin was already set with copy=False in this PR: https://github.com/odoo/odoo/pull/236656 The default context was introduced in PR: https://github.com/odoo/odoo/pull/34561 ### Steps to reproduce: - Create a sales order (SO) - Create and confirm an invoice from the SO - Click on the `Invoices` smart button to access the invoice (SO is visible at the top) - Duplicate and confirm the invoice (The SO is not linked) - Go to the invoices list view and make the `Source Document` visible - Observe that both invoices show the same SO as their `Source Document` opw-5360172 Forward-Port-Of: odoo/odoo#239676
This update fixes an issue where the wrong manager was sometimes assigned to approval requests. The change ensures that the correct manager, based on the request details, is always selected, preventing potential errors and ensuring approvals are processed accurately. This improves the reliability of the approval workflow.
Original PR description
The previous code added the manager by searching for the first employee that matches the request_owner_id. If there are multiple such employees, it's possible that an employee from a different company than the approval can be selected. Ticket: [5185449](https://www.odoo.com/odoo/project.task/5185449) Forward-Port-Of: odoo/enterprise#99978
This update resolves an issue where recruitment officers couldn't correctly update applicant stages, leading to errors when sending email notifications. The fix uses a temporary workaround to bypass access restrictions, ensuring that all applicant stage changes are processed without interruption.
Original PR description
Problem: Recruitment officers don't have the rights to create `appointment.type` nor `appointment.interview`, Hence when they move an applicant to the qualified stage an error is raised during the rendering the body of the qweb mail template. Fix: Override the controller to use sudo and pybass the access check. Task-5262936 Forward-Port-Of: odoo/enterprise#100648
This update fixes a potential issue where multiple employee versions could be archived or reassigned simultaneously, causing problems with reporting. The change ensures that updates only affect the current version of an employee, improving data accuracy and stability. This resolves a technical problem related to generating necessary reports.
Original PR description
Currently, it is possible to archive or reassign all versions of an employee if there exists more than 1. This leads to issues with generating the necessary SQL views for the `hr.employee.public` model. To rectify this issue, we check whether the versions of each employee is a subset of the records being written to. opw-5289226 Forward-Port-Of: odoo/odoo#241142 Forward-Port-Of: odoo/odoo#238358
This update resolves an issue where copying and pasting content from the knowledge editor resulted in a loss of plain text formatting. The fix restores the ability to correctly copy and paste text into other applications, ensuring users can accurately transfer information. This improves the usability of the knowledge management feature.
Original PR description
Since [1] when `vnd.odoo.odoo-editor` was added to the `HtmlViewer` clipboard, the `text/plain` mimetype was lost. This commit restores the plain text version of the clipboard. Steps to reproduce: - In knowledge, lock a page - Select some content - Copy - Paste into a plain text editor => No content was pasted [1]: https://github.com/odoo/odoo/commit/62a7c50b434e3f47ad58e20e96970cbd90b979b6 task-5449435 Forward-Port-Of: odoo/odoo#241676 Forward-Port-Of: odoo/odoo#241642
This update corrects a visual issue where a duplicate dropdown menu appeared in social stream post management. The fix ensures consistency by correctly integrating the existing dropdown from the ‘social_crm’ module, improving the user experience. Additionally, the ‘is_author’ field has been re-introduced to manage button visibility for post editing and deletion.
Original PR description
Following https://github.com/odoo/enterprise/commit/c9ddf1c a new dropdown has been added to "social" to allow the edition and deletion of a social stream post. This new dropdown didn't take into account the one already existing in "social_crm" resulting in a duplicated dropdown menu. Fixing the issue by making sure the dropdown from "social_crm" is correctly extending the one from "social". As the "Create Lead" action is set above the "Edit" and "Delete" ones, making sure it's also the case for the stream post comments dropdown menu for consistency. Re-inserting the "is_author" field (removed here https://github.com/odoo/enterprise/pull/69650) in the kanban view to make sure the "Edit", "Delete" and "Create Lead" buttons visibility are correctly managed for your own posts. Task-5270180 Forward-Port-Of: odoo/enterprise#103409 Forward-Port-Of: odoo/enterprise#101679
This update resolves an issue where users without attendance access rights would encounter an error when attempting to use the 'Monthly Hours' smart button. The fix restricts access to sensitive data and ensures that only authorized personnel can view attendance records, improving data security and user experience.
Original PR description
Steps to reproduce: - Log in as a user without attendance access rights - Open the current user's employee record (public view) - Click the "Monthly Hours" smart button Issue: - Public users cannot access the `attendance_manager_id` field, which was used to group records by employee in the Gantt view. Fix: - Add a permission check before accessing `attendance_manager_id` - Restrict non-attendance officers to viewing only their own attendance task-5440612 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A technical bug was causing a traceback when using the AI button within the applicant refusal process. This update resolves the issue by modifying the widget's behavior to correctly identify applicant data, ensuring the AI refusal functionality works as intended. This improves the user experience for recruiters.
Original PR description
Step to reproduce: - Install hr_recruitment. - Open any applicant in any job position. - Click the Refuse button to open the refusal wizard. - Enable the send email toggle key. - Click on AI button Issue: traceback occurs Reason: - required field for using this widget is not defined. - so it tries to slice the res_ids field which is still not defined Solution: - In stable versions, we cannot add the missing required fields because this would cause upgrade issues. - Instead, we extend the widget and override its behavior to use active_model and active_id. task-5058510 Forward-Port-Of: odoo/enterprise#103384 Forward-Port-Of: odoo/enterprise#99498
This update ensures Odoo's internal crawler, 'Odoobot,' follows website guidelines (robots.txt) when fetching data. By respecting these rules, we prevent the crawler from accessing restricted areas and improve the reliability of our data collection process. This enhances our data integrity and avoids potential issues with website owners.
Original PR description
### Purpose Add `robots.txt` compliance to the `_fetch_url` helper. Before fetching any URL, we now check the site's `robots.txt` and ensure that our user agent (`Odoobot/1.0`) is allowed to access the requested path. ### Changes - Added `robots.txt` validation using `urllib.robotparser` - Respect disallow rules for the `Odoobot/1.0` user agent ### Why This ensures that our crawler behaves politely, avoids fetching disallowed resources, and provides more transparent failure reporting. --- **Task-ID:** 4779962 Forward-Port-Of: odoo/enterprise#96369
This update fixes a technical issue where docstrings weren't correctly parsing return values, leading to incomplete documentation. The changes improve the accuracy of documentation across multiple Odoo modules, ensuring developers and users have clearer information about how to use the system. This enhances the overall quality and usability of Odoo.
Original PR description
Improve the docstring linter and fix yet another batch of docstrings. Forward-Port-Of: odoo/odoo#232673
This update corrects inconsistencies in the documentation for several Odoo modules. The changes ensure that all public documentation aligns with recent updates, improving clarity and maintainability. This enhances the overall user experience and supports future development efforts.
Original PR description
Forward-Port-Of: odoo/enterprise#101655
This update resolves a visual issue where a horizontal cursor appeared between cards in the website layout. This was caused by a plugin that incorrectly enabled cursor editing. The fix disables the plugin and prevents editing of image figures, ensuring a cleaner and more professional card layout experience.
Original PR description
Since [1] when the selection placeholder plugin was introduced, a horizontal cursor is displayed between cards in website, while that area is not supposed to be editable. This commit disables the `SelectionPlaceholderPlugin` inside the `html_builder`. It also makes the `<figure>` element around images non editable - in order to be able to write a test that does not enforce it to be wrong. Steps to reproduce: - Drop an `s_cards_grid`` block - Put the cursor in a card - Move the cursor with the arrow keys until you leave the card => The cursor was displayed between cards. [1]: https://github.com/odoo/odoo/commit/edf7f7bb0c62978640c181eccb4934855d5d872d task-5383957 Forward-Port-Of: odoo/odoo#240591
This update resolves a warning that appeared when searching for payment tokens, indicating an issue with how Odoo was trying to find the correct name. Adding a specific search field (`_rec_name_search`) ensures the system can reliably identify payment tokens, preventing the warning and maintaining data accuracy.
Original PR description
address this warning: `2026-01-07 04:53:23,985 3407309 WARNING v18c_... odoo.models: Cannot search on display_name, no _rec_name or _rec_names_search defined on payment.token` Forward-Port-Of: odoo/odoo#242477
This update fixes an issue where applying full amounts to invoice or payment lines was incorrectly triggering tax calculations. This ensures accurate financial reporting for invoices and payments, particularly when dealing with multi-currency transactions. The change improves the reliability of financial data.
Original PR description
Since this commit: https://github.com/odoo/enterprise/commit/5893005187fd67613baaae38e58e126dc9e28544 It could happens that on lines that come from an invoice or a payment (so lines with reconciled_lines_ids. Applying the full amount would trigger the edit_tax_line function which shouldn't be the case since those lines cannot have tax set on them. no task id Forward-Port-Of: odoo/enterprise#103334
This update resolves a bug that caused Facebook statistics refreshes to fail due to inconsistencies in how date and time information was handled across different versions of the Python datetime library. The fix ensures compatibility with older Python versions, preventing errors and improving the reliability of Facebook account statistics updates.
Original PR description
Bug
===
When refreshing the statistics of a Facebook account, an error can happen, depending on the datetime library version.
The following work in python 3.11, but not on python 3.10 and earlier, due to `+0000` instead of `+00:00`.
```py
import datetime
datetime.datetime.fromisoformat('2025-11-16T08:00:00+0000')
```
Task-5473117
Forward-Port-Of: odoo/enterprise#103456This update removes the Tailscale IP address from the IoT box status screen. This simplifies the display and ensures accurate reporting of network connections. The change improves the user experience by presenting only relevant network information.
Original PR description
This PR removes tailscale ip address from iot box status screen. ``` >>> netifaces.interfaces() ['lo', 'eth0', 'wlan0', 'tailscale0'] ``` The 'tailscale0' interface will now be ignored
This update automatically removes draft IoT Box records created during the connection process. This prevents unnecessary data storage and improves system performance, particularly for offline pairing scenarios where the app couldn't previously identify when to delete these records.
Original PR description
We now remove automatically draft IoT Box records every day. Draft records are the ones created when clicking "connect" in the IoT app, used to generate a token to identify boxes. If we use the pairing code or auto pairing process, this draft record isn't created until we actually find an IoT Box. But if the method is "offline pairing" and no request is later made by the IoT Box, then the IoT app can't know when to delete the record. The cron job fixes the issue.
This update enhances the speed and efficiency of dashboard loading within the Odoo SaaS platform. By implementing caching based on unique identifiers (ETags), the system now retrieves dashboard data more quickly, reducing loading times for users. This results in a smoother and more responsive user experience.
Original PR description
Ensure that the etag is used for caching dashboards. Task: 5441251 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where spreadsheet caching wasn't correctly updating when a spreadsheet was renamed. Now, the system accurately reflects changes in spreadsheet names, ensuring users always access the latest version. This improves the overall user experience and data consistency.
Original PR description
Etag was computed from the spreadsheet content, but we forget to take spreadsheet metadata (like the name, ...) into account. So when user renames a spreadsheet, the browser still has the old version in cache and does not fetch the new name. This commit ensures that the ETag for spreadsheet data responses also takes into account the metadata of the spreadsheet. This commit also ensures that eTag for dashboards is computed. Task: 5441251
This update resolves an issue where the bank reconciliation process would fail when multiple reconciliation models were applied to a single bank statement line. The fix combines the names of all applied models, ensuring the system can correctly handle complex reconciliation scenarios. This enhances the reliability of bank statement matching.
Original PR description
Steps to reproduce: - Configure several reconciliation models matching the same statement line. - Reconcile the line and validate When reconciling a bank statement line, multiple reconciliation models can be applied (e.g. fees + write-off). The matching confirmation message assumed a single record and crashed when accessing `reconcile_model.name`. Fix by joining the names of the applied reconciliation models. OPW-5416031 Forward-Port-Of: odoo/enterprise#103069
This update fixes a technical error that prevented the system from correctly updating SSL certificate status information. The issue stemmed from incorrect timezone handling during data conversion, which caused a system error. This change ensures certificate updates run smoothly without disruption.
Original PR description
Currently an error occurs when the `iot/box/update_certificate_status` controller tries to write `ssl_certificate_end_date` as `cert.not_valid_after_utc`. Error: `ValueError: unconverted data remains: +00:00` This is because when we convert `cert.not_valid_after_utc` to a string, it will convert the UTC date as ` "2026-03-08 13:06:39+00:00"` and while the system converts this string date with +00:00, it will throw an error. This commit fixes the issue by using a `timezone-naive` value derived from `cert.not_valid_after_utc`. Applying `replace(tzinfo=None)` removes the `+00:00` timezone information and converts the datetime to a `timezone-naive` object. sentry-7016111455 Forward-Port-Of: odoo/odoo#241631 Forward-Port-Of: odoo/odoo#241592
This update ensures that downpayment accounts are correctly applied when calculating taxes externally (like Avatax). Previously, invoices always used the default income account, even with a specified downpayment account. This change aligns with standard downpayment behavior and improves invoice accuracy.
Original PR description
**Problem:** When calculating taxes externally (such as Avatax) and a downpayment is made, the line on the invoice will always use the default income account, regardless of the downpayment account set as a company default. This is inconsistent with the standard behavior of downpayments, which will use the downpayment account set on the product's category instead of the income account (which themselves may come from company defaults). **Solution:** Check if there's a company default for downpayment account on product category and use this account for the downpayment line instead of the income account. opw-5171067 Forward-Port-Of: odoo/enterprise#101860 Forward-Port-Of: odoo/enterprise#101524
This update resolves a test failure that consistently occurred on January 1st. The fix adjusts the test's date reference to a more standard mid-year date, ensuring consistent test results and preventing disruptions. This improves the reliability of the l10n_mx_edi module's testing process.
Original PR description
Some tests are making "self.frozen_today - timedelta(days=1)". It means some tests are failing only the first of January. To avoid that, let's make "frozen_today" to be in the middle of the year. Forward-Port-Of: odoo/enterprise#102827 Forward-Port-Of: odoo/enterprise#102772
This update fixes an issue where displaying the correspondent's local timezone in the Discuss app caused the header height to be uneven. The changes subtly adjust the conversation name, line height, and font size to maintain a balanced and visually appealing header across all conversations, ensuring a consistent user experience.
Original PR description
Follow-up of https://github.com/odoo/odoo/issues/210094 PR above add a new feature to show the local timezone of correspondent of chat when it differs from current user. The conversation name, in addition to local timezone, increases the height of discuss header, which didn't look great. This commit fixes the issue by: - reducing the conversation name slightly when local timezone is shown - reduce line-height when local timezone is shown - reduce slightly font size of timezone These changes preserves the height of discuss header for all conversations, and makes text content more balanced between each item relative to header, including the avatar size. <img width="1164" height="490" alt="Screenshot 2026-01-07 at 20 39 07" src="https://github.com/user-attachments/assets/21a8dc59-c3c3-4fe4-9c54-f74f7156c00c" />
This update fixes an issue where dropdown menus appeared too small when positioned near the edges of the screen. The change decouples the shrinking logic, ensuring dropdowns adapt correctly to different screen sizes and positions, improving the user experience. This ensures consistent and functional dropdown display.
Original PR description
This commit resolves an issue where dropdowns shrank incorrectly when positioned close to the window's edges. Following changes in https://github.com/odoo/odoo/pull/239601, only one positioning variant is tested per direction, with the popper shifting to stay inside the container. However, the existing shrinking logic attempted to strictly adhere to that specific variant. This conflict led to unsatisfactory rendering when space was tight near the edges. The fix is to decouple the shrinking logic from the specific positioning variant. The shrinking computation now ignores the variant preference and only reduces the size when the popper physically exceeds the container dimensions. task-5462517
This update resolves a bug that prevented users from successfully canceling image uploads within the Salary Configurator. The fix ensures the system correctly handles image selection and cancellation, preventing errors and improving the user experience. This improves the reliability of the employee contract generation process.
Original PR description
**Version:** - 17.0 **Steps to reproduce:** - Install the hr_contract_salary module. - Go to Employee contract and click the Generate Offer. - Click on 'Send By Email' button and open Salary Configurator. - Upload an employee photo the first time. then cancel the image selection the second time. **Issue:** - Error occurs when canceling the image selection on Salary Configurator page. **cause:** - The condition to check whether the file exists properly was missing. **solution:** - Added the missing condition to properly check that file exist. Task-5423390 Forward-Port-Of: odoo/enterprise#103421 Forward-Port-Of: odoo/enterprise#102410
This update fixes an issue where the appraisal plan start date wasn't being correctly calculated. The previous change removed a necessary logic block, and this PR reintroduces it to ensure accurate appraisal scheduling. This ensures appraisals are set up correctly for employees.
Original PR description
**Issuee:** A recent change (https://github.com/odoo/enterprise/pull/100599/changes) was made to remove duplicate mehtod, but we need to maintain the main logic of setting the `appraisal_plan_start_date` field. This PR reintroduces this logic. Task:5408846 Forward-Port-Of: odoo/enterprise#103385 Forward-Port-Of: odoo/enterprise#102022
This update optimizes how the POS system calculates product prices for paid orders. Previously, the system unnecessarily recomputed prices, leading to wasted processing time. This change improves the efficiency of the POS system and reduces unnecessary server load.
Original PR description
Before this commit, the POS system would recompute product prices even for orders that were already paid. This led to unnecessary calculations. opw-5263663 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238838
This update resolves a minor issue that caused a checkout error when selecting a delivery method for the first time. The fix adds a check to ensure the necessary webpage elements are fully loaded before attempting to modify them, preventing a JavaScript error. This ensures a smoother checkout experience for all users.
Original PR description
**Description:** - This error occurs when the code attempts to access the classList of a DOM element that has not yet been rendered. Specifically, amountDelivery.querySelector(...) returns null…
**Description:**
- This error occurs when the code attempts to access the classList of a DOM element that has not yet been rendered. Specifically, amountDelivery.querySelector(...) returns null during the first selection of the delivery method, and calling .classList on this null value triggers the traceback.
- The issue is observed only on the first interaction when selecting the delivery method. After refreshing the page, the required DOM element is available, and the checkout flow works as expected.
- To resolve this issue, a conditional check was added to ensure that the DOM element exists before accessing its classList.
- [Reference](https://github.com/odoo/odoo/pull/204358/files#diff-ecbd12f8bbcc7e08a87d7edba111301bb0ca5197137d193323d156809651fcb6R353)
**Steps to reproduce:**
1) Create a fresh database on version saas-18.4.
2) Install the website_sale module.
3) Create a product and add it to the cart.
4) Proceed to the checkout page.
5) Add two delivery addresses for the customer.
6) Configure a delivery method for only one of the delivery addresses.
7) During checkout, select the delivery address that has a delivery method configured.
8) When selecting the delivery method for the first time, a traceback occurs.
- Video [video.webm](https://github.com/user-attachments/assets/b9146fef-cef8-4d16-8556-bbeac9ef6119)
**Traceback:**
```.py
Odoo Client Error
UncaughtPromiseError > TypeError
Uncaught Promise > Cannot read properties of null (reading 'classList')
Occured on 51.test.upgrade.odoo.com on 2026-01-07 12:09:06 GMT
TypeError: Cannot read properties of null (reading 'classList')
at Class._updateCartSummary (https://51.test.upgrade.odoo.com/web/assets/1/beaafe8/web.assets_frontend_lazy.min.js:11024:437)
at https://51.test.upgrade.odoo.com/web/assets/1/beaafe8/web.assets_frontend_lazy.min.js:11025:355
at NodeList.forEach (<anonymous>)
at Class._updateCartSummaries (https://51.test.upgrade.odoo.com/web/assets/1/beaafe8/web.assets_frontend_lazy.min.js:11025:337)
at Class._updateDeliveryMethod (https://51.test.upgrade.odoo.com/web/assets/1/beaafe8/web.assets_frontend_lazy.min.js:11022:2353)
at async Class._selectDeliveryMethod (https://51.test.upgrade.odoo.com/web/assets/1/beaafe8/web.assets_frontend_lazy.min.js:11022:54)
```
- opw-5427215
- upg-3715707
Forward-Port-Of: odoo/odoo#242578This update resolves issues preventing the accurate generation of stock reports for Peru (PLE). The fix corrects several errors related to how Odoo accesses product data, ensuring reports now display correct information for Peruvian businesses. This improves the reliability of financial reporting.
Original PR description
## Summary Fix multiple `AttributeError` exceptions when generating PLE 12.1 and 13.1 stock reports: - Use `unspsc_code_id` instead of `unspsc_code` (correct field name defined in `product_unspsc`) - Use `with_context(lang=)` instead of `with_lang()` (correct Odoo API) - Use `categ_id` instead of `category_id` (correct field name on `product.template` and `product.product`) Forward-Port-Of: odoo/enterprise#103004
This update fixes an issue where invoice names weren't correctly linked to Avalara transactions. The team reverted to a previous method of recreating transactions after posting to ensure Avalara receives the necessary invoice information. This ensures accurate tracking of transactions with Avalara, improving data consistency.
Original PR description
In the external tax refactor [1] I wanted to use the commit endpoint to commit transactions in Avalara after posting. It works, but now transactions on Avalara's side are missing the Odoo invoice name references. It's still possible to cross-reference transactions using avatax_unique_code, but it's less convenient. The reason is that we create transactions for draft invoices. They don't have a name yet. Avalara doesn't have a way to update just the code so we revert back to the pre-refactor approach of recreating the entire transaction right after posting with `'commit': True`. `account_external_tax` calculates the taxes right before `_post()`, so we're reasonably sure they should remain the same. In master we can remove all the commit-specific methods and code. [1] https://github.com/odoo/enterprise/pull/82623 opw-5382268 Forward-Port-Of: odoo/enterprise#103570
This update fixes a minor issue where the "Move to trash" option was displayed unnecessarily when documents were already in the trash view. This change simplifies the user interface and prevents confusion, ensuring a smoother workflow for users managing archived documents. It's a small improvement focused on usability.
Original PR description
### Description Do not show the "File > Move to trash” menu entry when the document is already archived (in trash). Task: [5253608](https://www.odoo.com/odoo/project/2328/tasks/5253608) Forward-Port-Of: odoo/enterprise#102773
This update resolves an issue where spreadsheets with certain data validations were causing unexpected animations during printing. The fix ensures the system waits for all animations to complete before initiating the print process, resulting in a smoother and more reliable printing experience for users.
Original PR description
The hook preparing the spreadsheet for printing did not account for cell animations. Unfortunately, this can affect spreadsheets that contain a datavalidation as the spreadsheet is forced to dashboard mode to print (current technical limitation) and since the datavalidations do not have the same aspect between spreadsheet and dashboard modes, an animation is triggered. This revision ensures that we wait for all animations to be done before triggering the browser printing. Task: 5461856 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#242260