Daily updates from Odoo
Monday, June 15, 2026
49 changes · saas-19.3
Resolved issues and error corrections
This update clarifies bank statements for transactions split into multiple lines. Previously, all split lines received the same message, making it difficult to understand each charge. Now, transaction details are added to the label, aligning with CodaBox's breakdown and improving user clarity.
Original PR description
Currently, when global transaction is split into multiple lines, Odoo assigns the exact same communication text to every single split line. This makes it difficult for users to identify what each specific charge is for. To fix this, this commit introduces the transaction category data. Using this data to append specific transaction details to the end of the communication label. As a result, each split line now has a clear, descriptive label that closely matches the detailed breakdown provided by CodaBox. task-6059709 Forward-Port-Of: odoo/enterprise#113811
This update resolves a crash issue that occurred during pivot table autofill operations, specifically with formulas like `=PIVOT(1)`. By adding a check for simple `=PIVOT(...)` formulas, the system now consistently prevents crashes and maintains predictable behavior, ensuring a smoother user experience.
Original PR description
Current behavior before PR: - Autofill on formulas like `=PIVOT(1)` could crash after the refactor in e34c0a3, the new logic tried to process all pivot formulas. - However, simple `=PIVOT(...)` cases do not require any change in formula during autofill. Desired behavior after PR is merged: - Add an early return for pivot formulas that are not `PIVOT.VALUE` or `PIVOT.HEADER`, avoiding unnecessary processing. - Ensure `=PIVOT(...)` formulas remain unchanged during autofill, preventing crashes and keeping behavior consistent. Task: [6158888](https://www.odoo.com/odoo/project/2328/tasks/6158888) Forward-Port-Of: odoo/enterprise#119390
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
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 fixes an error in the vehicle contract report that was incorrectly adding recurring costs. The issue stemmed from overlapping database queries, leading to inflated totals. The fix replaces multiple joins with a single, more efficient query, ensuring accurate cost reporting for vehicles.
Original PR description
Steps to reproduce: ------------------- 1. Install Fleet with demo data. 2. Create a contract for a vehicle (A) with a recurring cost of 1000 and "Monthly" frequency. 3. Go to Reporting > Costs and…
Steps to reproduce: ------------------- 1. Install Fleet with demo data. 2. Create a contract for a vehicle (A) with a recurring cost of 1000 and "Monthly" frequency. 3. Go to Reporting > Costs and verify the monthly cost (it shows 1000). 4. Create another contract for the same vehicle (A) with a recurring cost of 50 and "Monthly" frequency. 5. Check the monthly cost again. Issue: ------ The reported cost is incorrect. Instead of 1050 (1000 + 50), it shows 2100. Cause: ------ The query uses multiple LEFT JOINs on the contract table, including: https://github.com/odoo/odoo/blob/9ca36dbe53692309bac84329de3b54a1c510cce0/addons/fleet/report/fleet_report.py#L103 These joins overlap and produce duplicate rows for the same vehicle and month, which results in inflated cost totals. Solution: --------- Replace the multiple LEFT JOINs with a single LATERAL join. This ensures the contract table is processed once per vehicle per month and avoids duplication, resulting in correct totals. **Before:** <img width="940" height="609" alt="image" src="https://github.com/user-attachments/assets/e5b3e747-1135-4674-97c9-4e4fd9986dfd" /> **After:** <img width="1053" height="590" alt="image" src="https://github.com/user-attachments/assets/f0df3819-07fb-4de5-aab3-5b4c6f10d213" /> opw-6024132 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256051
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 fixes an issue where the VAT books report was incorrectly including withholding tax in the total VAT calculation for Spanish companies. The fix excludes 'retencion' (withholding tax) from the VAT calculation, ensuring accurate reporting of VAT liabilities. This ensures compliance and reliable financial reporting.
Original PR description
Step to reproduce - install `l10n_es_reports` and switch to ES company - create a invoice, add a product, set price = 100 - add two taxes (one should be withholding tax) ex: 21%G and 19%whi - confirm it, total payable is now 100 + 21 - 19 = 102 - open vat Books report for ES, see line for this invoice Observation: - for this invoice, in total vat column, we get 102 value - it should be 100+ 21 i.e 121 as we do not include withholding taxes in total vat Cause: - the query for report used to sum up all the taxes for calculating vat Fix: - excluded tax of type "retencion" in tax summation opw-6082329 Forward-Port-Of: odoo/enterprise#120270 Forward-Port-Of: odoo/enterprise#114137
This 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 resolves an issue where closing and reopening records with x2many fields would cause a crash. The fix ensures that all related lists and records share the same 'fields' object, correctly updating the display of property fields within those lists. This improves stability and user experience when working with complex data structures.
Original PR description
Have an x2many field displayed as a list in a form view. In the arch, the x2many form view **isn't** inlined. In that x2many form view, there's a properties field. When a record is clicked,…
Have an x2many field displayed as a list in a form view. In the arch, the x2many form view **isn't** inlined. In that x2many form view, there's a properties field. When a record is clicked, `extendRecord` is called to add the new fields (those of the form) into `this.fields` and those fields are fetched. If there're properties in the property definition, fake fields are created to represent them (see `_processProperties`). However, because of extendRecord, the static list and the record don't share the same reference to the `fields` object. As a consequence, the `fields` object of the static list isn't updated with the fake property fields. If the user closes the record, and opens/closes it again, there's a crash, because the record is re-updated with the fields of the static list, and thus doesn't know about those property fields anymore. This commit fixes the issue by ensuring that we keep the same `fields` object when extending a record, s.t. the list and all its records always share the same object. Bug originally reported here: https://github.com/odoo/odoo/pull/268312 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269717
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 fixes a bug where purchase order line prices were incorrectly set to zero when using reordering rules with expired vendor price lists. The fix ensures the system uses the correct product cost or a valid fallback price, preventing inaccurate purchase order pricing. This improves the reliability of purchase order generation.
Original PR description
Version: ---------- - 18.0+ Steps to reproduce: ----------------------- 1 - Install the `purchase` and `stock` modules. 2 - Create a storable product with tracking enabled. Set the Cost (standard…
Version: ---------- - 18.0+ Steps to reproduce: ----------------------- 1 - Install the `purchase` and `stock` modules. 2 - Create a storable product with tracking enabled. Set the Cost (standard price) to 50. 3 - Open the product form and go to the Purchase tab. * Add a vendor with: * Quantity: 2 * Price: 10 4 - Create a Reordering Rule for this product: * Route: Buy * Trigger: Manual * To Order Quantity: 2 5 - Click on the Order button to generate a purchase order. 6 - Open the generated Purchase Order and verify the Unit Price on the purchase order line. 7 - Open the same product and go to the Purchase tab. In the existing vendor line, add an End Date lower than today so the vendor pricelist becomes expired. 8 - Reopen the same reordering rule. Change To Order Quantity to 1. 9 - Click on the Order button again Issue: ----- The generated purchase order line gets a Unit Price of 0 instead of keeping the product cost or a valid fallback price. Root Cause: -------------- - When clicking on `Order`, it triggers `action_replenish`, which calls the procurement flow: `_procure_orderpoint_confirm` → `run` → `run` → `_run_buy`. - Inside `_run_buy`, the system checks whether a `purchase.order.line` already exists. In this case, the PO line exists, so it calls `_update_purchase_order_line`. https://github.com/odoo/odoo/blob/47ef8b75d0c90001b9989a95f09b962c5b286c53/addons/purchase_stock/models/stock_rule.py#L137 - In `_update_purchase_order_line`, the system tries to fetch a seller using `_select_seller`, - which internally calls `_get_filtered_sellers`. https://github.com/odoo/odoo/blob/47ef8b75d0c90001b9989a95f09b962c5b286c53/addons/product/models/product_product.py#L759 - However, if the seller's `end_date` is less than `today`, `_get_filtered_sellers` skips that seller and returns no valid seller. https://github.com/odoo/odoo/blob/47ef8b75d0c90001b9989a95f09b962c5b286c53/addons/product/models/product_product.py#L731-L733 - As a result, `_update_purchase_order_line` does not find any seller and falls back to setting `price_unit` to `0`, causing the purchase order line price to be updated incorrectly. https://github.com/odoo/odoo/blob/47ef8b75d0c90001b9989a95f09b962c5b286c53/addons/purchase_stock/models/stock_rule.py#L259 --- opw-6117461 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269971 Forward-Port-Of: odoo/odoo#262396
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 fixes an issue where the Datev export incorrectly displayed currency amounts due to a mismatch between the invoice currency and the company currency. The fix ensures that currency calculations in the Datev export align with the invoice's currency, improving the accuracy of financial reports for German clients.
Original PR description
There is an issue in the Datev export functionality. In the current functionality, the code calculates a delta between the taxes in the `tax_totals` and the ones on the journal items. Issue is, the tax amounts from tax_totals were always in company currency, while the entry itself can use a foreign one. This replaces the use of company currency with the use of the invoice's currency and appropriately adjusts the test featuring foreign currency. Steps: Create a foreign currency. Create an invoice with a taxed product using the currency. Export the ledger to Datev. Inspect the resulting csv. Note that neither the final listed price, nor the rate listed for the currency align with the ones in the db. opw-6275889 Forward-Port-Of: odoo/enterprise#120293
This update resolves an issue where inventory counts weren't accurately recording products without lot numbers. Previously, scanning these products incorrectly updated existing inventory lines. Now, the system correctly creates new inventory lines for lotless products during counts, ensuring accurate stock tracking.
Original PR description
### Steps to reproduce: 1. Create a product tracked by lot 2. Put 10 units in WH/Stock without lot 3. Inventory > Operations > Adjustments > Physical Inventory 4. Select the line referring to your…
### Steps to reproduce: 1. Create a product tracked by lot 2. Put 10 units in WH/Stock without lot 3. Inventory > Operations > Adjustments > Physical Inventory 4. Select the line referring to your product and request an inventory count + Show Expected Quantity 5. Open the barcode app > Count Inventory 6. Scan your product #### > The line is not selected, in particular, next scans will be re-interpreted as product scans rather than new serial creation for your product. ### Cause of the issue: Scanning your product search a line to select if any: https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_model.js#L1432-L1435 https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_model.js#L1630-L1632 However, the `findLine` will fail since this method calls the `_canOverrideTrackingNumber` to determine if the lot of the barcodData matches the one of the line: https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_model.js#L1859-L1863 But, the override of the `_canOverrideTrackingNumber` method for the `BarcodeQuantModel` does not handle the absence of lotName in the barcodeData correctly as it does not consider that a line without lot can be overridden by an empty lotName: https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_quant_model.js#L729-L731 Note however that the super call does: https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_model.js#L795-L798 ### Issue 2: ### Steps to reproduce: - Steps 1 -> 5 - Click on your product line to select it - Scan a new lot to add one new unit referring to that lot - Confirm (1) - Apply Now #### > User Error: Quant's editing is restricted, you can't do this operation Since the line is selected, you have a currentLine during the `processBarcode` and hence the existing line will be updated using the `lotName``: https://github.com/odoo/enterprise/blob/cf3c2fce8a6b7b2d7547d44a0e4423f887986d52/stock_barcode/static/src/models/barcode_model.js#L1560-L1584 However, writing on the line will then try to write on the related quant during the validation process which will be forbiden since we are not allowed to change the lot of an existing quant: https://github.com/odoo/odoo/blob/e3b0ca11d99b2ef819cdad68b169112cd73668b6/addons/stock/models/stock_quant.py#L351-L360 Now, the issue is that actually due to the nature of the line and of the barcode data, the line lot is not expected to be updated but rather a new line is expected to be created: https://github.com/odoo/enterprise/blob/cf3c2fce8a6b7b2d7547d44a0e4423f887986d52/stock_barcode/static/src/models/barcode_model.js#L795-L798 Additional issue: Fixing issue 1 and 2 highlight and other issue of the validation process: - Steps 1 -> 6 > The line gets selected - Scan a newlot > a new subline is added referring to 1 unit of your new quant - Confirm (1) > Some serials where not counted, set them as missing #### > Check your quants: the 10 unit lotless quant was not updated but a new quant for 1 units was created for your newlot ### Cause of the issue: Applying all quantities is expecting to toggle them as counted before applying to update the existing quants: https://github.com/odoo/enterprise/blob/c8535a7a0e2eae811048a34a0bae187a1fa45311/stock_barcode/static/src/models/barcode_quant_model.js#L72-L82 https://github.com/odoo/enterprise/blob/c8535a7a0e2eae811048a34a0bae187a1fa45311/stock_barcode/static/src/models/barcode_quant_model.js#L287-L296 However, only line tracked by serial numbers are set as counted: https://github.com/odoo/enterprise/blob/c8535a7a0e2eae811048a34a0bae187a1fa45311/stock_barcode/static/src/models/barcode_quant_model.js#L60-L63 opw-6212923 Forward-Port-Of: odoo/enterprise#118373
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 an issue where reloading the Point of Sale while the system was in a specific state caused data loss and errors. The fix prevents a race condition between sending a beacon and initiating a new POS request, ensuring a smoother and more reliable reload experience. This improves overall POS stability for users.
Original PR description
When the user reloads the POS while the session is in opening_control, the beforeunload sendBeacon and the new pos_web request race. If the beacon is processed first it deletes the session and load_data fails. task-6259527 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268668 Forward-Port-Of: odoo/odoo#267190
This update fixes an issue where employee out-of-contract payments weren't being correctly deducted when multiple contract versions existed. The system now accurately calculates deductions based on the contract's start date, ensuring accurate payroll processing for employees with amended contracts.
Original PR description
…rsions on same contract **Steps to reproduce**: - Create a contract version from May 1 to May 14. - Create another contract version starting on May 15, then create an amendment version from May 20. - Generate a payslip for May using the May 20 version. - The employee receives the full monthly wage. The out of contract period (May 1 to May 14) is not deducted. **Reason**: - OUT worked days are linked to the first version of the contract starting on May 15. - When computing the OUT ratio, the system only considers worked days linked to the exact version being processed. - As a result, the May 20 amendment version does not see the OUT worked days and no deduction is applied. **Fix**: - Compute the OUT ratio using the contract start date instead of the current version, ensuring OUT worked days are correctly taken into account across all versions of the same contract. Task: 6259341 Forward-Port-Of: odoo/enterprise#119893
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 corrects a bug where bank statement CSV imports were incorrectly multiplying amounts by 100. The fix ensures that debit and credit values are parsed correctly, regardless of whether the 'account_bank_statement_extract' module is installed. This prevents inaccurate financial data import.
Original PR description
Steps to reproduce --- 1. With Accounting installed, import a bank statement CSV that has separate Debit and Credit columns using number separators (e.g. a line with "1.234,56"). 2. Map the columns…
Steps to reproduce --- 1. With Accounting installed, import a bank statement CSV that has separate Debit and Credit columns using number separators (e.g. a line with "1.234,56"). 2. Map the columns to Debit and Credit and import. The imported amounts are multiplied by 100: "1.234,56" is imported as 123,456.00. Issue --- This only happens when both `account_bank_statement_import_csv` and `account_bank_statement_extract` are installed, which is the default in any Accounting database since both modules are auto-installed. `account_bank_statement_extract` turns debit and credit into real Monetary fields on `account.bank.statement.line`: https://github.com/odoo/enterprise/blob/af863c5a53d0ab50fe67cb9ea910391d4a1979dd/account_bank_statement_extract/models/account_bank_statement_line.py#L7-L8 Because they are now real fields, the generic importer already converts those columns to floats: https://github.com/odoo/odoo/blob/bfa39854e56da4bf23295d62f63d66973ad0d78e/addons/base_import/models/base_import.py#L1281-L1285 The CSV statement wizard then parses the same columns a second time: https://github.com/odoo/enterprise/blob/d7ab7ee1287342638006e290ede20b955aae8370/account_bank_statement_import_csv/wizard/account_bank_statement_import_csv.py#L92-L93 The first pass correctly reads "1.234,56" as "1234.56", but the second pass sees a lone dot, mistakes it for the thousands separator, strips it, and produces 123456. The wizard now parses debit and credit only when they are virtual fields, so when they are real fields the values parsed by the generic importer are reused instead of being parsed twice. Without `account_bank_statement_extract`, debit and credit exist only as virtual import fields, so the generic importer skips them and the wizard parses them once. That is why the regression stays hidden until the extract module is present. opw-6227083 --- Forward-Port-Of: odoo/enterprise#118979
This update corrects a bug in how Odoo imports products from UBL invoices. Specifically, when searching by product name, the system incorrectly linked multiple products to the same line, leading to inaccurate data. This fix ensures that products are correctly associated during import, preventing data inconsistencies.
Original PR description
**PROBLEM** When retrieving a product by name, there is no cache_key for the search_method criteria. This leads to the cache_key frozendict being an frozen dict with None values. This means, once we retrieve a first product with the search_method criteria, all following product will match its cache_key, so we ends up associating a product to all subsequent lines, even if they don't have anything in common. **STEP TO REPRODUCE** 1. Create a product with the name: "CASTELTORRE MERLOT DELLE VENEZIE 75CL 10,5i" (it's important the name is not exactly matching) 2. Import the xml which is attached to the bug fix ticket. 3. Notice the product column on all the lines after a certain point have the CASTELTORRE product, even though the corresponding line in the ubl is for another product. opw-6227280 Forward-Port-Of: odoo/odoo#265987
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 significantly improves the speed of searching for partners (customers and suppliers) within the Point of Sale module. By optimizing the search process and reducing unnecessary sorting, the system now responds much quicker, especially when dealing with large customer databases. This enhances the efficiency of sales staff and improves the overall user experience.
Original PR description
Improve partner search response time on large databases (1M+ rows): - Implement smart field selection based on input type (phone, email, text). - Use prefix search (=ilike) for identifiers and exact match for barcodes. - Remove expensive sorting by complete_name in the backend. - Increase search limit to 500 to reduce network round-trips. task-id: 6143737 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265943 Forward-Port-Of: odoo/odoo#260347
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
This update corrects a calculation error in the Saudi HR payroll module that impacted GOSI contributions for employees with unpaid leave. The fix prortions contributions based on actual worked days, ensuring accurate deductions for employees taking time off. This improves payroll accuracy and compliance for Saudi operations.
Original PR description
Task: 6279514 Forward-Port-Of: odoo/enterprise#119990
This update fixes an issue where long-term sick leave payments weren't correctly calculated due to an outdated system. The change ensures existing sick leave data is properly processed, guaranteeing accurate unpaid sick leave payments as required by Belgian regulations. This prevents incorrect payroll calculations.
Original PR description
Following this task: https://www.odoo.com/odoo/project/1251/tasks/5942163, sick time offs are automatically split between paid/unpaid when the leave is created. However, existing data was not upgraded, and might result on sick leaves not being unpaid when they should. This commit re-introduces the method to ensure legacy compatibility with existing sick leaves. Upgrading the data by splitting/creating new sick leaves would be too heavy. task-6297274
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 fixes a potential issue where certified point-of-sale configurations could allow users to enter negative quantities on order lines. This restriction has now been implemented across both the backend and frontend of the system, ensuring data accuracy and preventing incorrect inventory calculations. This change improves the reliability of our POS system for certified users.
Original PR description
Certified pos configs should not allow to set negative quantities on order lines. We now prevent it from both backend and frontend. see odoo/odoo#269487 task-5942777 Forward-Port-Of: odoo/enterprise#120513 Forward-Port-Of: odoo/enterprise#119702
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 addresses a missing rule in the calculation of employer costs within the Odoo Enterprise system. Following a review, a crucial rule was identified and added to ensure accurate employer cost reporting. This improves the reliability of payroll and HR data.
Original PR description
In this previous PR https://github.com/odoo/enterprise/pull/106839 the computation of the employer cost was fixed and many rules were flagged as needed in that computation. After a report, we found one of the rules was missing so we add it in this PR. Task: 6088412 Forward-Port-Of: odoo/enterprise#112681
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 ensures that stock reports automatically print when a Point of Sale (POS) order is validated. Previously, the print job wasn't triggered, causing delays in stock reporting. The change adds a system to retrieve and execute report actions, streamlining the process and improving inventory tracking.
Original PR description
Validating a `pos.order` creates a stock move in inventory. However, when configuring reports to automatically print on validation, the print job wasn't triggered from the pos. We added a way to retrieve report actions and execute them. Task: 5392414 Forward-Port-Of: odoo/odoo#269614 Forward-Port-Of: odoo/odoo#239084
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
This update resolves an issue where the URL used for OAuth authentication with the Romanian tax authority (ANAF) was incorrectly generated. The previous method relied on the user's current session, leading to a mismatch with the registered URL. This change ensures the correct URL is used, allowing for proper authentication and tax reporting.
Original PR description
The `_compute_l10n_ro_edi_callback_url` method was using `request.httprequest.url_root` to build the OAuth callback URL. The URL is derived from the current HTTP request, meaning it reflects however the user accessed the session at that moment (e.g. internal IP, localhost, non-standard port). This produces a callback URL that does not match what was registered with ANAF, breaking the OAuth flow. 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#268974 Forward-Port-Of: odoo/odoo#265000