Monday, February 9, 2026
15 changes · saas-18.4
Resolved issues and error corrections
The Point of Sale product configuration popup now shows the price from the selected pricelist instead of the product's default price. This prevents staff from seeing misleading prices when selling products with variants under flexible pricelist rules.
Original PR description
Steps to reproduce: - Configure POS → enable Allow Flexible Pricelist and assign the Default pricelist. - Create product A with variants. - Add product A to the Default pricelist. - Set a fixed price…
Steps to reproduce: - Configure POS → enable Allow Flexible Pricelist and assign the Default pricelist. - Create product A with variants. - Add product A to the Default pricelist. - Set a fixed price for product A in that pricelist. - Open POS session. - Select product A in POS. Observation: - In ProductConfiguratorPopup dialog, pricelist price is not considered Cause: - After this [commit](https://github.com/odoo/odoo/commit/5e77c14912324bf967a55a1a40bb01071eca5c8b) the text appears from `get title()` method, which do not consider pricelist Fix: - we now consider pricelist for displaying title. **Before** <table> <tr> <td> <img width="400" height="300" alt="image" src="https://github.com/user-attachments/assets/6faac3e4-a579-41db-a2ad-fdc9c24e422f" /> </td> <td> <img width="400" height="300" alt="image" src="https://github.com/user-attachments/assets/14035707-aa23-4fb3-97d7-d0ce2f6e6b46" /> </td> </tr> </table> **After** <img width="340" height="225" alt="image" src="https://github.com/user-attachments/assets/3beeaf76-fc1a-42a5-9f3c-dabc43389d36" /> opw-5270319 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237899
Employees in Indian companies can now open their already approved past time off records without being blocked by an incorrect manager-only error. The fix avoids an unnecessary background update when the Indian sandwich leave rule does not apply, improving access to time off information for regular employees.
Original PR description
Steps to reproduce: ------------------- 1. Install `l10n_in` and `l10n_in_hr_holidays` 2. Switch to an Indian company 3. Create a user and related employee without Time Off rights 4. Log in with the…
Steps to reproduce: ------------------- 1. Install `l10n_in` and `l10n_in_hr_holidays` 2. Switch to an Indian company 3. Create a user and related employee without Time Off rights 4. Log in with the new user and create a past time off 5. Approve the time off as an time off manager/admin 6. Open the validated time off record as the employee Issue: ------ Opening a validated time off raises the following UserError: ```python You must have manager rights to modify/validate a time off that already begun. ``` Cause: ------ The `_get_durations` method in `l10n_in_hr_holidays` was updating the `l10n_in_contains_sandwich_leaves` field every time it was executed. When a user opened a validated time off record, this triggered a `write()` operation. Since non-manager users are not allowed to write on already started validated leaves, this caused a [UserError](https://github.com/odoo/odoo/blob/047d5b61a5f3fc5c41f5bc3975938a53b5da49a7/addons/hr_holidays/models/hr_leave.py#L793-L798) The field `l10n_in_contains_sandwich_leaves` does not need to be updated when `l10n_in_is_sandwich_leave` is False. See [[1]](https://github.com/odoo/odoo/blob/047d5b61a5f3fc5c41f5bc3975938a53b5da49a7/addons/l10n_in_hr_holidays/models/hr_leave.py#L156-L157) & [[2]](https://github.com/odoo/odoo/blob/047d5b61a5f3fc5c41f5bc3975938a53b5da49a7/addons/l10n_in_hr_holidays/models/hr_leave.py#L62) And this [part of the code](https://github.com/odoo/odoo/blob/047d5b61a5f3fc5c41f5bc3975938a53b5da49a7/addons/l10n_in_hr_holidays/models/hr_leave.py#L160-L173) is responsible to update `l10n_in_contains_sandwich_leaves` value. **NOTE:** Opening future validated time off records as a non-manager user triggers `AccessError` as it is not allowed to update the validated time off record. Solution: --------- Ensure that `l10n_in_contains_sandwich_leaves` is updated only when `indian_leaves` is applicable. opw-5373055 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246078 Forward-Port-Of: odoo/odoo#240056
Recruiters can now send emails to applicants even after those applicants have been archived or refused. This prevents lost communication during hiring follow-up and keeps the email action usable for all selected applicants.
Original PR description
Version: - 17.0 Steps to reproduce: - Create an applicant. - Archive the applicant. - Select the archived applicant. - Click the Send Email action. Issue: - Unable to Send Emails to Refused Applicants Cause: - The applicant_ids many2many field does not include archived applicants. Because of this, when an applicant is archived, the field becomes empty. Solution: - Add active_test to the field context. Task - 5786195 Forward-Port-Of: odoo/odoo#244691
The remaining hours field is now hidden on tasks linked to subscription sales lines. This prevents users from seeing confusing or negative hour balances that do not fit recurring subscription billing and delivery.
Original PR description
This change hides the remaining_hours_so field when the sales order line is linked to a subscription. Unlike standard service or time-based sales orders, where this field reflects the difference between the quantity ordered and the quantity delivered, the concept does not translate well to subscription logic. In the context of a subscription, the service is delivered on a recurring period (monthly, yearly, etc.). Delivery quantities continuously accumulate over time, and because the subscription renews indefinitely until cancellation, the “remaining hours” calculation quickly becomes misleading. In many cases it can drift into negative values, giving the impression of an error or over-consumption when, in reality, the subscription is simply following its recurring delivery cycle. To avoid confusing end-users and to maintain a clean, intuitive interface, we hide this field whenever the line is part of a subscription. opw-5246238 Forward-Port-Of: odoo/odoo#241099
Point of Sale test scenarios now keep their simulated date and time even when the page reloads. This prevents date-based information from disappearing during automated checks, improving test reliability without changing everyday user behavior.
Original PR description
Mocking time in tours via `freezeDateTime` is lost when the page reloads , causing date-filtered data to disappear and tests to fail. Introduce `withTimeFreeze(millis, steps)`, which persists the mock timestamp in `sessionStorage`. POS now checks this storage on module load to automatically re-apply the freeze, ensuring the clock survives refreshes while handling cleanup after the steps finish. runbot-232601 Related Enterprise PR: odoo/enterprise#106724
Delivery slips now avoid showing the same product name twice when products have variant details and descriptions. This makes printed delivery documents and backorder sections clearer for warehouse teams and customers.
Original PR description
When creating a delivery slip, if the product sold has variant of type never and have a description, the name will be repeated. ### Steps to reproduce: * Create a product A with variants of type…
When creating a delivery slip, if the product sold has variant of type never and have a description, the name will be repeated. ### Steps to reproduce: * Create a product A with variants of type never * Create a sales order with two product A and confirm it * Go on the delivery (don't validate it) and create a delivery slip -> Issue, the name of the product appears twice. * Reduce the quantity of product delivered to one * Confirm and create a backorder * Print the deliveryslip -> Issue, the name of the product appears twice in the backorder section ### Observation: When confirming the SO: It creates the procurement values, where the product_description_variants are obtained from _get_sale_order_line_multiline_description_variants. In our case, we will have several elements regarding the variant: https://github.com/odoo/odoo/blob/3e5aabf66a19d406fa49c9ff2f6e4db6d5ba124a/addons/sale_stock/models/sale_order_line.py#L300 This information is added to the picking_description (for which the fallback value is the product name): https://github.com/odoo/odoo/blob/626d06734991bcd3b94a6c9454317f311164e9dc/addons/stock/models/stock_rule.py#L339-L340 When printing the delivery_slip, it uses description_picking (and attempts to filter out the name): https://github.com/odoo/odoo/blob/842025976ab65e92551366def88cdd243549e5ee/addons/stock/report/report_deliveryslip.xml#L74 However, in our case, since the variant information is included, it will not be filtered out because the value is no longer just the name. The same issue is present here : https://github.com/odoo/odoo/blob/e99e07f2f22b0987468c45d3d7da287cdf703588/addons/stock/report/report_deliveryslip.xml#L179-L180 opw-5153222 Forward-Port-Of: odoo/odoo#239693
This fix ensures warehouses used by the Repair app have the required production location when upgrading. It prevents upgrade failures for customers who use Repair without Manufacturing and had archived those locations.
Original PR description
The warehouses need at least a Production location[^2] to avoid triggering an error, but they are not considered a missing location. The function is borrowed from the `mrp` module[^mrp]. This error was found during upgrades. To reproduce: - In 17, install repair and don't install mrp. - Archive the production locations. - Upgrade to 18. - It will trigger an error[^1] while upgrading stock. [^1]:https://github.com/odoo/upgrade/blob/b46cf7ea8770c5d428ea3d569148eb76d16903b9/migrations/stock/saas~17.3.1.1/end-migrate.py#L16 [^2]:https://github.com/odoo/odoo/blob/ab3c2d52bcaee516eae319ccd20088eb48c819f1/addons/repair/models/stock_warehouse.py#L67 [^mrp]:https://github.com/odoo/odoo/blob/ab3c2d52bcaee516eae319ccd20088eb48c819f1/addons/mrp/models/stock_warehouse.py#L278-L283 Forward-Port-Of: odoo/odoo#245805
The keyboard shortcut shown for creating a new task in Project was corrected so it no longer conflicts with the priority control. Users can now rely on the displayed shortcut to create tasks as expected, avoiding accidental priority changes.
Original PR description
Steps to Reproduce: - - Open Project → Tasks. - Press Alt key to view shortcut hints. - New button control show Alt+R. - Pressing Alt+R triggers priority change instead of creating a new record. Issue: - Pressing the shortcut displayed on the New button (Alt+R) does not create a new task but instead changes the task priority. Cause: - The New button and the Priority widget share the same shortcut (Alt+R), causing the wrong action to trigger. Solution: - Changed the shortcut for the New button from Alt+R to Alt+C to avoid conflict and ensure correct behavior. task-5270075 Forward-Port-Of: odoo/odoo#237555
This update fixes an inconsistent visual issue in the Field Service Report generated from the Bubble document layout. The report's tables had conflicting border styles, resulting in a jarring appearance. By adding a specific CSS class, the report now consistently uses rounded borders, improving its overall professionalism and readability.
Original PR description
Steps to reproduce: -------------------------------- 1. Install `industry_fsm_sale` module 2. Go to Settings > Configure Document Layout 3. Select the Bubble document layout and save 4. Open any…
Steps to reproduce: -------------------------------- 1. Install `industry_fsm_sale` module 2. Go to Settings > Configure Document Layout 3. Select the Bubble document layout and save 4. Open any Field Service task 5. Use the Products smart button to add one or more products 6. Click the Settings icon > Print > Field Service Report Observation: -------------------------------- In Time & Material tables using the Bubble layout, table borders show a mix of rounded corners and sharp edges, resulting in inconsistent visuals Issue: -------------------------------- The table tags in the report were missing the `table-borderless` class. As a result, the layout-applied rounded borders conflicted with the default table borders Solution: -------------------------------- Add the `table-borderless` class to the affected table tags so the tables inherit consistent rounded borders from the document layout Before: <img width="787" height="317" alt="before_css" src="https://github.com/user-attachments/assets/dac136a8-022a-4c36-8cdb-1c0fbb048f3e" /> After: <img width="816" height="372" alt="after_css" src="https://github.com/user-attachments/assets/b5f96e75-2cd3-44cf-89e3-9a3b564c8369" /> opw-5401612 Forward-Port-Of: odoo/enterprise#105616
This update resolves an issue where journal items displayed in general ledger reports were incorrectly linked to account groups. The problem stemmed from a change in Odoo 18.0 that prevented a previous fix from working. The update now uses a more robust SQL query to accurately retrieve the correct account IDs, ensuring correct reporting.
Original PR description
Currently journal items shown don't belong to the account group that they should belong to, and from saas-18.3 an error will be generated after following the below steps or step mentioned in ref PR…
Currently journal items shown don't belong to the account group that they should belong to, and from saas-18.3 an error will be generated after following the below steps or step mentioned in ref PR [1]. - Install `Accounting (accountant)` with demo data - Create account groups e.g., name as `Test 1` and code prefix `1 to 1` - Go to the general ledger report - Click on `Journal Items` of the account group line `1 Test 1` Error from saas-18.3: `ValueError: Cannot convert account.account.group_id to SQL because it is ...` This error occurs because PR with ref [1] in 17.0 added the` group_id` field of the `account.account` model to the search domain. However, in 18.0, commit [2] modified this field so that it is no longer stored. As a result, when a search domain includes this `non-stored` field, Odoo skips the domain evaluation and logs a error at code line [3]. Consequently, the changes introduced by commit [1] have no functional effect from 18.0. Also, starting from saas-18.3, passing such a non-stored field in a domain raises an explicit error at code line [4], instead of being silently ignored. This commit resolves the issue by introducing an SQL query that returns the account ids related to `record_id(account group id)` include `record_id` as `None`. [1]: https://github.com/odoo/enterprise/pull/100191 [2]: https://github.com/odoo/odoo/commit/854c3b27aa5476c208572f19e64f8f3364bfc381#diff-19ef5a530c506fdee93fe0d113e61946b87fae7dd2d360558da69c0014f766b2R114-R767 [3]: https://github.com/odoo/odoo/blob/71e86f38c7699aaea980c929c67835a3495edf55/odoo/osv/expression.py#L1166-L1174 [4]: https://github.com/odoo/odoo/blob/00517e9e085c6fa9e00bedb8aee122a60e407fea/odoo/orm/fields.py#L1201 sentry-7100657414 Forward-Port-Of: odoo/enterprise#103137
This update resolves an error that prevented non-employee users from creating expenses linked to uploaded documents. The issue stemmed from a required field ('employee_id') not being populated correctly. The fix now displays a user-friendly error message instead of crashing, ensuring a smoother experience for all users.
Original PR description
Currently an exception is generated when the non-employee user tries
to generate expenses from the documents.
Steps to produce an error:
- Install the `documents_hr_expense` module without demo data
- Delete employee `Administrator`
- Upload any PDF/image file inside the company's `Internal` folder
- Click on the uploaded document and click on the `Create an Expense` button
Error: `ValueError: NotNullViolation('null value in column "employee_id" of ...`
This error occurs because `employee_id` is required when creating an
expense. Since the current user is not linked to an employee record,
`employee_id is` set to false, which causes the issue.
This commit resolves the issue by raising a `UserError` when the current
user is not linked to an employee.
sentry-7192984733
Forward-Port-Of: odoo/enterprise#104966
Forward-Port-Of: odoo/enterprise#104762This update simplifies the sales order reporting for subscription customers. The 'remaining hours' field, which could be misleading due to the recurring nature of subscriptions, has been hidden. This ensures a clearer and more intuitive experience for our customers and reduces potential confusion.
Original PR description
This change hides the `remaining_hours_so` field when the sales order line is linked to a subscription. Unlike standard service or time-based sales orders, where this field reflects the difference between the quantity ordered and the quantity delivered, the concept does not translate well to subscription logic. In the context of a subscription, the service is delivered on a recurring period (monthly, yearly, etc.). Delivery quantities continuously accumulate over time, and because the subscription renews indefinitely until cancellation, the “remaining hours” calculation quickly becomes misleading. In many cases it can drift into negative values, giving the impression of an error or over-consumption when, in reality, the subscription is simply following its recurring delivery cycle. To avoid confusing end-users and to maintain a clean, intuitive interface, we hide this field whenever the line is part of a subscription. opw-5246238 Forward-Port-Of: odoo/enterprise#99813
This update automatically generates unique employee IDs and sets the initial marital status to a person's birthday if they are single. This simplifies the onboarding process for new employees in the Swiss payroll system, reducing manual data entry and improving data accuracy.
Original PR description
For quality of life improvement, the unique employee identification is now automatically generated and initial marital status date is set to the birthday by default if the person is single Forward-Port-Of: odoo/enterprise#106752
This update clarifies the type of data stored in a key vector field within the AI module. Adding a 'ttype' field provides better organization and control over vector data, ensuring data consistency and improving the overall reliability of AI-powered features. This change is a technical refinement to enhance the AI module's functionality.
Original PR description
Add field ttype for vector field. community: https://github.com/odoo/odoo/pull/247542 For problem https://github.com/odoo/odoo/pull/247323#discussion_r2767940038
This update standardizes the way time off and absences are managed within the Odoo Enterprise system. It backports a fix that ensures consistent reporting and processing of these employee-related data points, improving accuracy and streamlining HR workflows. This change primarily affects the CH (Switzerland) payroll module.
Original PR description
Backport of https://github.com/odoo/enterprise/commit/f238e04f3f6c39b61d0449a0766809df06eb6980 task-5384297 Forward-Port-Of: odoo/enterprise#101449