Thursday, May 21, 2026
26 changes · saas-19.3
Enhancements to existing features
This update enhances the user experience for warehouse staff who frequently use tablets to view transfer lists. The changes improve the visibility of key information like reference IDs and contact details, ensuring they are easily readable on medium-sized screens. This addresses a usability issue for a common workflow.
Original PR description
Devices with medium screen sizes such as tablets are often used in warehouses. However, when we check a transfer list view, we can not read clearly important info such as reference or contacts because fields are not entirely displayed. Task-id: 6030156
Resolved issues and error corrections
This update corrects a problem where the ABA file generated for Australian payroll wasn't being created correctly. The fix ensures the payslip batch is assigned before payment validation, guaranteeing the ABA file contains accurate payment information. This resolves a previous issue and improves the reliability of payroll reporting.
Original PR description
Payslip batch needs to be assgned before the payment batch is validated, otherwise the ABA file will be blank. This commit ensures that flow and the test ensure both aba flows generate the same file content. task-6123029 Forward-Port-Of: odoo/enterprise#116907 Forward-Port-Of: odoo/enterprise#114970
This update corrects a bug where attendance records were disappearing after a public holiday was added. The issue stemmed from a mismatch between how attendance dates were stored (in UTC) and how they were compared against local timezones. The fix ensures attendance dates are correctly converted to the employee's timezone for accurate reporting.
Original PR description
**Steps to reproduce in runbot:** 1. Install hr_holidays_attendance. 2. Create an employee with a contract start date (e.g., April 1st). 3. Set the timezone(for both user and emp working schedule) to…
**Steps to reproduce in runbot:** 1. Install hr_holidays_attendance. 2. Create an employee with a contract start date (e.g., April 1st). 3. Set the timezone(for both user and emp working schedule) to Europe/Brussels. 4. Create an attendance record (e.g., April 15th). 5. Go to Reporting > Time Off Ledger and remove all filters. -> Attendance is correctly shown for all dates from April 1st 6. Create a public holiday on April 16th starting at 00:00. 7. Check the Time Off Ledger again. **Issue:** The attendance entry for April 15th disappears after adding the public holiday. **Cause:** Calendar leave datetime fields (date_from/date_to) are stored in UTC but compared against attendance dates without converting to the employee's resource calendar timezone, causing date boundaries to shift and records to be incorrectly excluded. https://github.com/odoo/odoo/blob/b293ce50e0fc9355ffd233557f079916b514eac7/addons/hr_holidays_attendance/report/hr_leave_attendance_report.py#L133-L144 **Solution:** Convert calendar leave datetimes to the employee timezone before casting to date, ensuring comparisons reflect the correct local boundaries. **NOTE:** This issue is mainly reproducible on runbot since its server timezone is GMT. On local machines configured with UTC, the stored datetime values already align with the expected conversions, so the date shift does not occur. opw-6118043 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265129 Forward-Port-Of: odoo/odoo#262179
This update resolves a problem where the Brazilian localization module (`l10n_br`) was incorrectly referencing a field that had moved in a recent upgrade. The change ensures the module correctly pulls data from the updated address form fields, maintaining accurate address information for Brazilian users. This update is a critical fix to prevent potential data inconsistencies.
Original PR description
Issue: ------ `l10n_br.address_form_fields` inherits from `portal.address_form_fields` but targets a `<select>` element that was moved to `portal_address_extended.address_extended_form_fields` in…
Issue: ------ `l10n_br.address_form_fields` inherits from `portal.address_form_fields` but targets a `<select>` element that was moved to `portal_address_extended.address_extended_form_fields` in [saas~19.2]. Traceback: ---------- ```py Error while parsing or validating view: Element '<xpath expr="//select[@name='city_id']/option[not(@value='')]">' cannot be located in parent view ``` Steps to reproduce: ------------------- 1. Install `l10n_br` in v19 2. Upgrade to v19.2 3. Upgrade the `l10n_br` module → Traceback Root cause: ----------- The view is adapting an element owned by a sibling view, making the inheritance hierarchy conceptually wrong and fragile. Solution: --------- Update the `inherit_id` of `l10n_br.address_form_fields` to `portal_address_extended.address_extended_form_fields` so it correctly inherits from the view that owns the targeted element. opw: [6125901] [saas~19.2]: https://github.com/odoo/odoo/commit/026c6f9f2a388ee509a135c53e38f5bb3d08ff73 [6125901]: https://www.odoo.com/odoo/70/tasks/6125901?debug=1 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#264045
This update resolves an issue where users couldn't edit dates within the blog section due to a missing plugin configuration. The fix ensures the `DateTimeFieldPlugin` is correctly included in the necessary Odoo lists, allowing for proper date field editing and preventing potential save errors. This improves the user experience for blog content management.
Original PR description
The plugin `DateTimeFieldPlugin` was only added in registry `builder-plugins`. But it should also be included in the lists `CORE_PLUGINS` of `html_builder` and `TRANSLATION_PLUGINS` of `website` (the same as `MonetaryFieldPlugin` and similar plugins) Steps to reproduce: - Open `/blog` in translate mode - Click on a date - Bug: you can edit the text (and it will likely cause an error on save) task-6226376 Forward-Port-Of: odoo/odoo#265400 Forward-Port-Of: odoo/odoo#264943
This update fixes an error in the WPS payroll report generation process. Specifically, it ensures the report accurately reflects payment dates and values, preventing potential discrepancies when generating the WPS file. This improves the reliability of payroll reporting for Saudi Arabia.
Original PR description
In this commit, we: - corrected the tooltip description of `l10n_sa_wps_value_date`; - added back the Debit Date to the WPS file and assigned it the value of the `effective_date`; - added back the user error in case the Payment Date is greater than or equal to the Value Date. TaskID-6130969 Forward-Port-Of: odoo/enterprise#115762
This update resolves an issue where the skill addition form in Odoo 19.3 would freeze when using 'Save & New'. The fix ensures the form correctly retrieves and updates data, preventing this freezing behavior and guaranteeing the badges many2one field functions reliably.
Original PR description
Issue: - Since 19.3, using "Save & New" while adding skills could freeze the subsection in forms using the badges many2one field. - The component was relying on `record` and `field` values captured during setup, which became stale after the form state was recreated. Fix: - Updated the special data hook to read `record`, `name`, and related field values directly from hook props instead of setup-scoped values. - Updated `useSelectCreate` to dynamically retrieve the relation from current props. Impact: - Prevents the skill subsection from freezing after using "Save & New". - Ensures the badges many2one field always works with the latest record state. Task: 6147646 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where certain Italian taxes (INPS and Pension Fund) weren't properly imported from CSV files. The fix ensures these taxes are correctly configured within Odoo, allowing for accurate processing of vendor bills and compliance with Italian tax regulations. This improves the reliability of tax calculations and reporting.
Original PR description
### Issue before this commit: In the previous implementation, several Italian taxes, specifically the 4% INPS and the 4% Pension Fund (F.Pens), were not correctly initialized. Although the relevant…
### Issue before this commit: In the previous implementation, several Italian taxes, specifically the 4% INPS and the 4% Pension Fund (F.Pens), were not correctly initialized. Although the relevant EDI data was present in the source CSV templates, it was missing from the actual tax records in the database. ### Steps to reproduce the issue: 1. Download Accounting and l10n_it_edi 2. Go to Accounting -> Taxes 3. Open 4% INPS tax and 4% F.Pens and go to Advanced Options tab and see that no Pension Fund Type is associated by default ### Cause of the issue: While moving the witholding data from l10n_it_edi to l10n_it in this commit https://github.com/odoo/odoo/commit/40e09ca01242 the templates were not correcly rendered and set up. ### Reason to introduce the fix: For a tax to be correctly recognized from the XML, it is essential that we have the corresponding tax already configured in Odoo, including the specific type. We should have at least these two taxes fully configured so the system can elaborate them correctly when imported from vendor bills. opw-6093221 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258947
This update ensures that the customer reference field from invoices is correctly included in the fa3 XML files sent to the Polish tax authority (KSEF). Previously, this information was missing, which could cause processing delays. This fix improves invoice accuracy and compliance with Polish tax regulations.
Original PR description
**STEP TO REPRODUCE** 1. Create an invoice and fill the customer reference field (other info tab). 2. send the invoice to ksef. 3. Open the generated fa3 file, and notice there is no mention of the customer reference. Ticket [link](https://www.odoo.com/odoo/project.task/6150812) opw-6150812 Forward-Port-Of: odoo/odoo#263797
This update fixes an issue where updating a manufacturing order (MO) with a multi-level BOM would only create MOs for the immediate child components, missing the next level. The fix ensures that all necessary MOs are created during the BOM update process, preventing incomplete manufacturing operations. This improves the reliability of production planning.
Original PR description
When updating a mo, if the new component has a multilvl bom, it will only create a mo for the direct child and not the next Steps to reproduce: ------------------- * Create a products "Main",…
When updating a mo, if the new component has a multilvl bom, it will only create a mo for the direct child and not the next Steps to reproduce: ------------------- * Create a products "Main", "Final", "Semi", "Raw" * Create a Bom for "Final" with "Semi" as component * Create a Bom for "Semi" with "Raw as component * Add MTO on Final and Semi * Create a MO for Main with no components and confirm it * Add "Final" to the mo as component as save. -> The MO for "Final" is correctly created with "Semi" as component but there is no MO for "Semi" with "Raw" as component. Observation: ------------- When updating de MO, it will write the new SM (Final) to the production, and we will call ```_autoconfirm_production``` with ```no_procurement```: https://github.com/odoo/odoo/blob/6fb69b5640743d3bc7bb52c73cb27da428f2451c/addons/mrp/models/mrp_production.py#L1051 Where we will directly confirm the sm (```_action_confirm```). From the SM ```_action_confirm``` we will create and run a procurement (manufacture in our case). From the manufacture we will create the new move line for Semi and go through ```action_confirm``` on the manufacturing order: https://github.com/odoo/odoo/blob/9ef76a4d6010191ab7ab1a0d1085972901280dda/addons/mrp/models/stock_rule.py#L116-L118 In the MO ```action_confirm```, we will confirm the move and should create new procurement for the moves that need them, but, since in our case we have ```no_procurement``` in the context, we will set ```create_proc``` to false: https://github.com/odoo/odoo/blob/9ef76a4d6010191ab7ab1a0d1085972901280dda/addons/mrp/models/mrp_production.py#L1635 Since ```create_proc``` is false we will not create a procurement for those move lines: https://github.com/odoo/odoo/blob/6fb69b5640743d3bc7bb52c73cb27da428f2451c/addons/stock/models/stock_move.py#L1557-L1558 https://github.com/odoo/odoo/blob/6fb69b5640743d3bc7bb52c73cb27da428f2451c/addons/stock/models/stock_move.py#L1571-L1580 opw-6005675 Forward-Port-Of: odoo/odoo#258153
This update fixes an issue where service products didn't consistently apply user-defined default units of measure. Previously, the default unit was overridden when a product was marked as a service. Now, the system correctly applies the user's preferred unit of measure for all products, including services, ensuring accurate time tracking and invoicing.
Original PR description
A user-defined default on `product.template` Unit is not applied when the product is of type Service 1. Install Sales and Sales Timesheet 2. Go to Settings > Sales > Product Catalog and enable Units of Measure & Packagings 3. Enable debug mode 4. Go to Sales > Products, open a new product form and set unit to Days 5. In the debug menu (bug icon in the top right), select Set Default Values for Unit = Days and save 6. Reload the page 7. Set the type to Service 8. Unit changes from Days to Hours Same issue happens for `product.product` Issue: User default values are overwritten when certain conditions are met by https://github.com/odoo/odoo/blob/6955370fd2d62c83f0ea24247abf7a9e4b4ebed3/addons/sale_timesheet/models/product_template.py#L55-L57 Solution: Use the user defined default on `uom_id` except for service products that are invoiced with timesheets as they need a time unit of measure opw-6139603 Forward-Port-Of: odoo/odoo#262597
This update fixes an issue where Fedex labels were missing a crucial 'REF' field, which is required by the shipping carrier. The fix ensures that all Fedex labels now correctly include this reference, preventing potential delivery delays or errors. This improves the accuracy and reliability of our shipping process.
Original PR description
Issue ----- `REF` field of Fedex labels is missing. Steps to reproduce ----- - Setup Fedex - Create a product (set weight) - Create a delivery for the product - Set carrier as Fedex - Validate…
Issue
-----
`REF` field of Fedex labels is missing.
Steps to reproduce
-----
- Setup Fedex
- Create a product (set weight)
- Create a delivery for the product
- Set carrier as Fedex
- Validate delivery
- Opend the label
> REF field is empty
Cause
-----
When filling the `CustomerReferences`, we only specify the SO
https://github.com/odoo/enterprise/blob/aae680f5b86fa87193ba6616e8431eed985b2ee7/delivery_fedex_rest/models/fedex_request.py#L309-L313
The `REF` field is populated using `CUSTOMER_REFERENCE` references, which is not present in this case.
Excerpt of the API DOC
-----
```
"CustomerReference": {
"type": "object",
"properties": {
"customerReferenceType": {
"type": "string",
"description": [...],
"example": "DEPARTMENT_NUMBER",
"enum": [
"CUSTOMER_REFERENCE",
"DEPARTMENT_NUMBER",
"INVOICE_NUMBER",
"P_O_NUMBER",
"INTRACOUNTRY_REGULATORY_REFERENCE",
"RMA_ASSOCIATION"
]
},
"value": {
"type": "string",
"description": [...],
"example": "3686"
}
}
},
```
[...] replaces long description strings, refer to API for full documentation.
Result after fix
-----
<img width="477" height="738" alt="image" src="https://github.com/user-attachments/assets/0d3a0786-5b7d-41cc-8548-2dc7b0f379ab" />
-----
Ticket:
opw-6101620
Forward-Port-Of: odoo/enterprise#116870This update significantly speeds up the process of finding BOMs for product records, particularly when dealing with large numbers of products. The change optimizes how the system identifies relevant BOMs, reducing processing time and improving overall MRP performance. This results in faster product configuration and order fulfillment.
Original PR description
Before this commit, finding a bom for a recordset of `products` involved looping over all the boms and it will loop over all the `product_variant_ids` of `bom.product_tmpl_id` if the bom's…
Before this commit, finding a bom for a recordset of `products` involved looping over all the boms and it will loop over all the `product_variant_ids` of `bom.product_tmpl_id` if the bom's `product_id` is NULL. This approach might loop over variants which we are not trying to find a bom for. In additon to that, due to the fact that multiple boms might have the same `product_tmpl_id`, this approach might consider the same variants in the inner loop redundantly even though we matched the variant with a bom in a previous itration.
Worst case, this might result in a time complexity of $O(N * M)$ where N is the number of boms and M is the number of variants.
To improve the performance, I only considered the variants given in the paramater `products` and in addition to that, I created a new dictionary mapping a `product_tmpl_id` to its bom if the bom doesn't have a variant set. By doing this, I can loop over the `products` given and if it doesn't have a bom set then it will be set to the one its template had taken from the previos loop.
In a method call with the following constraints
- **2** products the method was finding a bom for
- The 2 products had the same template and the template contained **550** active variants
- The boms were only related to the template rather than the variants themselves.
| Input Size | Before | After |
| :--- | :--- | :--- |
| 100 | 0.78s | 0.03s |
| 1000 | 8.53s | 0.11s |
| 10000 | 80.99s | 0.73s |
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#247465This update resolves an issue that prevented users from successfully duplicating sale orders when the order's company differed from the website's company. The fix ensures that the duplication process handles company discrepancies gracefully, preventing a traceback error and improving the user experience. This ensures sales operations can continue without interruption.
Original PR description
When duplicating a sale order whose company differs from the website's company, a traceback is raised. Steps to reproduce the error: - Install ``website_sale`` module with demo data - Create a new Company A - Select both the companies your company and Company A - Go to Website > eCommerce > Order > Open any order > Other info, change the company from your company to Company A > Save - Actions > Duplicate Traceback: ```py ValueError: The company of the website you are trying to sell from (Hune Specialized International Co LLC) is different than the one you want to use (My Company (San Francisco)) ``` https://github.com/odoo/odoo/blob/ea56382f804e494a86a72dab02a26134ef358c50/addons/website_sale/models/sale_order.py#L165-L171 Here, when the website's company and sale order's company is different, The above traceback will generate. sentry-7465306461 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where recurring plans weren't appearing in quotation reports when using the DIN5008 template for Swiss companies. The fix ensures that recurring plans are always visible in the generated reports, improving accuracy and providing a complete view of subscription details. This resolves a previous reporting discrepancy.
Original PR description
When generating a quotation for a recurring plan, if the quotation uses the DIN5008 template, the recurring plan is not shown in the report. Steps to reproduce: ------------------- * Make sure…
When generating a quotation for a recurring plan, if the quotation uses the DIN5008 template, the recurring plan is not shown in the report. Steps to reproduce: ------------------- * Make sure l10n_din5008 is installed * Create a Swiss company * Go to the subscription app and create an order with a recurring plan * Print the quotation > Observation: The recurring plan is not shown in the report. Why the fix: ------------ We add a new scss rule to make sure the recurring plan is always shown in the report. https://github.com/odoo/enterprise/blob/fb2eb6cfdc4527e102dd22321975ab3f0d24b88b/sale_subscription/views/subscription_templates.xml#L7-L23 Before: <img width="790" height="677" alt="image" src="https://github.com/user-attachments/assets/342753fa-9655-41ac-a958-f94f6ae2b6c7" /> After: <img width="808" height="756" alt="image" src="https://github.com/user-attachments/assets/4ed726c5-0702-48ee-8578-8b0d2c0f4e55" /> opw-5960219 Forward-Port-Of: odoo/odoo#261727
This update fixes a problem where adding rental products to the cart would fail due to mismatched date calculations. The fix ensures that rental product durations are correctly handled, preventing errors when mixing different rental periods. This improves the reliability of the rental product checkout process.
Original PR description
Steps to reproduce: =================== 1. Go to the shop page and use the rental date picker to select a start and end date with hours. 2. Find a rental product configured with "Days" pricing. 3.…
Steps to reproduce: =================== 1. Go to the shop page and use the rental date picker to select a start and end date with hours. 2. Find a rental product configured with "Days" pricing. 3. Add to card directly from the product card 4. Add a rental product from product image that has date type value date 5. Go to that product details page. 6. Click add to cart -> Invalid operation, You cannot mix different rental periods... Cause: ====== When adding a product from the shop list view, the system uses the default start/end dates (from the rental period) exactly as first added. However, the "Add to Cart" logic on the product details page attempts to adapt the selected dates to the product's specific rental unit (e.g., normalizing the time component for 'Day' pricing). This re-calculation creates a timestamp mismatch between the item already in the cart (from the shop view) and the new item being added (from the details page). Solution: ========= The add-to-cart flow has been updated to correctly utilize the default duration values (the globally selected dates) if they exist. opw-5450576 Forward-Port-Of: odoo/enterprise#117058 Forward-Port-Of: odoo/enterprise#103373
This update fixes a problem where combo prices were incorrectly doubling when multiple items were ordered during pricelist changes. The update ensures that free items are scaled correctly and that parent unit prices are accurately updated, resulting in more reliable combo pricing in the Point of Sale system. This improves the accuracy of sales calculations and prevents overcharging customers.
Original PR description
Fix combo prices doubling when quantity > 1 during pricelist changes. Correctly scale free items in 'getFreeAndExtraChildLines' and ensure parent unit prices are updated in 'setPricelist'. task-id: 5971935 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250666
This update allows users to re-submit invoices that were previously rejected by the tax authorities (SPV). Previously, rejected invoices were deleted and recreated, losing important tracking information. Now, rejected invoices are preserved, providing a history of attempts and improving traceability for Romanian VAT compliance.
Original PR description
Allow users to re-send invoices that were rejected by the SPV. Previously, EDI documents were deleted and recreated on every interaction, losing history in the process. This commit updates existing EDI documents in place instead, preserving failed documents as history for traceability. task-[5976612](https://www.odoo.com/odoo/project/967/tasks/5976612) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254882
This update ensures payments to Viva.com are reliably confirmed, even if the connection is temporarily lost. Previously, a dropped connection would halt payment processing, leading to potential issues with Viva.com. Now, the system automatically retries payment confirmation until successful, providing a smoother and more accurate payment experience.
Original PR description
When a payment was sent to Viva.com and the connection dropped before receiving confirmation, the polling loop in waitForPaymentConfirmation would stop because _handleOdooConnectionFailure set the payment status to "retry" and rejected the promise. This left the payment debited on Viva's side but unconfirmed in the POS. Now the polling uses a direct silent ORM call instead of _call_viva_com to avoid triggering _handleOdooConnectionFailure. On connection failure, the poll silently retries on the next interval until a definitive success/failure response is received. A one-time warning notification informs the user that connectivity was lost. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259746 Forward-Port-Of: odoo/odoo#259564
This update resolves an error that prevented users from viewing historical payslip details in the Indonesian payroll system. The fix ensures that the system correctly handles the retrieval of payslip information, allowing users to access the necessary data. This improves the usability of the payroll reporting feature.
Original PR description
Currently, an error occurs when users click on View GROSS/PPH21/JHT/JP History to see historical payslip line values. Steps to Reproduce: - Install the `l10n_id_hr_payroll` module with demo data. -…
Currently, an error occurs when users click on View GROSS/PPH21/JHT/JP History to see historical payslip line values. Steps to Reproduce: - Install the `l10n_id_hr_payroll` module with demo data. - Switch to the `Indonesian` company. - Go to `Employees` and open an `existing record or create a new one`. - Click on `GROSS/PPH21/JHT/JP History` button. `ValueError: External ID not found in the system: hr_payroll.act_contribution_reg_payslip_lines` The issue occurs because, in [this commit], the act_contribution_reg_payslip_lines window action was removed. However, when viewing historical lines, and it still tries to retrieve this action using its XML ID [1] and then updates its domain, context, and views. As a result, it raises an error due to the missing XML ID. This commit ensures that the method returns a standalone window action dictionary instead of relying on the removed window action record. [this commit]: http://github.com/odoo/enterprise/pull/112571/changes/7094cdc033591258cae7c7df46888c29eaae6248 [1]- https://github.com/odoo/enterprise/blob/103500a805d1ffc1185ed639d613c2d1ede492cb/l10n_id_hr_payroll/models/hr_employee.py#L17-L24 sentry-7489148694
This update resolves an error that occurred when automatically checking out employees with no defined check-out date, specifically when using the hr_attendance and hr_work_entry_attendance modules. The fix ensures accurate overtime calculations by correctly handling timezones, preventing the creation of duplicate overtime entries.
Original PR description
__ ## Short functional explanation of the error While investigating for bug reported on ticket 6036064, I found this other bug. It only occurs when hr_attendance and hr_work_entry_attendance are both…
__ ## Short functional explanation of the error While investigating for bug reported on ticket 6036064, I found this other bug. It only occurs when hr_attendance and hr_work_entry_attendance are both installed. When setting an attendance for an employee that has a check-in date but no check-out date, and running the scheduled action `Automatically check-out employees`, an `expected singleton` error occurs. ## Reproduction Steps 1. Install hr_work_entry_attendance. 2. Create an Employee. In the Payroll tab, set a start date for the contract. In the Settings tab, make sure their timezone is set to Brussels, and set the Overtime Ruleset field to Default Ruleset. 3. In Settings, check the Automatic Check-out box. 4. Go to Attendances. Create an attendance for the employee you just created. Set a Check-in date to 8 am on April 17th, for example, and leave the check-out field empty. 5. Open Scheduled Actions. Search the action Automatically check-out employees and click Run Manually. ### Expected behavior The attendance check-out should be set at the end of April 17th. ### Unexpected behavior An error occurs: `Expected singleton: hr.attendance.overtime.line(39, 40)` ## Origin of the issue When the attendance goes over several days, we set the check-out date to: https://github.com/odoo/odoo/blob/b293ce50e0fc9355ffd233557f079916b514eac7/addons/hr_attendance/models/hr_attendance.py#L618 This is a Naive date. However, it will later be considered as a UTC date. Because the employee's timezone is Brussels, this time will be transformed to 2 am next day when we retrieve attendance intervals. This will result in the creation of overtime entries for both days, causing the Expected Singleton error. https://github.com/odoo/odoo/blob/b293ce50e0fc9355ffd233557f079916b514eac7/addons/hr_attendance/models/hr_attendance.py#L687 https://github.com/odoo/odoo/blob/b293ce50e0fc9355ffd233557f079916b514eac7/addons/hr_attendance/models/hr_attendance.py#L667-L672 In our case, `self.check_in` = April 17th at 06:00:00 and `self.check_out` = April 17th at 23:59:59. Converted, we will obtain April 17th at 08:00:00 and April 18th at 1:59:59. Because of that, at the return: https://github.com/odoo/odoo/blob/b293ce50e0fc9355ffd233557f079916b514eac7/addons/hr_attendance/models/hr_attendance.py#L706-L709 We will return a dict containing 2 intervals: one for 17th April and one for 18th April. We will then create overtime entries with such attendances: https://github.com/odoo/odoo/blob/b293ce50e0fc9355ffd233557f079916b514eac7/addons/hr_attendance/models/hr_attendance.py#L333 leading to the creation of 2 different overtimes for the same attendance. So, when we retrieve the overtime for that attendance: https://github.com/odoo/enterprise/blob/2d2056766441157dc45ebc37b677841c44e5c513/hr_work_entry_attendance/models/hr_version.py#L185, We get the 2. Thus when trying to access their status with: https://github.com/odoo/enterprise/blob/2d2056766441157dc45ebc37b677841c44e5c513/hr_work_entry_attendance/models/hr_version.py#L191 An Expected Singleton Occurs. __ opw-6036064 Forward-Port-Of: odoo/odoo#262257
This update resolves an error that occurred when automatically checking out employees with no defined check-out date, particularly when the hr_attendance and hr_work_entry_attendance modules are used. The fix corrects a timezone calculation issue that was creating duplicate overtime entries, preventing the scheduled checkout action from functioning correctly. This ensures accurate overtime calculations for employees.
Original PR description
__ ## Short functional explanation of the error While investigating for bug reported on ticket 6036064, I found this other bug. It only occurs when hr_attendance and hr_work_entry_attendance are both…
__ ## Short functional explanation of the error While investigating for bug reported on ticket 6036064, I found this other bug. It only occurs when hr_attendance and hr_work_entry_attendance are both installed. When setting an attendance for an employee that has a check-in date but no check-out date, and running the scheduled action `Automatically check-out employees`, an `expected singleton` error occurs. ## Reproduction Steps 1. Install hr_work_entry_attendance. 2. Create an Employee. In the Payroll tab, set a start date for the contract. In the Settings tab, make sure their timezone is set to Brussels, and set the Overtime Ruleset field to Default Ruleset. 3. In Settings, check the Automatic Check-out box. 4. Go to Attendances. Create an attendance for the employee you just created. Set a Check-in date to 8 am on April 17th, for example, and leave the check-out field empty. 5. Open Scheduled Actions. Search the action Automatically check-out employees and click Run Manually. ### Expected behavior The attendance check-out should be set at the end of April 17th. ### Unexpected behavior An error occurs: `Expected singleton: hr.attendance.overtime.line(39, 40)` ## Origin of the issue When the attendance goes over several days, we set the check-out date to: https://github.com/odoo/odoo/blob/b293ce50e0fc9355ffd233557f079916b514eac7/addons/hr_attendance/models/hr_attendance.py#L618 This is a Naive date. However, it will later be considered as a UTC date. Because the employee's timezone is Brussels, this time will be transformed to 2 am next day when we retrieve attendance intervals. This will result in the creation of overtime entries for both days, causing the Expected Singleton error. https://github.com/odoo/odoo/blob/b293ce50e0fc9355ffd233557f079916b514eac7/addons/hr_attendance/models/hr_attendance.py#L687 https://github.com/odoo/odoo/blob/b293ce50e0fc9355ffd233557f079916b514eac7/addons/hr_attendance/models/hr_attendance.py#L667-L672 In our case, `self.check_in` = April 17th at 06:02:00 and `self.check_out` = April 17th at 23:59:59. Converted, we will obtain April 17th at 08:02:00 and April 18th at 1:59:59. Because of that, at the return: https://github.com/odoo/odoo/blob/b293ce50e0fc9355ffd233557f079916b514eac7/addons/hr_attendance/models/hr_attendance.py#L706 We will return a dict containing 2 intervals: one for 17th April and one for 18th April. We will then create overtime entries with such attendances: https://github.com/odoo/odoo/blob/b293ce50e0fc9355ffd233557f079916b514eac7/addons/hr_attendance/models/hr_attendance.py#L333 leading to the creation of 2 different overtimes for the same attendance. So, when we retrieve the overtime for that attendance: https://github.com/odoo/enterprise/blob/2d2056766441157dc45ebc37b677841c44e5c513/hr_work_entry_attendance/models/hr_version.py#L185, We get the 2. Thus when trying to access their status with: https://github.com/odoo/enterprise/blob/2d2056766441157dc45ebc37b677841c44e5c513/hr_work_entry_attendance/models/hr_version.py#L191 An Expected Singleton Occurs. __ opw-6036064 Forward-Port-Of: odoo/enterprise#115828
This update enhances the working files feature within the account reports, making it safer and more user-friendly. Specifically, a confirmation dialog has been added when deleting a working file, and the button is now hidden for non-accountant users to prevent accidental deletions. This ensures data integrity and simplifies the reporting process.
Original PR description
contains: [FIX] account_reports: Working files delete button: - hide it for non-accountant - add confirmation dialog [FIX] account_reports: Working file should always open in cycle view [FIX] account_reports: Always show embedded actions in Working files task-5880319 Forward-Port-Of: odoo/enterprise#115596
This update fixes a bug that caused duplicate vendor creation during EDI import of Swiss VAT documents. The change ensures Odoo correctly matches VAT numbers, regardless of format (flat or formatted), preventing unnecessary partner duplication. This improves data accuracy and streamlines import processes.
Original PR description
### Issue: When importing EDI documents such as Peppol files, Swiss VAT numbers are often provided in a flat format (e.g., CHE530781296TVA), while existing Odoo partners usually store them in the…
### Issue: When importing EDI documents such as Peppol files, Swiss VAT numbers are often provided in a flat format (e.g., CHE530781296TVA), while existing Odoo partners usually store them in the official formatted version (e.g., CHE-530.781.296 TVA) This mismatch prevents proper partner matching and may create duplicate partners during import ### Cause: `_retrieve_partner` lacks Swiss-specific VAT normalization logic in `_import_retrieve_customer_from_vat()` As a result, the matching process fails to: - match formatted and unformatted Swiss VAT numbers - properly handle language suffixes such as `TVA`, `MWST`, or `IVA` If `base_vat` is installed, and the imported XML VAT is `CHE530781296TVA`, a new partner will be created with the structure format `CHE-530.781.296 TVA` As the match won't be made new partner will be created at each import ### Steps to reproduce: - Install `account` - Create a Vendor (Name: Test CH Vendor, Country: Switzerland, Tax ID: CHE-530.781.296 TVA) - Import the bill [CH_bill_to_import.xml](https://github.com/user-attachments/files/27202997/CH_bill_to_import.xml) from the ticket Before the fix, the existing partner is not matched and a duplicate partner is created opw-6072239 Forward-Port-Of: odoo/odoo#262011
This update resolves an issue where the Odoo Agent would time out when updating records without the specific 'natural language query' topic. By adding available menus and models to the context, the Agent now correctly identifies and interacts with records, significantly improving stability and reliability during update operations.
Original PR description
Purpose: -------- The update and create tools can generate a link to show a preview of the created/updated record. However, the list of available menus is only added when the agent has the natural language query topic. Therefore, when using the Odoo Agent (that does not have that topic) to update a record, the LLM loops on the update record tool guessing random menu ids and eventually times out because the tool calls fail since the menu ids guesses do not match the model of the updated record. The list of available menus is now added in the context if the create or update records topics are available on the agent. The list of available models has also been added in this case. Task-6236642
This update optimizes how product wishlists are loaded on the Odoo website’s shop page. Previously, the system was inefficiently retrieving wishlist data for each product, leading to slower loading times. This change reintroduces a previous optimization to batch the retrieval, resulting in a faster and more responsive shopping experience for users.
Original PR description
Was done in the past but lost through f427f795c24ee37ee02302642b77bfc314a9ea43. This commit makes sure the rendering value is still considered when available, to avoid fetching the wishlist content once for each displayed product on the /shop page. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr