Monday, May 5, 2025
21 changes · saas-18.3
Enhancements to existing features
The HR contract module now provides a wage normalization method needed by ESG reporting integrations. This places the calculation where dependent ESG features can access it without requiring the payroll module, improving compatibility with lighter HR setups.
Original PR description
Before this commit, the method `_get_normalized_wage` should have been declared in `hr_contract` rather than `hr_payroll` since the esg bridge depends only on hr_contract. This commit adds the method in `hr_contract` with a more approximate approach given the available information.
Calendar events now store video call references in a way that can be searched more efficiently. This should improve performance for calendar operations that need to find events linked to a video call, with no expected change to user workflows.
Original PR description
https://github.com/odoo/odoo/pull/199532 introduce a `One2many` on `videocall_channel_id`. This PR index `videocall_channel_id`.
Resolved issues and error corrections
This update adjusts the bank reconciliation widget so its buttons and editable line actions display more reliably. It helps accounting users work through reconciliation with fewer visual issues or misplaced controls.
Miscellaneous changes
In this commit we remove checkDelay from codebase because it is no longer used since https://github.com/odoo/odoo/pull/194508 has been merged. 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#206148 Forward-Port-Of: odoo/odoo#205524
Original PR description
In this commit we remove checkDelay from codebase because it is no longer used since https://github.com/odoo/odoo/pull/194508 has been merged. 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#206148 Forward-Port-Of: odoo/odoo#205524
### Steps to reproduce: - Go to Expenses > Expense Reports - Make sure that no expenses are present to make the sample data display - Try clicking on the left panel to change the filter on the status - It doesn't work ### Cause: The display of sample data adds the class "o_view_sample_data" to the `Layout` component containing the control panel, the search panel and the list ([see](https://github.com/odoo/odoo/blob/e1b6f55840c9d5e2c0f6705add8d82a311fb04a7/addons/web/static/src/views/list
Original PR description
### Steps to reproduce: - Go to Expenses > Expense Reports - Make sure that no expenses are present to make the sample data display - Try clicking on the left panel to change the filter on the status…
### Steps to reproduce: - Go to Expenses > Expense Reports - Make sure that no expenses are present to make the sample data display - Try clicking on the left panel to change the filter on the status - It doesn't work ### Cause: The display of sample data adds the class "o_view_sample_data" to the `Layout` component containing the control panel, the search panel and the list ([see](https://github.com/odoo/odoo/blob/e1b6f55840c9d5e2c0f6705add8d82a311fb04a7/addons/web/static/src/views/list/list_controller.xml#L6)). When this class is added, the events are ignored for div with `form-check` ([see](https://github.com/odoo/odoo/blob/e1b6f55840c9d5e2c0f6705add8d82a311fb04a7/addons/web/static/src/views/view.scss#L7-L10)) As the `SearchPanel` component is inside the `Layout` component and contains form-check for the filters on Selection fields (state for example), this filter also gets deactivated. ### Solution: Add the class `o_view_sample_data` in the Renderer and not the Controller component, this way we make sure that only the interactions with the sample data get deactivated. Doing this implies adding a prop in the Renderer to pass the value of `useSampleModel` to the renderer. Fix done for the list and kanban view which are problematic with the Expense Reports page. opw-4707016 Forward-Port-Of: odoo/odoo#208100 Forward-Port-Of: odoo/odoo#206060
Problem: When viewing the project update of a project that timesheets on a service product with standard valuation, the 'cost_of_goods_sold' section is displayed when it should not be. Purpose: The COGS section should only be displayed in the project updates if COGS lines exists in relation to the project. The behavior should stay consistent with v17.0 as with this commit: #203936 Steps to reproduce the issue: 1. Install Purchase, Sales, Project,sale_project, Inventory, Timesheets 2. Cre
Original PR description
Problem: When viewing the project update of a project that timesheets on a service product with standard valuation, the 'cost_of_goods_sold' section is displayed when it should not be. Purpose: The…
Problem: When viewing the project update of a project that timesheets on a service product with standard valuation, the 'cost_of_goods_sold' section is displayed when it should not be. Purpose: The COGS section should only be displayed in the project updates if COGS lines exists in relation to the project. The behavior should stay consistent with v17.0 as with this commit: #203936 Steps to reproduce the issue: 1. Install Purchase, Sales, Project,sale_project, Inventory, Timesheets 2. Create a service product with standard valuation and creates project & task on order 3. Create a sales order with the service product 4. Invoice the sales order and confirm 5. Create another invoice not linked to the sales order but contains project's analytic account 6. Load the project update or dashboard of the project and notice there's a COGS section displayed despite no related COGS invoice line opw-4684445 -- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208019
**Steps to reproduce:** - Create a service with "Create on Order" = `Project & Task` and "Invoicing Policy" = `Based on Delivered Quantity (Manual)`. - Create a quotation using this service as a product. - Create a new line in Timesheet with the Project of the service. - The Sales Order Item field updates automatically. - If manually modified, the item no longer appears in the lists of `name_search` or `web_search_read`. **Issue:** Inconsistent behavior on the domain used for the Sale O
Original PR description
**Steps to reproduce:** - Create a service with "Create on Order" = `Project & Task` and "Invoicing Policy" = `Based on Delivered Quantity (Manual)`. - Create a quotation using this service as a product. - Create a new line in Timesheet with the Project of the service. - The Sales Order Item field updates automatically. - If manually modified, the item no longer appears in the lists of `name_search` or `web_search_read`. **Issue:** Inconsistent behavior on the domain used for the Sale Order Item showed in the Timesheet app. **Fix:** Removed `qty_delivered_method` domain filtering to allow sale order line with any `qty_delivered_method` to be used in the Timesheet app. opw-4710840 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207681
We predict the account to use in an invoice/purchase entries based on product configuration and frequent account used for partner but we do not verify if those accounts are allowed on the specified journal. This can be problematic if the entry is generated from a external file (ex: using Peppol), Odoo should retrieve an account allowed in the journal. Steps to reproduce: 1. Have two purchase journal A and B on the same company 2. Set an expense account that is allowed on one of those journa
Original PR description
We predict the account to use in an invoice/purchase entries based on product configuration and frequent account used for partner but we do not verify if those accounts are allowed on the specified journal. This can be problematic if the entry is generated from a external file (ex: using Peppol), Odoo should retrieve an account allowed in the journal. Steps to reproduce: 1. Have two purchase journal A and B on the same company 2. Set an expense account that is allowed on one of those journal (A) and not the other (B) 3. Create multiple bills with this account on the journal A for partner X 4. Upload a XML bill of partner X in journal B -> The expense account is used based on the bills in journal A -> Error because journal B is not allowed for this account opw-4607733 Forward-Port-Of: odoo/odoo#207999 Forward-Port-Of: odoo/odoo#203664
After this commit: === - Allowed all presets to be set as default. - Added a shortcut to edit presets from settings. - Renamed `Others` to `Available` for clarity. - Users can select a `default` preset only from `available presets`. - Enabled users to change preset identification, even if set as default. - Improved field names for better usability. - Restricted deletion of master and in-use presets. Task: 4523232 Related PR: odoo/odoo#202640 Forward-Port-Of: odoo/odoo#20
Original PR description
After this commit: === - Allowed all presets to be set as default. - Added a shortcut to edit presets from settings. - Renamed `Others` to `Available` for clarity. - Users can select a `default` preset only from `available presets`. - Enabled users to change preset identification, even if set as default. - Improved field names for better usability. - Restricted deletion of master and in-use presets. Task: 4523232 Related PR: odoo/odoo#202640 Forward-Port-Of: odoo/odoo#207808 Forward-Port-Of: odoo/odoo#196800
Have a server action that creates an activity based on a record's x2m user field. Run that action on a record that has more than one user in this field. Before this commit: display traceback "ValueError: Expected singleton" After this commit: the activity is created for the first user found in the x2m field value. Task id: opw-4745032 Forward-Port-Of: odoo/odoo#207453
Original PR description
Have a server action that creates an activity based on a record's x2m user field. Run that action on a record that has more than one user in this field. Before this commit: display traceback "ValueError: Expected singleton" After this commit: the activity is created for the first user found in the x2m field value. Task id: opw-4745032 Forward-Port-Of: odoo/odoo#207453
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#207785 Forward-Port-Of: odoo/odoo#199930
Original PR description
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#207785 Forward-Port-Of: odoo/odoo#199930
To reproduce the issue: 1. In Settings, enable: - Storage Locations - Units of Measure & Packagings - Packages 2. In uom list, edit Pack of 6: - Package type: Pallet 3. Create a putaway rules: - From: WH/Stock - Package type: Pallet - To: WH/Stock/Shelf 1 4. Create and confirm a receipt with one Pack of 6 of any product Error: in the detailed operations of the SM, the destination location is still WH/Stock. It should be the shelf. A small mistake happened d
Original PR description
To reproduce the issue: 1. In Settings, enable: - Storage Locations - Units of Measure & Packagings - Packages 2. In uom list, edit Pack of 6: - Package type: Pallet 3. Create a putaway rules: - From: WH/Stock - Package type: Pallet - To: WH/Stock/Shelf 1 4. Create and confirm a receipt with one Pack of 6 of any product Error: in the detailed operations of the SM, the destination location is still WH/Stock. It should be the shelf. A small mistake happened during the big refactoring of UoM and packaging: commit [1] simply removed the use of the SM's packaging instead of using the new field [1] https://github.com/odoo/odoo/commit/dc24a1d1c93cf6eeb6456b1591a0ab8ccc4086ba OPW-4750639 Forward-Port-Of: odoo/odoo#208137
Before this commit, in Odoo, it was not possible to change an all-day event to a timed event and have it synchronized in Google correctly. This is because were sending to Google both 'date' and 'datetime' info for a single event (since Google stores the previous date and dateTime), which lead to "ERROR 400 Invalid start time." After this commit, the user can successfuly update a timed event to all-day event and vice versa and get it successfully updated in Google, since we now send 'date' as
Original PR description
Before this commit, in Odoo, it was not possible to change an all-day event to a timed event and have it synchronized in Google correctly. This is because were sending to Google both 'date' and 'datetime' info for a single event (since Google stores the previous date and dateTime), which lead to "ERROR 400 Invalid start time." After this commit, the user can successfuly update a timed event to all-day event and vice versa and get it successfully updated in Google, since we now send 'date' as null when the event is timed and 'dateTime' as null when it is an all-day event. task-3965107 Forward-Port-Of: odoo/odoo#205563 Forward-Port-Of: odoo/odoo#177549
This fix solves a specific corner case where the analytic distribution could False by defaulting to an empty list. To reproduce the issue: - Enable analytic accounting. - Create an expense paid by the company with a linked SO. - Disable Analytic Accounting (also ensure the analytic distribution in the journal entry is False at this point) - Try to reset the Expense or its journal entry back to draft. This issue happens because the code assumes that the analytic distribution is always
Original PR description
This fix solves a specific corner case where the analytic distribution could False by defaulting to an empty list. To reproduce the issue: - Enable analytic accounting. - Create an expense paid by the company with a linked SO. - Disable Analytic Accounting (also ensure the analytic distribution in the journal entry is False at this point) - Try to reset the Expense or its journal entry back to draft. This issue happens because the code assumes that the analytic distribution is always a list, which might not since analytic accounting is disabled. opw-4710518 Forward-Port-Of: odoo/odoo#207221
This 'bug' was introduced when translating strings from data files became possible (87fc0d6b). The translation of some fields in Spanish did not include their respective abbreviations leading to confusion of clients. This commit appends the abbreviations of the problematic strings. RD Feedback task: 4679704 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#206471
Original PR description
This 'bug' was introduced when translating strings from data files became possible (87fc0d6b). The translation of some fields in Spanish did not include their respective abbreviations leading to confusion of clients. This commit appends the abbreviations of the problematic strings. RD Feedback task: 4679704 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#206471
<b>Steps to reproduce:</b> 1. Setting > Navigate to Configure Document layout > layout : DIN 5008. 2. Accounting > invoice > PDF without Payment. Note :Ensure the address has at least 33 characters without spaces to trigger the issue. <b>Issue:</b> The footer of the invoice is not displaying correctly — the company name in the bottom left corner is overlapping and not aligned properly. <b>Cause:</b> An upstream PR modified the footer text sizing, leading to layout issues
Original PR description
<b>Steps to reproduce:</b> 1. Setting > Navigate to Configure Document layout > layout : DIN 5008. 2. Accounting > invoice > PDF without Payment. Note :Ensure the address has at least 33 characters…
<b>Steps to reproduce:</b> 1. Setting > Navigate to Configure Document layout > layout : DIN 5008. 2. Accounting > invoice > PDF without Payment. Note :Ensure the address has at least 33 characters without spaces to trigger the issue. <b>Issue:</b> The footer of the invoice is not displaying correctly — the company name in the bottom left corner is overlapping and not aligned properly. <b>Cause:</b> An upstream PR modified the footer text sizing, leading to layout issues when fields contain long values. <b>Solution:</b> Removed the `text-nowrap` class from the company details in the footer section. Improved section alignment using `colspan` and made minor adjustments to footer text sizing. These changes prevent content overlap in the company information section of reports, ensuring proper display regardless of content length. <b>opw: 4731515</b> Before changes applied:  After changes applied:  Forward-Port-Of: odoo/odoo#206774
In this commit we remove checkDelay from codebase because it is no longer used since https://github.com/odoo/odoo/pull/194508 has been merged. Forward-Port-Of: odoo/enterprise#83466 Forward-Port-Of: odoo/enterprise#83217
Original PR description
In this commit we remove checkDelay from codebase because it is no longer used since https://github.com/odoo/odoo/pull/194508 has been merged. Forward-Port-Of: odoo/enterprise#83466 Forward-Port-Of: odoo/enterprise#83217
Forward-Port-Of: odoo/enterprise#84325 Forward-Port-Of: odoo/enterprise#80561
Original PR description
Forward-Port-Of: odoo/enterprise#84325 Forward-Port-Of: odoo/enterprise#80561
A traceback occurs when attempting to view the 'Hierarchy and Subtotals' of an Account Group with a Financial Budget set in the 'Profit and Loss' report. Steps to reproduce: ------------------- * Open Accounting in debug mode * In Configuration > Accounting > Financial Budgets create a new budget * In Configuration > Accounting > Account Groups create a new group * Open Reporting > Statement Report > Profit and Loss * Select the budget and Hierarchy and Subtotals * Click on Revenues
Original PR description
A traceback occurs when attempting to view the 'Hierarchy and Subtotals' of an Account Group with a Financial Budget set in the 'Profit and Loss' report. Steps to reproduce: ------------------- *…
A traceback occurs when attempting to view the 'Hierarchy and Subtotals' of an
Account Group with a Financial Budget set in the 'Profit and Loss' report.
Steps to reproduce:
-------------------
* Open Accounting in debug mode
* In Configuration > Accounting > Financial Budgets create a new budget
* In Configuration > Accounting > Account Groups create a new group
* Open Reporting > Statement Report > Profit and Loss
* Select the budget and Hierarchy and Subtotals
* Click on Revenues
* Traceback
> Observation:
File '/home/odoo/src/enterprise/18.0/account_reports/models/account_report.py', line 1035, in compute_group_totals
hierarchy_total + (column.get('no_format') or 0.0) if isinstance(hierarchy_total, float) else hierarchy_total
~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TypeError: unsupported operand type(s) for +: 'float' and 'str'
Why the fix:
------------
Add float verification to ensure valid operation in the hierarchy.
opw-4628498
Forward-Port-Of: odoo/enterprise#84564
Forward-Port-Of: odoo/enterprise#83302Currently, the “Unpaid” and “Late” buttons in the sale journal dashboard used the total invoice amount instead of the remaining due amount when account_3way_match was installed. Steps to reproduce: - Install account_3way_match - Create and partially pay an invoice - Go to the dashboard - The displayed amount should reflect the residual, but it shows the full amount This fix restores the expected behavior by using the same logic as the original `_get_open_sale_purchase_query` to compute
Original PR description
Currently, the “Unpaid” and “Late” buttons in the sale journal dashboard used the total invoice amount instead of the remaining due amount when account_3way_match was installed. Steps to reproduce: - Install account_3way_match - Create and partially pay an invoice - Go to the dashboard - The displayed amount should reflect the residual, but it shows the full amount This fix restores the expected behavior by using the same logic as the original `_get_open_sale_purchase_query` to compute `amount_total` and `amount_total_company`. opw-4731478 Forward-Port-Of: odoo/enterprise#83823
Forward-Port-Of: odoo/enterprise#84045 Forward-Port-Of: odoo/enterprise#84014
Original PR description
Forward-Port-Of: odoo/enterprise#84045 Forward-Port-Of: odoo/enterprise#84014