Tuesday, January 6, 2026
18 changes · saas-19.1
Enhancements to existing features
This update automatically sends email notifications to applicants when a recruiter declines their application, provided a pre-defined email template is available for that reason. This streamlines the recruitment process by ensuring timely communication and reduces manual effort for the HR team. It improves applicant experience and efficiency.
Original PR description
In this commit, we make the toggle button "Send Email" enabled by default whenever the refusal reason has an email template, including the reason selected by default in the wizard. TaskID: 5245023 Forward-Port-Of: odoo/odoo#234759
Resolved issues and error corrections
This update fixes an issue where employees with past accrual allocations weren't correctly accounting for future leave days. Now, leave requests are only deducted from available days if there's a possibility of accruing more vacation time before the leave date. This ensures accurate tracking of available time off.
Original PR description
Description of the issue/feature this PR addresses: This ticket: https://www.odoo.com/odoo/project/49/tasks/5218745 In the above ticket, an employee Norbert Loibl had an accrual allocation from Feb.…
Description of the issue/feature this PR addresses: This ticket: https://www.odoo.com/odoo/project/49/tasks/5218745 In the above ticket, an employee Norbert Loibl had an accrual allocation from Feb. 2023 to May 2024. Since then, all his allocations have been regular allocations, so he is no longer accruing vacation days. But, Norbert’s future leaves do not get counted against the “Days Available” displayed on his Time Off Dashboard. Current behavior before PR: If an employee had an accrual allocation (of the relevant type, e.g. past vacation allocations won’t affect sick leave) at any point in time, their future leaves do not get counted against the “Days Available” on their Time Off Dashboard. Desired behavior after PR is merged: If an employee has an accrual allocation between today’s date and the date of a future leave, that future leave does not get counted against the “Days Available” on their Time Off Dashboard. That way, we will count a leave against “Days Available” unless there is a possibility of accruing more days off before the leave. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241216 Forward-Port-Of: odoo/odoo#238977
This update fixes an issue where the DIN5008 invoice report didn't include Incoterm information. The fix adds the necessary logic to display the Incoterm code and location, ensuring compliance with DIN5008 standards. This improves invoice accuracy and reporting for international transactions.
Original PR description
**Steps to reproduce:** 1. Install the modules account and l10n_din5008. 2. Go to Settings and set DIN5008 as the default invoice report template. 3. Navigate to Configuration → Settings and set a default Incoterm. 4. Create a new customer invoice. 5. Print the DIN5008 Invoice Report. **Issue:** The DIN5008 invoice report did not display the Incoterms, while other invoice layouts printed them correctly. **Cause:** This was due to missing logic in l10n_din5008 report to include Incoterm data. Confirmed with TSB that the DIN5008 layout should display Incoterms. **Fix:** This commit adds the Incoterm information to the DIN5008 template data: - Always include the Incoterm code - If an Incoterm location is set, display it as `CODE - LOCATION` **opw-5349267** Forward-Port-Of: odoo/odoo#240688 Forward-Port-Of: odoo/odoo#238682
This update fixes issues with image dropping, copying, and pasting within the website builder, ensuring images with captions are handled correctly and formatting is preserved. It resolves duplication errors and incorrect attribute handling, leading to a more reliable and user-friendly editing experience.
Original PR description
**Current behavior before PR:** - When dragging and dropping elements with attributes and classes, any non-whitelisted attributes and classes were removed during the `cleanForPaste` process. This…
**Current behavior before PR:** - When dragging and dropping elements with attributes and classes, any non-whitelisted attributes and classes were removed during the `cleanForPaste` process. This caused structural issues and loss of formatting after the drop. - When an image had a caption and only the image was selected and cut, the image was removed but the caption incorrectly remained - When dragging and dropping an image without an active selection on the image, the image was not removed during the drop. This resulted in the image being duplicated, one at the original position and another at the drop location. - When selecting an image with a caption and performing copy-paste, only the image was copied and pasted. **Desired behavior after PR is merged:** - An `application/vnd.odoo.odoo-editor` dataTransfer type is now set during `dragstart` for editor elements. As a result, we no longer need to clean the `dataTransfer` content during drop, preserving the original structure and preventing the loss of attributes and classes. - Cutting an image that contains a caption now correctly removes both the image and its associated caption. - The image is now selected on pointerdown event . As a result, when the image is dropped, deleteSelection correctly removes the original image before inserting the new one, preventing duplication. - Now, when an image with a caption is selected and copy-pasted, the entire image along with its caption is correctly copied and pasted. task: 4914451 Forward-Port-Of: odoo/odoo#240788 Forward-Port-Of: odoo/odoo#217125
This update resolves an issue where unnecessary dialogs appeared during One-click Payment in the POS system, leading to errors. The fix ensures that orders are validated correctly and users are smoothly redirected back to the previous screen if validation fails. This enhances the overall reliability and usability of the One-click Payment feature.
Original PR description
steps: - Configure a default preset as Delivery or Takeout and enable One-click Payment - Open the POS restaurant. - Open any table and add a product. - Click the One-click payment method. issue: - Unnecessary dialogs appear on the ReceiptScreen (e.g., customer selection or time-slot selection), followed by traceback. reason: - The order is validated on the ProductScreen during One-click Payment and ProductScreen creates new draft order. fix: - After this commit, new order will not be created on the ProductScreen with One-click Payment.. - If validation fails (e.g., an RPC error), it will redirected back to the previous screen. - In case of Delivery preset, on discard do not remove Delivery preset. task-5391389 Forward-Port-Of: odoo/odoo#239038
This update corrects a bug that caused subscription order processing to repeat unnecessarily, leading to potential delays. The fix ensures that order progress is accurately tracked, preventing reprocessing and improving the reliability of subscription order management. This resolves a technical issue impacting order processing efficiency.
Original PR description
Before this commit, when the continue instruction was called before the _subscription_commit_cursor call, the order would be reprocessed again and and again. Commit with a progress=1 was commited but if the continue was called before, progress with 0 was never called. Forward-Port-Of: odoo/enterprise#102142
This update fixes a visual issue where the search panel was being cut off when navigating deep within the hierarchy view. The change allows the hierarchy content to scroll properly, ensuring a full and usable experience for users managing complex data structures. The fix also stabilizes a key test case.
Original PR description
Issue: - The search panel was getting clipped when navigating deep into the hierarchy. - `.o_content` enforced `height: 100%` and `overflow: hidden`, preventing the hierarchy from expanding and blocking vertical scroll. - The JS test "drag node to scroll" queried `.o_content`, which is no longer the actual scrollable container in the hierarchy view, causing intermittent test failures. Fix: - Allow `.o_content` to grow and remove overflow restrictions only in the hierarchy view. - Enable vertical scrolling on `.o_hierarchy_view.o_action` to support large hierarchies. - Update the test to query `.o_hierarchy_view.o_action` so it targets the correct scrollable element. Impact: - Restores proper scrolling behavior. - Prevents search panel truncation and preserves full UI usability. - Stabilizes the hierarchy drag-scroll test without impacting other views. Task: 5326054 Forward-Port-Of: odoo/odoo#236823
This update corrects a problem where delivery pickings remained 'Waiting Another Operation' after cancelling a related manufacturing order (MTO). The fix reuses existing logic to properly unlink stock moves and update availability, ensuring deliveries can be confirmed correctly. This prevents delays in order fulfillment.
Original PR description
Issue ----- After cancelling a MO created by a SO (MTO), user cannot reserve quantity from stock for the delivery picking. This happens for both MO & Reception as long as they are multi-step. Steps…
Issue ----- After cancelling a MO created by a SO (MTO), user cannot reserve quantity from stock for the delivery picking. This happens for both MO & Reception as long as they are multi-step. Steps to reproduce ----- - Enable multi step routes - Set WH to 3-step manufacturing - Create a product - empty bom - MTO & manufacturing routes - 5 in stock - Create a SO for the product - Cancel the linked MO - Open the delivery picking - Click "Check Availability" > The product is not getting reserved from stock > The delivery picking is still "Waiting Another Operation" Cause ----- The problem happens in `action_cancel` https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L1995 In 1-step case, `move.propagate_cancel` is false so we go through https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L2017-L2021 where `move_dest_ids` is the move of the delivery picking. This makes it so that, when we go to the delivery picking and do `action_assign` we go through the first condition while skipping the second of https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L1929-L1931 instead of going into the `else` part https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L1947-L1949 In 3-step, when we `action_cancel`, `move.propagate_cancel` so we go through https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L2009-L2014 which lacks the swap to MTS and unlink `move_dest_id` logic. Solution ----- We can re-use the logic of unlink and MTS swap to `move_dest_ids` that were not cancelled by https://github.com/odoo/odoo/blob/0eb44aec8867e292f8258df02045efe7fbd3303f/addons/stock/models/stock_move.py#L2012 This also takes care of the problem of the status of the delivery picking being `waiting` instead of `confirmed` because it gets recomputed https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L754 and since it was set to MTS, it goes into the `else`part of https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L2202-L2216 ----- Ticket: opw-5124380 Forward-Port-Of: odoo/odoo#241738 Forward-Port-Of: odoo/odoo#237890
This update fixes an issue where HR Officers could access restricted functionality within employee forms, leading to potential errors. The changes limit access to 'Create User' and certain data views to authorized HR Managers, ensuring data security and proper user permissions within the HR module. This prevents unauthorized actions and maintains data integrity.
Original PR description
* = hr_work_entry
Steps to reproduce:
- Install 'hr' and 'hr_work_entry'.
- Log in as an HR Officer.
- Open an employee form and click:
- 'Create User'
- 'Work Entries' smart button
- 'History' smart button
Cause:
- 'Create User' was visible to HR Officers, but only users with Settings rights
('base.group_erp_manager') can create 'res.users', causing an AccessError.
- The 'Work Entries' and 'History buttons were visible to HR Officers, but
fields as 'contract_date_start' which only HR Managers can read when
payroll is not installed.
Fix:
- Restricted 'Create User' to 'base.group_erp_manager'.
- Limited the 'History' smart button to 'hr.group_hr_manager'.
- Limited the 'Work Entries' smart button to 'hr.group_hr_manager'.
Task - 5188997
Forward-Port-Of: odoo/odoo#235923This update resolves an issue where HR Officers without payroll access could still view and modify salary adjustments data. The fix restricts access to sensitive payroll information and ensures that users only see relevant data based on their roles, improving data security and user experience.
Original PR description
* = hr_contract_salary Steps to reproduce: - Install 'hr', 'hr_payroll', 'hr_work_entry', and/or 'hr_contract_salary'. - Log in as an HR Officer without payroll access. - On an employee form: -…
* = hr_contract_salary
Steps to reproduce:
- Install 'hr', 'hr_payroll', 'hr_work_entry', and/or 'hr_contract_salary'.
- Log in as an HR Officer without payroll access.
- On an employee form:
- Switch to the 'Salary Adjustments' tab.
- Edit/save a record (tracking reads 'salary_offer_ids').
- Click the 'Work Entries', 'History', or 'Offers' smart buttons.
Cause:
- HR Officers could still reach payroll-only data:
- 'salary_offer_ids' (one2many to 'hr.contract.salary.offer') triggered
tracking reads on a model restricted to HR Managers/Recuriters.
- The 'Salary Adjustments' tab and offer buttons remained visible even when
the user lacked payroll rights.
- The payroll overrides changed 'contract_date_start' to
'hr_payroll.group_hr_payroll_user', so the 'Work Entries'/'History' buttons
show AccessErrors while the buttons stayed visible.
Fix:
- Restricted 'salary_offer_ids' to 'hr.group_hr_manager'.
- Made the 'Salary Adjustments' tab visible only to
'hr_payroll.group_hr_payroll_user' and existing 'Offers' buttons stay for
HR Managers.
- Added dedicated overrides giving 'Work Entries' and 'History' buttons the
'hr_payroll.group_hr_payroll_user' group when payroll is installed.
Task - 5188997
Forward-Port-Of: odoo/enterprise#99234This update fixes an issue where holiday carryover days weren't accurately calculated, leading to discrepancies in the number of days expiring. The change ensures that accrued holiday days are correctly added before the expiration date is determined, resulting in accurate holiday accrual and reporting.
Original PR description
To reproduce: ============= - Create an accrual plan: - Carryover date: allocation - One level: - Accrues 2 days. - Accrual date: monthly on 1st of each month - Starts immediately on allocation start…
To reproduce:
=============
- Create an accrual plan:
- Carryover date: allocation
- One level:
- Accrues 2 days.
- Accrual date: monthly on 1st of each month - Starts immediately on allocation start date - Carryover policy: all days carry over - Carried over days validity: 3 months.
- Create an allocation that uses the above accrual plan on 23/09/2025:
- Starts on 01/07/2024
We should have 30 days in total with 24 expiring on 01/10/2025 but we only have 22 expiring on 01/10/2025.
Problem:
========
When `accrued_gain_time` of the accrual plan is 'start', in the `_process_accrual_plans` method, the property `expiring_days` is set when the first accrual still hasn't been added to the `number_of_days` (it is usually added at the [end of the loop](https://github.com/odoo/odoo/blob/18.0/addons/hr_holidays/models/hr_leave_allocation.py#L596)).
Solution:
=========
In the `_process_accrual_plans`, add the accrued days to the `number_of_days` before the `expiring_days` is set.
[opw-4963163](https://www.odoo.com/odoo/all-tasks/4963163)
Forward-Port-Of: odoo/odoo#240738
Forward-Port-Of: odoo/odoo#233424This update fixes an issue where imported DTE invoices in a multi-company environment incorrectly assigned tax to the wrong company. The fix ensures that the tax aligns with the company receiving the invoice, improving financial accuracy and compliance. This resolves inconsistencies during import processes.
Original PR description
**PROBLEM**
When importing a DTE from mail (using fetchmail) in a multicompany setting, there can be company inconsistencies during the import, i.e. the product created during the import belong to the right company, but the tax on a move line belong to another company.
**STEP TO REPRODUCE**
1. Create 2 CL companies with those VAT number: 22060449-7, 77697621-0
2. Set an incoming mail server for bills
3. Send XML to the mailbox (see in the ticket for the xml, one of them should trigger the bug, it depends on the order you created the companies).
4. Run a fetchmail scheduled action.
**CAUSE**
On the creation of the move line for the DTE bill, we retrieve the default purchase tax using `self.env['account.chart.template'].ref('OTAX_19')`. There is no guarantee this tax belong to the recipient company. We should use the default purchase tax of the recipient company instead.
opw-5378068
Forward-Port-Of: odoo/enterprise#102274This update resolves an installation problem that previously caused the website rental module to fail during setup. The fix moves a key function to the correct module, ensuring compatibility with the website's installation order and preventing installation errors. This improves the reliability of the rental pricing feature.
Original PR description
## Steps To reproduce: 1. On a local environment, install **`website_sale_renting`** using `-i website_sale_renting` 2. During installation, the process reaches **`website_sale`**. 3. A traceback is…
## Steps To reproduce: 1. On a local environment, install **`website_sale_renting`** using `-i website_sale_renting` 2. During installation, the process reaches **`website_sale`**. 3. A traceback is raised while loading `website_sale/data/mail_template_data.xml`. --- ## Issue * The installation fails during **`website_sale`** because the mail template calls `_get_rental_pricing_description()` on `sale.order.line`, but the method is not available at that stage. --- ## Cause: * `_get_rental_pricing_description()` existed previously but was defined in **`website_sale_renting`**. * A recent design PR- odoo/odoo#213186 introduced a `t-if="hasattr(combo_line, 'is_rental')"` guard in the `website_sale` mail template. * Since `mail.template`'s body_html data is parsed as HTML, the template cannot be safely extended via XPath in other modules. * Module installation order is: `sale → sale_renting → website_sale → website_sale_renting` * When **`website_sale`** is installed: * `sale.order.line` already has the `is_rental` field (from `sale_renting`) * but `_get_rental_pricing_description()` is not yet present, as it is only loaded with `website_sale_renting` This causes the guard to pass while the method call fails, leading to a traceback during installation. --- ## Solution: * Move `_get_rental_pricing_description()` to the **`sale_renting`** module, alongside the `is_rental` field. * This ensures the method is always available whenever rental logic is enabled and makes `website_sale` mail templates safe regardless of installation order. opw-5454946 Affected Version-saas~19.1
This update fixes an issue where helpdesk ticket creation would fail due to incorrect access permissions across different companies. The change prevents unnecessary data fetching in sudo, ensuring users only access resources within their own company when creating tickets. This improves stability and prevents errors for users with multi-company setups.
Original PR description
Before this commit, the `resource_ids` field in `res.users` model was fetched in sudo due to the `resource_calendar_id` related field in `res.users` and so the user will get the resources of members…
Before this commit, the `resource_ids` field in `res.users` model was fetched in sudo due to the `resource_calendar_id` related field in `res.users` and so the user will get the resources of members in a helpdesk team from another company than the current one(s). The problem is since the current user does not have access to those resources due to the multi company rule, he will get a traceback when he will try to create a ticket from that helpdesk team if the assignement method is ramdom and a user with resource exists in another company. This commit makes sure the resource_ids field in res.users is not fetched in sudo to correctly determine which user to set to the ticket when the current user tries to create a ticket. Steps to reproduce the issue: ---------------------------- 1. Install helpdesk module 2. Create a new company B 3. Create a new user with helpdesk user access right (or use Marc demo) and give the company B to that user 4. Select that new company created in step and go to helpdesk app. 5. Create an helpdesk team with auto-assignment set to "randomly" and set admin user as members in that helpdesk team 6. log in as the user created in step 3 7. make usre the company selected is the one created in step 2 8. create a ticket in the helpdesk team created in step 5 Expected behavior: ----------------- The ticket should be created without any issue. Actual behavior: --------------- An access error is raised because the current user does not have access to the resource of admin user since it is not in the same company than the current one. opw-5223717 Forward-Port-Of: odoo/enterprise#102910 Forward-Port-Of: odoo/enterprise#102859
This update resolves an issue where filtering a Kanban view would lose its settings after reopening a record. The fix ensures that filtered views remain active and accurately reflect changes made within the Kanban, improving user workflow and data consistency. It addresses a bug related to cached data and group filtering.
Original PR description
Have a kanban view with progressbar and some records. Click on a progressbar to filter a column. Then open a record and come back. From that point, the data of the filtered kanban is in cache. Now,…
Have a kanban view with progressbar and some records. Click on a progressbar to filter a column. Then open a record and come back. From that point, the data of the filtered kanban is in cache. Now, open a record again, and make a change in the form that will have an impact in the kanban (e.g. that will move a record from a column to another). Come back to the kanban view, which will instantly show the data from the cache, and that will be then updated once the rpc returns. At that point, the view is still correct, but the cache callback has already erased the groups information (in particular, the extraDomain of the filtered column). So, if you open a record and come back a last time, the view is no longer correct: the column that is supposed to be filtered displays all records. Introduced by [1] This commit basically reverts [1] and fixes the original issue differently. When we receive the result of a web_read_group, we can trust it and determine that a group for which we receive records (or groups) is open. [1] https://github.com/odoo/odoo/pull/226312 Task~5387553 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#240593
This update resolves a memory error that occurred when processing recurring invoices with a large number of subscriptions. By optimizing how the system retrieves data, the change significantly reduces memory consumption, improving the stability and performance of the invoicing process. This prevents potential system slowdowns and errors.
Original PR description
A MemoryError can be thrown when running the scheduled action `_cron_recurring_create_invoice` on large databases. When there are lots of subscriptions, sale.orders and account.move.lines, the…
A MemoryError can be thrown when running the scheduled action `_cron_recurring_create_invoice` on large databases. When there are lots of subscriptions, sale.orders and account.move.lines, the compute method overwrite `_get_invoiced` in the sale_subscription module can consume a lot of memory. The issue is mostly coming from the search on account.move.line. In case a lot of account.move.lines have a subscription_id, the search to get `all_subscription_ids` is going to return a lot of records. Then, accessing any field on this recordset will prefetch all the prefetchable fields, leading to a MemoryError. This commit fixes that by manually fetching the fields we need on account_move_line. Since `subscription_move_lines` is not used anywhere else and `move_by_origin` only contains ids, the number of queries stays the same while the memory consumption plummets. #### Benchmark In a database with 236 000 account.move.line with a non-null subscription_id, running the schedule action with 5 subscriptions to invoice consumes at least 1.7GB (MemoryError raised). After this commit it consumes 191MB. <img width="1918" height="943" alt="sale_subscription_before" src="https://github.com/user-attachments/assets/e868921f-e691-47c3-8474-edb9a1d22d0b" /> <img width="1920" height="949" alt="sale_subscription_after" src="https://github.com/user-attachments/assets/78e9fc31-4c5f-4369-8bd0-494ca2c693fd" /> Forward-Port-Of: odoo/enterprise#102364
This update fixes a problem where incorrect error messages were displayed when creating employees with negative fixed allowance values. The fix isolates error handling to payroll validation, ensuring users receive the precise error message needed to correct the issue. This improves data accuracy and simplifies the employee onboarding process.
Original PR description
Issue: * When creating an employee with negative fixed allowance values, the system should show a payroll validation error. * Instead, a leave-related error from hr_holidays always appeared because the module wrapped the entire create() method in a broad try/except, catching all ValidationError messages including those from payroll. Fix: * Restricted the try/except only to the part that actually creates a new leave entries. Impact: * Users now see the correct and relevant error message when the fixed allowance values are invalid. task-5383700 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238984
This update fixes an issue where child manufacturing orders weren't correctly updating quantities when the parent order was modified. The change ensures that all quantities are converted to the same UoM (product's UoM) during calculations, preventing incorrect quantity adjustments in child MOs. This improves the accuracy of production planning.
Original PR description
Problem: When a manufactured product uses a component whose UoM is different from its reference UoM, for example the component’s UoM is dozens but units are used on the BoM line, updating the…
Problem: When a manufactured product uses a component whose UoM is different from its reference UoM, for example the component’s UoM is dozens but units are used on the BoM line, updating the quantity to produce on the parent MO causes the child MO’s quantity to roduce to update incorrectly. This is because the new quantity to produce on the child MO is calculated with quantities in different UoMs. Purpose: To ensure that the child MO’s quantity to produce updates correctly when the parent MO’s quantity to produce is updated. This is achieved by making sure the quantities that get added together are both the same UoM, in this case the product’s UoM. Steps to Reproduce on Runbot: 1. Create product_a with the MTO route and UoM set to pack of 6. 2. Create a BoM for product_a that creates 1 pack of 6 products. 3. Create product_b. 4. Create a BoM for product_b that creates 1 unit and uses 3 units of product_a. Make sure the component line shows 3 units instead of 0.5 pack of 6. 5. Create a manufacturing order for 1 unit of product_b and confirm it. 6. There should be a child MO for 0.5 pack of 6 of product_a. 7. On the parent MO update the production quantity to 2 units. 8. Observe that the child MO is now for 3.5 pack of 6 instead of 1 pack of 6. opw-5414085 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241692