Tuesday, August 5, 2025
18 changes · saas-18.4
Enhancements to existing features
Companies in French overseas territories can now activate Peppol electronic invoicing when the accounting module is installed. The system can also automatically set the required Peppol identifiers from local business or VAT numbers, reducing manual setup.
Original PR description
Purpose ------- Add the DOM-TOM to the list of countries allowed to activate Peppol when the module is installed. Changes ------- - Updated `PEPPOL_LIST` to include the following country codes: 'MF', 'MQ', 'NC', 'PF', 'RE', 'GF', 'GP', 'TF', 'BL', 'PM', 'YT', 'WF' - Updated EAS_MAPPING so that the Peppol ID and endpoint can be automatically set based on either the SIRET, SIRENE, or VAT number, as in the French implementation. Task-4889705 Forward-Port-Of: odoo/odoo#218813
Resolved issues and error corrections
When several vendor bills are paid by check at the same time, each related accounting entry now keeps the correct check number in its label. This avoids duplicate or misleading labels and makes payment records easier to reconcile and audit.
Original PR description
Steps to reproduce: 1. Install `accounting` and `account_check_printing` modules. 2. Configure a bank journal: - Enable the `Manual Numbering` option for checks. - Set an `Outstanding Payments…
Steps to reproduce: 1. Install `accounting` and `account_check_printing` modules. 2. Configure a bank journal: - Enable the `Manual Numbering` option for checks. - Set an `Outstanding Payments Account` for checks under the `outgoing payments` tab on the journal. - Ensure the Check Sequence is properly configured. 3. Create three vendor bills (two for the same vendor and one for a different vendor). 4. Go to the list view of vendor bills and select all three of them. 5. Click the `Pay` button and in the payment wizard: - Enable the `Group Payments` option. - Choose `Checks` as the payment method. - Confirm the wizard to register the payment. Observed Behavior: - Multiple payments are created simultaneously. - Each payment has its own check number (e.g., 0001, 0002), correctly assigned. - However, all the related journal entries (account.move) have journal item labels that incorrectly use the same check number (e.g., all journal items have label Check - 0001 instead of Check - 0001, Check - 0002, etc.). Issue: - Journal entries are created during payment creation `create()`, at which point the payments are still in draft state. - The check_number is only computed and the check sequence is incremented when the payment is posted `action_post()`. - As a result, all journal entries generated during draft state receive the same initial check number. Solution: - Override the `_get_trigger_fields_to_synchronize` method to include the `check number`, ensuring that any updates to the check number on a payment are also reflected in the related journal entries. opw-4886452 Forward-Port-Of: odoo/odoo#220150
Point of Sale now correctly converts sales order quantities and prices when products use different units of measure, such as dozens. This prevents undercounted quantities and incorrect pricing when confirmed sales orders are brought into a POS session.
Original PR description
**Steps to reproduce:** - Install `pos_sale`. - Create a sale order for a POS product with quantity 1 and UoM `Dozens`. - Confirm the order. - Go to Point of Sale → open a session. - Click Actions →…
**Steps to reproduce:** - Install `pos_sale`. - Create a sale order for a POS product with quantity 1 and UoM `Dozens`. - Confirm the order. - Go to Point of Sale → open a session. - Click Actions → Quotation/Order and select the recently created sale order. - Check the POS order line quantity. **Issue:** - The POS order line shows quantity as 1 unit, while the sale order line used 1 Dozen, so it should be 12 units. **Cause:** - The POS order line was directly using the quantity and price from the sale_order_line without applying the proper UoM conversion. https://github.com/odoo/odoo/blob/8f937d4c4a6c4cece698a5e904ba7a0cf2fbb24c/addons/pos_sale/static/src/overrides/models/pos_store.js#L152-L153 Solution: - Updated logic to set quantity and price_unit in the POS order line based on the converted sale order lines after UoM calculations. https://github.com/odoo/odoo/blob/8f937d4c4a6c4cece698a5e904ba7a0cf2fbb24c/addons/pos_sale/static/src/overrides/models/pos_store.js#L84-L86 - Also updated the value assigning of 'has_valued_move_ids' to converted line because quantity calculation is based on 'converted_line'. https://github.com/odoo/odoo/blob/8f937d4c4a6c4cece698a5e904ba7a0cf2fbb24c/addons/pos_sale/static/src/overrides/models/pos_order_line.js#L50-L53 opw-4900767 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221123 Forward-Port-Of: odoo/odoo#217734
Applying a partnership grade to a company or contact now affects only that selected partner, not its related child contacts. This restores the intended behavior and prevents unintended partnership status changes for linked contacts.
Original PR description
This reverts commit 9d1857e so that applying a grade no longer adds it to the children of the partner as well. TASK-4985900 Forward-Port-Of: odoo/odoo#221424
This fixes cases where hidden website sections or popups could appear out of sync after using undo and redo. Business users editing pages should now see more reliable visibility controls, cleaner hidden-element lists, and fewer confusing overlays while building website content.
Original PR description
> [FGE] add Popup section, play with visibility + undo/redo. Visibility eye is not update correctly > [BLSE] Click on a section, hide it in desktop, click on the eye to make it visible, undo => the section still has the overlay to tell it is invisible (but with the icon for the phone)
Portal users can now open project task links sent by email using the "View Task" button. The fix restores access to the information needed to generate working task links, improving collaboration with external users.
Original PR description
To reproduce: ============= - on a project task where a portal user is follower send a message - the portal user should receive an email with a link to the task on the button "View Task" -> the link is not working Problem: ======== starting from 18.3, a method to check field access was added to the project task model, `access_token` and `access_url` were not in set of readable fields for portal users, so the link was not working. Solution: ========= add `access_token` and `access_url` to the set of readable fields for portal users. opw-4939913 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221506
This fix prevents negligible rounding differences in foreign-currency purchase prices from creating unnecessary stock valuation entries. As a result, affected posted vendor bills can be reset to draft when they should be allowed, reducing accounting workflow disruptions.
Original PR description
**Current behavior:** Modifying the "Product Price" global precision and purchasing some product in a foreign currency sometimes leads to problematic SVL creation, which will make a posted vendor…
**Current behavior:** Modifying the "Product Price" global precision and purchasing some product in a foreign currency sometimes leads to problematic SVL creation, which will make a posted vendor bill unable to be reset to draft when it logically should be permitted. **Expected behavior:** No SVL, can reset vendor bill. **Steps to reproduce:** 1. Activate a foreign currency, set the "Product Price" precision from 2 -> 3, make an exchange rate to the foreign currency with a rate: `0.2710027100271003` 2. Make a product with avg costing, real time valuation, with a standard price = `0.875` 3. Create a purchase order in the foreign currency for the avco product: * `price_unit: 0.237` * `product_qty: 5500` 4. Confirm -> receive -> create invoice -> post * Can't reset the bill to draft * There is an additional SVL that shouldn't have been generated **Cause of the issue:** There will be a negligible rounding diff between the price units of the journal item and SVL created on reception. When the invoice is posted, this will captured and when multiplied by a large enough invoicing qty, will create a large enough value to trigger creation of pdiff SVL. **Fix:** Zero out the price unit difference if it is functionally equivalent to zero when rounded according to the maximally precise "precision record" involved in the sequence, that is: A) The bill currency B) The SVL currency C) The "Product Price" global precision value opw-4873246 Forward-Port-Of: odoo/odoo#221023 Forward-Port-Of: odoo/odoo#217650
This fixes an issue where restaurant point-of-sale sample data could fail to load when starting from a database without demo data. Pizza extra options are moved back into the restaurant setup flow so businesses can test or demonstrate the restaurant POS without errors.
Original PR description
Versions -------- - saas-18.4+ Steps ----- 1. Set up a database without demo data; 2. open restaurant POS; 3. go to register; 4. load sample data. Issue ----- Data doesn't load. Cause ----- Commit ffb976c3ed5fb moved demo data from `pos_restaurant` to `product`. Issue is that `pos_restaurant` uses a custom "scenario" flow where demo data gets loaded for a specific scenario. As a consequence, any reference to demo data from `product` will cause an error. Solution -------- Commit b15cf569c766f already moved back the burger sides data. This commit does the same for the pizza extras data. opw-4989005
This fix prevents timed surveys from being submitted too early when a participant's device clock is slightly ahead of the server. By accounting for much smaller time differences, survey timers behave more fairly and avoid confusing error messages for participants.
Original PR description
Description of the issue/feature this PR addresses: This commit addresses early submissions of surveys due to timer expiry. Differences in server/client clocks can leave the survey in an incorrect…
Description of the issue/feature this PR addresses: This commit addresses early submissions of surveys due to timer expiry. Differences in server/client clocks can leave the survey in an incorrect state. Current behavior before PR: The server, seeing a submission come before the time limit that was triggered by the client timer, lets the survey continue. Clients are receiving error messages when trying to do more submissions, which bump against the cheating prevention. This is true if the client is "ahead" of the server. Currently, a difference would only be addressed if above 5 s. This is not enough as the client being "ahead" by 1 s can cause this issue. This was detected in real use. Looking at server logs has led me to this cause. Here's a diagram that could help understand the issue with the current behaviour: <img width="455" alt="Survey Timer bug" src="https://github.com/user-attachments/assets/1804f848-ad4b-4b8a-97fe-7562b76ea66c" /> The above diagram shows how, for a survey with a 30 min timer, a 1 sec difference between the clocks can lead to an early submission. Desired behavior after PR is merged: The fix here is to tighten when to apply the time difference to when it is above 500 ms. This should help avoid the early submission bug but conversely also not allow late submissions, even below 5 s, making the timer fair across users. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220431 Forward-Port-Of: odoo/odoo#207485
Fixes a checkout and sales order issue where shipping methods could be blocked for combo products because the combo itself has no weight. Delivery weight validation now ignores combo lines and zero-quantity lines, allowing customers and sales teams to select shipping when the underlying products are valid.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have a combo product Foo; 2. ensure the combo items have a weight set; 3. enable & publish a shipping connector; 4. add combo product to cart; 5. go to…
Versions -------- - 18.0+ Steps ----- 1. Have a combo product Foo; 2. ensure the combo items have a weight set; 3. enable & publish a shipping connector; 4. add combo product to cart; 5. go to checkout; 6. attempt to select shipping connector as delivery method. A similar message appears when trying to add a delivery method to a backend order if the order has downpayment lines. Issue ----- > The estimated shipping price cannot be computed because the weight is missing for the following product(s): Foo Cause ----- The combo product doesn't have a weight, as it's not a discrete item, but a collection of multiple items. The shipping connectors haven't been updated yet to account for this, and still expect every non-service product to have a weight. Solution -------- When looking for lines without weight, filter out products of type `combo` (similar to how `service` products are handled) using a new `_get_invalid_delivery_weight_liens` helper method, added to `sale.order.line`. Also ignore lines where `product_qty` is zero, e.g. `display_type` lines & down payment lines. Enterprise PR: https://github.com/odoo/enterprise/pull/91243 opw-4940973 Forward-Port-Of: odoo/odoo#221696
Point of Sale now links manually entered physical gift card codes to the correct gift card program when multiple programs exist. This prevents customers from receiving cards with unexpected generated codes and helps ensure sales staff issue the intended gift card.
Original PR description
### Problem: When selling a gift card via PoS, if multiple loyalty programs of type *Gift Card* exist, assigning a physical gift card code does not always link it to the correct program. As a result, the created gift card receives an automatically generated code instead of the one entered. ### How to reproduce: * Create multiple loyalty programs of type *Gift Card*. * Open a PoS session. * Add a gift card product from one of the created programs. * Assign a physical gift card code to it. * Complete the sale. * The created gift card will have a generated code. opw-4910647 Forward-Port-Of: odoo/odoo#221624 Forward-Port-Of: odoo/odoo#220792
Spreadsheet charts now keep global filters applied when their chart criteria are updated. This prevents reports and dashboards from showing unfiltered or inconsistent chart data after edits.
Original PR description
The global filters were not re-applied when updating an oodo chart domain. Task: [4965683](https://www.odoo.com/odoo/2328/tasks/4965683) 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#221729 Forward-Port-Of: odoo/odoo#220764
This fixes an issue where reopening the website editor could fail after placing a carousel inside a table of contents block with its navigation hidden. The change makes the editor initialize in the right order, preventing the crash and helping users continue editing pages normally.
Original PR description
Problem: When `s_carousel` is placed inside an `s_table_of_content` and the navbar of the TOC is hidden (visibility set to "Hide" on desktop), saving and reopening the editor results in a traceback.…
Problem: When `s_carousel` is placed inside an `s_table_of_content` and the navbar of the TOC is hidden (visibility set to "Hide" on desktop), saving and reopening the editor results in a traceback. Cause: The traceback occurs due to the following sequence: In `WysiwygAdapterComponent.startEdition`, calling `await super.startEdition()` will invoke `createInvisibleElement()` if the navbar is hidden. This, in turn, activates the scroll spy by calling `_activateScrollSpy()` while starting the TOC snippet. That triggers `widgets_start_request`, which starts the `s_carousel` snippet. However, at this point the `wysiwyg` instance has not yet been attached to the `wrapwrap` element. That happens later, at: https://github.com/odoo/odoo/blob/f12050f75ae9ae1125c0c01ec504a24bd401b1ea/addons/website/static/src/components/wysiwyg_adapter/wysiwyg_adapter.js#L318 and only after the `await super.startEdition()` call at: https://github.com/odoo/odoo/blob/f12050f75ae9ae1125c0c01ec504a24bd401b1ea/addons/website/static/src/components/wysiwyg_adapter/wysiwyg_adapter.js#L232 This delay causes a race condition when starting widgets like `s_carousel` that rely on the presence of the `wysiwyg` instance. Solution: Attach the `wysiwyg` instance to the DOM before `await super.startEdition()` in `WysiwygAdapterComponent.startEdition`. Steps to reproduce: - Add a Table of Content block - Insert a Carousel inside the content - Set the TOC navbar visibility to "Hide" on desktop - Save the page - Reopen the editor - A traceback occurs opw-4971409 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221200
Spanish Model 349 rectification reporting now excludes payments and other unrelated transactions when calculating corrected amounts. This ensures the tax report and official BOE export reflect only the impact of linked credit notes, reducing the risk of inaccurate regulatory filings.
Original PR description
# How to reproduce the issue With l10n_es fiscal position: - Create a bill in a previous period (e.g., amount 1000). Partially credit note this bill for 500. - Register a partial payment of 250 on…
# How to reproduce the issue With l10n_es fiscal position: - Create a bill in a previous period (e.g., amount 1000). Partially credit note this bill for 500. - Register a partial payment of 250 on this bill. - In the tax report, go to model 349. Under the Rectificationes section, the new rectified value will be 250. This is incorrect, as the rectifications in this report should only reflect the value of the original move from a past period after applying the credit note. Payments or other transactions should not impact this report. This commit adjusts the computation of the report (and the BOE export) to ensure that, instead of using `amount_residual` (which includes payments and other transactions), the report uses the sum of the credit notes linked to the move included in the rectification report. Also changed the test test_mod349_credit_note. The rectification section is supposed to show the adjusted amount after rectification. In the test a bill of 400 is fully refunded. Instead of 400, the report should show 0. (https://www.boe.es/buscar/doc.php?id=BOE-A-2010-5098 in TIPO DE REGISTRO 2: REGISTRO DE RECTIFICACIONES. in 153-165 Numérico Base Imponible Rectificada section) opw-4895636 Forward-Port-Of: odoo/enterprise#91350 Forward-Port-Of: odoo/enterprise#89431
This update prevents partner grades from being automatically applied to child contacts when that behavior is not intended. It also fixes commission plans so they are not removed when a cancelled sale order is no longer relevant to the partner, helping preserve accurate partnership and commission data.
Original PR description
This reverts commit 14001a8a0216750be0c897d0e1bf31fccfc51c6a so that applying a grade no longer adds it to the children of the partner as well. This PR also fix the issue of a commission plan being removed even if the cancelled sale order was not used by the partner anymore. TASK-4985900 Forward-Port-Of: odoo/enterprise#91456
Customers can now choose supported shipping carriers at checkout when their cart includes combo products. The fix prevents combo products and zero-quantity order lines such as down payments from being incorrectly flagged as missing weight, reducing checkout and sales order errors.
Original PR description
\* = bpost, dhl{,_rest}, easypost, sendcloud, ups, usps{,_rest} Versions -------- - 18.0+ Steps ----- 1. Have a combo product Foo; 2. ensure the combo items have a weight set; 3. enable & publish a…
\* = bpost, dhl{,_rest}, easypost, sendcloud, ups, usps{,_rest}
Versions
--------
- 18.0+
Steps
-----
1. Have a combo product Foo;
2. ensure the combo items have a weight set;
3. enable & publish a shipping connector;
4. add combo product to cart;
5. go to checkout;
6. attempt to select shipping connector as delivery method.
A similar message appears when trying to add a delivery method to a backend order if the order has downpayment lines.
Issue
-----
> The estimated shipping price cannot be computed because the weight is missing for the following product(s): Foo
Cause
-----
The combo product doesn't have a weight, as it's not a discrete item, but a collection of multiple items.
The shipping connectors haven't been updated yet to account for this, and still expect every non-service product to have a weight.
Solution
--------
When looking for lines without weight, filter out products of type `combo` (similar to how `service` products are handled) using a new `_get_invalid_delivery_weight_liens` helper method, added to `sale.order.line`.
Also ignore lines where `product_qty` is zero, e.g. `display_type` lines & down payment lines.
Community PR: https://github.com/odoo/odoo/pull/221696
opw-4940973
Forward-Port-Of: odoo/enterprise#91243Mexican point-of-sale refunds can now be completed when the refund is issued back to a gift card. This prevents checkout errors and correctly allows the gift card balance to be refilled during the refund process.
Original PR description
**Problem:** When trying to make a refund in Mexico, with a gift card in the order, the order should be refunded on said gift card. But when doing so, two problems arise: - In the case of a gift…
**Problem:** When trying to make a refund in Mexico, with a gift card in the order, the order should be refunded on said gift card. But when doing so, two problems arise: - In the case of a gift card, *line[2].refunded_orderline_id* is not set, so we are trying to read the property of an undefined variable. - Another problem is that the order can not have any line that have a positive subtotal in the case of a refund. This was not taking the gift cards into accounts, as it makes sense for them to be positive in such a case. **Steps to reproduce:** - Set your company to a Mexican company - Make a purchase for a gift card - Make another purchase for a random product - Start the refund process and enter the gift card code we created before - Try to finalize the purchase, a traceback appears - If we were not trying to read an undefined variable, the purchase would still not go through as some lines are positive in a refund **Why the fix:** When refunding with a gift card, we should refill the gift card by the order's cost instead. With this in mind, it makes sense for the gift card to have a positive price even though we are in the context of a refund, which usually only permits negative priced lines. opw-4892935 Forward-Port-Of: odoo/enterprise#91385 Forward-Port-Of: odoo/enterprise#89892
Upsell invoices for yearly subscriptions now show the correct service period when billing is aligned to the start of a period. This prevents confusing invoice descriptions by separately accounting for the remaining current period and the next full billing period.
Original PR description
**Steps to Reproduce:** - Install `sale_subscription`. - Create a product (recurring product) with: - Type: Service - Invoicing Policy: Prepaid/Fixed Price - Create a subscription plan Yearly with: -…
**Steps to Reproduce:**
- Install `sale_subscription`.
- Create a product (recurring product) with:
- Type: Service
- Invoicing Policy: Prepaid/Fixed Price
- Create a subscription plan Yearly with:
- Billing Period: 1 year
- Align to period start: enabled
- Create and confirm a subscription for the product using the Yearly plan.
- Create and confirm the first invoice (shows remaining days like
185 days – 06/30/2025 to 12/31/2025 in product description).
- Create and confirm second invoice (check 1 year – 01/01/2026 to 12/31/2026).
- Go back to the subscription and create an upsell.
- Confirm the upsell and generate its invoice.
**Observation:**
- The upsell invoice line shows the wrong duration:
1 year (06/30/2025 to 12/31/2026).
- This is incorrect because the expected duration is:
185 days (from 06/30/2025 to 12/31/2025) + 1 year (01/01/2026 to 12/31/2026)
**Issue:**
- The duration calculation is based on the ratio of the first date and the end
date, but for the Upsell's ratio is always 1, so it considers fix duration,
i.e 1 year, 1 month
https://github.com/odoo/enterprise/blob/4bb43da79dba7ac1d0772fde814b3da6bade7db6/sale_subscription/models/sale_order_line.py#L346-L347
**Solution:**
- Corrected the logic to calculate the upsell duration by combining the remaining
current period (e.g., 185 days) with the standard 1-year period ratio.
Reference PR: https://github.com/odoo/enterprise/pull/68163/commits/cfed2d369960896f0f4d91a90eb24f3641627419
opw-4853426
Forward-Port-Of: odoo/enterprise#91362
Forward-Port-Of: odoo/enterprise#88963