Wednesday, May 6, 2026
27 changes · saas-19.3
Enhancements to existing features
This update splits a key accounting account to better align with French tax regulations (ANC PCG 2026). Specifically, it separates social security charges from salaries within the Profit and Loss report, ensuring accurate financial reporting for French businesses. The original account remains 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/odoo#260262 Forward-Port-Of: odoo/odoo#255038
This update expands the width of the Discuss sidebar to better accommodate chat descriptions and improve usability across different screen sizes. The sidebar now dynamically adjusts its width based on the screen, allowing users to see more of the conversation content without overlapping.
Original PR description
Prior to this commit, the left sidebar in Discuss had a max width of 300px. This commit allows larger widths based on the screen width. This is dependent on screen width, similar to…
Prior to this commit, the left sidebar in Discuss had a max width of 300px. This commit allows larger widths based on the screen width. This is dependent on screen width, similar to o-mail-ActionPanel.o_resizable_panel. It also removes the styling setting the max width to 300px. This helps make discuss more configurable, and makes it possible to see more of the description in live chat conversations. The sizes are set to match the max size of the right panel, so that they don't overlap, and there's suitable space in the center for the chat itself. Related to 221559 task-6180965 (Screenshots below show the worst case-scenario, where both the left and right panels are expanded to their max size) Before (Screen width > 1200px): <img width="1291" height="965" alt="image" src="https://github.com/user-attachments/assets/952d6c4b-60fd-47b9-aff7-8e034a2ee752" /> After: Screen width > 750px: <img width="1291" height="964" alt="image" src="https://github.com/user-attachments/assets/1120da2d-a434-4b3b-b387-f1d29bf0cb91" /> Screen width > 1200px: <img width="1291" height="965" alt="image" src="https://github.com/user-attachments/assets/47c6c981-0c62-43b6-8634-c6d644c342bb" /> Screen width > 1600px: <img width="1291" height="964" alt="image" src="https://github.com/user-attachments/assets/2945c964-5847-456b-b982-09086f335860" /> Screen width > 2300px: <img width="1291" height="965" alt="image" src="https://github.com/user-attachments/assets/c8cbc63f-025b-463d-9a3a-c84fce87d223" /> Forward-Port-Of: odoo/odoo#262338
Resolved issues and error corrections
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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