Wednesday, May 6, 2026
79 changes · saas-19.3
Resolved issues and error corrections
This update resolves an issue where the 'short description' field on the website slides wasn't being populated correctly when the description was blank. The fix ensures that the field is populated appropriately, maintaining consistent presentation of slide information. This improves the overall quality and accuracy of the website's slide content.
Original PR description
In the PR #246357 the code for populate_description_short was adapted wrongly. When the `vals.get('description_short', False) is False`, the description_short field won't be populated correctly.
This commit fixes the issue.
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update adjusts the placement of editing tools (pencils) within Odoo reports. The change moves the pencil icon to the right of editable values, improving usability and making it easier for users to modify report data. All report values have been aligned for consistency.
Original PR description
The UI for editable values in reports was recently revamped. Currently, the pencil icon for editing the values is awkwardly positioned between the text and the value of a line in a report. This change moves the pencil to the right of any editable values. All report values have been shifted so that they are still right-aligned, regardless of whether they are editable or not. task-6086452
This update enhances Odoo's ability to maintain partner information offline. By optimizing how multi-ID data is handled, the system now avoids unnecessary calls to the server, allowing partner forms to remain available even when offline. This improves the user experience and data accessibility.
Original PR description
Change the multi ID Json (additional_identifiers) to avoid the rpc call on each country_code change and rely on a computed field to keep the partner form available offline. task-none
This update corrects a recent change in how Odoo handles geoIP location data. Previously, the system incorrectly favored the city database as a fallback, which is now reverted to prioritize the country database for optimal accuracy. This ensures more reliable location information is used for our users.
Original PR description
There are two geoip database: a small and fast-to-query country database, and a big but slower-to-query city database. As the City record inherits from the Country record, we can access the country…
There are two geoip database: a small and fast-to-query country database, and a big but slower-to-query city database. As the City record inherits from the Country record, we can access the country informations from the City record. In our case it means that when the ip was geolocalized against the city db, we can reuse the city record for the country informations, we don't need to query the country db. It also means that in case the country database does not exist, we can query the city database for the equivalent country information: it is slower but returns the information. In commit 06b0e0017651 we tried to simplify the code a bit, and decided to return the city database as fallback to the country database when the latter was not found/corrupt. This is wrong because if the city and country *records* are indeed compatible, the city and country *databases* are not. This commit reverts the changes that were included in the `[MOV]` commit. Reference-to: 06b0e0017651 ([MOV] core: http.router.root.geoip -> http.geoip) Forward-Port-Of: odoo/odoo#259412
This update fixes a calculation error in the l10n_ar_withholding module that resulted in an incorrect payment amount. The fix ensures accurate withholding tax calculations for payments, preventing discrepancies between the expected and actual amounts. This improves financial reporting accuracy.
Original PR description
**Steps to reproduce:** * Install `l10n_ar_withholding` module. * Create a vendor bill and click on 'Register Payment' to open the payment wizard. (i.e. amount 25000, tax 21%) * Select 'Own Checks'…
**Steps to reproduce:** * Install `l10n_ar_withholding` module. * Create a vendor bill and click on 'Register Payment' to open the payment wizard. (i.e. amount 25000, tax 21%) * Select 'Own Checks' within the payment method. * Clear Withholding lines and add line with tax `IIBB WTH CABA`. * In the Checks tab, input the check number, date, and amount (30000) natively. * The computation of the withholding lines is triggered. **Observed behavior:** * The total gross amount registered computes to exactly $30,247.93 instead of mathematically converging to the true original invoice debt of $30,250.00. **Cause:** * The `l10n_ar_withholding` module uses an iterative mathematical solver to progressively bump `wizard.amount` upward to effortlessly offset and scale the equivalent proportionate withholding taxes accurately. * However, inside Odoo's iterative memory loop (`for i in range(201)`), the ORM caches computed values across passes for NewId performance. As `wizard.amount` increments upwards, the dynamically dependent `l10n_ar_withholding_ids.base_amount` and `amount` fields fail to automatically invalidate their internal cache. * The loop relies on these statically cached values (e.g., $247.93) to verify if equilibrium has been reached, wrongfully satisfying the balancing exit condition and halting the loop prematurely. **Fix:** * Recompute the `base_amount`, `amount` using `add_to_compute` on the `l10n_ar_withholding_ids` automatically inside the iterative loop in `account_payment_register.py`. * This signals the ORM to cleanly dump the stale cache dependencies, natively forcing mathematically correct recalculations of the proportionate untaxed withholdings at every incremental `wizard.amount` step. The solver now strictly converges optimally to exactly block the correct value in 1-2 rapid passes without hanging on legacy computation artifacts. opw-5934489 Forward-Port-Of: odoo/odoo#254635
This update prevents Odoo from crashing when viewing order details without a linked employee. Previously, enabling 'Log in with Employees' could cause issues. Now, the system correctly displays the user who processed the order, ensuring a smoother experience.
Original PR description
**Before this commit** When trying to open an order's details, we would crash when that order does not have an employee associated with it. This can happen when the "Log in with Employees" setting is…
**Before this commit** When trying to open an order's details, we would crash when that order does not have an employee associated with it. This can happen when the "Log in with Employees" setting is enabled after at least one order has already been processed. **After this commit** If there isn't an `employee_id` associated with an order, don't try to overwrite the "Served By" field. By default, this should allow the name of the user who processed the order to be displayed. This can be seen in the original `getOrderFields()` method on the `OrderDetailsDialog` component. https://github.com/odoo/odoo/blob/e1c81c326e370b0a7b5bc8018b151e251ebce544/addons/point_of_sale/static/src/app/screens/ticket_screen/order_details_dialog/order_details_dialog.js#L81 This commit is mostly a backport of the slight refactor in 19.3, with the added benefit of still showing the names of the users who processed orders before `pos_hr` was installed on the database. https://github.com/odoo/odoo/blob/be57b42442db8c6be219d36f8c3e07e8baf45e31/addons/pos_hr/static/src/app/screens/order_details_dialog.js#L10-L15 opw-6169880 Forward-Port-Of: odoo/odoo#261622
This update ensures that invoices only include validated timesheets, preventing over-invoicing when sales orders have both validated and unvalidated timesheets associated with them. Previously, the system incorrectly included unvalidated timesheets in invoices, leading to inaccurate billing. This fix corrects a bug related to timesheet validation policies.
Original PR description
**Steps to reproduce** - Settings: Timesheets > Invoicing policy = only validated TS. - Have a service product with an invoicing policy based on timesheets. - Create a sales order using this product.…
**Steps to reproduce** - Settings: Timesheets > Invoicing policy = only validated TS. - Have a service product with an invoicing policy based on timesheets. - Create a sales order using this product. - From the SO, click on the "Recorded" smart button and create 2 timesheets. Validate only one of them. - Invoice the SO, using a timesheets period that includes both TS. - Notice that the quantity of the invoice line includes the non-validated timesheet. **Cause** The domain excluding non-validated timesheets provided by `_timesheet_compute_delivered_quantity_domain` is not considered since c3b6053b09222d4bd2237e7de589a63fbef118f1 **Change** Since the purpose of the previous fix was to exclude timesheets linked to an invoice with a date before the "Invoicing Switch Threshold", this can be achieved by tweaking the `timesheet_domain` slightly, similar to the `_timesheet_domain_get_invoiced_lines` domain. opw-6116670 Forward-Port-Of: odoo/odoo#262350 Forward-Port-Of: odoo/odoo#259224
This update fixes a problem where the payroll system incorrectly flagged users as unauthorized document owners in multi-company environments. The fix replaces a dependent field with a stored employee flag, ensuring accurate validation during background tasks regardless of the company context. This prevents errors related to generating payroll PDFs.
Original PR description
Steps to reproduce- 1) In a multi-company environment, create an employee in a secondary company. 2) Link a Portal User to this employee via the user_id field. 3) Create and validate a payslip for…
Steps to reproduce- 1) In a multi-company environment, create an employee in a secondary company. 2) Link a Portal User to this employee via the user_id field. 3) Create and validate a payslip for this employee. 4) Run the 'Payroll: Generate pdfs' cron. Error - ValidationError: The following user(s) cannot own root documents/folders: portal_employee: Payslip - portal_employee Cause - The validation logic uses the employee_id field on res.users to check if a user is an employee. Since employee_id is a non-stored computed field, its value depends on the current company context (self.env.company). When the payroll cron runs under the OdooBot user in the default company context (ID = 1), it cannot resolve the employee_id for users belonging to other companies. The field evaluates to False, causing the system to incorrectly flag the user as an unauthorized document owner. Fix - Replace the validation check with the employee boolean field. Unlike the computed Many2one, employee is a stored field that is not restricted by the active company context. This ensures that a user's employee status is correctly identified during background tasks across all companies. opw-6143042 Co-authored by Tina Lin (liti) Forward-Port-Of: odoo/enterprise#115570
This update resolves an issue where users weren't able to save settings when GST registration was unregistered. The fix ensures the system correctly checks the GST registration status, preventing a 'Missing Required Fields' error and allowing users to configure the necessary settings.
Original PR description
**Steps to reproduce:** * Install `l10n_in` module. * Go to Accounting > Settings. * Check 'Fetch Vendor E-Invoiced Document` and clear the GST Username * Uncheck `Registered Under GST`. * Try to…
**Steps to reproduce:** * Install `l10n_in` module. * Go to Accounting > Settings. * Check 'Fetch Vendor E-Invoiced Document` and clear the GST Username * Uncheck `Registered Under GST`. * Try to modify any setting and save. **Observed behavior:** * A `Missing Required Fields` error is raised even though no visible field is missing a value. **Cause:** * The `l10n_in_gstr_gst_username` field is placed inside a `div` that is hidden when `l10n_in_is_gst_registered` is `False`. * However, its `required` condition only checked `l10n_in_gst_efiling_feature or l10n_in_fetch_vendor_edi_feature`, without accounting for `l10n_in_is_gst_registered`. * Since both features default to enabled, the field remained required even when invisible, blocking any settings save. **Fix:** * Update the `required` attribute on `l10n_in_gstr_gst_username` to include `l10n_in_is_gst_registered` as a condition, so the field is only required when the GST section is visible and either `GST E-Filing & Matching` or `Fetch Vendor E-Invoiced Document` is enabled. opw-6133001 Forward-Port-Of: odoo/enterprise#116174 Forward-Port-Of: odoo/enterprise#114423
This update optimizes the HTML editor's performance by reducing unnecessary style recalculations during update processes. Previously, the system repeatedly checked element styles, leading to slower updates. This change improves the responsiveness and speed of the HTML editor, particularly when making frequent changes.
Original PR description
Description of the issue this PR addresses: Before this PR, updateHooks retrieved the computed style for each visible element and accessed marginTop and marginBottom inside the loop. Accessing properties of CSSStyleDeclaration may trigger style resolution, causing repeated 'Recalculate Style' work during hook updates. This PR extracts marginTop and marginBottom after getComputedStyle outside the loop, which reduces style reads during hook updates and avoids unnecessary style recalculations. task-6063534 closes odoo/odoo#252385 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259341
This update fixes a potential issue where holiday creation could fail unexpectedly. By ensuring error handling is correctly applied during the core holiday creation process, the system is now more reliable and robust. This improves the overall user experience when managing employee holidays.
Original PR description
this commit, in this PR:https://github.com/odoo/odoo/pull/242299 the create method was refactored to wrap only the _create_all_new_leave call in a try/except block, ensuring that ValidationError is caught at the correct. Task-6179171 Forward-Port-Of: odoo/odoo#262609 Forward-Port-Of: odoo/odoo#262175
This update corrects a calculation error in the Belgian payroll module (l10n_be_hr_payroll) related to determining eligible occupations for holiday attestation. The change ensures accurate hour calculations for employees, resolving a potential discrepancy in holiday entitlements. This update improves payroll accuracy and compliance.
Original PR description
. use _get_hours_per_week() method instead of calling the field on the version task-6185339 Forward-Port-Of: odoo/enterprise#115990
A test related to rental stock management was failing due to duplicate configuration settings within the demo data. This fix ensures the test runs correctly by preventing the creation of redundant 'out of stock' ribbons, maintaining data integrity.
Original PR description
Currently, running test `test_out_of_stock_ribbon_is_not_applicable_for_rentals` with demo data enabled leads to a validation error: `Only one ribbon with the "assign when out of stock" option is allowed.` This happens because, with demo data loaded, an "out of stock" ribbon is already created via XML data. The test then attempts to create another ribbon with the same configuration, triggering the constraint and causing the failure. Related PR: https://github.com/odoo/enterprise/pull/112660 runbot-[242457](https://runbot.odoo.com/odoo/error/242457) --- Forward-Port-Of: odoo/enterprise#116162
This update fixes an issue where the product amount in the quotation preview was incorrectly showing tax excluding prices. The fix ensures that when 'Tax Included' is selected in settings, the preview and PDF reports accurately display the total price, including taxes. This improves the accuracy of sales quotes for our customers.
Original PR description
**Steps to produce:** - Install `sale_management` without demo data. - In settings > Under Taxes > Set `Tax Prices` as `Tax Included`. - Create a product with a sales price of 10. - Create a…
**Steps to produce:** - Install `sale_management` without demo data. - In settings > Under Taxes > Set `Tax Prices` as `Tax Included`. - Create a product with a sales price of 10. - Create a quotation with this product. - Confirm the line amount shows 10 (tax included). - Click on preview. **Observation:** - In the preview, the product line amount is shown as tax excluded. **Root cause:** - At [1], when in the company setting `tax included` is selected, the system displays `price_total` instead of `price_subtotal`. - This logic is not applied in the portal preview and PDF report. **Solution:** - Apply the same logic in portal preview and PDF reports: display `price_total` when taxes are included, otherwise `price_subtotal`. [1]https://github.com/odoo/odoo/blob/3dfb2849acd899ccbf4048f2a15dff3c74aed96d/addons/sale/views/sale_order_views.xml#L656-L663 Before: --- <img width="1031" height="384" alt="image" src="https://github.com/user-attachments/assets/743abbec-9225-4f77-894b-193052ee8e42" /> After: --- <img width="1052" height="391" alt="image" src="https://github.com/user-attachments/assets/61d2b331-e197-4ca0-a71d-e307d9bf80fe" /> opw-6089473 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261892 Forward-Port-Of: odoo/odoo#258551
A technical error preventing cash payments on POS terminals using Razorpay was resolved. The fix ensures the system correctly handles payment selections, preventing a 'null value' error that interrupted the transaction process. This improves the reliability of cash payments within the Odoo POS system.
Original PR description
Steps: - Open a POS configuration with the Razorpay payment method set to all payment modes. - Process an order and initiate a Razorpay transaction. - Select a cash payment option on the terminal. Issue: - A traceback occurs with the error: `Cannot read properties of null (reading 'replace')`. Cause: - The code attempts to call the replace method on a null value. Fix: - Ensure the replace method is called only when the value is a valid string. Task-6190355 Forward-Port-Of: odoo/odoo#261922
This update corrects a technical error that was preventing livechat channels with AI agents from appearing correctly to users. The fix ensures the system accurately counts agents linked to each livechat channel, resolving a visual issue. This improves the user experience for livechat functionality.
Original PR description
The number of agents linked to a livechat channel was always 0 because of a mistake in the code. This prevented livechat channels with AI agents from appearing to users. This commit fixes the problem. task-5409200 Forward-Port-Of: odoo/enterprise#114404 Forward-Port-Of: odoo/enterprise#111574
This update optimizes the way the spreadsheet component interacts with field selections, reducing unnecessary processing. Previously, a repeated process caused performance slowdowns. This change improves the overall responsiveness and efficiency of the spreadsheet feature.
Original PR description
Currently, the component `ModelFieldSelector` will call the field service on `willUpdateProps` regardless of its current state. Since the introduction of the persistent cache, there is a slight overhead when calling the fieldService (notably caused by the call to deepCopy) and this call can now become costy when called repeatedly, which occurs in the spreadsheet component for instance. Task-6185388 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#262497
This update resolves an issue where adding a lot to a detailed operation on a stock move would reset the quantity and erase the lot. The fix ensures that component moves are correctly picked when a lot is added, preventing data loss and ensuring accurate production tracking. This improves the reliability of subcontracted production workflows.
Original PR description
### Steps to reproduce: - Create and confirm an MO for 1 unit of product without bom - Set the producing quantity to 1 - Add a new component line for a product tracked by SN - Click on details…
### Steps to reproduce: - Create and confirm an MO for 1 unit of product without bom - Set the producing quantity to 1 - Add a new component line for a product tracked by SN - Click on details operation and add a lot > Save - Produce all #### > The quantity is of the component move is reset to 0 and the lot erased ### Cause of the issue: Setting the producing quantity to 1 will set the state of the of the MO to `to_close`. After which, adding a new move will add it in the appropriate `picked` state so that the move is considered when validating the MO: https://github.com/odoo/odoo/blob/5e623af55fba64e812db6bcaf06d8f7c5d08f055/addons/mrp/models/stock_move.py#L269-L270 However, clicking on the detailed operation and selecting a lot will create a new `move_line` without set `picked`. As such the related picked compute method of the stock move will be launched: https://github.com/odoo/odoo/blob/5e623af55fba64e812db6bcaf06d8f7c5d08f055/addons/stock/models/stock_move_line.py#L123-L127 resetting the picked state of the move to False as a new move line was added (triggering a dependency of its compute method): https://github.com/odoo/odoo/blob/5e623af55fba64e812db6bcaf06d8f7c5d08f055/addons/stock/models/stock_move_line.py#L126 https://github.com/odoo/odoo/blob/5e623af55fba64e812db6bcaf06d8f7c5d08f055/addons/stock/models/stock_move.py#L280-L286 Additional change: The test `TestSubcontractingBasic.test_flow_tracked_1` underlined that the `auto_pick_move_lines` context key added to `action_show_details` had to be cleaned in subcontracting flows before synchronizing the subcontracted productions: https://github.com/odoo/odoo/blob/0352c5e8543b75083cf555c3d5b4f164f949b465/addons/mrp_subcontracting/models/stock_move_line.py#L34-L38 Otherwised, if a receipt for tracked subcontracted product is picked and additional move lines are added via the detailed operations, the subcontracted backorders created to fulfill the additional demand will will pick each of their move leading to subcontracted MO's that will avoid assignment: https://github.com/odoo/odoo/blob/6d7b1ffb8bbea77baa9feb9087b320a9e01ea715/addons/stock/models/stock_move.py#L1914-L1916 and be cancelled at the picking validation: https://github.com/odoo/odoo/blob/6d7b1ffb8bbea77baa9feb9087b320a9e01ea715/addons/mrp/models/mrp_production.py#L1924 https://github.com/odoo/odoo/blob/6d7b1ffb8bbea77baa9feb9087b320a9e01ea715/addons/stock/models/stock_move.py#L2107-L2109 This can be checked by launching the test without the `clean_context`. We also improve the `TestSubcontractingBasic.test_flow_tracked_1` test as it is not possible to edit moves to be picked prior to confirmation and since move lines can not manually be created in picked state. ### Fix: Note that we rely on a context key to adapt the compute method of the picked field of the `stock.move.line` instead of adding a `default_picked` context in the `action_show_details` because the new move lines added to the list view of the `move` form are generated via the UI by opening a list of `stock.quant` which cleans the `default_context` key prior to generation of the `new` move line. In particular, the exact UI flow can not be tested by relying on the `Form` class of stock moves since the new move lines will then be created by via the `O2MForm` class: https://github.com/odoo/odoo/blob/06bc382d8f722ef87c23e360992df0743e350172/odoo/tests/form.py#L642-L658 and an onchange of the stock move line will be triggered to determine its value relying on the `default_picked` context key to create the new move line in picked state: https://github.com/odoo/odoo/blob/06bc382d8f722ef87c23e360992df0743e350172/odoo/tests/form.py#L332-L339 https://github.com/odoo/odoo/blob/06bc382d8f722ef87c23e360992df0743e350172/odoo/tests/form.py#L579 https://github.com/odoo/odoo/blob/06bc382d8f722ef87c23e360992df0743e350172/addons/web/models/models.py#L2005-L2008 By contrast performing the flow from the interface will highlight that the `default_picked` context key does not solve the issue. opw-5991985 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258935
This update resolves an issue where users lacking access to employee data would encounter an error when trying to view attendance records. The change corrects a technical detail related to accessing employee information, ensuring all users can access the Attendances feature. This improves usability for all employees.
Original PR description
Steps to reproduce: ---------------------------------------- - Connect with a user having no rights on Employee - Try to open Attendances - Access error Cause: ---------------------------------------- Since 218b91cad3e50b27a84624145c89ed6bb23f18c5 we read the field `is_flexible` on employee which is a field only accessible to `hr.group_hr_user` ([src](https://github.com/odoo/odoo/blob/70ade77937bfc171a3352e70c5c78bfd87ceb4d1/addons/hr/models/hr_version.py#L154)). opw-6179252 Forward-Port-Of: odoo/enterprise#116052
A minor typo in the French Profit & Loss report (P&L) has been fixed. Specifically, the term 'exceptionnel' was incorrectly using masculine form when it should be feminine to accurately reflect charges. This ensures correct reporting for French-speaking users.
Original PR description
There was a small typo in section 8 of the pnl report. "exceptionnel" must go feminine when referring to charges. Forward-Port-Of: odoo/enterprise#116198
A bug in the testing process was causing tests to fail when demo data was loaded. This was due to a duplicate IoT Box record existing in both the test setup and the demo data. This fix resolves the conflict, ensuring tests run correctly and reliably.
Original PR description
We define an IoT Box record in tests with name "Shop". Another IoT Box with this name is defined in the demo data of the module. As a result, when tests are started with demo data loaded, we tend to click on the first IoT Box record with whis name, which correspond to the one from demo data. Some tests are then failing as they can't find device record defined in the test setup. related: odoo/enterprise#96760 Forward-Port-Of: odoo/enterprise#116234
This update clarifies French accounting reports by splitting a key account to accurately separate social security charges from salaries. This change ensures compliance with French accounting standards (ANC PCG 2026) and improves the accuracy of financial reporting. The old account remains for legacy systems but is marked as deprecated.
Original PR description
Splitting account 649 into two new accounts (6491 and 6492) is necessary to handle the Profit and Loss report properly. This ensures we can accurately separate social security charges from salaries in the report. Reference: ANC PCG 2026, page 445, note (h) https://www.anc.gouv.fr/files/anc/files/1_Normes_fran%C3%A7aises/recueil/RECEUIL-PCG-2026-AVEC-COUVERTURE.pdf task-6053784 Forward-Port-Of: odoo/enterprise#114412 Forward-Port-Of: odoo/enterprise#111420
This update resolves an issue where text highlights in the website editor were incorrectly displayed in front of the text on Firefox. The fix reorders how SVG highlight elements are added to the HTML, ensuring they render behind the text as intended. This improves the visual consistency of the website editor across different browsers.
Original PR description
# How to reproduce - Go to the website editor - Select some text that wraps - Add text highlight to that text # The problem On firefox, for every line of text that wraps, the highlight is displayed in front of the text instead of behind. # Why The highlights are made of SVG's that are added to the html element of the selected text. To be sure that theses SVG's are displayed behind the text, they have position: absolute and z-index: -1. Sadly, z-index and absolute positionning in an inline context (like in a span) is a browser specific behavior and in the case of firefox, seems to sometimes be ignored. Since the SVG's are appended in the html element after the text, they are rendered after. This fix aims to insert the SVG's in the html element before the text to make sure the rendering order is correct opw-5976647 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254196
This update ensures continued functionality with Sendcloud by incorporating their legacy API version 2 key. Sendcloud has transitioned to a new API version, and this change allows existing users to maintain seamless delivery processing. Future work will focus on upgrading to the latest Sendcloud API version 3.
Original PR description
Sendcloud pass their api v2 to maintenance and only provide new api V3 key to the new customers. In order to make a smooth transition for the user we add the partner key, so they know that the customer are coming from odoo and they use the v2 api. Future work will be done to upgrade our module and support the v3. API key. Forward-Port-Of: odoo/enterprise#115999 Forward-Port-Of: odoo/enterprise#114441
This update fixes an issue where users could select customers from different companies within the Helpdesk module. The fix involved adding a restriction to the customer selection dropdown, ensuring users only see customers within their assigned company. This improves data accuracy and prevents errors when creating new support tickets.
Original PR description
Steps to reproduce: - - Create two companies (Company A and Company B) - Create one partner in each company - Enable both companies for the user - Open Helpdesk and go to the tickets Kanban view for a Company A team. - In the quick create form, the customer dropdown shows customers from Company B Issue: - - Customers from other companies are visible in the customer field, Cause: - - The partner_id field in the quick create view had no domain, so it displayed partners from all allowed companies. Solution: - - Added a domain on partner_id in the Python field. task-4971466 Forward-Port-Of: odoo/enterprise#116157 Forward-Port-Of: odoo/enterprise#111909
This update resolves a technical error preventing the import of emissions data, specifically related to journal entries. The fix restricts imports to manual emissions, ensuring data integrity and preventing database issues. This improves the reliability of our ESG reporting capabilities.
Original PR description
The import button is present in the Emitted Emissions menu, but it produces the following error: "cannot insert into view 'esg_carbon_emission_report' DETAIL: Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." => To fix this, we will only allow the insertion of manual emissions (model: other.emission) via import, not emissions related to journal entries. task-6168587 Forward-Port-Of: odoo/enterprise#116092 Forward-Port-Of: odoo/enterprise#115306
This update fixes an issue where the emission factor date range wasn't displayed accurately. The missing 'always_range' option was the root cause, now resolved to ensure correct date validation and display. This improves the reliability of ESG reporting data.
Original PR description
Before this commit, the validity period was not correctly displayed because the always_range option was missing no related task Forward-Port-Of: odoo/enterprise#115832 Forward-Port-Of: odoo/enterprise#114784
This update fixes an issue where a horizontal scrollbar obscured the bottom border of the code view when content overflowed. The change repositioned the scrollbar to ensure the border remains visible, improving the overall visual consistency and user experience of the code editor. This ensures a cleaner and more professional look for code snippets.
Original PR description
Problem: When the code view contains content that overflows horizontally, the horizontal scrollbar hides the bottom border of the code view. Solution: Move the scrollbar inside the code view so the bottom border remains visible. Before: <img width="716" height="76" alt="image" src="https://github.com/user-attachments/assets/05b16d8e-4014-488f-84d6-f4e4c0dcae23" /> After: <img width="707" height="108" alt="image" src="https://github.com/user-attachments/assets/7151e3e0-254c-4e7c-bcda-bea2d7ab2cea" /> Steps to reproduce: - Add content in the code view that overflows horizontally. - Observe that the scrollbar hides the bottom border. task-6124267 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261554
This update addresses a technical issue that caused kiosk-related tests to fail. The problem stemmed from a missing configuration setting within the Odoo system, specifically the `self_ordering_default_user_id` field. Fixing this ensures that the system can correctly load product information, resolving the access error and allowing the tests to pass.
Original PR description
pos_self_order_* = pos_self_order_bancontact_pay, pos_self_order_qfpay Some kiosk-related tests failed due to an incomplete `pos.config` setup. The `self_ordering_default_user_id` field was not configured, leading to an access error on the `account.tax` model when loading `product.product` fields and relations. --- Task: https://www.odoo.com/odoo/1737/tasks/6183108 Runbot Error: https://runbot.odoo.com/odoo/error/243051
This update resolves a bug that caused bank reconciliation balances to reset to zero after editing a bank statement move line when using multiple currencies. The fix ensures accurate balance calculations during bank reconciliation processes, improving financial reporting reliability.
Original PR description
Fixed an issue where when editing a move line for the bank reconciliation and setting the currency to a currency other than the company's currency if we edit the move line again we will find that the balance is equal to 0. task-6037835 Forward-Port-Of: odoo/enterprise#114898
This update corrects a minor issue where the 'unfold all' option was incorrectly applied during the export of aged receivable reports (like PDFs). This prevented users from seeing all relevant data in the exported reports. The fix ensures the 'unfold all' option functions as intended, providing complete report data.
Original PR description
This commit introduced a small issue: https://github.com/odoo/enterprise/commit/40484f985f511edd7ba2ae759ce63ef564bcf1f7 When exporting a report (the aged receivable in pdf for example), the option key "unfold_all" was set but shouldn't be. Forward-Port-Of: odoo/enterprise#115985
This update resolves an issue causing incorrect rounding when importing purchase orders processed through OCR. The fix restores the original rounding precision, which was designed for EDI processing, rather than the OCR method. This ensures accurate financial data import.
Original PR description
Since commit odoo/odoo@86463ce, there could be rounding issues when importing a purchase order matched through the OCR. A first attempt at fixing this was done in commit odoo/odoo@5dbb814, but it was eventually reverted as deemed too risky for a stable branch. More information about how the rounding error occurred is available in that commit description. This second fix should be much safer, we simply don't disable the rounding precision when the OCR is used, as this was intended for EDI in mind in the first place, not the OCR. opw-[6113387](https://www.odoo.com/odoo/my-support-tasks/6113387) Forward-Port-Of: odoo/enterprise#116141 Forward-Port-Of: odoo/enterprise#116021
This update resolves an issue where Amazon's stock synchronization was failing due to incorrect fulfillment channel data. The system now uses a more reliable field from the Listings API to determine channel availability, defaulting to FBM when necessary to ensure stock updates continue. The change also improves the process for customizing stock updates.
Original PR description
During the upgrade from XML-based feeds to the new JSON Listings API for stock management, we chose to use Amazon's API to fetch a listing's fulfillment channel information. However, Amazon does not…
During the upgrade from XML-based feeds to the new JSON Listings API for stock management, we chose to use Amazon's API to fetch a listing's fulfillment channel information. However, Amazon does not provide a clear answer for a given listing. After some research, we assumed an offer was FBM when the listing contained a `merchant_shipping_group`, because this setting is specific to FBM listings. See also e6d620e4b200cadabb00ce37ab03289cfeb4ae58. This assumption was flawed: Amazon can keep the shipping group even after a listing switches to FBA, which can block stock synchronization. This commit uses the `fulfillmentAvailability` field from the Listings API instead. This field stores the available quantity for each fulfillment channel in which the listing is sold. When multiple fulfillment channels are present, the offer defaults to FBM so stock synchronization can continue. The `sale_amazon_channel_management` module can then be installed to manually select and disambiguate the channel. This commit also upgrades the patching method used to update the FBM stock to ensure user specific configuration aren't overriden during the synchronization. opw-6064896 opw-5152359 Forward-Port-Of: odoo/enterprise#115899 Forward-Port-Of: odoo/enterprise#114473
This update resolves an issue where enabling 'Secure Posted Entries with Hash' on LATAM purchase journals caused posting failures due to document number sequencing. The fix hides this option for LATAM purchase journals, aligning with how vendor-assigned document numbers are handled, and prevents users from creating an incorrect setup.
Original PR description
Steps to reproduce 1. Install l10n_ar (or any LATAM localization). 2. Go to Accounting > Configuration > Journals and open a Purchase journal that has "Use Documents?" enabled. 3. Enable "Secure…
Steps to reproduce 1. Install l10n_ar (or any LATAM localization). 2. Go to Accounting > Configuration > Journals and open a Purchase journal that has "Use Documents?" enabled. 3. Enable "Secure Posted Entries with Hash". 4. Create and post a vendor bill with a high document number (e.g. 00001-00009999). 5. Create another vendor bill with a lower document number (e.g. 00001-00000100) and try to post it. Issue Posting the second vendor bill fails with: "This move could not be locked either because some move with the same sequence prefix has a higher number. You may need to resequence it." The hashing logic in account_journal.py enforces a strict continuous sequential chain per journal: https://github.com/odoo/odoo/blob/89993885823f7309b921145eacc7bbe2c3c1e427/addons/account/models/account_journal.py#L671-L678 In LATAM countries, vendor bill document numbers are assigned by the vendor, not by Odoo. A bill with a lower number can legitimately be entered after one with a higher number, which breaks the sequential assumption the hash chain relies on. Allowing it would produce a hash that no longer represents a proper chain, giving users a false sense of security. Sales journals are unaffected because Odoo controls their sequence. Solution Hide the "Secure Posted Entries with Hash" field on purchase journals that have "Use Documents?" enabled, preventing users from enabling an option that cannot work correctly for vendor-assigned document numbers. Sales journals keep the option available since Odoo controls their sequence. opw-6076673 Forward-Port-Of: odoo/odoo#262614 Forward-Port-Of: odoo/odoo#259206
This update corrects a technical error that prevented proper sorting of partners within the Discuss feature. The fix ensures that partners with email addresses matching search terms are prioritized correctly, enhancing the functionality of this important communication tool. This resolves a previously undetected issue.
Original PR description
In Discuss, the function used to sort partners prioritizes those whose email addresses start with the search terms. However, due to an error in the programming of the corresponding condition, this check could never be true. This commit adjusts the condition so that it behaves as expected. Forward-Port-Of: odoo/odoo#262583
The Gantt view now accurately displays operation durations in hours instead of minutes. This change was triggered by a correction to a formatting issue that had been introduced previously. Users will see more precise and reliable time estimates for work orders within the Gantt view.
Original PR description
Issue ----- In the gantt view, operation duration is displayed as minutes but is actually in hours. Steps to reproduce ----- - Enable work orders - Create a product with a BoM - Add an operation with some duration on the BoM - Creation a MO for the product, confirm & plan - Open the gantt view > Duration is displayed in minutes Cause ----- Overlooked by the rework of formatter done in b764335. Value is in hours but unit is set to "minutes". https://github.com/odoo/enterprise/blob/8281fe6c830dce94ca851bf4bd5c768443721f17/mrp_workorder/static/src/mrp_workorder_gantt_renderer.js#L46-L49 ----- Ticket: opw-6109524 Forward-Port-Of: odoo/enterprise#113829
This update fixes an issue where the CustomGroupByItem dropdown in the search bar wasn't properly styled on hover. The fix ensures the dropdown items appear correctly, enhancing the user experience and visual consistency. It also restores keyboard navigation functionality for this item.
Original PR description
The CustomGroupByItem select was missing the `o-navigable` class, so the navigation system never registered it. On hover, it would not receive the `focus` class, which ensures proper styling of dropdown items. The fix also restores the ability to reach the CustomGroupByItem select with keynav. task-6108677 Forward-Port-Of: odoo/odoo#262608 Forward-Port-Of: odoo/odoo#260675
This update optimizes how Odoo searches for products based on names, significantly speeding up the process. The change utilizes a more efficient query structure to avoid performance bottlenecks when searching across multiple product tables, leading to faster search times. This improves the user experience and overall system responsiveness.
Original PR description
When doing a name_search with positive operators (=, ilike, in) the resulting query combines domains with the OR operator. This works fine when the leaves are all on the same table (product_product…
When doing a name_search with positive operators (=, ilike, in) the resulting query combines domains with the OR operator. This works fine when the leaves are all on the same table (product_product or product_template) as postgresql uses a Bitmap OR when everything is properly indexed.
When leaves are on multiple tables however postgresql has to plan a Seq Scan. For instance, let's take a simple domain on product.product of the form `['|', ('name', 'ilike', 'test'), ('default_code', 'ilike', 'test')]`. Because `name` is an inherited field via `product_tmpl_id`, the resulting query has the where clause `join_table.name ilike %s OR product_product.default_code ilike %s` with `join_table` the table you get after joining product_product and product_template. Since it's an `OR` condition, postgresql does not know in advance whether a given row will pass this condition. There's no way to filter the tables before the join. The condition moves therefore to a `Join Filter` node and postgresql has to scan the whole join table to fetch the correct tuples.
Same thing when there's a subquery. In case of a where clause `cond OR cond OR subquery`, postgresql does not know in advance whether or not a given row is gonna pass the subquery condition. So it has to scan the whole table.
In both cases this becomes a bottlneck when the number of products increaases. This commit introduces the use of `UNION ALL` instead of `OR`. There's one SubPlan for each individual table in the domain. The results are then appended to get the final products matching the conditions. Thanks to each table having its own SubPlan postgresql can now properly hit indexes for each table, greatly improving the performances.
#### speedup
In a database with 2.5M product_product, the name_search on product with a partner_id in the context and the ilike operator goes from 8s -> 5ms.
In another database with 500k product_template, the name_search on template with a partner_id in the context and the ilike operator goes from 1.8s -> 5ms.
opw-4921944
opw-5103287
opw-5049054
opw-5256691
opw-5221753
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#240860
Forward-Port-Of: odoo/odoo#229275This update resolves a previously unpredictable crash in the website caused by a faulty test. The issue stemmed from how a popover component handled closing when the sidebar was closed, specifically when the component was destroyed. This ensures the website remains stable and reliable for users.
Original PR description
The goal of this commit is to fix the `test_10_website_conditional_visibility` test in the website, which has been crashing unpredictably since the dropdown patch in knowledge. This patch does not handle the case where `dropdownActiveEl` and `this.activeEl` are `undefined` because the component has already been destroyed. In our case, we have a popover that closes when the sidebar closes, triggered by clicking the “save” button. error-243073 Forward-Port-Of: odoo/enterprise#115316
This update resolves an issue where manufacturing orders incorrectly flagged missing components, leading to unnecessary consumption alerts. The fix ensures that component compatibility with the specific product variant is now checked before triggering consumption issues, streamlining the production process and preventing false alerts. This improves order accuracy and reduces manual intervention.
Original PR description
Steps to reproduce the bug:
- Create a storable product “P1”:
- Variant: Color -> Red & Blue
- BoM: -Components: - C1: apply on variant Blue - C2: apply on all variant
- Create a manufacturing order to produce one P1 red
- only the move raw C2 is created -> expected behavior
- Confirm the MO
- Try to validate the production
Problem:
A consumption issues is triggered to indicate that C1 is missing
Explication:
When confirming a manufacturing order, we checks if some BoM components are missing and may trigger a consumption issue.
However, the check was done on all BoM lines of the exploded BoM, without verifying whether the component was compatible with the variant being produced.
As a result, a consumption issue could be raised even when the missing component was not supposed to be consumed for the selected variant.
opw-6062762
Forward-Port-Of: odoo/odoo#256655This update fixes an issue where self-order combo prices were inaccurate when multiple quantities of the same combo were ordered. The fix ensures that prices are correctly calculated across all orders, particularly when multiple units of a combo are purchased, resolving a discrepancy between the mobile and restaurant views. This ensures accurate pricing and a better customer experience.
Original PR description
**Steps to reproduce:** - Order a combo in the self order Mobile with multiple products - Order the same combo more than once - Checkout and go to the linked restaurant - Go to the orders, the price…
**Steps to reproduce:** - Order a combo in the self order Mobile with multiple products - Order the same combo more than once - Checkout and go to the linked restaurant - Go to the orders, the price is not the same as in the self - If you check the unit prices in the backend, they are not consistent **Why the fix:** This is mostly a backport of bd117e8 with an addition because the extras still did not work as intended. In the backend, during the price recomputation, we did not account for the fact that we could have a parent line with multiple quantity during the split between the free and the extra lines. This means that we counted too many lines, and had to put some in the extra lines. We then override the price_unit with the total_price in this code https://github.com/odoo/odoo/blob/f73c32960721b046076b91e4bc017ddb924e0837/addons/pos_self_order/models/pos_order.py#L341-L342 But the total price has been computed to zero, so the previously computed price_unit is overridden and set to zero. We now divide the line's qty by the parent line's qty to get the qty per parent line, allowing us to have a qty of more than 1 for the parent line. The same is done for the computation of the remaining amount to pay, as **child.qty** is the number of time the item is selected in the combo * the number of combo ordered, meaning it was messing up the computation. There was an oversight in the original fix, which meant that the unit prices were not distributed as they should have been, even though the total was correct. When we only order one combo that costs 25 and has 2 items, both items will have a price_unit of 12.5, but if we have more than 1 qty of said combo, the price_unit will be all over the place and the second item will have to compensate for the first one thanks to https://github.com/odoo/odoo/blob/b108bb847b1c4d3a91f223d77a4888b8139b0a8d/addons/pos_self_order/models/pos_order.py#L322-L323 We now update the original total to take the fact that multiple combo can be ordered. opw-6076911 Forward-Port-Of: odoo/odoo#261810 Forward-Port-Of: odoo/odoo#257922
This update resolves an issue preventing non-admin internal users from accessing website imports. The fix grants read-only access to the relevant data model, ensuring the website generator systray functions correctly without causing errors. This improves the usability of the website import process for all users.
Original PR description
Steps to reproduce: =================== 1. On a 19.1, launch a website import as admin 2. Log in as a non-admin internal user => AccessError on website_generator.request Cause: ====== The website generator systray polls `website_generator.request` on every page load: https://github.com/odoo/enterprise/blob/0226ad15abc8db70f8e379fddec3d83d15749c85/website_generator/static/src/systray_items/generator_request.js#L48 Only `base.group_system` had access on the model, so any non-admin user hit an AccessError as soon as an import request existed (session_info sets show_scraper_systray=True for everyone based on the last request's notified flag). Solution: ========= Grant read-only access to `base.group_user`; writes/creates stay restricted to system so the import flow itself is unchanged. => Systray loads silently, shows status indicator opw-6092411 Forward-Port-Of: odoo/enterprise#114879
This update prevents users without posting permissions from dragging and dropping files into the chatter window. Previously, this allowed users to upload attachments even if they couldn't contribute to the conversation. This change improves security and usability by restricting file uploads to authorized users.
Original PR description
This commit disables the drag&drop of files into the chatter if the user cannot post on the thread. Part of task-6071789 PR enterprise: https://github.com/odoo/enterprise/pull/115658 Forward-Port-Of: odoo/odoo#262018
This update fixes a minor issue where the 'attach file' button wasn't appearing correctly in the email preview for enterprise users. The change ensures the button is enabled only after the email thread has fully loaded, resulting in a smoother and more reliable user experience. This improves the functionality of the email module.
Original PR description
Wait for the attach file button to be enabled, meaning that the thread is loaded. PR community: https://github.com/odoo/odoo/pull/262018 Forward-Port-Of: odoo/enterprise#115658
This update resolves an issue where Nilvera was not sending recently created invoices to Odoo. The change extends the date range used to fetch invoices by 3 hours (Istanbul time) to account for the time zone difference, ensuring all invoices are synchronized correctly. This prevents data loss and improves the accuracy of invoice processing.
Original PR description
# Description of the issue/feature this PR addresses: Nilvera does not return recently created documents (within ~3 hours), which can lead to missing invoices during synchronization. # Current behavior before PR: The end_date was set to the current time, causing recently created documents to be excluded from the fetch results. # Desired behavior after PR is merged: The end_date is extended by 3 hours (TR GMT+3), ensuring recently created documents are included and not missed during synchronization. task-id: [6123171](https://www.odoo.com/odoo/my-tasks/6123171) I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr) Forward-Port-Of: odoo/odoo#261626 Forward-Port-Of: odoo/odoo#259306
This update resolves a test failure related to tour completion, specifically when users interact with form views. The fix ensures all popup closures are processed before the tour ends, preventing inconsistencies and improving test reliability. This ultimately contributes to more stable software.
Original PR description
**Issue** Currently, there is an async issue with the test `test_shop_floor_disable_serial_create`that may fail with the following error: "Tour finished with a dirty form view being open. Dirty form views are automatically saved when the page is closed, which leads to stray network requests and inconsistencies." **Cause** Although the tour explicitly closes all popups, the last click on the discard button may not be processed before the tour ends: https://github.com/odoo/enterprise/blob/859e65e8c267701bb19dbff9d24a8c80774dbaa6/mrp_workorder/static/tests/tours/tour_shopfloor.js#L332-L333 runbot-242504 Forward-Port-Of: odoo/enterprise#114367
This update fixes a problem where the softphone tour wouldn't function correctly after opening for the first time. The change ensures the correct tab is displayed and prevents errors during user interactions like searching. This improves the overall user experience for new softphone users.
Original PR description
Commit [1] made the softphone to show recent tab when there are missed calls. Commit [2] changed the demo data to contain 1 missed call. As a result, now when you open the softphone for the first time, you will see recent tab instead of the keypad tab before. This causes issues when a tour starts with switching to, for example, contacts tab, and then do a search for something immediatly. This is because that `input[id='o-voip-Tab-searchInput']` can be found on both recent and contacts tab. It can happen that we do the search before the dom change finished. To avoid that, we add extra check to make sure we have changed to the tab we want. [1]: c995b7df3fc6ff541dc65d8b28661ab03f4a8c08 [2]: f16faa029220ca7152289180c4de78783bab03be
This update fixes an issue where list header labels in odoo spreadsheets weren't properly translated, causing instability with multi-language pivots. The change allows for flexible header labels, ensuring consistent translations across different languages and spreadsheet pivots.
Original PR description
**Description** With odoo/odoo#247578, we were storing static column names in the list definition during migration and list insertion. As a result, list header labels stopped being translatable. This…
**Description** With odoo/odoo#247578, we were storing static column names in the list definition during migration and list insertion. As a result, list header labels stopped being translatable. This was originally done because spreadsheet pivots created from list ranges can break when translated headers change from one language to another. In this commit: - make `string` optional in list column definitions so headers fall back to the translated field display name when no explicit label is stored - keep explicit/custom labels by storing `string` only when a stable header is really needed - update list migration, insertion, and reinsertion flows so they no longer force static labels by default - simplify the list side panel so users can choose between the automatic translated label and a custom stored label - when creating a spreadsheet pivot from a list range in multi-language mode, automatically store the current displayed labels only for the list columns used by that pivot so the pivot stays stable across languages Task: 247578 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where list header labels weren't properly translated, preventing spreadsheet pivots from working correctly in multiple languages. The change allows for both automatic translation and custom labels, ensuring consistent and accurate translations across all supported languages.
Original PR description
**Description** With odoo/odoo#247578, we were storing static column names in the list definition during migration and list insertion. As a result, list header labels stopped being translatable. This…
**Description** With odoo/odoo#247578, we were storing static column names in the list definition during migration and list insertion. As a result, list header labels stopped being translatable. This was originally done because spreadsheet pivots created from list ranges can break when translated headers change from one language to another. In this commit: - make `string` optional in list column definitions so headers fall back to the translated field display name when no explicit label is stored - keep explicit/custom labels by storing `string` only when a stable header is really needed - update list migration, insertion, and reinsertion flows so they no longer force static labels by default - simplify the list side panel so users can choose between the automatic translated label and a custom stored label - when creating a spreadsheet pivot from a list range in multi-language mode, automatically store the current displayed labels only for the list columns used by that pivot so the pivot stays stable across languages Task: 247578
This update resolves an issue where a delay in website navigation elements (specifically dropdown menus) caused unexpected behavior and test failures. By ensuring the menu fully renders before other actions are taken, the system now provides a more reliable and consistent user experience. This improves overall website stability.
Original PR description
[FIX] website: wait for extra menu to fully render before continuing When clicking on the extra menu item, a Bootstrap dropdown is displayed with a transition. Because this transition takes time, it can lead to undeterministic behavior especially in tests. For example, if a tour clicks on the extra menu item and then clicks on the "Site" button in the navbar, the dropdown transition may still be in progress. This can cause the "Site" dropdown to close prematurely. runbot-240955 Forward-Port-Of: odoo/odoo#262660 Forward-Port-Of: odoo/odoo#261179
This update resolves an issue preventing tours for the purchase and stock modules in the community version of Odoo. The fix leverages an existing utility function to ensure tours correctly launch, regardless of whether the enterprise version is installed. This improves the user experience for all Odoo users.
Original PR description
The tours: - `test_basic_purchase_flow_with_minimal_access_rights` - `test_basic_stock_flow_with_minimal_access_rights` fail to perform the first step if enterprise is not in the addons path since the app icons are not in the the main view. Fortunately, a general util is already present to perform the task of opening the app in both community and enterprise builds: https://github.com/odoo/odoo/blob/e258de4235b4872e0427017e22b46495080c25dc/addons/web_tour/static/src/tour_utils.js#L81-L101 https://github.com/odoo/odoo/blob/e258de4235b4872e0427017e22b46495080c25dc/addons/web_tour/static/src/tour_utils.js#L36-L43 runbot-240934 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262559
This update corrects a previous issue where HR version searches weren't accurately filtering by start and end dates. The fix ensures searches using date ranges now correctly target the intended date fields, leading to more precise and reliable version searches. This improves the accuracy of HR data retrieval.
Original PR description
Previously, the searches defaulted to delegating the search to the contract_date_start/end fields instead of mapping to the actual computes of date_start and date_end, which caused incorrect results when searching for versions with a specified date_start or date_end. This PR fixes this by implementing the search method on date_start and date_end to correctly map the search to the expected values for date_start and date_end. Task-6067139 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#256581
This update corrects a previous issue where payslips were incorrectly referencing contract dates instead of the correct version dates. The fix ensures payslips accurately reflect the version of the contract being processed, resolving potential discrepancies in payroll reporting. This improvement was enabled by a related update to Odoo's search functionality.
Original PR description
Prior to this commit, the version domain on payslips only looked at the contract dates rather than the version's dates. The domain was fixed in this commit to limit the domain based on the version's dates instead, and this was allowed after the searches on the version date_start and date_end fields were fixed in the odoo/odoo#256581. task-6067139 Forward-Port-Of: odoo/enterprise#113818
This update resolves a crash in the Retail POS system that occurred when viewing order details. The issue stemmed from a delay in loading order information, causing a 'null' error. The fix ensures order data is fully loaded before displaying details, improving stability and preventing unexpected application crashes.
Original PR description
Steps to reproduce: =================== - Open Retail POS - Add at least one product to the order - Go to the Payment Screen - Select any payment method - Navigate to the Ticket Screen - Click the (i) button to open Order Details Issue: ====== - Application crashes with an OWL lifecycle error: TypeError: Cannot read properties of undefined (reading 'id') - At that point, this.props.order.currency_id is undefined Cause: ====== - The currency_id relation field may not be fully loaded when orders are accessed during certain navigation flows (Payment Screen → Ticket Screen) - The method formatCurrency() tried to access currency.id on an undefined object Fix: ==== - Changed formatCurrency() in OrderDetailsDialog to use the currency getter instead of the direct currency_id field Task:6178180
This update removes the Tailscale IP address from the IoT box status screen. This simplifies the display for users and ensures accurate reporting of network connectivity. The change addresses a minor technical detail related to interface detection.
Original PR description
This PR removes tailscale ip address from iot box status screen. ``` >>> netifaces.interfaces() ['lo', 'eth0', 'wlan0', 'tailscale0'] ``` The 'tailscale0' interface will now be ignored Forward-Port-Of: odoo/odoo#242796
This update resolves an issue where invoices sent via Peppol were failing for customers in Iceland and Albania. The change ensures that VAT numbers for these countries retain their country code prefix, allowing invoices to be successfully transmitted. This improves compatibility with Peppol and avoids invoice sending errors.
Original PR description
Current behavior before PR: To send an invoice via Peppol, the customer's VAT must have the country code as a prefix. But while creating customers from countries like Iceland and Albania, It removes the country code prefix. Which later raises an error while sending the invoice that "The VAT of the customer should be prefixed with its country code." Desired behavior after PR is merged: VAT numbers for customers in Iceland and Albania now keep their country code prefix, letting users to send invoices via Peppol. task-6050791 Forward-Port-Of: odoo/odoo#259105
This update corrects a technical issue that caused a traceback error when users removed the Unit of Measure (UOM) from a sales order line. The fix prevents unnecessary calculations related to discounts, ensuring smoother operation when managing UOM settings on sales orders. This improves overall system stability and user experience.
Original PR description
Issue: --- Due to this issue, there is a TB when you try to remove uom. Steps to reproduce: 1- Create a SO and add a line. 2- On SOL, remove uom. You get a traceback. This is because of `ensure_one` here: https://github.com/odoo/odoo/blob/saas-18.4/addons/product/models/product_pricelist_item.py#L588 We can prevent the discount compute on the line which is causing the `compute_price`, when uom is not set. opw-6144426 Forward-Port-Of: odoo/odoo#262266
This update resolves a technical problem that prevented the 'l10n_tr_nilvera_edispatch' module from installing correctly. The change ensures a necessary dependency, 'stock_account', is automatically installed, preventing an error related to missing configuration data. This ensures the module functions as intended.
Original PR description
Issue: currently, the module `l10n_tr_nilvera_edispatch` depends on `l10n_tr_nilvera_einvoice` and `stock`. and in `l10n_tr_nilvera_einvoice` , it eventually gets `account` in its dependencies [from…
Issue: currently, the module `l10n_tr_nilvera_edispatch` depends on `l10n_tr_nilvera_einvoice` and `stock`. and in `l10n_tr_nilvera_einvoice` , it eventually gets `account` in its dependencies [from dependency chain]. So `stock` and `account` both are installed, and ideally `stock_account` is also installed since it is set to `auto_install: True`. but if we try to install edispatch module with `--skip-auto-install` the module installation fails, because we skip auto install modules and `stock_account` is not installed, due to this, `country_code` field defined in `stock_account` module and used in `l10n_tr_nilvera_edispatch` module is not found which causes error. Solution: This PR fixes this issue by updating dependency from `stock` to `stock_account` to make sure it is installed in all conditions. Related runbot error: https://runbot.odoo.com/odoo/runbot.build.error/238909 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262721
This update resolves a recurring issue that caused the Gantt chart's edge scrolling tests to fail intermittently. The fix ensures the test accurately identifies and interacts with the chart elements, improving overall stability and reliability. This prevents potential disruptions for users relying on the Gantt chart functionality.
Original PR description
This commit resolves intermittent flakiness in the Gantt side panel edge scrolling tests. Previously, the test could fail because the target pill element would occasionally become unbound (detached from the DOM) following the unsuccessful drag-and-drop sequence. The test logic has been updated to ensure the element reference is re-queried appropriately. runbot-error-243446
This update resolves an issue where referenced refunds in Viva.com were incorrectly reversing payments. The problem stemmed from a previous update that removed a necessary payment session ID. This fix restores the session ID, allowing refunds to function as intended and ensuring accurate payment reversals.
Original PR description
Referenced refunds in Viva.com require the session ID of the original payment to be sent, resulting in that payment being reversed. Unfortunately this functionality was broken when a forward-port PR (odoo/odoo#236004) mistakenly removed the `parentSessionId` field from the request. This commit restores the `parentSessionId` field, fixing the issue. It also adds a tour to test the full payment and referenced refund flow. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262911 Forward-Port-Of: odoo/odoo#262475
This update fixes a bug that prevented users from assigning recruiters to job positions when the hr_payroll module wasn't installed. The fix ensures the necessary data is always available, preventing an error message and improving the user experience. This change ensures consistent functionality across different Odoo configurations.
Original PR description
**Steps to Reproduce:** 1. Ensure hr_payroll module is NOT installed 2. Open a Job Position in hr_recruitment app 3. Click on "Assign Recruiter" button for a position without a recruiter 4. Observe error: "Name 'company_id' is not defined" **Bug Cause:** The interviewer_ids field on hr.job uses a string domain that references company_id. Since company_id is not available in the current view without hr_payroll it fails. **Solution:** Add `<field name="company_id"/>` to the hr_job_kanban view to ensure the field is consistently available for domain evaluation regardless of other installed modules. **Task:** 6106143 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259305
This update fixes a potential issue where multiple sign actions within a single transaction could incorrectly assign the same roles, leading to data inconsistencies. The change adds a check during the transaction to ensure unique role assignments, preventing conflicts and maintaining data integrity. A new test has been implemented to verify this fix.
Original PR description
Before this commit, creating multiple server actions for the Sign app in a single transaction (e.g., when saving an Automation Rule with multiple nested actions) bypassed the `_check_sign_template_conflicts` constraint. Because the constraint only queried the database for existing links, it failed to detect conflicts within the in-memory batch, allowing the save to succeed and causing silent role overrides. This commit introduces an intra-batch check to the constraint. By tracking requested roles in memory during the loop, the constraint now correctly raises a ValidationError if multiple actions in the same transaction attempt to automate the exact same template roles. A test has been added to ensure batch creations are properly validated. Task: 6128909 Forward-Port-Of: odoo/enterprise#115062
This update resolves an issue where multiple users were incorrectly added to Whatsapp discussion channels after a message was sent. The fix ensures that only the user who initiated the conversation is added, preventing unnecessary notifications and channel clutter. This improves the user experience and channel management efficiency.
Original PR description
…ser sends a template message when creating discussion channels after the partner sends a message back. Issue: Currently, When there are multiple users listed under whatsapp.account.notify_user_ids no matter what, when creating a new discuss channel it will add all users in that list. Even when a single user inside that list initiated the conversation with a template. To replicate in runbot add multiple users to whatsapp.account.notify_user_ids, make a partner with a number, send a template, then have the partner send a message back. All users will be notified and added to the channel. There was an unformatted number being passed to a function that required the formatted number. This caused _find_active_channel to find 0 active channels. Fix: Format the number received from the message values inside WhatsAppAccount._process_messages opw-5349138 Forward-Port-Of: odoo/enterprise#114912 Forward-Port-Of: odoo/enterprise#102452
This update fixes an issue where the product configurator dialog wasn't displayed when products had sale packaging set. Now, the dialog automatically appears when a product's unit of measure (UOM) is defined, ensuring users always see the options for configuring the product before adding it to their cart. This improves the shopping experience and prevents accidental use of default UOMs.
Original PR description
Issue: --- If a product has sale packaging set, in website_sale, by clicking on add to cart icon, the dialog is not shown, as a result it always uses the default uom. This can be fixed by showing the configurator if there are product.uom set. opw-6112786 Forward-Port-Of: odoo/odoo#259658
This update fixes a bug where users could accidentally add text within image-only gallery items (like banners and image walls). The change prevents users from directly editing the content within these galleries, ensuring they display only images as intended. This improves the visual consistency and stability of website designs.
Original PR description
Some image items are supposed to not contain any extra content. Grid image items and `s_image_gallery`'s images are such images. Grid image-only items are actually `contenteditable`. This makes it possible to replace the image with text. A similar issue exists for images inside `s_image_gallery` blocks. This commit makes such items non-editable, while keeping the media inside it replaceable. Steps to reproduce: - Drop a Banner block - Select an image - Type something => Image was replaced with text - Drop an Image Wall - Select an Image - Type something => Image was replaced with text task-5436148 Forward-Port-Of: odoo/odoo#258018
This update corrects a calculation issue related to Pay-For-Account (PFA) and Daily Pay Value (DPV) in the Odoo Enterprise's Belgian payroll module. Separating these calculations ensures more accurate payroll processing and compliance with Belgian tax regulations. This fix enhances the reliability of payroll reports and reduces the risk of errors.
Original PR description
Forward-Port-Of: odoo/enterprise#113385
This update fixes a discrepancy in the calculation of canteen costs within the payroll module for employees without worked day data. By adding a simulation context, the system now accurately reflects canteen cost eligibility, ensuring correct payroll calculations. This improves the accuracy of employee compensation reporting.
Original PR description
We add simulation context in the canteen cost condition, since we dont have worked day lines in that case Forward-Port-Of: odoo/enterprise#113907
This update fixes an issue where users couldn't delete time off requests after a payslip was validated. Previously, the system incorrectly prevented deletion, even though the time off wasn't impacting the pay calculation. This change ensures that time off requests can be deleted regardless of payslip validation status, streamlining HR processes.
Original PR description
## Issue After confirming a payslip for a period, no time off request within that period can be deleted, even though requests are ont taken into account in the payslip if they are not approved. ##…
## Issue
After confirming a payslip for a period, no time off request within that period can be deleted, even though requests are ont taken into account in the payslip if they are not approved.
## Steps to reproduce
1. Install *Time Off in Payslips* (`hr_payroll_holidays`)
2. Create or use an employee E with a running contract, e.g.:
- Contract: Jan 1 to Indefinite
- Wage: $1000/month
3. In Time Off > Management > Time off, create a new time off allocation for Employee E:
- Date: anywhere during March
- **Do not validate the time off**
4. In Payroll > Payslips, create a new Off-Cycle for Employee E:
- Period: March 1 - March 31
- *Compute Sheet*, *Confirm* and *Mark as paid*
5. Try to delete the allocation created in step 3
6. **An error occurs: _"The pay of the month is already validated with this day included. If you need to adapt, please refer to HR."_, even though the time off is not taken into account in the payslip.**
## Cause
The condition to raise the error message does not take into account the state of the leave:
https://github.com/odoo/enterprise/blob/2d2056766441157dc45ebc37b677841c44e5c513/hr_payroll_holidays/models/hr_leave.py#L195-L204
This commit completes https://github.com/odoo/enterprise/pull/114895, which was preventing the error from being raised when time off were generated after validating the payslip. The error should also not be raised for leaves that are not approved yet, as they did not impact the generation of the payslip.
(related to)
opw-6089990
Forward-Port-Of: odoo/enterprise#116024
Forward-Port-Of: odoo/enterprise#115765This update resolves a bug where attachments weren't uploading correctly when navigating between records in the chatter. The change ensures attachments are always associated with the intended record, preventing data inconsistencies and improving the reliability of attachment uploads.
Original PR description
Currently, when uploading a bunch of attachments or a big one to the chatter, if you click on the pager (e.g. next) before the upload is complete, the attachments that have not yet been uploaded are uploaded to the next record. Due to the persistence of the Chatter component during record navigation and the fact that the `FileUploader` logic is tied to `state.thread`, an async callback that finishes after a record switch will attempt to update the currently active thread rather than the one that initiated the upload. With this change we tie uploader lifecycle to a specific record and ensure the completion callback only affects that record. task-5119290 Forward-Port-Of: odoo/odoo#262923 Forward-Port-Of: odoo/odoo#261552
This update ensures Odoo’s Dutch reporting modules (SBR) correctly submit data to the new Digipoort infrastructure, which is migrating to digipoort.logius.nl by May 1, 2026. This change is critical to avoid submission failures and maintain compliance with Dutch regulations.
Original PR description
*: l10n_nl_reports_sbr{,_icp,_status_info}
---
Description of the issue this commit addresses:
The Dutch Digipoort endpoint infrastructure is being migrated from procesinfrastructuur.nl to digipoort.logius.nl effective May 1, 2026. Odoo's SBR modules need to use the new endpoints or submissions will fail.
---
Desired behavior after this commit is merged:
This commit updates all Digipoort endpoint URLs (delivery and status services) from the old domain to the new logius.nl domain, and clarifies that valid PKIoverheid certificates are required for both environments. Reports now submit to the new Digipoort infrastructure correctly.
---
task-6171403
Forward-Port-Of: odoo/enterprise#115668This update resolves an issue that prevented the `sale_stock` and `purchase_stock` modules from installing correctly on databases with existing sale or purchase orders that included non-stock items like downpayments. The fix filters out these problematic lines during the installation process, preventing a software error and ensuring smooth module installation.
Original PR description
## Summary When installing `sale_stock` or `purchase_stock` module on a database that already has sale/purchase orders with non-stock lines (downpayments, section notes), the installation fails with:…
## Summary
When installing `sale_stock` or `purchase_stock` module on a database that already has sale/purchase orders with non-stock lines (downpayments, section notes), the installation fails with:
ValueError: Expected singleton: uom.uom()
## Root Cause
The `post_init_hook` (`_create_pickings_for_open_sale_orders` / `_create_pickings_for_open_purchase_orders`) filters order lines to create pickings:
```python
empty_lines = open_sale_orders.order_line.filtered(
lambda l: l.product_uom_id.is_zero(l.qty_delivered)
)
```
This accesses product_uom_id without checking if it exists. Lines with:
- display_type set (sections, notes)
- is_downpayment = True (downpayments)
...don't have a product_id or product_uom_id, causing the error.
Fix
Add filters to skip non-stock lines before accessing product_uom_id:
```
empty_lines = open_sale_orders.order_line.filtered(
lambda l: not l.display_type and not l.is_downpayment and l.product_uom_id.is_zero(l.qty_delivered)
)
```
Steps to Reproduce
1. Create a fresh database (without sale_stock/purchase_stock)
2. Create a sale order with a downpayment line or section/note
3. Install sale_stock module
4. Error: ValueError: Expected singleton: uom.uom()
Reproduction Reference
- purchase_stock issue: https://drive.google.com/file/d/1aKw-ago-pMds_-x_y9f8nJZyZsLqGJ67/view?usp=sharing
- sale_stock issue: https://drive.google.com/file/d/1I9fY8UZZZ3ULcairl3YGZTi_KttsYLNR/view?usp=sharing
opw-6179073
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#262625
Forward-Port-Of: odoo/odoo#262439This update resolves an issue where the inheritance in the marketing card event views was incorrectly referencing a related module. The fix ensures the correct view inheritance is applied, improving the stability and functionality of marketing event management within Odoo. This change ensures proper display and interaction with marketing event cards.
Original PR description
Technically, mass_mailing_event is not in marketing_card_event deps. Moreover the inherit refers to event form view. runbot-242493
This update resolves an issue preventing tests using the 'pos_admin' user from running correctly. The change adjusts user group permissions to ensure the 'pos_admin' test user has the necessary internal access, allowing for proper testing of the Point of Sale module. This ensures continued functionality and stability of the POS system.
Original PR description
Tests using `login=pos_admin` were no longer starting properly because `/pos/ui` was returning a 404 error. This happened because `pos_admin` was no longer an internal user. The issue was introduced when `stock.group_stock_user` was removed from the implied groups of `point_of_sale.group_pos_manager`. Since `stock.group_stock_user` implies `base.group_user`, `point_of_sale.group_pos_manager` no longer granted internal user access. To fix this, `base.group_user` is now added directly to the implied groups of `point_of_sale.group_pos_manager`. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6193752 PR introducing the bug: https://github.com/odoo/odoo/pull/241368/changes#diff-04860a18d18ef0dc2ebfcd974fafc0b886b6b1e8094a333a7c107b3cdc2301b2
This update resolves a test failure related to the ESG report by adjusting the data used in the tests. Specifically, the report's date range and associated records were set to an ancient date to prevent interference from demo data. This ensures the ESG report tests run reliably.
Original PR description
There was an issue when setting in draft all the account moves of the test DB before running the ESG report tests. In that process, some account moves were actually removed, which results in a 'Not found' record error. As the ESG report searches for all the account moves given a period (in all companies of the DB), some demo data could make the test to fail. We handle that issue by changing the date of the report and the related records to a very ancient date, to ensure that no external data will disturb the test. We also make that change for tests related to the HR part of the ESG report. runbot-error: https://runbot.odoo.com/odoo/runbot.build.error/242321
This update corrects a visual issue in the accounting reports where the last column's data was partially cut off when scrolling. The fix adds bottom padding to the report, ensuring all data is fully visible and readable. This improves the clarity and usability of the accounting reports for users.
Original PR description
Before this commit, there was no bottom padding in the accounting reports, which caused the last column’s values to appear partially cut off when scrolling to the bottom. This issue started occurring after the PR: https://github.com/odoo/enterprise/pull/99198 opw-6130981 **Before fix (runbot)** <img width="1920" height="1005" alt="image" src="https://github.com/user-attachments/assets/808bbb2b-3b4e-4b5c-a872-b8bd7bf589ba" /> **After fix:** <img width="1917" height="1006" alt="image" src="https://github.com/user-attachments/assets/55f04e1f-0469-46e1-af69-f5055a7232d9" /> Forward-Port-Of: odoo/enterprise#116329 Forward-Port-Of: odoo/enterprise#116168
This update fixes a problem where tax amounts weren't accurately calculated when users grouped invoice lines. Now, the system automatically adjusts tax amounts to match before and after grouping, ensuring correct financial reporting. Additionally, a test case has been updated to use Belgian company and tax scenarios.
Original PR description
[FIX] account_edi_ubl_cii: correct tax amount when grouping lines When the user group lines of a move, the tax amount is now corrected if there's a difference in the tax amount before and after grouping This commit also removes the `ungroup_lines` context key, as the flow was changed in odoo/odoo#252458 Reword the `test_import_and_group_lines_by_tax` test: use belgian company and belgian taxes task-5993555 Forward-Port-Of: odoo/odoo#261718 Forward-Port-Of: odoo/odoo#252719
This update fixes a bug that occurred when attaching images to invoices. The system was incorrectly creating and syncing orphaned attachment files, leading to errors and crashes. The change prevents this premature attachment creation, ensuring stability and proper invoice processing.
Original PR description
Steps to reproduce: - Install documents_account and account_accountant. - Create and post a customer invoice. - Add an image attachment via a log note. - Click Send & Print. -> KeyError:…
Steps to reproduce: - Install documents_account and account_accountant. - Create and post a customer invoice. - Add an image attachment via a log note. - Click Send & Print. -> KeyError: `proforma_pdf_attachment` Cause: When attaching an image via a log note, the file becomes the main attachment but is intentionally unlinked (res_model=False) by the system to avoid UI clutter. Downstream modules unknowingly sync this orphaned file. Later, when "Send & Print" generates the real PDF, the system attempts to update the orphaned downstream record, causing model linkage conflicts and eventually a crash. Solution: Add `no_document=True` to the context during `_message_post_after_hook` for invoices. Previously, for incoming emails or log notes, the mail framework would trigger document creation immediately before the core accounting module could evaluate and orphan invalid files (like images). This change suppresses that premature sync, allowing downstream modules to explicitly handle the sync after the attachment's final state is resolved. opw-5930888 Forward-Port-Of: odoo/odoo#262637 Forward-Port-Of: odoo/odoo#258307
This update resolves an issue where sending invoices with attached images caused a system crash. The fix prevents the incorrect syncing of orphaned attachments, ensuring stable invoice printing and preventing data inconsistencies. It improves the reliability of the documents account functionality.
Original PR description
Steps to reproduce: - Set a journal with documents folder sync. - Create and post a customer invoice. - Add an image attachment via a log note. - Click Send & Print. -> KeyError:…
Steps to reproduce: - Set a journal with documents folder sync. - Create and post a customer invoice. - Add an image attachment via a log note. - Click Send & Print. -> KeyError: `proforma_pdf_attachment` Cause: Adding an image via log note sets it as the main attachment, but it is intentionally orphaned (res_model=False) to prevent UI clutter. `documents_account` incorrectly syncs this unlinked file, creating a workspace document with a missing model. During "Send & Print", the official invoice PDF replaces the image as the main attachment. The document versioning logic intercepts this swap and attempts to re-parent the new PDF to match the orphaned document. This destroys the PDF's linkage to the invoice, causing a crash when the system later attempts to fetch the PDF. Solution: Since the base module now suppresses premature document creation during the message post, we explicitly handle the sync ourselves. We override `_fix_attachments_on_record_from_files_data` to iterate over the validated attachments and trigger document creation only for files that retained their `res_model`. We also add a check inside `_update_or_create_document` to strictly block orphaned attachments. opw-5930888 Forward-Port-Of: odoo/enterprise#116247 Forward-Port-Of: odoo/enterprise#115065
This update resolves an issue where a key in the purchase order suggestion process was incorrectly formatted, leading to potential errors. The fix ensures the correct key is used, improving the reliability of the purchase order suggestion feature. This change ensures accurate data processing within the purchase order workflow.
Original PR description
Issue: - `_editSuggestContext` sends `sectionId` in the context, but `action_purchase_order_suggest` expects the key to be `section_id`. Fix: - Update the `_editSuggestContext` to send the correct context key, `section_id`. Forward-Port-Of: odoo/odoo#261930