Monday, June 15, 2026
32 changes · saas-19.3
Enhancements to existing features
This update enhances the visual quality of Odoo invoices generated through the account_edi_ubl_cii module. The changes include a refined header and footer, a disclaimer indicating the document is not official, and branding to identify invoices as 'Generated by Odoo'.
Original PR description
The previous UI was a little bit raw. To improve the client experience, we made the following changes: - Modify an inherited internal layout to improve header and footer. - Add a pill that says "Generated by Odoo". - Add a sentence mentioning that it is not an official document. Task-6132980 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260393
Resolved issues and error corrections
This update resolves an issue where duplicating a Time Off type with a Payroll Code would trigger an error due to a uniqueness constraint. The fix automatically appends a suffix to the code field during duplication, allowing for multiple time off types with the same code but different names.
Original PR description
Steps to reproduce: ------------------------------------------ 1. Install Time Off module 2. Create a new Time Off type with Payroll Code (e.g, TEST) 3. Duplicate the Time Off type Observation:…
Steps to reproduce: ------------------------------------------ 1. Install Time Off module 2. Create a new Time Off type with Payroll Code (e.g, TEST) 3. Duplicate the Time Off type Observation: ------------------------------------------ User Error raised: ``` Cannot insert 'Test (copy)': Work entry type 'Test' of code 'TEST', with no country assigned, already exists. ``` Issue: ------------------------------------------ When you duplicate a Time off type, Odoo's default `copy()` method doesn't modify the code field. The `_check_code_unicity` constraint enforces that each combination of `code` and `country_id` must be unique. Since your duplicated record has the same `code`, the same `country_id` and a different `name`. The constraint correctly raises an error. Solution: ------------------------------------------ Override the `copy()` method to automatically append a suffix to the code field when duplicating, similar to how the name field gets '(copy)' appended. opw-6225931 Forward-Port-Of: odoo/odoo#265144
Code cleanup and technical improvements
This update simplifies the automated bank reconciliation process within Odoo Enterprise. The code has been reorganized for better readability and maintainability, addressing a previous complexity issue. This change enhances the reliability and efficiency of bank statement matching.
Original PR description
Reworked the try_auto_reconcile function to make it more readable by creating helper functions and splitting the function into multiple smaller ones. task-6171727 Forward-Port-Of: odoo/enterprise#120500 Forward-Port-Of: odoo/enterprise#116958
This update enhances the accuracy of partner searches within Odoo by using exact name matches instead of partial matches. This prevents incorrect partner identification and ensures more reliable data retrieval, particularly important for UBL import processes. The system now also uses bank account details to further refine partner identification.
Original PR description
Before this commit: * Partner was searched using contains on the name, which could match unrelated partners with similar names (e.g. 'Global Tech' matching 'Global Technologies Ltd'). After this commit: - Partner retrieval now uses an exact name match to avoid incorrect matches caused by partial name search. - The search limit is set to 1 to ensure a consistent result when multiple partners are found. Technical: - Replaced `ilike` with `=ilike` in the name search domain. task-5485563 Forward-Port-Of: odoo/odoo#269525 Forward-Port-Of: odoo/odoo#250309
This update fixes an issue where URLs using forward slashes were incorrectly simplifying into single words. Previously, `/` characters were silently removed, leading to unexpected URL formatting. This change restores the original behavior, ensuring URLs with forward slashes are correctly converted to hyphens, improving URL consistency and reliability.
Original PR description
After Unicode slug support was introduced in https://github.com/odoo/odoo/commit/926e45aa93ffc3f74fe9bf4ae8f06642976c2ae5, `/`
characters started being silently removed instead of treated as
slug boundaries.
As a result:
"foo/bar" -> "foobar"
while it should instead generate:
"foo/bar" -> "foo-bar"
This restores the previous behavior by treating each non word character
as separators normalized to `-`.
task-6219984
Forward-Port-Of: odoo/odoo#269621
Forward-Port-Of: odoo/odoo#264557This update fixes an issue where the Odoo tour system would throw an error if a tour was only stored in the user's browser but not in the database. Now, the system gracefully handles this situation by displaying a notification and clearing the tour data, ensuring a smoother user experience.
Original PR description
Before this commit if there was a tour in the localStorage but no more in the DB, an error was threw. Now, instead, there is a notification when starting a tour that doesn't exist in the DB, but no more error when trying to resume a tour that is no more in the DB. The localStorage is cleaned instead. TASK-6229383 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an error that occurred when users removed the date field in the Accrued Expense Entry wizard. The fix adds a check to ensure the date field has a valid value before performing comparisons, preventing a type error. This ensures the feature continues to function correctly.
Original PR description
Currently, error occurs when user removes date on Accrued Expense Entry wizard. Steps to replicate: - Install `purchase` and `accountant` with demo. - Open any Purchase Order > Click on cog menu >…
Currently, error occurs when user removes date on Accrued Expense Entry wizard.
Steps to replicate:
- Install `purchase` and `accountant` with demo.
- Open any Purchase Order > Click on cog menu > Accrued Expense Entry.
- Remove value from `date` and click else where.
Error:
```
File '/home/odoo/odoo19/community/addons/account/wizard/accrued_orders.py', line 67, in _compute_reversal_date
if not record.reversal_date or record.reversal_date <= record.date:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: '<=' not supported between instances of 'datetime.date' and 'bool'
```
Cause:
- As the user removed value from `date`, [here] `record.date` is received as False.
- As a result the comparison `record.reversal_date <= record.date` causes this error to occur.
Solution:
- Added a conditional check for `date` before the date comparison.
[here]: https://github.com/odoo/odoo/blob/8791cdcd89ea3cb56b1fac63b3e2ffbd2956a912/addons/account/wizard/accrued_orders.py#L67
No ID
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#269418
Forward-Port-Of: odoo/odoo#262568This update resolves an issue preventing users from selecting contacts with VAT numbers as feedback recipients within appraisals. The previous system incorrectly identified VAT-enabled contacts as 'companies,' limiting recipient options. Removing a restrictive domain allows for full recipient selection, streamlining the feedback process.
Original PR description
Issue: ---------------------------------------- We cannot add a contact with a VAT as a feedback recipient. Steps to reproduce: ---------------------------------------- - Have a contact with a VAT - Go to a confirmed appraisal and select 'Ask Feedback' - We cannot add the contact as recipient. Cause: ---------------------------------------- There is a domain on the field to only accept non company contacts. The idea of the domain was to restrict the field to persons only. But since f2965048f60fe6c815b3e50fa714c97a93dfb5d3 the field `is_company` is computed based on the VAT presence. So a contact with a VAT specified is considered a company. Solution: ---------------------------------------- Remove the domain. We allow to select all contacts, the users will have to do the sort. opw-6280689 Forward-Port-Of: odoo/enterprise#120236
This update fixes a display issue where employee holiday availability dates in the internal chat (Discuss) were incorrectly showing the previous day when users were in negative timezones. The fix ensures dates are displayed accurately regardless of the user's timezone, improving communication and reducing confusion.
Original PR description
Issue: ---------------------------------------- When in a negative timezone, the "Out of Office until..." text in discuss shows the day before. Steps to reproduce:…
Issue: ---------------------------------------- When in a negative timezone, the "Out of Office until..." text in discuss shows the day before. Steps to reproduce: ---------------------------------------- - Change the timezone of the user to "America/Toronto" for example - Have an employee currently on leave until tomorrow - Open discuss to chat with this employee - The "Out of Office until..." shows today's date Cause: ---------------------------------------- When calling `toLocaleString()` without a timezone specified in the options, the date is converted to local time (in the browser's timezone). Here `persona.out_of_office_date_end` is just a date, `deserializeDateTime()` converts it to a timestamp, so the same day at 0am. Then if the timezone is negative, the timestamp becomes an hour the previous day when calling `toLocaleString()`. The format we give `DateTime.DATE_MED` doesn't include hours, so we just display the previous date. Solution: ---------------------------------------- Add `timeZone:"UTC"` in the options to avoid the timezone conversion. opw-6252040 Forward-Port-Of: odoo/odoo#268886 Forward-Port-Of: odoo/odoo#267479
This update ensures that non-mandatory text fields in sign documents appear with a transparent background when using dark mode in browsers. A recent update to PDF.js caused a color mismatch, and this fix corrects the styling to match the overall page aesthetic, improving the user experience.
Original PR description
## Issue When using the browser's dark mode, non-mandatory text fields in sign documents appear with a dark background, which does not match the aesthetic of the rest of the page. ## Steps to…
## Issue
When using the browser's dark mode, non-mandatory text fields in sign documents appear with a dark background, which does not match the aesthetic of the rest of the page.
## Steps to reproduce
1. Set your browser's theme to a dark theme (in Chrome, go to Settings > Appearance > Theme, chose a theme from the dark options)
2. Install Sign (`sign`)
3. Open a Sign template and add 3 Text fields:
- Mandatory
- Non-mandatory
- Read-only (for comparison)
4. Click *Sign Now*
5. **The non-mandatory text field has a dark background.**
## Cause
Since a [PDF.js update](https://github.com/mozilla/pdf.js/commit/ae1cbc6a9ecc738d6777830488ad5481b97338bc), the `light dark` color-theme was added to `:root`. This means that the element will react to the settings of the browser and adapt its background and text color. In this case, there's no other `background-color` provided to mandatory fields, resulting in them using the dark color of the browser theme.
## Fix
We make the default background of text fields transparent then we update the selector of `.o_sign_sign_item_required` to prevent their `background-color` from being overwritten by that new transparent background.
| | Before | After |
|------------|--------|-------|
| **Light mode** | <img width="211" height="99" alt="6213059-before-light" src="https://github.com/user-attachments/assets/c4c70394-c7c2-4dbf-92b9-c1362d1cf9c8" /> | <img width="207" height="89" alt="6213059-after-light" src="https://github.com/user-attachments/assets/63142be5-9f7d-4d5d-94e8-ef9428e1b778" /> |
| **Dark mode** | <img width="220" height="95" alt="6213059-before-dark" src="https://github.com/user-attachments/assets/19149c3d-511e-407c-821e-f318f373368a" /> | <img width="210" height="103" alt="6213059-after-dark" src="https://github.com/user-attachments/assets/0b412d4f-061f-41b3-aae9-569b9a8219dc" /> |
opw-6213059
Forward-Port-Of: odoo/enterprise#117589This update fixes an issue where new timesheet entries created from the systray menu were always added to the bottom of the list, making it difficult to see the most recent entries. The fix reorders entries to display the newest timesheet entry at the top, improving usability. This change ensures a more intuitive experience for users managing their timesheets.
Original PR description
## Issues When creating a new timesheet entry from the systray menu, that entry is added at the end of the list, which is inconvenient when the list gets long, as it requires to scroll through the…
## Issues When creating a new timesheet entry from the systray menu, that entry is added at the end of the list, which is inconvenient when the list gets long, as it requires to scroll through the entirety of it to see the most recent entry. ## Steps to reproduce 1. Install Timesheets (`timesheet_grid`) 2. Open the systray menu 3. Create two timesheet entries 4. The second (= most recent) entry appears below the first (= oldest) entry ## Cause Since https://github.com/odoo/enterprise/commit/5901619141c81085111f2ee65b54492abf1e324f the entries are sorted based on the create date in ascending orer. This means that the oldest entries appear at the top, and the most recent at the bottom. On top of that, new entries were added at the end of the list instead of the start. ## Test The existing test `Creating a new timesheet places it at the top of the list` was only adding one entry to the list, thus was not properly testing **where** the new entries were added. opw-6284059 Forward-Port-Of: odoo/enterprise#120258
This update resolves an issue where HR users without payroll access couldn't view employee type counts due to conflicting access restrictions in the system's data. The fix uses a system-level bypass to allow HR users to correctly calculate these counts, ensuring accurate reporting.
Original PR description
**Steps to Reproduce** 1. Create a database on v19.3. 2. Install `hr` and `hr_payroll`. 3. Create or log in as a user who only has access rights for the Employee app (`hr`) and no Payroll access. 4.…
**Steps to Reproduce**
1. Create a database on v19.3.
2. Install `hr` and `hr_payroll`.
3. Create or log in as a user who only has access rights for the Employee app (`hr`) and no Payroll access.
4. Go to **Employees → Configuration → Employee → Employee Types**. Opening the Employee Types menu raises the following error:
```python
You do not have enough rights to access the field "employee_type_id" on
Employee Contract (hr.version). Please contact your system administrator.
Operation: read
User: 2
Groups: allowed for groups 'Payroll / Assistant'
```
**Issue Description:**
The field `employee_type_id` is defined in both modules with different group restrictions:
* In `hr/models/hr_version.py`, the [field](https://github.com/odoo/odoo/blob/f7e87637d5c47047ebffda0f3c929c25022c3f27/addons/hr/models/hr_version.py#L184) is restricted to **HR Managers**.
* In `hr_payroll/models/hr_version.py`, the [field](https://github.com/odoo/enterprise/blob/acd831acd0f59f7b8c15bccfb6da0c3969fc3f6d/hr_payroll/models/hr_version.py#L41 ) is extended with the **Payroll / Assistant** group.
When both modules are installed, access to `hr.version.employee_type_id` requires Payroll permissions.
In v19.3, [PR #241780](https://github.com/odoo/odoo/pull/241780/changes) introduced the `employee_count` [computation](https://github.com/odoo/odoo/blob/f7e87637d5c47047ebffda0f3c929c25022c3f27/addons/hr/models/hr_employee_type.py#L25 ) on `hr.employee.type`. During this computation, `_read_group()` is executed on `hr.employee` using the domain.
HR-only users (without hr_payroll.group_hr_payroll_user) cannot read the field, causing below traceback.
**Solution:**
Use `.sudo()` to bypass access control for the system-level computation. This allows:
- HR users without payroll rights to view employee type counts
- The computation to complete without access errors
**Traceback:**
```python
File "/home/odoo/src/odoo/saas-19.3/addons/hr/models/hr_employee_type.py"
line 25, in _compute_employee_count
employee_count_by_employee_type = dict(self.env['hr.employee']._read_group(
...
File "/home/odoo/src/odoo/saas-19.3/odoo/orm/models.py", line 2732, in
check_field_access
raise AccessError(error_msg)
odoo.exceptions.AccessError: You do not have enough rights to access the field
"employee_type_id" on Employee Contract (hr.version).
Operation: read
User: 8
Groups: allowed for groups 'Payroll / Assistant'
```
opw-6246367
upg- 4302826
tbg- 2751
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-prThis update corrects a bug that prevented new online account connections for Canadian bank accounts (without IBANs). The fix skips unnecessary journal checks when an account number is missing, preventing misleading error messages and ensuring proper connection creation. Users with Canadian bank accounts should now experience a smoother connection process.
Original PR description
…unt number When a provider returns an account without `account_number` (typical for Canadian banks, which do not use IBANs), the existing-journal search ran with `bank_account_number = False`.…
…unt number When a provider returns an account without `account_number` (typical for Canadian banks, which do not use IBANs), the existing-journal search ran with `bank_account_number = False`. Because `bank_account_number` is a related field on `bank_account_id.account_number`, that search matched every bank journal in the user's allowed companies whose `bank_account_id` was unset. If any of those journals was tied to a connected online link, the new sync was blocked with the misleading error "There's already a synchronized journal linked to this IBAN", even though no IBAN was involved. Skip the search entirely when `account_number` is falsy: without an identifier there is nothing meaningful to dedup against, and the downstream code already handles `existing_journals` being empty by creating a fresh journal. Note: when the provider omits `account_number`, a delete-and-recreate of the connection will now create a fresh journal rather than coincidentally reusing an unlinked empty-`bank_account_number` journal. That reuse path already failed (with a spurious "IBAN already connected" error) as soon as the user had more than one such journal, so the prior behavior was not reliable. The supported recovery path remains the reconnect button on the existing journal, which uses the `active_id` branch and is unchanged. opw-6253563 Forward-Port-Of: odoo/enterprise#119848
This update fixes an issue where Latin American invoices weren't correctly displaying company-specific document layouts (like 'Bubble') in the header. The change ensures that custom headers are displayed alongside the layout image, providing accurate and branded invoice presentation for LATAM clients. This improves the professional appearance of invoices.
Original PR description
Problem: When printing an invoice for a Latin American (LATAM) company, the company's document layout is not used in the header of the invoice. For example, if an Argentinian company has set up a…
Problem: When printing an invoice for a Latin American (LATAM) company, the company's document layout is not used in the header of the invoice. For example, if an Argentinian company has set up a Bubble layout as its document layout, the header of the invoice will not have the bubble. Steps to reproduce: 1. Install l10n_ar 2. Create an invoice using Electronic Sales Journal 3. Set document layout to Bubble in the company settings 4. Print the invoice 5. Notice that the header of the invoice does not have the bubble Cause: Most LATAM localizations use custom headers for their reports. In report_templates of l10n_latam_invoice_document, it checks if custom_header is set to decide whether to display the custom header. If custom_header is set, the div with class "header" will be hidden, and the custom header will be displayed after the div with class "header". Since the div with class "header" contains the background image that corresponds to the document layout, the background image will not be displayed when div with class "header" is hidden. Solution: Instead of hiding the entire div with class "header" when custom_header is set, only hide the table inside the header. This way, the background image of the document layout will still be displayed even when a custom header is used. opw-6204062 Forward-Port-Of: odoo/odoo#267164
This update resolves a visual bug in the product view where price and cost fields were misaligned. The fix corrects an HTML issue that caused both fields to be rendered as a single cell, ensuring proper display and alignment of cost information within product listings. This improves the user experience and data accuracy.
Original PR description
[FIX] product: fix visual bug cost alignment Issue: Price and Cost were not aligned with other fields in products view. Steps to reproduce: It's present in every product in version 19.3. Cause: Both label and field were inside the same div with colspan="2". Analyzing the HTML, this methodology was converting both the label and the field to the same o_cell not separating properly. Fix: Moved the label to outside the div and removed colspan="2", also added invisible to label. opw-6277458
This update fixes a naming inconsistency within the HTML editor module. The resource used to identify removable nodes was previously incorrect and has now been updated to the correct name, ensuring the editor functions as intended. This ensures the HTML editor operates reliably.
Original PR description
Commit [1] references `unremovable_node_predicates`, while the resource had already been renamed to `is_node_removable_predicates` following commits [2] and [3]. This commit updates the resource name accordingly. [1]: https://github.com/odoo/odoo/commit/66bed84dd0947271471520372e2ffc1c0822a471 [2]: https://github.com/odoo/odoo/commit/7082116417fe52cd9c10f139aa3d48ba77cdfd55#:~:text=unremovable_node_predicates [3]: https://github.com/odoo/odoo/commit/d57a2e50cf25a113b6c43a7927503fac1ff35ac3#:~:text=is_node_removable_predicates --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a delay in Odoo's web map tests by adjusting how the tests wait for responses. The change prevents tests from hanging indefinitely due to potential slowdowns, leading to faster and more reliable test execution. This improves the overall stability and performance of the web map feature.
Original PR description
This commit replaces the waitFor timeout in map view tests with runAllTimers to cope with potential execution slowdowns and avoid waiting for too long while executing the tests. runbot-error-939600
This update resolves an issue where HR users without payroll access couldn't view employee type configurations. The fix adds the 'HR Manager' group permission to the relevant field, ensuring all users can access this critical setting. This prevents errors and maintains consistent functionality.
Original PR description
**Steps to Reproduce** 1. Create a database on v19.3. 2. Install `hr` and `hr_payroll`. 3. Create or log in as a user who only has access rights for the Employee app (`hr`) and no Payroll access. 4.…
**Steps to Reproduce**
1. Create a database on v19.3.
2. Install `hr` and `hr_payroll`.
3. Create or log in as a user who only has access rights for the Employee app (`hr`) and no Payroll access.
4. Go to **Employees → Configuration → Employee → Employee Types**. Opening the Employee Types menu raises the following error:
```python
You do not have enough rights to access the field "employee_type_id" on
Employee Contract (hr.version). Please contact your system administrator.
Operation: read
User: 2
Groups: allowed for groups 'Payroll / Assistant'
```
**Issue Description:**
The field `employee_type_id` is defined in both modules with different group restrictions:
* In `hr/models/hr_version.py`, the field is restricted to **HR Managers**. [field](https://github.com/odoo/odoo/blob/f7e87637d5c47047ebffda0f3c929c25022c3f27/addons/hr/models/hr_version.py#L184)
* In `hr_payroll/models/hr_version.py`, the field is extended with the **Payroll / Assistant** group.
[field](https://github.com/odoo/enterprise/blob/acd831acd0f59f7b8c15bccfb6da0c3969fc3f6d/hr_payroll/models/hr_version.py#L41) When both modules are installed, access to `hr.version.employee_type_id` requires Payroll permissions.
In v19.3, PR #241780 introduced the `employee_count` [computation](https://github.com/odoo/odoo/blob/f7e87637d5c47047ebffda0f3c929c25022c3f27/addons/hr/models/hr_employee_type.py#L25) on `hr.employee.type`. During this computation, `_read_group()` is executed on `hr.employee` using the domain.
[pr] : https://github.com/odoo/odoo/pull/241780/changes
HR-only users (without hr_payroll.group_hr_payroll_user) cannot read the field, causing below traceback.
**Solution**
added `group_hr_manager` group to the field `employee_type_id` so both groups can view employee_type.
**Traceback**
```python
File "/home/odoo/src/odoo/saas-19.3/addons/hr/models/hr_employee_type.py"
line 25, in _compute_employee_count
employee_count_by_employee_type = dict(self.env['hr.employee']._read_group(
...
File "/home/odoo/src/odoo/saas-19.3/odoo/orm/models.py", line 2732, in
check_field_access
raise AccessError(error_msg)
odoo.exceptions.AccessError: You do not have enough rights to access the field
"employee_type_id" on Employee Contract (hr.version).
Operation: read
User: 8
Groups: allowed for groups 'Payroll / Assistant'
```
opw-6246367
upg- 4302826
tgb- 2751This update corrects a potential issue in the Swiss payroll module where users could incorrectly request refunds on payslips. Swiss regulations limit payments to one per month, so the system now guides users to cancel and re-create a payslip for any necessary adjustments. This ensures compliance with Swiss payroll rules.
Original PR description
Prevent refunds for CH payslips since only one payslip per month is allowed for Swiss payroll. Users should cancel the payslip and create a new one to apply corrections. task-5951981 Forward-Port-Of: odoo/enterprise#107943
This update fixes an issue where the 'Due' button wasn't appearing for customers when balances existed only at the line level within journal entries. The change improves the accuracy of balance detection, ensuring the button is always visible for all customers, regardless of how they're linked to accounting records.
Original PR description
Steps to Reproduce: 1. Install Accounting module (without Point of Sale). 2. Create a customer. 3. Create a journal entry with that customer set only at line level. 4. Post the journal entry. 5. Open…
Steps to Reproduce: 1. Install Accounting module (without Point of Sale). 2. Create a customer. 3. Create a journal entry with that customer set only at line level. 4. Post the journal entry. 5. Open the customer form. Issue: The Due smart button is not visible on the partner form even though an outstanding balance exists for the customer. Note: This issue does not reproduce when Point of Sale is installed, as the POS module overrides `_compute_has_moves` with its own implementation that checks the outstanding balance directly. Root Cause: The `_compute_has_moves` method queries only `account.move `for partner matching. When a partner is referenced only at the account.move.line level, the partner is never picked up by this query, resulting in `has_moves = False` and the Due button remaining hidden. Fix: Replaced the EXISTS-based implementation with a UNION-based approach as the EXISTS implementation evaluated the query per partner row, whereas UNION processes all partners in a single batch query. Additionally extended the UNION to also include account.move.line partner matching, ensuring partners referenced only at the line level, are correctly detected and has_moves is set to True. Result: The Due smart button is now correctly visible for all partners with an outstanding balance, regardless of whether the partner is set at the journal entry level or only at the line level. owp = 6243562 Forward-Port-Of: odoo/enterprise#120294 Forward-Port-Of: odoo/enterprise#119084
This update resolves a technical issue where the Urbanpiper order information screen incorrectly displayed customer details even after the customer was removed. The fix ensures that customer information is only shown when a customer is actually linked to the order, improving the user experience and preventing error messages.
Original PR description
Steps to reproduce: ==== - Place an order through Urbanpiper. - Edit the order and remove the customer. - Open the ticket screen and click the info button. - A traceback occurs. Cause: ==== - Customer details were rendered even when no customer was linked to the order. Fix: ==== - Display customer details only when a customer is present on the order. task-6233812 Forward-Port-Of: odoo/enterprise#120290 Forward-Port-Of: odoo/enterprise#118147
This update fixes an issue where extra spaces in code blocks within the To-Do creation feature were incorrectly displayed as ` ` characters. The fix converts these spaces to regular spaces, ensuring accurate syntax highlighting and a cleaner user experience. This improves the overall readability and functionality of the code editor.
Original PR description
Step to reproduce: - Go to To-Do → Create New - Type text with multiple consecutive spaces in the same line - In the same line → insert a /code block Description of the issue: Multiple spaces are converted into ` ` inside the code block. Cause: When the code block is processed for syntax highlighting, its `innerHTML` is used as the source text. During this process, ` ` is not handled as a result it remains as literal text, so syntax highlighting displays ` ` instead of a normal space. Solution: Convert ` ` into a normal space before the content is used for syntax highlighting. task-6184686 Forward-Port-Of: odoo/odoo#267970 Forward-Port-Of: odoo/odoo#263053
This update ensures that overtime hours recorded in the system are accurately recognized as additional working time. Previously, these hours weren't being fully accounted for, leading to potential discrepancies in employee tracking and payroll. This fix improves the accuracy of time and attendance data.
Original PR description
make sure that Overtime Hours entries is concidered as extra hours Task: 6279514 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269539
A bug was preventing users from reordering extra images on product pages through the website editor. This update corrects a technical issue related to how image attachments are handled, ensuring that users can now successfully move images to the first position without encountering errors. This improves the user experience for managing product visuals.
Original PR description
**Problem:** On the shop, moving one of a product's extra images to the first position through the website editor raises a server error. **Steps to reproduce:** 1. Have a product whose TEMPLATE has a…
**Problem:** On the shop, moving one of a product's extra images to the first position through the website editor raises a server error. **Steps to reproduce:** 1. Have a product whose TEMPLATE has a main image set and at least one template-level extra image with different content. 2. Open the shop, open that product, and enter edit mode. 3. Move the extra image to the first position. 4. Observe the error. **Current behavior:** The reorder fails with "Attachment modified when accessing it from a Binary field". **Expected behavior:** The extra image becomes the product's main image and the others keep their order. **Cause of the issue:** Moving an additional image to the first position promotes it to the main image, so `resequence_product_image` swaps the `image_1920` value of the main record and the additional image. The swap was done with a single tuple assignment, where both right-hand reads are lazy values still bound to their attachments. Writing the first field rewrites its attachment in place, which changes that attachment's checksum; the second value is then read from the same attachment and its cached checksum no longer matches, tripping the binary field's concurrent modification assertion. https://github.com/odoo/odoo/blob/55c7c8be9a7a78d683f5b8b6e1703fb051dddd2f/odoo/orm/fields_binary.py#L345-L346 This only surfaces for a narrow combination, which is why it is easy to miss (e.g. on runbot demo data and in the existing tests): The main image being swapped must be a `product.template` record, i.e. the moved image is a template-level extra image. For variant extra images the main image is `product.product.image_1920`, a computed field whose inverse writes elsewhere, so no attachment is mutated in place and no error occurs. https://github.com/odoo/odoo/blob/55c7c8be9a7a78d683f5b8b6e1703fb051dddd2f/addons/product/models/product_product.py#L132 https://github.com/odoo/odoo/blob/55c7c8be9a7a78d683f5b8b6e1703fb051dddd2f/addons/product/models/product_product.py#L249-L255 The product's main image must be set and its content must differ from the moved image (identical content keeps the same checksum). The values must be read from their attachments (the case on a real request; in-memory tests cached them as plain bytes and passed). **Fix:** Reading both image contents into memory before writing decouples each write from the other's attachment, so mutating one attachment can no longer invalidate the value being written to the other. opw-6249950
This update resolves a visual inconsistency in the way account reports display line items. The change ensures that all report lines have the correct styling, improving the overall presentation and readability of financial reports. This improves the user experience for generating and viewing financial data.
Original PR description
commit introducing the issue: https://github.com/odoo/enterprise/commit/6608d5c21a7fb9d57786c2a7618b878e244bd420
This update resolves an issue preventing the import of electronic invoices (like XRechnungen) using email addresses as Peppol EAS endpoints. The fix allows the '@' character in email addresses, correcting a validation error that previously blocked partner creation. This ensures seamless import of invoices with standard email formats.
Original PR description
### Issue When importing an electronic bill (such as a German XRechnung) that uses the Peppol EAS 'EM' (Email) with an email address as the endpoint, the import fails during the automatic partner…
### Issue When importing an electronic bill (such as a German XRechnung) that uses the Peppol EAS 'EM' (Email) with an email address as the endpoint, the import fails during the automatic partner creation An error is logged in the chatter stating that the Peppol endpoint is not valid and should contain only letters and digits Since 'EM' stands for Email, the system should allow the '@' character and validate the endpoint format ### Cause While the export logic supported the 'EM' EAS, the validation flow triggered during automatic partner creation on import was too restrictive The global regex `PEPPOL_ENDPOINT_INVALIDCHARS_RE` did not include the '@' character, causing the validation to fail for any email address Additionally, there was no specific format check implemented for the 'EM' EAS type to ensure the endpoint is a valid email string ### Steps to reproduce - Install `account_edi_ubl_cii` - Go to Accounting / Vendors / Bills - Upload an electronic invoice containing an EM EAS and an email endpoint (you can use the added test file or the one from the ticket) Before the fix, an error is raised in the chatter and the partner cannot be created automatically opw-6205745 Forward-Port-Of: odoo/odoo#266894
This update fixes a visual issue where suggestion icons weren't appearing in the Assistant when it detected activities like 'Working on task'. The fix ensures the Assistant correctly identifies activity types, allowing the icons to display as intended. This improves the user experience and provides clearer guidance within the Assistant.
Original PR description
- When the Assistant detected activities such as 'Working on task', the suggestion icon was not displayed because the event type was not assigned. Unlike `aw.rule` matches, the Odoo URL resolver only set the label and related record information, but did not set the activity type required by `getIcon()`. - Expose the activity type through `get_assistant_data` and assign the activity type when resolving model URLs in extractWatcherActivity. task-6259793 Forward-Port-Of: odoo/enterprise#120370
This update ensures website configuration builds consistently by automatically generating necessary snippet templates for selected themes. Previously, a configuration error would cause a retry, leading to duplicate menu items. Now, templates are created upfront, resolving the issue and improving the website building process.
Original PR description
Steps to reproduce: - Start from a database where the eCommerce app is not installed. - Open the website configurator. - In the first step, choose "I want an eCommerce". - In the Pages and Features…
Steps to reproduce: - Start from a database where the eCommerce app is not installed. - Open the website configurator. - In the first step, choose "I want an eCommerce". - In the Pages and Features step, select all Pages. - Select a theme that adds an eCommerce category snippet, for example "Treehouse". - Build the website. => During the first `configurator_apply`, `website_sale` is installed after the theme and the configured menu items are already created. => The homepage rendering then needs a `website_sale` configurator snippet template requested by the theme, but it was not generated during that first call. => The client retries `configurator_apply`. It now succeeds because `website_sale` is fully installed, but page and menu creation runs again and duplicates the menu items. Before this commit, primary snippet template generation only read the manifest of the module being generated. When `website_sale` was installed from the first `configurator_apply`, it did not see addon snippets declared by the already installed theme. The first call could therefore fail while rendering the homepage after pages and menus were created. After this commit, generation also reads installed theme addon snippets that target the module being generated. The `website_sale` configurator templates requested by the selected theme are created before the first homepage rendering, so `configurator_apply` does not retry after creating menu items. task-5973739 Forward-Port-Of: odoo/odoo#261022
This update resolves a bug where the employee field in the appraisal module wouldn't automatically populate when using the appraisal smart button from the employee record. The fix ensures the correct employee ID is passed to the appraisal action, streamlining the appraisal request process. This improves usability and reduces manual data entry.
Original PR description
[FIX] hr_appraisal: fix auto-fill of employee in appraisal Bug production: 1 - employee app -> department -> select employees -> select any employee -> use appraisal smart button in top ->…
[FIX] hr_appraisal: fix auto-fill of employee in appraisal
Bug production:
1 - employee app -> department -> select employees -> select any employee -> use appraisal smart button in top -> employee_id is not coming
Bug cause:
1 - When we press smart button of appraisal action_send_appraisal_request in hr_employee is called.
2 - It send the self.env.context as a context and active_model and active_id.
3 - In hr_appraisal, _get_default_employee function calculates the default employee_id by looking to context and especially by looking to active model and id.
3.1 - If active_model is hr.employee and there is active_id, it finds the employee automatically (that is the case when we are coming directly from employee -> smart button hr_appraisal)
3.2 - When we first click to department and then we click to employee and smart button, active_model is hr.department and default_employee_id cannot be calculated in default version.
Bug solution:
1 - I have passed the default_employee_id to the context in action_send_appraisal_request function. Since we know the employee in the action_send_appraisal_request function we can pass it directly.
task - 6285434
Forward-Port-Of: odoo/enterprise#119737This update prevents the Timesheet Assistant from incorrectly matching events to projects or tasks with disabled timesheets. The change improves data accuracy and ensures the assistant only focuses on active projects, streamlining workflow and reducing potential errors. This was achieved through backend and frontend updates to filter and manage project/task matching rules.
Original PR description
Currently, the Timesheet Assistant (ActivityWatch) can match events to projects or tasks that have timesheets disabled, either via Custom Rules or Historical Memory.
This commit resolves the issue across the entire pipeline:
- Backend: Updated `resolve_assistant_models_targets` to efficiently filter out records where `allow_timesheets` is False using a search domain.
- Frontend: Updated the `loadData` JS pipeline to intercept and wipe any project/task IDs rejected by the backend, ensuring they cleanly fall back into a single "Unmatched" group.
- Views: Added the `[('allow_timesheets', '=', True)]` domain to `project_id` and `task_id` fields in `aw.rule` views to prevent users from creating invalid rules.
Task: 6267401
Forward-Port-Of: odoo/enterprise#120303
Forward-Port-Of: odoo/enterprise#119403This update corrects a previous issue where sale order reports incorrectly translated the customer's GST/HST number based on the user's language setting. The fix ensures that reports accurately display address information in the customer's preferred language, improving data accuracy and user experience for international customers.
Original PR description
Issue: --- User lang is used to translate address info instead of partner lang. Steps to reproduce: 1- Setup Canada company. 2- Create a partner with GST/HST number set and English lang. 3- Create a SO with the created partner. 4- Change user language to French. 5- Download SO report. The `GST/HST number` is translated to French. Cause: --- This is due to bba2fc505f5d0b4770eacc6877155b1aeda6d772. In the fix c679a9670494c8e6fca92e94d8dba9cca254cb16 we fixed the issue but the doc lang set is added after address set. opw-6252648 Forward-Port-Of: odoo/odoo#269842
This update resolves an issue where the version timeline widget was causing unnecessary page reloads when versions were updated. The fix replaces a delayed refresh with a more efficient method of triggering a data refresh, resulting in smoother and faster timeline updates. This improves the user experience.
Original PR description
A useEffect was added to clear the cache of the versions in case of generation or removal of versions. This is not the best as it waits for everything to be rendered and applied to the DOM to trigger a reload. The alternative is to add a context to the widget and to the orm.searchRead, to trigger a cache miss on version change. task-6289891 Forward-Port-Of: odoo/odoo#269089