Thursday, July 17, 2025
19 changes · saas-18.1
Resolved issues and error corrections
This fix adjusts how Vietnamese electronic credit notes are sent to Viettel SInvoice so amounts keep the expected negative signs after Viettel's own processing. It helps ensure credit notes display correctly in the SInvoice portal for accounts that use Viettel's data validation step.
Original PR description
Description of the issue/feature this PR addresses: - Viettel SInvoice will automatically change the signs of the amount values (except for unit price) we sent for credit notes (on accounts with data…
Description of the issue/feature this PR addresses: - Viettel SInvoice will automatically change the signs of the amount values (except for unit price) we sent for credit notes (on accounts with data validation step). So the "right" values will appear in the portal. Currently (before the commit) the values have the wrong sign in the portal (because they are changed but we sent the right ones already). - We need to retain the original signs of those values when submitting them to SInvoice. Current behavior before PR: - All the amount values, including `itemTotalAmountWithoutTax`, `taxAmount`, `itemTotalAmountAfterDiscount` and `itemTotalAmountWithTax` are sent to Viettel SInvoice in negative values for credit note. Viettel SInvoice changes the sign of these values to positive (which is not correct for credit note). Desired behavior after PR is merged: - Only the sign of `unitPrice` is changed when we send the credit note to SInvoice. **Note:** - The signs will not automatically be changed for accounts with data validation step removed. So this commit will break credit notes for them (since the signs are not automatically adjusted but our values have the wrong signs). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#201993
Sales order lines now recalculate the unit price when a product is changed, even if the previous price had been manually edited. This prevents quotations from keeping an outdated price after switching products, improving pricing accuracy for sales teams.
Original PR description
step to reproduce - Create a quotation, - Select a product - Update the price manually - change the product - The amount stays the same expectation: with change of product in SO, price should also recompute issue: currently,`_compute_price_unit` depends on `technical_price_unit` such that `price_unit` won't update if `price_unit` and `technical_price_unit` are not same. which is the case when price_unit was manually set, regardless of the product https://github.com/odoo/odoo/blob/12ef230df58122fbdac0b4c1b4781c535b8516ba/addons/sale/models/sale_order_line.py#L567-L570 we should reset to original price with change of product opw-4813069 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213912
This update ensures Odoo respects the setting that prevents missing standard tax groups from being recreated during upgrades. It helps avoid upgrade failures and prevents incomplete tax group records with missing account information, especially for affected localizations such as Pakistan.
Original PR description
**Description** - The `force_create` attribute was added to `try_loading` in odoo/odoo@a3c57b4f0198236b04486d336d56b25de74677b8 allowing control over whether missing standard records should be…
**Description** - The `force_create` attribute was added to `try_loading` in odoo/odoo@a3c57b4f0198236b04486d336d56b25de74677b8 allowing control over whether missing standard records should be created. However, this wasn't respected for `account.tax.group`. As a result, tax groups could still be created even when `force_create=False`, leading to null values in accounts fields like `tax_payable_account_id` and `tax_receivable_account_id`. **The issue which prompted this patch:** - A recent patch in upgrade: odoo/upgrade@d2d16a2321abb525fe3fe2c403f89009f51c1394 This patch was made to update the `reconcile` and `non_trade` flags on standard accounts due to recent changes across localizations. During the upgrade, we overrode the `write` method of `account.tax.group` to conditionally update these flags. However, in a client’s database, `account.tax.group` records were missing for the `l10n_pk` module, while the standard account records were present. When `try_loading` was triggered at the end, it attempted to `create` the missing tax groups. But since the create method is called during creation and does not include the conditional update logic for `reconcile` and `non_trade` the upgrade failed with the same error that the original patch aimed to resolve. - To avoid such errors and prevent tax groups from being created with null account fields when `force_create=False`, this patch ensures `force_create` is respected for `account.tax.group`. **Steps to reproduce:** - Create a `v17` DB and install `l10n_pk` - Delete the standard tax groups - Upgrade to `v18` OPW-4915394 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219211
Mercado Pago payments that return a processing status are now treated as still in progress instead of failed. This prevents confusing error messages at checkout and allows the system to keep retrying until the payment reaches a final state.
Original PR description
The Mercado Pago 'PROCESSING' payment status was not handled. As a result, when receiving this status, the payment was treated as failed and the user saw an 'Unknown payment status' message. This fix treats 'PROCESSING' as an in-progress state, just like 'OPEN' and 'ON_TERMINAL'. It triggers the same retry mechanism. opw-4918455 Forward-Port-Of: odoo/odoo#219056 Forward-Port-Of: odoo/odoo#218990
This fix restores Cloudflare Turnstile protection for website newsletter signup forms, preventing an error that stopped the protection from working. Businesses using newsletter blocks can keep collecting subscriptions while maintaining bot protection.
Original PR description
Scenario: - configure turnstile in setting - install website_mass_mailing - drop the newsletter widget in any page Result: In saas-18.1, we get this traceback error and the turnstile code is not…
Scenario: - configure turnstile in setting - install website_mass_mailing - drop the newsletter widget in any page Result: In saas-18.1, we get this traceback error and the turnstile code is not working: Uncaught Promise > this._turnstile.addSpinner is not a function Cause: - On November 2024, in saas-18.1 and over, 37fb21911ef33885a3dae309158a359ed1a604e0 adds the addTurnstile method but not the addSpinner method - On January 2025, in saas-18.2 and over, 421c5e5c4ee6271bb1085b43505cc1c28b2cb574 moved addons/website_cf_turnstile/static/src/js/turnstile.js to addons/website_cf_turnstile/static/src/interactions/turnstile.js - On January 2025, in saas-18.2 and over, 22e777c046521f3f89b62caa5876680beb7f5aba rewrote the Turnstile class removing addTurnstile - On February 2025, in 17.0 up to 18.0, 7ec74bcc692fc1c0d89fbeb243eef31685996784 adds the addTurnstile and addSpinner method - On April 2025, in 17.0 up to master, c48e74f57569a1670fee65d65625488846513d79 uses addTurnstile and addSpinner method and the old file link without being adapted in saas-18.1 and over That last commit cause a traceback error in saas-18.1 up to master since it was forward-ported without adaptation. Fix: adapt the code for saas-18.1, more adaptation will be needed in saas-18.2 and over since the turnstile code was rewritten. Note: the code also modifies website_cf_turnstile to add the possibility that there is no form around the turnstile elements (which is the case for the subscribe (.js_subscribe) widget) in which case we fallbacks on the parent element of the turnstile element. opw-4933957 opw-4925771
Point of Sale now uses a stable login number when creating order references, preventing incorrect references with 000 in the middle. This avoids confusion and downstream issues when the same PoS session is used across multiple devices or employees.
Original PR description
Before this commit, it was possible for the session to assign `0` as a login number. This resulted in order references containing `000` in the middle, leading to various issues. Additionally, other…
Before this commit, it was possible for the session to assign `0` as a login number. This resulted in order references containing `000` in the middle, leading to various issues. Additionally, other parts of the code that relied on the session's login number were also using an incorrect value. This problem occurred because the `session.login_number` is not stable; it gets updated whenever the PoS session record itself is modified, potentially overriding a valid login number with `0`. The fix involves changing the code to use `odoo.login_number` instead, which provides a reliable and consistent login number. To reproduce the issue: 1. Open one PoS session on two different devices. 2. Log in with an employee on the first device. 3. Log in with a different employee on the second device. 4. Create a new order on the first device. You would observe that the login number in the order reference is `0`. opw-4861456 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218370
When Indian e-invoicing authentication fails, users now see the detailed error message and code returned by the service. This helps businesses understand what went wrong faster and reduces back-and-forth when resolving configuration or service issues.
Original PR description
Previously, the `UserError` raised on authentication failure did not include the error message returned by the IAP server.
In this commit:
---
- Added logic to extract and include detailed error messages with code from the IAP response in the `UserError` during authentication for e-invoicing.
Related Tickets:
---
opw-4908388
opw-4942744
opw-4946339
opw-4946193
opw-4933833
Forward-Port-Of: odoo/odoo#219277This update fixes an issue where calendar privacy checks could use the wrong type of data, causing event visibility filtering to behave incorrectly. The change ensures the calendar uses a proper list of user setting records, improving reliability of privacy-related calendar results with only a small performance cost.
Original PR description
Using `_search()` was returning a query object, which broke the domain logic when checking `user_id.res_users_settings_id`. Replaced with `search(...).ids` to ensure a proper list of IDs is passed. `_get_default_privacy_domain` timing: before is always the same since it doesn't execute the sql query | Number of users | Before PR | After PR | |:------------------:|:-----------:|:--------:| | 10k | 0.1 ms | 8 ms | | 30k | 0.1 ms | 14 ms | | 50k | 0.1 ms | 20 ms | | 70k | 0.1 ms | 28 ms | | 90k | 0.1 ms | 35 ms | opw-4841266 bug introduced in:[#5f55544][1] [1]:https://github.com/odoo/odoo/commit/5f5554460c61d3e715e71dd7c946b77083411ae7 Forward-Port-Of: odoo/odoo#214359
Point of Sale now calculates lot availability using only stock from the configured PoS source location and its internal child locations. This prevents cashiers from seeing or selling quantities that are actually stored elsewhere, improving inventory accuracy at checkout.
Original PR description
The get_existing_lots function previously returned product_qty based on stock.lot's computed field, which sums quantities from all locations. This led to incorrect available quantities in the PoS, as it should only consider stock in the configured PoS source location and its child internal locations. opw-4865777 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215227
Archiving a record can now correctly create and keep follow-up activities triggered by automation rules. This prevents important reminders, such as those tied to archived leads or contacts, from disappearing immediately after archive actions.
Original PR description
**Issue** Activities created by an automation triggered when archiving a record are deleted. It can be useful to be able to generate an activity when a record such as a Lead is archived. **Cause** Commit d220bb4c872d3660d15373d15565c846e3a35d9f introduced a change in behavior: activities linked to a mail activity mixin record are deleted after the record has been archived. `on_archive` automations will create the activity when writing on the active field of the record, which now happens before the activities linked to the record are unlinked. **Steps to reproduce** 1. Create an automation rule for a model using the mail activity mixin (e.g. Contact), set the trigger "On archive" and "Create an activity" as an action. 2. Archive the record and notice no activity appears in the chatter. opw-4936246
This fixes several color selector issues in the HTML editor so formatting controls behave consistently while editing longer content. Users can now rely on the color picker to close with the toolbar, handle gradient-colored text, and correctly replace fully selected gradients without affecting unrelated formatting.
Original PR description
**Current behavior before PR:** **Issue 1:** - Have a long text content in editable, making the container scrollable. - Select first line of the text, in toolbar open color selector. - Scroll down…
**Current behavior before PR:** **Issue 1:** - Have a long text content in editable, making the container scrollable. - Select first line of the text, in toolbar open color selector. - Scroll down until the toolbar overflows and becomes hidden. - Notice that the toolbar disappears when it overflows its container while color picker remains open, floating at the top of container. **Issue 2:** - Select a text having gradient text color. - Open text color selector, switch to custom color picker. - Notice that hex and rgba fields are empty and user is not able to apply color through it. In colorpicker.js, the convertCSSColorToRgba method fails when attempting to convert a gradient color to RGBA. As a result, colorComponents does not receive valid values and colorpicker doesn't work as expected. **Issue 3:** After merging commit [1], text color can be applied without removing or affecting the existing gradient color. In result, if gradient is fully selected then applying text color creates a new font tag inside gradient instead of replacing the gradient. **Desired behavior after PR:** **Issue 1:** Now, when the toolbar overflows and gets hidden, the color selector becomes hidden along with toolbar. **Issue 2:** Now, if `convertCSSColorToRgba` fails to convert selected color to rgba color then default color `#FF0000`is assigned to color components. This ensures that the colorpicker functions correctly. **Issue 3:** Now, if gradient is fully selected then, - Applying text color removes existing text gradient. - Applying background color removes existing background gradient. - Applying text color doen't remove the existing background gradient. - Applying background color doesn't remove the existing text gradient. [1]: https://github.com/odoo/odoo/commit/938995744b15f345958a2d78a6c844dd5bf1ae6c Enterprise PR: https://github.com/odoo/enterprise/pull/84579 task-4581884 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#202889
Point of Sale users who do not have access to sales documents can now load loyalty programs without errors. This prevents loyalty features from being blocked for cashiers or staff with limited permissions, keeping checkout promotions available as expected.
Original PR description
Before this commit, the loyalty program was not loaded for PoS users who lacked access rights to sale documents. This issue occurred because the system attempted to read the `total_order_count` field, which is computed based on sale orders, causing a failure in loading the loyalty program. opw-4847852 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217772
This fix ensures that when a dropshipped item supplied by another company is returned, the related sales order shows the delivered quantity decreasing instead of increasing. This improves order accuracy for businesses using intercompany dropshipping and adds test coverage to prevent the issue from returning.
Original PR description
**Current behavior:** Returning an intercompany dropship (product vendor is another `res.company`) increases the original sale order line's delivered qty. **Expected behavior:** The delivered qty…
**Current behavior:** Returning an intercompany dropship (product vendor is another `res.company`) increases the original sale order line's delivered qty. **Expected behavior:** The delivered qty should decrease once the return is completed. **Steps to reproduce:** 1. Create two companies, enable all the inter-company synchronization rules 2. Create a product with the dropship route and set the other company as the vendor 3. Create a sale order for the dropship product, confirm 4. Confirm the corresponding purchase order -> validate the dropship picking 5. Return the dropship picking 6. See the sale order line's delievered qty is wrong **Cause of the issue:** The dropship return move(s) are incorrectly flagged as outgoing. **Fix:** Use the `_is_dropshipped_returned()` method to filter these moves from being considered outgoing. Also added on to an existing dropshipping test so that there is now coverage for this use-case when the vendor is not another company, as this was previously not covered. opw-4526750 Forward-Port-Of: odoo/odoo#200133
This update fixes several early issues in Greece electronic invoicing, including VAT formatting, error handling, PDF generation, and invoice type calculation. It also makes myDATA settings easier to find and improves default invoice classification, reducing manual work and failed submissions.
Original PR description
First major fixes and improvements for Greece EDI. task-4781479 Forward-Port-Of: odoo/odoo#209078
Manufacturing orders created or opened in the Barcode app now correctly respect the units of measure defined on the bill of materials. This prevents errors when unit settings are later disabled and avoids incorrect component quantities caused by falling back to product default units.
Original PR description
Previous behaviour: * Traceback if MO created with a BoM whose lines have UoMs that don't correspond to those of the products, then UoM setting disabled and MO viewed in the barcode app. * BoM line UoMs ignored in favour of product UoMs when creating MO in the barcode app. New behaviour: * No traceback. * Stock moves in MOs properly created with the corresponding BoM line UoMs. Task ID: [4674196](https://www.odoo.com/odoo/my-tasks/4674196)
This fixes an issue where customers paying ahead for a second subscription period could fail to receive an invoice when their order included both recurring and one-time products. The system now checks the amount due for the next billing period, helping ensure advance payments are invoiced correctly.
Original PR description
Steps to Reproduce: 1. create a subscription with a recurring & non-recurring product(select monthly cleaning quatation) 2. Pay for the first period. 3. Now, try to pay the advance payment for the second period. The invoice is not generated for the second duration Issue: - The invoice is not generated for the second period. Cause: - The _get_partial_payment_subscription_transaction method incorrectly compares the sum of authorized, uninvoiced transactions with the total order amount. Solution: - Update the _get_partial_payment_subscription_transaction method to compare the sum of authorized, uninvoiced transaction amounts with the next billing period’s total instead of the full order total task-4780971
Accounting deferrals are now created even when the covered period is shorter than one month, such as a few days at the end of a month. This prevents valid revenue or expense allocations from being skipped and improves financial accuracy for short invoice periods.
Original PR description
Previously, `_get_deferred_periods` would return an empty list when the deferral period was contained within a single month and matched the invoice date's month, even if the period spanned multiple days. This caused deferred entries to be skipped for valid short deferral spans (e.g. June 25 to June 30). This fix removes the condition that filters out single-month deferral periods, ensuring that deferred entries are always generated when a valid start and end date are present. This change supports accurate pro-rata allocation even for invoice periods shorter than one month, aligning the accounting behavior with expected financial standards. task-4910854 Forward-Port-Of: odoo/enterprise#89114
This fixes an issue where shops using an Urban Piper payment method could become unable to close their point-of-sale session after an order. The closing screen now avoids duplicate payment method entries, preventing the session from getting stuck and helping staff complete end-of-day operations normally.
Original PR description
Currently if setting a urban piper payment method on a shop and using it at checkout will not allow you to close the session. Steps to reproduce: ------------------- * Go in the setting and set up…
Currently if setting a urban piper payment method on a shop and using it at checkout will not allow you to close the session. Steps to reproduce: ------------------- * Go in the setting and set up urban piper (no need for credentials) testing with random keys will do * Go into the payment methods and take one of the urban piper one and assign it to a shop * Open that shop * Place an order and use the urban piper payment method * Validate * Try closing the session > Observation: Nothing happen, we're now unable to select the menu. If doing the same steps but in debug mode, a traceback is shown indicating a duplicate key in a t-foreach Why the fix: ------------ The duplicate key is happening when rendering the closing popup because the function `get_closing_control_data()` was returning twice the information related to the urban piper payment method. Even though urban piper wasn't build with the use case in mind we want to keep it possible. We avoid sending twice the urban piper methods if they were already computed in the super method. opw-4874699 Forward-Port-Of: odoo/enterprise#88156
DHL and USPS shipping now use separate package detail handling, preventing one carrier’s settings from interfering with the other. This helps ensure the correct package information is sent when creating shipments, especially when both delivery connectors are installed.
Original PR description
Forward-Port-Of: odoo/enterprise#89771