Friday, June 13, 2025
37 changes · saas-18.3
Enhancements to existing features
Reconciliation rules now treat greater-than and lower-than amount limits as inclusive, so boundary values are matched as users expect. This makes it easier to define practical “between” amount ranges without missing transactions at the exact limit.
Original PR description
Matching amounts for reco rules now have `or equal to` for the `greater than` and `lower than` selections. This makes more sense for users trying to have "In between" values. task-4863744
Resolved issues and error corrections
Opening the VoIP contacts tab no longer fails when a contact has a phone number but no name. These unnamed contacts are now safely grouped at the end of the list under a "#" section, keeping the address book usable.
Original PR description
An error was arising when making the following steps: 1. create a company contact with a proper name. 2. create an invoice address for that company through the company form view. 3. set a phone number for the invoice. 4. leave the `name` empty. 5. open the contacts tab on VoIP. This happened because the code was trying to access the first charachater of a falsy string which is `voipName` in this case. A solution to this was to guard falsy names of contacts and add a section for contacts with empty string. This section will have a title of "#" and will appear at the end of the list.
Miscellaneous changes
Setting the opacity to the empty string leads to max opacity but is seen as "/" in the builder because no options corresponds to this value. And the "None" option is not that, which is confusing. Setting a known value for the opacity shows the correct choice for the option Steps to reproduce: - In a database with demo data, go to `/event` - Go to "An unpublished event" - Open editor - Bug: "Filter Intensity" shows "/" Backport of 94cc1cbd2d8ed23fd243515ad215ea91bac46068 task-4367641
Original PR description
Setting the opacity to the empty string leads to max opacity but is seen as "/" in the builder because no options corresponds to this value. And the "None" option is not that, which is confusing. Setting a known value for the opacity shows the correct choice for the option Steps to reproduce: - In a database with demo data, go to `/event` - Go to "An unpublished event" - Open editor - Bug: "Filter Intensity" shows "/" Backport of 94cc1cbd2d8ed23fd243515ad215ea91bac46068 task-4367641 Forward-Port-Of: odoo/odoo#213965 Forward-Port-Of: odoo/odoo#212530
The AI chat interface now places the copy button directly under the user's message instead of on the opposite side of the chat. AI action buttons are also better aligned with message bubbles, making chat actions clearer and easier to use.
Original PR description
This commit fixes the alignment of the copy button in ai chats for user messages. --- Behaviour Before this Fix --- The copy button would be aligned on the left side of the chat window while the user message would be on the right side. --- Changes Done for the Fix --- Previously, the flex-reversed class was added in the contentContainer div, which includes the message and its actions. That was removed and now the flex-row-reversed class is added when the chat is not AI. When the chat is AI, the flex-row-reversed class is added but this time only for the actions div. --- Behaviour After the Fix --- The copy button is now aligned on the right side, under the user's message. Task-4840542
Reconcile model names now display correctly in the accounting reconciliation widget even when users change their language. This prevents blank model names and avoids related widget errors, making reconciliation more reliable for multilingual users.
Original PR description
The name of the reconcile models displayed in the widget was sometimes empty due to a mismatch in user language. Specifically, if a reconcile model was created in one language (e.g., en_US) and the user switched to a different language, the model name would not be found and thus appear empty. This led to a props validation error in the widget. task-4863754
## Description Before this commit: - Clicking on a trendline point resulted in a RuntimeError. - Line chart points were not redirected to Odoo records. After this commit: - Clicking on trendline points is now ignored, preventing the error. - Line chart points now correctly redirect users to the relevant Odoo records. Task: [4815995](https://www.odoo.com/odoo/2328/tasks/4815995) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port
Original PR description
## Description Before this commit: - Clicking on a trendline point resulted in a RuntimeError. - Line chart points were not redirected to Odoo records. After this commit: - Clicking on trendline points is now ignored, preventing the error. - Line chart points now correctly redirect users to the relevant Odoo records. Task: [4815995](https://www.odoo.com/odoo/2328/tasks/4815995) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214098 Forward-Port-Of: odoo/odoo#211472
### Steps to reproduce: - Install l10n_bg - Install the Bulgarian language - In the Accounting Settings, tick the option "Total amount of invoice in letters" - Change a contact's language to Bulgarian - Create an invoice for this partner, select BGN as the currency - The total should be with a unit in thousands (for example 8500) - The text transcription of the number substracts 1000: Седем Хиляди И Петстотин = 7500 ### Cause: The class `NumberToWords_BG` is a copy of the library num2
Original PR description
### Steps to reproduce: - Install l10n_bg - Install the Bulgarian language - In the Accounting Settings, tick the option "Total amount of invoice in letters" - Change a contact's language to…
### Steps to reproduce: - Install l10n_bg - Install the Bulgarian language - In the Accounting Settings, tick the option "Total amount of invoice in letters" - Change a contact's language to Bulgarian - Create an invoice for this partner, select BGN as the currency - The total should be with a unit in thousands (for example 8500) - The text transcription of the number substracts 1000: Седем Хиляди И Петстотин = 7500 ### Cause: The class `NumberToWords_BG` is a copy of the library num2cyrillic except for the initialization of the variable `_digits` which specifies three arrays with variants of the numbers (1-9). We do it by copying the index 0, which is the default variant, for the non-different spellings. The issue comes from the line `_digits[-1] = [None, 'една', None] + _digits[0][2:]` which have an unneeded `None` which offsets the array by one. So when reading `_digits[-1][8]` we end up with "seven". ### Solution: Remove the `None`. opw-4753418 Forward-Port-Of: odoo/odoo#212914
**Description** The label **"Identification Number"**, displayed in the website checkout form, was not being translated despite being properly marked with `_()` in `portal.py`. --- **Why the fix** - When the translatable term was introduced the `.pot` file wasn't updated. By exporting the `.pot` file from the db we are able to update it to make it translatable --- **Steps to Reproduce** 1. Install the `l10n_latam` module. 2. Create an Argentinian company. 3. Create a new websi
Original PR description
**Description** The label **"Identification Number"**, displayed in the website checkout form, was not being translated despite being properly marked with `_()` in `portal.py`. --- **Why the fix** -…
**Description** The label **"Identification Number"**, displayed in the website checkout form, was not being translated despite being properly marked with `_()` in `portal.py`. --- **Why the fix** - When the translatable term was introduced the `.pot` file wasn't updated. By exporting the `.pot` file from the db we are able to update it to make it translatable --- **Steps to Reproduce** 1. Install the `l10n_latam` module. 2. Create an Argentinian company. 3. Create a new website , add spanish to its languages and assign it to the Argentinian company. 4. Switch the current user’s **default company** to the Argentinian one. 6. Go to Inventory → Create and publish a new product. 7. On the website: - Add the product to the cart. - Proceed to checkout. 8. Observe that the **"Identification Number"** field in the address form remains untranslated. --- **Before** - The "Identification Number" label appeared only in English and could not be translated. --- **After** - It shows up in the translation interface and can be translated into Spanish. --- Ticket ID: opw-4814341 Forward-Port-Of: odoo/odoo#212947
Before this commit, some command palette tests failed non- deterministically. The cause was that the values set on debounced functions were too short, compared to the time it took to render the component after each action, PLUS the additional animation frame awaited by each call to 'advanceTime'/'runAllTimers'. All in all, should the CPU be a bit busier than usual, these tests would fail. This commit does 2 things: - the debounce delays have been vastly increased (100 & 200ms -> 500 & 1000
Original PR description
Before this commit, some command palette tests failed non- deterministically. The cause was that the values set on debounced functions were too short, compared to the time it took to render the component after each action, PLUS the additional animation frame awaited by each call to 'advanceTime'/'runAllTimers'. All in all, should the CPU be a bit busier than usual, these tests would fail. This commit does 2 things: - the debounce delays have been vastly increased (100 & 200ms -> 500 & 1000ms); - the awaited actions in the command palette test module have been reduced to a minimum, using Hoot helpers directly instead of the web 'contains' wrapper. runbot [223268](https://runbot.odoo.com/odoo/runbot.build.error/223268) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214017 Forward-Port-Of: odoo/odoo#213840
Description of the issue this PR addresses: Current behavior before PR: The separator was always inserted before the current block, regardless of its content. Desired behavior after PR is merged: The separator is inserted before the block if it's empty, otherwise it is inserted after the block if it contains text. task-4848276 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212970
Original PR description
Description of the issue this PR addresses: Current behavior before PR: The separator was always inserted before the current block, regardless of its content. Desired behavior after PR is merged: The separator is inserted before the block if it's empty, otherwise it is inserted after the block if it contains text. task-4848276 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212970
Steps to reproduce: - Have a [TAX] configured with: - Affect Base of Subsequent Taxes: True - Base Affected by Previous Taxes: True - Tax Exigibility: Based on payment - Distribution for invoices: - Base, Tax grids: +A, +B - 100% of tax, Tax grids: +C - -100% of tax, Tax grids: -D, -E - Distribution for refunds: - Base, Tax grids: -A, -B - 100% of tax, Tax grids: -C - -100% of tax, Tax grids: +D, +E - Create a BILL with [TAX] - Create a matching Ba
Original PR description
Steps to reproduce:
- Have a [TAX] configured with:
- Affect Base of Subsequent Taxes: True
- Base Affected by Previous Taxes: True
- Tax Exigibility: Based on payment
- Distribution for invoices:
- Base, Tax grids: +A, +B
- 100% of tax, Tax grids: +C
- -100% of tax, Tax grids: -D, -E
- Distribution for refunds:
- Base, Tax grids: -A, -B
- 100% of tax, Tax grids: -C
- -100% of tax, Tax grids: +D, +E
- Create a BILL with [TAX]
- Create a matching Bank statement and reconcile with BILL
- Check the created Cash Basis Entry
Issue:
VAT line will feature base tags +A, +B in addition to the tax tags +C
This occurs because in the source bill 2 tax lines are created, the first one got the origin tax assigned
When the cash basis move is created the tax tags will be taken also from that tax
opw-4729298
Forward-Port-Of: odoo/odoo#209284**Current behavior:** Using the return & exchange functionality when the product to exchange is a kit's component will not correctly update the SOL `qty_delivered` field upon validation of the exchange (out) picking. **Expected behavior:** accurate `qty_delivered` **Steps to reproduce:** 1. Create a product w/ kit bom like: * 2 units componentA * 1 units componentB 2. Sell 1 unit of the kit product, validate delivery 3. Create a return for the 1 unit of componentB and select the
Original PR description
**Current behavior:** Using the return & exchange functionality when the product to exchange is a kit's component will not correctly update the SOL `qty_delivered` field upon validation of the…
**Current behavior:** Using the return & exchange functionality when the product to exchange is a kit's component will not correctly update the SOL `qty_delivered` field upon validation of the exchange (out) picking. **Expected behavior:** accurate `qty_delivered` **Steps to reproduce:** 1. Create a product w/ kit bom like: * 2 units componentA * 1 units componentB 2. Sell 1 unit of the kit product, validate delivery 3. Create a return for the 1 unit of componentB and select the exchange option on the wizard 4. Validate the return, then validate the exchange 5. Look at the sale order line `qty_delivered` -> it's 0 **Cause of the issue:** The exchange picking move doesn't get a `bom_line_id` and thus is not properly aggregated in the computation of qty_delivered when incoming and outgoing quantities are being calculated (wherein these quantities must offset, but can't in this situation). **Fix:** When the procurement occurs to create the exchanging move, find the `bom_line_id` by looking at the original sale line's moves' bom's bom lines. opw-4676609 Forward-Port-Of: odoo/odoo#207955
If you have 2 invoices and 2 dropship picking linked to 1 Dropship Sale Order, and the two dropship have different SVL cost: The 2nd invoice will have incorrect COGS https://github.com/user-attachments/assets/79f15933-0449-4081-aff0-daa5709889bf ## To reproduce - Create Product P-DROP: * category: AVCO automated * Routes: Buy & Dropship * Purchase Vendors: Azure Interior @ $10 - Create Sale Order for 1 unit of P-Drop ⇾ Confirm - Go to Purchase Order ⇾ ensure unit price is
Original PR description
If you have 2 invoices and 2 dropship picking linked to 1 Dropship Sale Order, and the two dropship have different SVL cost: The 2nd invoice will have incorrect COGS…
If you have 2 invoices and 2 dropship picking linked to 1 Dropship Sale Order, and the two dropship have different SVL cost: The 2nd invoice will have incorrect COGS
https://github.com/user-attachments/assets/79f15933-0449-4081-aff0-daa5709889bf
## To reproduce
- Create Product P-DROP:
* category: AVCO automated
* Routes: Buy & Dropship
* Purchase Vendors: Azure Interior @ $10
- Create Sale Order for 1 unit of P-Drop ⇾ Confirm
- Go to Purchase Order ⇾ ensure unit price is $10 ⇾ Confirm
- Receive products ⇾ ensure **valuation is $10**
- Create Vendor Bill (optional) ⇾ Confirm
- Create Invoice ⇾ Confirm
* **COGS value is $10** (ok)
- In Sale Order, set ordered quantity to 2 units
* New draft PO should have been created
- Go to New Purchase Order ⇾ set price to $20 ⇾ Confirm
- Receive products ⇾ ensure **valuation is $20**
- Create Vendor Bill (optional) ⇾ Confirm
- Create Invoice ⇾ Confirm
* COGS should be $20, but they are actually **$16.67** (KO)
---
## Test result without fix
```
2025-06-11 11:25:32,230 29041 ERROR oes_test_17 odoo.addons.stock_dropshipping.tests.test_stockvaluation: FAIL: TestStockValuation.test_dropship_cogs_multiple_invoices
Traceback (most recent call last):
File "/home/odoo/projects/odoo-src/multiverse/src/17.0/odoo/addons/stock_dropshipping/tests/test_stockvaluation.py", line 382, in test_dropship_cogs_multiple_invoices
self.assertEqual(dropship2_cogs_line.balance, -16)
AssertionError: -13.33 != -16
```
OPW-4665635
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#213887
Forward-Port-Of: odoo/odoo#213763This adds XML generation tests for the following UBL formats: - Turkey (Nilvera) - Malaysia - ANZ, JP, MY and SG PINT formats. Additionally, we improve error reporting in the `assertXmlTreeEqual` method. Enterprise PR: https://github.com/odoo/enterprise/pull/87222 task-4242065 Forward-Port-Of: odoo/odoo#214082 Forward-Port-Of: odoo/odoo#213402
Original PR description
This adds XML generation tests for the following UBL formats: - Turkey (Nilvera) - Malaysia - ANZ, JP, MY and SG PINT formats. Additionally, we improve error reporting in the `assertXmlTreeEqual` method. Enterprise PR: https://github.com/odoo/enterprise/pull/87222 task-4242065 Forward-Port-Of: odoo/odoo#214082 Forward-Port-Of: odoo/odoo#213402
**Steps to reproduce:** - Install the modules `l10n_sg` and `l10n_sg_ubl_pint`. - Create an invoice. - On the form view of the partner you chose. Under the `Accounting` tab, set `eInvoice format` as PINT singapore. - On the invoice, for `currency_id`, use a currency other than SGD. - Download the invoice in the 'PINT Singapore' format. **Issue:** The invoice is not downloaded and it throws a traceback. **Cause:** The method '_get_additional_document_reference_list' returns a list of
Original PR description
**Steps to reproduce:** - Install the modules `l10n_sg` and `l10n_sg_ubl_pint`. - Create an invoice. - On the form view of the partner you chose. Under the `Accounting` tab, set `eInvoice format` as PINT singapore. - On the invoice, for `currency_id`, use a currency other than SGD. - Download the invoice in the 'PINT Singapore' format. **Issue:** The invoice is not downloaded and it throws a traceback. **Cause:** The method '_get_additional_document_reference_list' returns a list of dictionnaries within another list, while the XML is expecting a list of dictionnaries. **Solution:** Remove the append method. opw-4799363 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212754
The Italian localization defined 'preceding_subtotal' in tax group records using the Italian term "Imponibile" as the default value. This caused the label for untaxed amounts in invoices, sale orders, and purchase orders to always appear in Italian, regardless of the system or partner language. task-4853046 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
Original PR description
The Italian localization defined 'preceding_subtotal' in tax group records using the Italian term "Imponibile" as the default value. This caused the label for untaxed amounts in invoices, sale orders, and purchase orders to always appear in Italian, regardless of the system or partner language. task-4853046 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#213983
modules: portal, point_of_sale This commit is about the self-invoicing: the 'vat' and 'company name' were not editable when you request an invoice as an unlogged user. Steps to reproduce : - Open a pos session and create an order, pay it (and print the ticket) - Close the pos session - Open a new private window and go to <url>/pos/ticket - Enter the ticket number, the date and the unique code and press "Request invoice" - A form is displayed and the two fields "company name" and "vat" ca
Original PR description
modules: portal, point_of_sale This commit is about the self-invoicing: the 'vat' and 'company name' were not editable when you request an invoice as an unlogged user. Steps to reproduce : - Open a pos session and create an order, pay it (and print the ticket) - Close the pos session - Open a new private window and go to <url>/pos/ticket - Enter the ticket number, the date and the unique code and press "Request invoice" - A form is displayed and the two fields "company name" and "vat" can now be edited Related to task-4777131 Runbot: https://runbot.odoo.com/runbot/bundle/saas-18-2-portal-vat-editable-roto-376921 Forward-Port-Of: odoo/odoo#213973
### Purpose of this PR: - Add `expectElementCount` test helper to wait for elements to appear or disappear before asserting their count. This fixes flaky tests caused by timing issues and animations, especially on slower environments like runbot, in toolbar, link popover, powerbox, tablepicker, tablemenu, and emoji picker tests. task-4849995 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213623 Forward-Port-Of: odoo/
Original PR description
### Purpose of this PR: - Add `expectElementCount` test helper to wait for elements to appear or disappear before asserting their count. This fixes flaky tests caused by timing issues and animations, especially on slower environments like runbot, in toolbar, link popover, powerbox, tablepicker, tablemenu, and emoji picker tests. task-4849995 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213623 Forward-Port-Of: odoo/odoo#213090
If a currency not supported by AsiaPay is selected during payment, the system will crash, resulting in a KeyError. In the `const.py` file at [1], we have already defined the `CURRENCY_MAPPING`. Therefore, if a currency is chosen that is not included in the `CURRENCY_MAPPING`, it will cause a crash during the payment process. [1] https://github.com/odoo/odoo/blob/bcaafd941c1b4cae65a71900858894556805762e/addons/payment_asiapay/const.py#L19-L42 **Steps to produce:-** 1. Install `eCommerce`.
Original PR description
If a currency not supported by AsiaPay is selected during payment, the system will crash, resulting in a KeyError. In the `const.py` file at [1], we have already defined the `CURRENCY_MAPPING`.…
If a currency not supported by AsiaPay is selected during payment, the system will crash, resulting in a KeyError. In the `const.py` file at [1], we have already defined the `CURRENCY_MAPPING`. Therefore, if a currency is chosen that is not included in the `CURRENCY_MAPPING`, it will cause a crash during the payment process. [1] https://github.com/odoo/odoo/blob/bcaafd941c1b4cae65a71900858894556805762e/addons/payment_asiapay/const.py#L19-L42 **Steps to produce:-** 1. Install `eCommerce`. 2. Set up the `AsiaPay` payment provider, and in the configuration, set the Currencies as `EGP`. 3. Now, go to `Website > Shop` and add the product to the cart. 4. Try to make the `payment` for the cart using `AsiaPay`. **Error:-** `KeyError: 'EGP'` **Solution:-** - This commit adds a constraint that ensures only currencies defined in `CURRENCY_MAPPING` (from `const.py`) can be selected for the AsiaPay payment provider. If any unsupported currencies are selected, a ValidationError is raised listing the invalid entries. **Sentry - 6665716944** I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213496
**Problem** Given a form with three elements, A, B, and C, where C visibility depends on the content of B, and B visibility depends on the content of A, when form element B becomes visible, even if its content should trigger the visibility of C, C remains hidden. Since [1], the check of visibility condition for C fails because it is based on a FormData object created before removing the attribute disabled from B. This doesn't work because FormData does not contain information from disabled ele
Original PR description
**Problem** Given a form with three elements, A, B, and C, where C visibility depends on the content of B, and B visibility depends on the content of A, when form element B becomes visible, even if…
**Problem** Given a form with three elements, A, B, and C, where C visibility depends on the content of B, and B visibility depends on the content of A, when form element B becomes visible, even if its content should trigger the visibility of C, C remains hidden. Since [1], the check of visibility condition for C fails because it is based on a FormData object created before removing the attribute disabled from B. This doesn't work because FormData does not contain information from disabled elements. **How to reproduce** 1. Add a form snippet on the page 2. Add three new fields to the form 3. Label the fields `fieldA`, `fieldB` and `fieldC` 4. Set `fieldB` to be `visible only if` `fieldA` `Is equal to` `test` 5. Set `fieldC` to be `visible only if` `fieldB` `Is equal to` `test` 6. Save 7. Type `test` in `fieldA` -> `fieldB` becomes visible 8. Type `test` in `fieldB` -> `fieldC` becomes visible 9. Delete `test` from `fieldA` -> both `fieldB` and `fieldC` disappear 10. Type `test` in `fieldA` 11. BUG: `fieldB` appears, contains `test`, but `fieldC` is hidden **Solution** A new function `getFormDataIncludingDisabledFields` is added, which generates a `FormData`-like object that includes disabled elements. [1] odoo@b9b3a60 task-4367641 Forward-Port-Of: odoo/odoo#213643
For a document fix, we add a method to the activity button that implements custom behavior when an activity changes. see odoo/enterprise#84128 task-4690165 Forward-Port-Of: odoo/odoo#210988
Original PR description
For a document fix, we add a method to the activity button that implements custom behavior when an activity changes. see odoo/enterprise#84128 task-4690165 Forward-Port-Of: odoo/odoo#210988
If the browser triggers a request just as a tour is finishing up (e.g. navigation to a new page triggering a font fetch), the harness can close the websocket connection while the request is in the `requestPaused` proxy, causing the reply to fail and trigger an error. We can just ignore the error in that case. An alternative would be to enqueue a future into `_responses` when we receive the query, but that would still have a race as depending on scheduling decisions the browser could have alre
Original PR description
If the browser triggers a request just as a tour is finishing up (e.g. navigation to a new page triggering a font fetch), the harness can close the websocket connection while the request is in the `requestPaused` proxy, causing the reply to fail and trigger an error. We can just ignore the error in that case. An alternative would be to enqueue a future into `_responses` when we receive the query, but that would still have a race as depending on scheduling decisions the browser could have already shut down by the time we reach the handler, so we'd need to enqueue a future, check if `ws` is still open, and bail if not. And even then that's still got a hole as there is some time between the `wait(_responses.values())` and the `ws.close()`. https://runbot.odoo.com/odoo/error/186309 Forward-Port-Of: odoo/odoo#213959 Forward-Port-Of: odoo/odoo#213911
Before, if you marked the to publick check in an invoice, the generated cfdi would force the Without fiscal obligations regime at the receptor data, but this wasn't done on the invoice which caused a mismatch on what was being reflected on the invoice and what was on the cfdi. This commit targets to show the same info on the invoice if invoice is set to public target: 18.0 -> master task-4685440 Forward-Port-Of: odoo/enterprise#87263
Original PR description
Before, if you marked the to publick check in an invoice, the generated cfdi would force the Without fiscal obligations regime at the receptor data, but this wasn't done on the invoice which caused a mismatch on what was being reflected on the invoice and what was on the cfdi. This commit targets to show the same info on the invoice if invoice is set to public target: 18.0 -> master task-4685440 Forward-Port-Of: odoo/enterprise#87263
### Issue: `helpdesk.ticket` ratings were converted to emojis in https://github.com/odoo/enterprise/pull/42972, but currently do not display the correct color or face. ### Solution: Correctly check the value of `rating_avg_text` to determine which face should be shown, and remove class decoration that was recently added that hides the proper color. opw-4703331 Forward-Port-Of: odoo/enterprise#86573
Original PR description
### Issue: `helpdesk.ticket` ratings were converted to emojis in https://github.com/odoo/enterprise/pull/42972, but currently do not display the correct color or face. ### Solution: Correctly check the value of `rating_avg_text` to determine which face should be shown, and remove class decoration that was recently added that hides the proper color. opw-4703331 Forward-Port-Of: odoo/enterprise#86573
### Issue: Currently, non-system admin users are blocked from checking Envia rates. When initializing the `Envia` class, these users do not have access to the `carrier` fields, leading to an Access Error. ### Solution: Similar to `delivery_bpost` and `delivery_dhl`, we can use a `sudo` when grabbing the `api_key` value from the carrier record. opw-4761196 Forward-Port-Of: odoo/enterprise#85319
Original PR description
### Issue: Currently, non-system admin users are blocked from checking Envia rates. When initializing the `Envia` class, these users do not have access to the `carrier` fields, leading to an Access Error. ### Solution: Similar to `delivery_bpost` and `delivery_dhl`, we can use a `sudo` when grabbing the `api_key` value from the carrier record. opw-4761196 Forward-Port-Of: odoo/enterprise#85319
Since [^1] company customers are always invoiced by default. To Invoice should always be false for Brazil POS orders which is why the button on the payment screen was hidden, however, there is now no way to uncheck it. Fix: Set "To Invoice" to false always if the company's fiscal country is Brazil. [^1]: https://github.com/odoo/odoo/pull/202515 opw-4861672 Forward-Port-Of: odoo/enterprise#87504 Forward-Port-Of: odoo/enterprise#87389
Original PR description
Since [^1] company customers are always invoiced by default. To Invoice should always be false for Brazil POS orders which is why the button on the payment screen was hidden, however, there is now no way to uncheck it. Fix: Set "To Invoice" to false always if the company's fiscal country is Brazil. [^1]: https://github.com/odoo/odoo/pull/202515 opw-4861672 Forward-Port-Of: odoo/enterprise#87504 Forward-Port-Of: odoo/enterprise#87389
Sorting by something else than write date desc makes it very difficult to retrieve new documents, especially if never accessed before. Task-4737096 Forward-Port-Of: odoo/enterprise#87442 Forward-Port-Of: odoo/enterprise#83681
Original PR description
Sorting by something else than write date desc makes it very difficult to retrieve new documents, especially if never accessed before. Task-4737096 Forward-Port-Of: odoo/enterprise#87442 Forward-Port-Of: odoo/enterprise#83681
In uruguayan companies, if the field "Lock Posted Entries with Hash" is checked, the user can not validate electronic invoices in DGI. In this PR we are hiding the field in electronic uruguayan journals to prevent the user to check that field accidentally and generate inconsistencies with electronic invoicing. Forward-Port-Of: odoo/enterprise#85392
Original PR description
In uruguayan companies, if the field "Lock Posted Entries with Hash" is checked, the user can not validate electronic invoices in DGI. In this PR we are hiding the field in electronic uruguayan journals to prevent the user to check that field accidentally and generate inconsistencies with electronic invoicing. Forward-Port-Of: odoo/enterprise#85392
The dynamic payments domain for batch payments has been added in https://github.com/odoo/enterprise/pull/86217 Fix the override for domain payments in the SEPA module. Forward-Port-Of: odoo/enterprise#87481
Original PR description
The dynamic payments domain for batch payments has been added in https://github.com/odoo/enterprise/pull/86217 Fix the override for domain payments in the SEPA module. Forward-Port-Of: odoo/enterprise#87481
**Problem:** When internal transfer operation type has a manadatory destination in barcode, the transfer can still be validated without destination location scanned if it's a package **Steps to reproduce:** - In settings, enable the "packages" settings - Navigate to Inventory/Configuration/Warehouse Management/ Operations Types - Select "Internal Transfers", in the "Barcode App" page for Source Location, select Mandatory Scan - for "Destination Location" select "after each product"
Original PR description
**Problem:** When internal transfer operation type has a manadatory destination in barcode, the transfer can still be validated without destination location scanned if it's a package **Steps to…
**Problem:** When internal transfer operation type has a manadatory destination in barcode, the transfer can still be validated without destination location scanned if it's a package **Steps to reproduce:** - In settings, enable the "packages" settings - Navigate to Inventory/Configuration/Warehouse Management/ Operations Types - Select "Internal Transfers", in the "Barcode App" page for Source Location, select Mandatory Scan - for "Destination Location" select "after each product" - create a new storable product - Navigate to Inventory/Operations/Physical Inventory - Create a new line and select stock as the location - Select your product - In the package column, create a package and give it a name - Set a quantity > Apply - Open the barcode app, select operations and then internal transfers - Click on New and then Scan WH-Stock and the package name: PACK **Current behavior:** The validate button is higlighted in green and clickable **Expected behavior:** Because we didn't scan a destination location it shouldn't be green and clickabel **Cause of the issue:** When a package barcode is scanned, when _processBarcode calls _processPackage https://github.com/odoo/enterprise/blob/a60aea84d68587b1dfe1b6bfd20cb4fced0f7d46/stock_barcode/static/src/models/barcode_model.js#L1007 Inside _processPackage barcodeData.stopped is set to true (1) and this.selectedLineVirtualId is set to false (2) https://github.com/odoo/enterprise/blob/a60aea84d68587b1dfe1b6bfd20cb4fced0f7d46/stock_barcode/static/src/models/barcode_picking_model.js#L1532-L1533 Because of (1) _processBarcode returns here https://github.com/odoo/enterprise/blob/a60aea84d68587b1dfe1b6bfd20cb4fced0f7d46/stock_barcode/static/src/models/barcode_model.js#L1008-L1011 and doesn't reach the part of the method where _selectLine is called https://github.com/odoo/enterprise/blob/a60aea84d68587b1dfe1b6bfd20cb4fced0f7d46/stock_barcode/static/src/models/barcode_model.js#L1181-L1182 (Inside _selectLine the value of selectedLineVirtualId is defined https://github.com/odoo/enterprise/blob/a60aea84d68587b1dfe1b6bfd20cb4fced0f7d46/stock_barcode/static/src/models/barcode_model.js#L1269-L1274 ) So as a consequence of (1) and (2) the value of this.selectedLineVirtualID is false when a package is scanned When the validate method is called when the user clicks on validate, the method uses the value of this.selectedLine https://github.com/odoo/enterprise/blob/a60aea84d68587b1dfe1b6bfd20cb4fced0f7d46/stock_barcode/static/src/models/barcode_picking_model.js#L777-L779 Because this.selectedLineVirtualID is false, get selectedLine returns false https://github.com/odoo/enterprise/blob/a60aea84d68587b1dfe1b6bfd20cb4fced0f7d46/stock_barcode/static/src/models/barcode_model.js#L307-L309 So the if condition is false, the method is allowed to run and the error notification is not triggered **Fix:** After scanning a package there is no selectedLine so we need another condition opw-4590345 Forward-Port-Of: odoo/enterprise#87184 Forward-Port-Of: odoo/enterprise#83710
This adds tests to check that the UBL is correctly generated in the case of free invoices (feature introduced by c8abe0a7536a0bbe703730) and invoices involving both ISC and IGV (feature introduced by d598f338537b8f55771d7a). We take the opportunity to refactor the Peruvian tests and split the expected XMLs each into its own file. Community PR: https://github.com/odoo/odoo/pull/213402 task-4242065 Forward-Port-Of: odoo/enterprise#87569 Forward-Port-Of: odoo/enterprise#87222
Original PR description
This adds tests to check that the UBL is correctly generated in the case of free invoices (feature introduced by c8abe0a7536a0bbe703730) and invoices involving both ISC and IGV (feature introduced by d598f338537b8f55771d7a). We take the opportunity to refactor the Peruvian tests and split the expected XMLs each into its own file. Community PR: https://github.com/odoo/odoo/pull/213402 task-4242065 Forward-Port-Of: odoo/enterprise#87569 Forward-Port-Of: odoo/enterprise#87222
When importing a coda statement, in case of globalisation, Odoo doesn't take into account the different levels of details. Instead of that, we keep every lines even if one is already the sum of each detailed lines. According to https://febelfin.be/media/pages/publicaties/2023/archief-bankstandaarden/0c9e6e5026-1694763197/standard-coda-2.4-fr.pdf Chapter 3.1 Transaction type are communicate like that: - 0 -> simple amount without detailed data - 1 -> amount as totalised by the cus
Original PR description
When importing a coda statement, in case of globalisation, Odoo doesn't take into account the different levels of details. Instead of that, we keep every lines even if one is already the sum of each…
When importing a coda statement, in case of globalisation, Odoo doesn't take into account the different levels of details. Instead of that, we keep every lines even if one is already the sum of each detailed lines. According to https://febelfin.be/media/pages/publicaties/2023/archief-bankstandaarden/0c9e6e5026-1694763197/standard-coda-2.4-fr.pdf Chapter 3.1 Transaction type are communicate like that: - 0 -> simple amount without detailed data - 1 -> amount as totalised by the customer - 5 -> detail of 1 - 2 -> amount as totalised by the bank - 6 -> detail of 2, simple amount without detailed data - 7 -> detail of 2, simple amount with detailed data - 9 -> detail of 7 Let's assume this case: - 1 line with transaction type == 2, amount == 3000 - 1 line with transaction type == 7, amount == 2000 - 1 line with transaction type == 9, amount == 2000 - 1 line with transaction type == 7, amount == 1000 - 1 line with transaction type == 9, amount == 1000 Currently, Odoo will display lines 1, 2 and 4 in case of split transactions instead of lines 3 and 5. In case of not split transactions, Odoo sums up the same lines. With this commit, we keep trace of last line's transaction type to: - be able to delete it if it has detailed data, in case of split transaction - to sum up only the relevant lines opw-4619660 opw-4795349 Forward-Port-Of: odoo/enterprise#87523 Forward-Port-Of: odoo/enterprise#85006
### Steps to reproduce: - In the settings: Enable `Units of Measure & Packagings` - Create a storable product with 100 units in stock and an associated packaging such as 'pack of 6' - Create and confirm a sale order for 5 pack of 6. > This creates and reserve a delivery for 30 units (5 pack of 6). - Process the delivery in the barcode app and scan a pack of 6 #### > A new line is created for 1 pack of 6 instead of updating the quantity of the line referring to these packs to 5/30. ###
Original PR description
### Steps to reproduce: - In the settings: Enable `Units of Measure & Packagings` - Create a storable product with 100 units in stock and an associated packaging such as 'pack of 6' - Create and…
### Steps to reproduce: - In the settings: Enable `Units of Measure & Packagings` - Create a storable product with 100 units in stock and an associated packaging such as 'pack of 6' - Create and confirm a sale order for 5 pack of 6. > This creates and reserve a delivery for 30 units (5 pack of 6). - Process the delivery in the barcode app and scan a pack of 6 #### > A new line is created for 1 pack of 6 instead of updating the quantity of the line referring to these packs to 5/30. ### Cause of the issue: Since the packaging/uom refactoring, packagings are just uoms. Now, scanning the packaging will launch a call of the `_processBarcode` method. During this call, the existing line will not be be found and considered as an appropriate candidate to be updated since the its prodcut_uom is in Unit and the packaging uom is not: https://github.com/odoo/enterprise/blob/bdb3f3d959d6fd56e96e2299823fba6edbb5428c/stock_barcode/static/src/models/barcode_model.js#L1710-L1711 As such, there will be no `currentLine` to update and a new line will be created: https://github.com/odoo/enterprise/blob/bdb3f3d959d6fd56e96e2299823fba6edbb5428c/stock_barcode/static/src/models/barcode_model.js#L1441-L1443 opw-4782296 Forward-Port-Of: odoo/enterprise#86659 Forward-Port-Of: odoo/enterprise#86180
Case 1: How to reproduce ================ - Select a record in any folder in Kanban view - Display its chatter - Add an activity from the kanban tile --> the chatter is not updated and needs a refresh Expected behavior ================= Chatter should update instantly Case 2: How to reproduce ================ - Select a record in any folder in Kanban view - Display its chatter - Mark done or cancel one or more activities from Chatter - Click on the activity button of the r
Original PR description
Case 1: How to reproduce ================ - Select a record in any folder in Kanban view - Display its chatter - Add an activity from the kanban tile --> the chatter is not updated and needs a refresh Expected behavior ================= Chatter should update instantly Case 2: How to reproduce ================ - Select a record in any folder in Kanban view - Display its chatter - Mark done or cancel one or more activities from Chatter - Click on the activity button of the related kanban record --> stack trace Expected behavior ================= Corresponding KanbanRecord should update. Note: v. 17.4 raises a missing record exception for the same case task-4690165 Forward-Port-Of: odoo/enterprise#84128
**Before this PR:** - The `Validate` button was always visible, even if the OTP was empty or incorrect. - Users could attempt validation with an invalid or missing OTP. - The OTP delivery message was unclear. **After this PR:** - The `Validate` button proceed done when a valid 6-digit numeric OTP is entered. - A clear error notification is shown if users try to proceed without a valid OTP. - The OTP delivery message now clearly informs that the OTP is sent to the registered mobile n
Original PR description
**Before this PR:** - The `Validate` button was always visible, even if the OTP was empty or incorrect. - Users could attempt validation with an invalid or missing OTP. - The OTP delivery message was unclear. **After this PR:** - The `Validate` button proceed done when a valid 6-digit numeric OTP is entered. - A clear error notification is shown if users try to proceed without a valid OTP. - The OTP delivery message now clearly informs that the OTP is sent to the registered mobile number on the GST portal. These changes improve user guidance and prevent incorrect OTP submissions. Task ID: 4848729 Forward-Port-Of: odoo/enterprise#87199
Currently, an error occurs when a user tries to access `paid consultation` or `paid seats` if the booking fees are deleted by the user. **Steps to Reproduce:** - Install **appointment_account_payment** module without demo data. - Delete **Booking Fees** product`from `invoicing->customer->products` - Click on `Paid Seats` or `Paid Consultation` in the Appointment App. **Error:** `ValueError: No record found for unique ID appointment_account_payment.default_booking_product. It may have b
Original PR description
Currently, an error occurs when a user tries to access `paid consultation` or `paid seats` if the booking fees are deleted by the user. **Steps to Reproduce:** - Install…
Currently, an error occurs when a user tries to access `paid consultation` or `paid seats` if the booking fees are deleted by the user. **Steps to Reproduce:** - Install **appointment_account_payment** module without demo data. - Delete **Booking Fees** product`from `invoicing->customer->products` - Click on `Paid Seats` or `Paid Consultation` in the Appointment App. **Error:** `ValueError: No record found for unique ID appointment_account_payment.default_booking_product. It may have been deleted.` **Root Cause:** After deleting the **Booking Fees**, if user tries to open `Paid Seats` or `Paid Consultation` the system will try to access id of `appointment_account_payment.default_booking_product` at [1] or [2] causing an error. [1]- https://github.com/odoo/enterprise/blob/a4f68967a9826fac981c1141ece1791a0baf647a/appointment_account_payment/models/templates/appointment_type.py#L43 [2]- https://github.com/odoo/enterprise/blob/a4f68967a9826fac981c1141ece1791a0baf647a/appointment_account_payment/models/templates/appointment_type.py#L56 **Solution:** This commit prevents error by restricting user from deleting the `Booking Product`. Sentry-6013528364 Forward-Port-Of: odoo/enterprise#86159
Currently, the issue occurs when opening the achievement **Details** view from the commission report due to missing IDs in the view. **Steps to reproduce:** - Install the `sale_commission` module. - Create and approve a new **Commission Plan**. - Click the **Commissions** button on the form view. - From the list view, click the **Details** button for a commission entry. - Observe the error. **Error:** `ValueError: Expected singleton: sale.commission.report()` Here, an error is tri
Original PR description
Currently, the issue occurs when opening the achievement **Details** view from the commission report due to missing IDs in the view. **Steps to reproduce:** - Install the `sale_commission` module. -…
Currently, the issue occurs when opening the achievement **Details** view from the commission report due to missing IDs in the view. **Steps to reproduce:** - Install the `sale_commission` module. - Create and approve a new **Commission Plan**. - Click the **Commissions** button on the form view. - From the list view, click the **Details** button for a commission entry. - Observe the error. **Error:** `ValueError: Expected singleton: sale.commission.report()` Here, an error is triggered because the `action_achievement_detail` method at [1], expects a single `id` on the `sale.commission.report` record. However, when the commission report list loads, the `_table_query` method executes a SQL query - [2]. If any of `era.plan_id`, `u.user_id`, or `era.date_from` are **NULL**, the resulting id becomes `False`, which causes the singleton error when the user tries to open the details view. [1] - https://github.com/odoo/enterprise/blob/4575d3dfdbd0ccd9bf57bddbd35a89bd47c48798/sale_commission/model/commission_plan.py#L174-L175 [2] - https://github.com/odoo/enterprise/blob/4575d3dfdbd0ccd9bf57bddbd35a89bd47c48798/sale_commission/report/commission_report.py#L111 This commit produces a valid, non-null ID, preventing the downstream error. Sentry - 6587805735 Forward-Port-Of: odoo/enterprise#84785