Tuesday, May 12, 2026
35 changes · saas-19.2
Enhancements to existing features
This update improves the import of vehicle information from CBC Belgium invoices. Specifically, it now correctly fetches the license plate number ('LCPL-NO') from these invoices, ensuring accurate data capture for accounting purposes. This enhancement addresses a previous issue and improves the reliability of invoice processing.
Original PR description
Used on invoices from CBC Belgium
This update enhances the process for testing Odoo's external mode EDI files. It allows developers to validate their XML files against established standards using a built-in validator, streamlining the testing process and ensuring data accuracy within the IAP environment. This improves the reliability of EDI transactions.
Original PR description
There is a file validator running on the IAP server which validates different types of XML files using XSD and Schematron files. This commits allows for developers writing edi testcases to have their XML files validated by the file validator by running their tests in EXTERNAL_MODE. task-5955497 Forward-Port-Of: odoo/odoo#254991
Resolved issues and error corrections
This update corrects a UI issue where the `l10n_co_edi_ubl` field on the Units of Measure form was missing its label, causing confusion for users. The change ensures the field is clearly identified, improving form usability and data entry accuracy within the CO Company settings.
Original PR description
Currently, the field `l10n_co_edi_ubl` is displayed without a label in the UoM form, confusing users. **Steps to reproduce:** - Install the `l10n_co_edi` module and switch to the CO Company. -…
Currently, the field `l10n_co_edi_ubl` is displayed without a label in the UoM form, confusing users. **Steps to reproduce:** - Install the `l10n_co_edi` module and switch to the CO Company. - Navigate to Invoicing > Settings. - Enable `Units of Measure & Packagings`. - Open `Units & Packagings` and click `New`. **Observation:** The `l10n_co_edi_ubl` field appears between the `Quantity` label and its corresponding field, but its own label is not visible. <img width="1905" height="324" alt="6180769_before" src="https://github.com/user-attachments/assets/f35c345a-f449-46e4-ad15-6981109fca7a" /> **Root Cause:** The inherited view [1] inserts the field `l10n_co_edi_ubl` before `relative_factor` in the base view [2]. In the base view, `relative_factor` is wrapped inside a `<div>` with a shared label (`Quantity`). Since the new field is inserted inside this structure, it inherits the same layout without having its own label, resulting in the label being hidden. **Fix:** This commit updates the view to ensure that the field `l10n_co_edi_ubl` is properly displayed with its own label, avoiding UI confusion and improving form clarity. **After:** <img width="1907" height="376" alt="6180769_after" src="https://github.com/user-attachments/assets/f96470d3-8df2-4ca4-acf8-f6511a49d725" /> [1]: https://github.com/odoo/enterprise/blob/7b0d07bce92fb4b2cb588344fb0f6e3dd5d94f4a/l10n_co_edi/views/product_uom_views.xml#L4-L13 [2]: https://github.com/odoo/odoo/blob/bae4fa4e0dde2d2e2e4fcdbb968f630c080af818/addons/uom/views/uom_uom_views.xml#L15-L34 opw-6180769 Forward-Port-Of: odoo/enterprise#115933
Features or functions removed from Odoo
This update permanently removes a component related to VoIP functionality (voip_onsip) that was mistakenly reintroduced in a previous update. This ensures the system remains streamlined and focused on core business operations. The removal corrects a technical oversight from the 19.1 release.
Original PR description
While `voip_onsip` should have been removed altogether in 19.1, a commit adding new icons accidentally resurrected it. This commit removes it for good. Forward-Port-Of: odoo/enterprise#116773
This update fixes an issue where interactive tours were incorrectly triggered when the POS was loaded, causing errors. We've added a 'hold' flag to the tour to ensure steps are only loaded when needed, improving the POS experience and preventing technical problems.
Original PR description
When loading the POS, interactive tours were triggered but their steps were not included in the POS bundle. This caused a traceback each time the POS was opened or refreshed. To prevent this, we added a flag `onHold` onto the tour if no steps were found from the database and the registry wasn't loaded. --- Task: https://www.odoo.com/odoo/project/1737/tasks/605029 Forward-Port-Of: odoo/odoo#262812 Forward-Port-Of: odoo/odoo#255094
This update resolves an issue preventing sales team members from opening milestones associated with projects. The fix allows users to access project milestones by temporarily bypassing access restrictions during a key calculation, ensuring a smoother workflow for project management. This improves usability for sales teams.
Original PR description
Steps to reproduce: - Install the sale_project module - Create a sale order based on milestones - Create the project from the order - Open the project, click the three dots, and open a milestone Issue: Users are unable to open milestones and get an access error. Cause: Users in `sales_team.group_sale_salesman` lack read access to the related `sale.order.line`, causing an AccessError when `sale_line_id` is accessed during the computation of `product_uom_qty`. Fix: Compute `product_uom_qty` using `sudo()` to bypass record rule restrictions. task-5477304 Forward-Port-Of: odoo/odoo#263331 Forward-Port-Of: odoo/odoo#245392
This update optimizes the process of cleaning up old device log records, preventing performance slowdowns caused by large database scans. By using a more targeted filter, the system now only processes relevant records, significantly improving database efficiency. This change ensures smoother operation and faster response times.
Original PR description
The current query to delete unnecessary records from `res.device.log` must be run on all records in the table. This means that the entire table will be placed in the psql buffer. This can degrade…
The current query to delete unnecessary records from `res.device.log` must be run on all records in the table.
This means that the entire table will be placed in the psql buffer. This can degrade performance if autovacuum is very frequent.
This commit introduces a fix so that a seq scan does not have to be performed on the table to carry out the cleanup.
We can use an `USING` if the condition on the joined table (L2) significantly reduces the volume before the join.
This will avoid having the corresponding rows from the first table (L1).
Pseudo query:
```sql
DELETE FROM L1
USING L2
WHERE
<L2_selective_filter>
AND L1.<device> = L2.<device>
AND L1.last_activity < L2.last_activity
```
If `<L2_selective_filter>` is very selective, PostgreSQL will use L2 as the "base" table for the join.
PostgreSQL will therefore not place the entire table in the buffer.
With:
```
d: device
c: cron
t: time
```
```
d t1 - insert
d t2 - insert
d t3 - insert
c t4 - cleanup (delete d t1 and d t2)
d t3
d t5 - insert
d t6 - insert
c t7 - cleanup (delete d t3 and d t5)
d t6
d t8 - insert
c t9 - cleanup (delete d t6)
d t8
c t10 - cleanup
d t8
...
```
In the example, cron t9 cannot look at the time window between the moment it runs and the last cron t7. The proof is that the device inserted in t6 must be deleted because a device t8 has been inserted.
It is not possible to cleanup between two crons because older lines can still be deleted by a later cron if a more recent line has been inserted after the previous cron.
So if a device is inserted between the time of the current cron (t0) and the previous cron (t-x), it is necessary to scan the entire table to cleanup the previous devices.
Therefore, it is possible to create a filter so that devices for which there has been no new insertion in the table between the two crons (t0 and t-x) do not need to be checked.
Pseudo query becomes:
```sql
DELETE FROM L1
USING L2
WHERE
L2.last_activity >= <last_cron_time>
AND L1.<device> = L2.<device>
AND L1.last_activity < L2.last_activity
```
Task-5951999
Forward-Port-Of: odoo/odoo#263625
Forward-Port-Of: odoo/odoo#249738This update resolves an issue where the 'Signed Contract' button in the applicant salary configuration would sometimes redirect to an outdated, archived version of the contract. The fix prioritizes active contract versions during the search, ensuring users always access the most current information. This improves the user experience and prevents confusion.
Original PR description
Steps to reproduce: 1- Create an offer for an applicant 2- Sign the offer as an applicant multiple times 3- Counter sign only one of them 4- Click on the "Signed Contract" smart button Issue: In some cases, the smart button will redirect to an archived version. Cause: The search for the version allows for archived versions and has a limit of 1, so sometimes that 1 version turns out to be one of the signed contracts that weren't counter signed. Fix: Add a sort to the search to prioritize active versions. Task-6144381 Forward-Port-Of: odoo/enterprise#116885 Forward-Port-Of: odoo/enterprise#115505
This update fixes a minor issue where some names within the Odoo HR Work Entry module were misspelled. The team corrected the data files to ensure accurate and consistent naming conventions for work entry types. This ensures proper functionality and reporting within the HR system.
Original PR description
Issue: ---------------------------------------- Some work entry names are wrong. Solution: ---------------------------------------- Change the data files. opw-6090081 Forward-Port-Of: odoo/odoo#263761
This update addresses several technical issues within the spreadsheet component of Odoo. It includes fixes related to installation, workflow processes, and permissions, ensuring the spreadsheet functionality remains stable and reliable. This change is a routine maintenance update.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/7fa6ba6291 [REL] 19.2.11 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/7fa6ba6291 [REL] 19.2.11 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/4ddf97f4ca [FIX] package: husky should run at post install [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/958ae7d17c [FIX] workflow: fix the tag definition [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/5ec347d6eb [FIX] Workflow: fix missing permission to use OpenID Connect [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/a939d63d5c [FIX] workflow: Split the workflow in parallel jobs [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/31baa52ff4 [FIX] composer: remove forced reflow in content editable [Task: 6199661](https://www.odoo.com/odoo/2328/tasks/6199661) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update corrects a minor coding issue within the Odoo payroll module (l10n_be_hr_payroll). The change ensures the code functions more reliably by avoiding an unnecessary reference to 'self' within loop structures. This improves the stability and efficiency of the payroll calculations.
Original PR description
Don't use `self` in loop body. Oversight of 724edab8d5be8e774f00ae84e9ebeb5a70f4fa93.
This update resolves an issue where the Knowledge article's table of contents would incorrectly display the TOC of the last previewed article. The fix ensures the TOC accurately reflects the current article, improving the user experience when creating and editing knowledge content. This prevents confusion and ensures users see the correct article structure.
Original PR description
### Steps to reproduce 1. Open knowledge 2. Create a new empty article 3. Click on Templates 4. Close the modal ------> Current article's side panel TOC shows the TOC of the previewed article. ### Technical The side panel's TOC is managed by the TOC service. When opening/updating any article, the side panel's TOC is updated according to the current article. When the article picker is previewing the article using the `HtmlViewer`, it also updates the side panel's TOC using the previewed article. Then if we close the dialog without loading the article, the side panel's TOC doesn't get updated. Therefore, opening the side panel's TOC shows the last previewed article's TOC. After this commit, we add a cleanup inside the `HtmlViewer` and the `KnowledgeTableOfContent` to restore the previous TOC manager when it is destroyed. Task-6186675 Forward-Port-Of: odoo/enterprise#116615
This update adjusts the default date range for the Lead and Pipeline dashboards to 'Last 30 days'. This change ensures users consistently see the most recent data, providing a clearer and more actionable view of sales performance. The update resolves a previous issue with outdated default filter settings.
Original PR description
This commmit fixes the date filter default value to `Last 30 days`. Task: 5902231 Forward-Port-Of: odoo/enterprise#114560
This update fixes an issue where changes to quiz answers weren't immediately displayed in the question overview. The fix restores a necessary field to allow the web client to update its data display correctly, preventing the need for a full page reload. This ensures quiz data is always accurate for users.
Original PR description
After adding new answers or editing existing ones in a quiz question and clicking 'Save & Close', the question overview displays incorrect data. New answers appear as empty tags, and modified answers continue to show their old values. The correct data only appears after a full page reload. This regression was introduced in commit 8ceea093, where invisible fields were removed during code cleanup. The `display_name` field is required in the `answer_ids` list view for the web client to correctly update its local cache. Without this field, the client cannot refresh the display names of the tags immediately after modification. This commit restores the `display_name` field as `column_invisible` in the `slide.question` form view. Task-5449335 Forward-Port-Of: odoo/odoo#244460
This update corrects a technical issue where partners with VAT information were incorrectly flagged in the annual VAT listing report. The fix ensures that these partners are no longer displayed in the warning, improving the accuracy and usability of the report for accounting and tax purposes. This resolves a minor reporting inconsistency.
Original PR description
Partners with / in VAT shouldn't be displayed in the warning for the annual VAT listing. task-6081162 Forward-Port-Of: odoo/enterprise#113839
This update fixes an issue where the rental report was displaying incorrect dates. The fix ensures that each row in the report accurately reflects the start and return dates of a rental order, providing more reliable reporting data. This improves the accuracy of rental tracking and analysis.
Original PR description
The rental report is a daily report with x rows by rental order, with x the days between the start and return dates. With generate_series inside the select, the query was creating x rows with the same id, resulting in the date field not being correctly displayed (one unique date, the start date). This fix corrects the generation of the report to display the real date on each row. opw-5266525 Forward-Port-Of: odoo/enterprise#106235 Forward-Port-Of: odoo/enterprise#104764
This update fixes a bug preventing users from selecting custom date ranges in accounting reports (Profit & Loss). The recent date filter refactor caused a mismatch in how date modes were handled, leading to the missing options. This change ensures the full range of comparison filters is available.
Original PR description
**Problem:** The "Custom Dates" and "Specific Date" comparison options are missing from the Comparison dropdown in accounting reports. **Steps to reproduce:** 1. Go to Accounting > Reporting > Profit…
**Problem:** The "Custom Dates" and "Specific Date" comparison options are missing from the Comparison dropdown in accounting reports. **Steps to reproduce:** 1. Go to Accounting > Reporting > Profit & Loss 2. Click the Comparison dropdown 3. Only "No Comparison", "Previous Period", and "Same Period Last Year" are visible — "Custom Dates" is missing **Current behavior:** Custom date comparison options are not rendered. **Expected behavior:** "Custom Dates" (for range reports) and "Specific Date" (for single date reports) should appear in the Comparison dropdown. **Cause of the issue:** The date filter refactor (40484f985f5) restructured how the date mode is stored in options. Previously, `options.date.mode` held 'range' or 'single'. After the refactor, this key no longer exists — the mode is now stored as a boolean in `options.filter_date.range_mode`. The comparison filter template still checks `controller.cachedFilterOptions.date.mode`, which is now undefined, so both the range and single conditions always evaluate to false and the custom comparison options are never rendered. **Fix:** The comparison template was the only consumer not updated during the refactor. Aligning it to the new data path restores the options without any behavioral change. opw-6070402
This update fixes an issue where selecting multiple lines in the bank reconciliation process didn't function correctly. The change ensures that the dropdown accurately displays the intersection of relevant record models, resolving a bug that caused incorrect filtering. This improves the user experience when managing multiple transactions.
Original PR description
In this commit: https://github.com/odoo/enterprise/commit/fa8fedc4e2501a273e7f8f3f7f4462b2b58907b9 We introduce a way for user to select multiple lines and perform an action out of it. In the dropdown, there should be an intersection of all reco model of the selected lines but it wasn't working properly in two cases: - When only one selected lines, remainingRecoModels was empty and the filter was filtering everything, added a early return for that - When multiple lines, we compare the first list of reco model with all the others but we compare object which is not working in js. Now we will compare the id. no task id Forward-Port-Of: odoo/enterprise#115770
This update resolves a visual glitch where the status bar displayed twice for sub-tasks. The fix ensures that the status bar accurately reflects the task's project association, preventing a confusing and inconsistent user experience. This improvement maintains a clean and professional interface for users managing tasks.
Original PR description
Steps: - Create a task inside any project. - Create a sub-task under that parent task. - Open the sub-task and remove the project (clear the project field). - Look at the status bar at the top of the form view. Issue: - The status bar is displayed twice (both the Project stages and Personal stages - are visible simultaneously). Cause: - When the project field is cleared from a sub-task in the UI, conflicting visibility rules or residual stage data can cause the status bar widget to render twice. Fix: - To resolve this, an `onchange` event is added to the `project_id` field. If the user removes the project from a sub-task, the system now instantly falls back to the parent task's project and sets `display_in_project = False`. This syncs the frontend UI with the intended backend behavior, preventing the interface from entering the broken state and removing the duplicate status bars. task-6033970 Forward-Port-Of: odoo/odoo#255319
This update fixes an issue where product variants added through the product matrix widget on purchase orders weren't displaying the correct product description. The change restores a previous helper function to ensure the full product description, including attributes, is shown. This ensures accurate product information is visible when using the matrix feature.
Original PR description
From 7e553d25890d1, the `product_label_section_and_note_field` has been split into a mixin in `product` and an override in `account`. In this split. the `get label()` helper has been slightly modified in a way the product template is not extracted from the label to keep only the additional description (usually filled with product attribute values). This lead to having only the product template name displayed on the purchase order line if the product variant was added via the matrix widget. This commit brings back the old `label` helper only for the product matrix widget. Task: 6042382 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#262735
A recent issue caused the first line of product descriptions in quotation templates to be cut off when creating sales orders. This update adds a test to prevent this problem, ensuring that all description content is correctly displayed in sales orders. This improves the clarity and accuracy of sales order information.
Original PR description
Issue: --- When using quotation template, the first line of description is always removed. Steps to reproduce: 1- Create a quotation template and add a description to the line. 2- Create a SO from quotation template. As you see the first line of description is removed in SO. Cause: --- This regression is introduced after aba778538c2032a2924f99258c5c75e463296d21 which was done under the assumption that the description always starts with product name. This breaking commit is reverted by: a702a4989fc53ccc43f57213e0db3e62e7b69e8f However it's better to have a test in order to prevent this issue being introduced in the future. opw-6178360 Forward-Port-Of: odoo/odoo#262563
This update corrects a visual issue in the Project Gantt view where flexible employees were incorrectly marked as unavailable during weekends and off-hours. The fix ensures that flexible employees only appear grayed out for approved leaves and public holidays, improving the accuracy of project timelines. This resolves a previous bug that impacted how availability was displayed.
Original PR description
Steps to Reproduce --- - Assign a flexible working schedule to an employee (no leaves) - Open Project > Tasks > Gantt view grouped by Assignee - The employee's weekends and off-hours are grayed out…
Steps to Reproduce --- - Assign a flexible working schedule to an employee (no leaves) - Open Project > Tasks > Gantt view grouped by Assignee - The employee's weekends and off-hours are grayed out Current Behavior --- Flex employees with no approved leaves in the viewed date range have incorrect grayed-out days in the Project Gantt view. Expected Behavior --- Flex employees should have no grayed-out days except approved leaves and public holidays. Issue --- When a flex employee has no leaves in the viewed period, `_get_unavailable_intervals()` returns an empty dict for that resource. `_gantt_unavailability()` then falls back to `company_leaves`, producing incorrect gray intervals. The same case is already handled in `planning` (ref PR), but `project_enterprise` was not covered. Fix --- Add a guard in `_gantt_unavailability()` to return no unavailabilities for flexible resources absent from `leaves_mapping`. Related : https://github.com/odoo/odoo/commit/5f1cd39944134ffa2c30c331f8a5daca56446d78 task - 5063071 Forward-Port-Of: odoo/enterprise#113247
This update ensures that right-clicking on links within email messages displays the standard browser context menu, rather than the email-specific actions. Previously, this wasn't working correctly due to how email messages were structured within the application, and this fix resolves that issue.
Original PR description
Before this commit, when right-clicking on a link in a message of type email, this shows the message actions rather than the browser context menu. We expect to display the browser context menu, as…
Before this commit, when right-clicking on a link in a message of type email, this shows the message actions rather than the browser context menu. We expect to display the browser context menu, as there are many handful feature of browser context menu for links. This was handled in earlier fixes [1][2], but these fixes were not working with messages of type email. This didn't work because messages of type email are inside a shadow DOM, so `ev.target` is necessarily the shadow root and not the specific targeted element. This commit fixes the issue by using `ev.composedPath()` to pick the 1st element, so that this exposes the inner-most element inside the shadow DOM that has been right-clicked. This lets us ignore the showing of message actions in right-click when this comes from a link. opw-6110949 [1]: https://github.com/odoo/odoo/pull/244252 [2]: https://github.com/odoo/odoo/pull/258681 Before / After <img width="441" height="243" alt="before" src="https://github.com/user-attachments/assets/f274e8d2-66af-442e-9a31-27ea1ce4d9bd" /> <img width="605" height="513" alt="after" src="https://github.com/user-attachments/assets/3e241e83-93d0-47e6-970c-b5e5f339417d" /> Forward-Port-Of: odoo/odoo#263622
A technical issue causing a traceback in the Department Hierarchy view has been resolved. This prevented the view from loading correctly when departments had managers assigned. The fix addresses a problem with how the system handles date information, ensuring the view functions properly.
Original PR description
## Issue When opening the *Hierarchy* view of Employees > Departments, if at least one department has a manager set, a traceback appears before the view. ## Steps to reproduce 1. Install *Employees*…
## Issue
When opening the *Hierarchy* view of Employees > Departments, if at least one department has a manager set, a traceback appears before the view.
## Steps to reproduce
1. Install *Employees* (`hr`)
2. In Employees > Departments, add a manager to a department
3. Open the *Hierarchy* view
4. **A traceback appears:**
```
Caused by: TypeError: Cannot read properties of undefined (reading 'toMillis')
at get uniqueId (http://localhost:8192/web/assets/cbd2032/web.assets_web.min.js:21370:74)
at Many2OneAvatarEmployeeField.template (eval at compile (http://localhost:8192/web/assets/cbd2032/web.assets_web.min.js:1387:421), <anonymous>:25:122)
...
```
## Cause
The traceback is yielded from the `get uniqueId` getter from the `Many2OneAvatarEmployeeField` component:
https://github.com/odoo/odoo/blob/c3172d65db44c41f5619aef20532c3846494ea0e/addons/hr/static/src/views/fields/many2one_avatar_employee_field/many2one_avatar_employee_field.js#L38-L40
where `write_date` is undefined. This getter was added by https://github.com/odoo/odoo/commit/3732ca85b03bea9eabfb05cc306ce0bf5bac88d4, which handled the case of undefined `write_date` for the related Kanban component:
https://github.com/odoo/odoo/blob/c3172d65db44c41f5619aef20532c3846494ea0e/addons/hr/static/src/views/fields/many2one_avatar_employee_field/kanban_many2one_avatar_employee_field.js#L49-L52
A similar solution is applied in this problematic getter.
opw-6128837This update resolves an issue where Swedish account names were being incorrectly imported due to a character encoding mismatch. The file was originally saved in CP437, and the fix ensures the correct Swedish characters are imported, improving data accuracy for Swedish businesses using the Odoo Enterprise system.
Original PR description
Issue: Non-ASCII charatcter from sie file were lost on import. Steps to reproduce: - in a Swedish company - import the SIE4 exemple file from sie website: https://sie.se/wp-content/uploads/2024/01/SIE4-Exempelfil-Sample-file-1.zip Current behavior: - The account 1090 is imported as "vriga imm anl tillg" instead of "Övriga imm anl tillg" Expected behavior: - The account 1090 is imported as "Övriga imm anl tillg" Cause: CP437 uses 8 bits to represent data. Ö is \x99. However, file was imported using either UTF-8 or ISO-8859-1, where Ö is \xC396 and \x99 doesn't link to anything. This commit update the test file as it was save in cp437 but read as UTF-8. opw-6167408 Forward-Port-Of: odoo/enterprise#116722
This update resolves an issue where pressing backspace in the HTML editor, specifically at the button's left edge, would cause a crash. The fix ensures backspace correctly deletes characters and addresses an unintended behavior related to zero-width spaces, improving the editor's stability and user experience.
Original PR description
**Description of the problem** Pressing backspace when the cursor is positioned at the very left edge of a button could trigger a traceback. Additionally, even if the crash did not occur, the…
**Description of the problem** Pressing backspace when the cursor is positioned at the very left edge of a button could trigger a traceback. Additionally, even if the crash did not occur, the backspace behavior would be incorrect, because the cursor would move across a zero-width non-breaking space (Zwnbsp) without deleting the first character to the left. **How to reproduce** In the `html_editor`, create a button. Click on its very left edge, then press backspace. An error is thrown. **Why the problem happens** 1. Traceback when backspace is pressed `LinkPlugin.handleDeleteBackward` assumes that `previousSibling` is an element node, and calls the `matches` method. However, when clicking on the very left edge of a button, the cursor is positioned such that the left sibling (`previousSibling`) is a text node. Text nodes do not implement `.matches()`, leading to the crash. 2. No deletion of the character to the left of the cursor `DeletePlugin.isVisibleChar` handles the edge cases where backspace is pressed while the cursor is positioned to the side of a button, and defines the visibility of Zwnbsp to determine how much is deleted. The padding Zwnbsp to the left of a button are considered as visible, such that the user can delete an empty button without removing also the first character on its left. Anyway, the current code does not actually check if the button is empty, thus it applies to more cases than necessary. Probably this has never been observed before, because it takes a very precise click to the left edge to position the cursor between a button and its left Zwnbsp. **Fix** 1. Prevent the crash in `LinkPlugin` `LinkPlugin.handleDeleteBackward` now ensures that `previousSibling` is an element node before calling `matches`, otherwise it returns. 2. Fix backspace behavior in `DeletePlugin` `deletePlugin.isVisibleChar` now considers as visible only the Zwnbsp positioned to the left of an empty button. This way, if the user clicks on the very left edge of a button (which moves the cursor outside the button, to the left), pressing backspace actually deletes the character on the left. task-6102282 Forward-Port-Of: odoo/odoo#258858
This update eliminates redundant logging messages within the account_edi_ubl_cii module. Previously, excessive logging created unnecessary noise. This change streamlines logging, making it more efficient and easier to analyze when needed.
Original PR description
Before this commit, we had repeated logs (n-times if we had similar lines) but this doesn't help too much. To avoid this we decided to remove duplicated messages Task-None --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263779
This update fixes an issue where contacts enrolled in the same courses were incorrectly merged. Now, the system prevents this merging process, displaying an error message to the user when a duplicate course is detected. This ensures data accuracy and avoids potential confusion for users managing course attendees.
Original PR description
Expected Behaviour: Contacts enrolled in common courses should not be merged and the merge should fail. Steps to reproduce: 1- Go to one of the courses 2- Add two attendees to the course 3- Go to Contacts App 4- Select the two attendees you added to the course 5- Try merging the two contacts Actual Behaviour before the Fix: Contacts enrolled in common courses are getting merged and the common courses are kept in the destination contact. Behaviour with the Fix: Contacts enrolled in common courses are blocked from being merged and an error message is shown to the user saying that the reason the merge is blocked is a duplicate course. opw-5417223 Forward-Port-Of: odoo/odoo#263196 Forward-Port-Of: odoo/odoo#244500
This update resolves a bug that prevented price changes in the Blackbox POS module when the user's language used a comma (e.g., European format) instead of a dot as a decimal separator. The fix ensures accurate price calculations regardless of the user's locale, improving the reliability of order pricing.
Original PR description
Before this commit, when changing the price of an orderline with the blackbox installed, if the decimal separator of the user language was not a dot and was used during the price change, the price was not changed. This was due to the fact that we were comparing a string with a number, the string would be implicitly be converted to a number and, when there was a comma for example, it would return a NaN which would cause the discount to not be applied and thus the price to not change. Forward-Port-Of: odoo/enterprise#113341 Forward-Port-Of: odoo/enterprise#113151
This update provides pre-configured Italian accounting data for easier testing and demonstrations of the Odoo system. The data includes sample partners, bank accounts, invoices, and bills, along with necessary e-invoicing information. This simplifies the process of verifying the Italian localization and ensures accurate demonstrations.
Original PR description
Purpose: Load a pre-configured set of Italian accounting sample data to facilitate localization testing and demonstrations. Specifications: This commit introduces comprehensive sample data for the Italian localization, configuring the following: * Partners * Bank Accounts * Invoices & Bills * Dynamic Dates: All generated moves use a relative date format to ensure testing data remains relevant and doesn't expire on runbot. * EDI Data: Populates necessary e-invoicing fields (`l10n_it_codice_fiscale`, `l10n_it_pa_index`) for the created partners. task-6103257 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262711
This update resolves issues with how notes are replied to using the HTML composer, ensuring correct formatting and spacing. Previously, replies could lose formatting or introduce extra spaces. Now, replies maintain formatting and add trailing spaces correctly, improving the user experience when responding to notes.
Original PR description
Before this PR, Replying to a note with the HTML composer enabled had several issues. - The mention added did not include a trailing space. - If the composer already contained formatted content, reply action discarded all formatting because the content was overwritten using composerText, which is not formatting-aware. - the composer sometimes showed extra spacing between lines because the base container used a `<p>` tag instead of a `<div>`. This PR fixes these issues by - inserting the mention directly into composerHtml with an editable trailing space instead of mutating composerText. This preserves existing formatting, and correctly adds spacing after mentions. - The base container always use a `<div>`, preventing unwanted line spacing task-[5454785](https://www.odoo.com/odoo/project/1519/tasks/5454785) Forward-Port-Of: odoo/odoo#242748
This update resolves a crash that could occur when attempting to 'Unassign' items from the stock reception report if the linked source document (like an order) was empty. The fix prevents the system from trying to remove references to non-existent documents, making the report more reliable and robust, particularly for clients with custom configurations.
Original PR description
#### Issue: Clicking `Unassign` from the stock reception report could raise a traceback when the outgoing move source document was empty. ``ValueError: Expected singleton: mrp.production()`` Please…
#### Issue: Clicking `Unassign` from the stock reception report could raise a traceback when the outgoing move source document was empty. ``ValueError: Expected singleton: mrp.production()`` Please note that this is not expected in standard Odoo, where reception report moves should normally be linked to a source document, such as an MO, SO, or picking. This case seems specific to the client database and may be due to a customization, but handling it makes the reception report more robust. #### Cause: The reception report built report lines from `source = (move._get_source_document(),)` and checked `if not source`. Since the tuple itself is truthy, moves whose `_get_source_document()` returned an empty recordset were not filtered out. For example if `out_move._get_source_document()` returns `mrp.production()`, then `source = (mrp.production(),)` is still truthy, so the report keeps the line even though the source document is empty. later `action_unassign()` called `_remove_reference()` on that empty source document, which crashed on `ensure_one()`. #### Fix: Added a helper function that skips moves where `_get_source_document()` is empty. Also skip reference synchronization in `_action_assign()` and `_action_unassign()` when the source document is empty just for more protection. opw-6174870 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263366
This update fixes an issue where image data lingered in the website builder's code after shapes were removed, leading to potential performance problems. The change adds a cleanup process to remove outdated image data, ensuring a cleaner and more efficient website builder experience. This improves the overall stability and responsiveness of images on the Odoo website.
Original PR description
Steps to see the issue: - Add a shape to an image - Remove it => Image element in the DOM still has some data related to the shape. This commits adds a shared method to `ImageShapeOptionPlugin` to…
Steps to see the issue: - Add a shape to an image - Remove it => Image element in the DOM still has some data related to the shape. This commits adds a shared method to `ImageShapeOptionPlugin` to clean shape-related data when we apply a shape, or remove it, the method mirrors the behavior we had before the [html builder refactoring]. Also, commit [1] fixed the issue when the builder transfered shape or hover related data to incompatible images, when replacing an image with a shape/hover on it. However if these data attributes had already been saved prior to that commit, it would stay there indefinitely. The same could happen with hover effects attributes. Therefore, we add a resource that we call before saving data to clean any stale image data. Example of a CORS protected image: [2] [1]: https://github.com/odoo-dev/odoo/commit/137a6d7e59e1d788745c3b796a14839e52a8c5bc [2]: https://tinyjpg.com/images/social/website.jpg [html builder refactoring]: github.com/odoo/odoo/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-5172640 Forward-Port-Of: odoo/odoo#263662 Forward-Port-Of: odoo/odoo#259226
This update fixes an issue where the timesheet forecasting report incorrectly included public holidays from other companies. The change ensures that only public holidays relevant to the employee's company are considered, improving the accuracy of planned hour calculations. This prevents over-reporting of time spent on holidays.
Original PR description
## Steps to reproduce: - Install project_timesheet_forecast module - Create a public holiday in one company - In another company create a planning slot for an employee that overlaps with the holiday - Go to Timesheets/Planning analysis report - Notice the report is not showing planned hours for the employee on the day of the public holiday ## Cause: When filtering the resource_calendar_leaves we don't check for the company so any public holiday in any company will be taken into account even if it doesn't affect the employee ## Fix: Exclude holidays that has different company than the planning slot opw-5027070 Forward-Port-Of: odoo/enterprise#116263
This update resolves a minor visual glitch in the timesheet timer display. Previously, a brief flicker would occur when saving timesheet data due to rounding issues. Now, the system validates record data before saving, eliminating this flicker and ensuring a smoother user experience. Additionally, the delete button visibility has been adjusted to prevent a related flicker when new records are created.
Original PR description
before: The timer value is rounded to the record, then the saving attempt is made. This makes the timer flicker to the rounded value for a split second if the saving operation failed (ex. missing data) after: The record is updated with the rounded value if the saving operation is valid. We check the record validity before saving or updating the record. --- task-6120567