Wednesday, May 21, 2025
62 changes · saas-18.3
Enhancements to existing features
Live chat channel cards now focus on the visitor's name instead of showing both the visitor and agent names. This makes conversations easier to identify at a glance, with company information shown when relevant for customers.
Original PR description
**Current behavior before PR:** channel kanban card displayed both the visitor and agent name in display name. **Desired behavior after PR is merged:** now only visitor name displayed for better visibility. task-[4753171](https://www.odoo.com/odoo/project/1519/tasks/4753171) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The referral app now better highlights matching text when selecting users in autocomplete fields. This keeps the referral interface aligned with recent platform changes and makes it easier for users to recognize the right person quickly.
Original PR description
This commit adapts the ReferralKanbanMany2OneAvatarUserField to cope with changes made in https://github.com/odoo/odoo/pull/205922 task-4707431
Resolved issues and error corrections
The live chat bot now avoids adding the same restart message twice when events arrive in a different order. This prevents silent failures in automated checks and improves reliability of chatbot restart flows.
Original PR description
Before this commit, an error would occur if the "/chatbot/restart" rpc came after the bus notification related to the restart message. It occurs because the chat bot model pushes the restart message into the channel's message without checking if it was already done by the new message notification handler. Since the thread template sets the message id as a `t-key`, we cannot have the same message twice. This would lead to the chat bot flow tour failing silently on runbot when this happens. This commit ensures the restart message will only be added to the thread's message once. fixes runbot-181545 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
Miscellaneous changes
lot_id was column that needs stock.group_production_lot group to be visible to admin user, so it was not visible in the list view of stock.picking.tour and the tour depends on it visibility build_error-111685 Forward-Port-Of: odoo/odoo#208129 Forward-Port-Of: odoo/odoo#206959
Original PR description
lot_id was column that needs stock.group_production_lot group to be visible to admin user, so it was not visible in the list view of stock.picking.tour and the tour depends on it visibility build_error-111685 Forward-Port-Of: odoo/odoo#208129 Forward-Port-Of: odoo/odoo#206959
This fixes a compatibility issue that could prevent the Calendar app from installing correctly after recent changes to activity scheduling in Mail. It makes the Calendar setup more reliable for databases updated in stages, reducing installation errors for users.
Original PR description
Scheduler view in mail has been updated recently, trigerring an update of calendar view. However this may break installing new calendar override on old mail view. This happens if you have installed mail before the update, and install calendar after pulling updated code. We therefore update the xpath of override in calendar to be more resilient. Followup of odoo/odoo#210043
Importing product records that include sales or purchase tax fields now works correctly. This prevents users from encountering an error when re-importing exported product data with tax values.
Original PR description
Currently an error occurs when the user import the product record. Steps to Reproduce (to avoid step just try to import this…
Currently an error occurs when the user import the product record. Steps to Reproduce (to avoid step just try to import this [File](https://github.com/user-attachments/files/20360727/Product.product.template.1.xlsx)) : - Install the `account` module. - Go to Products > switch to `List View`, select a `product`, and click `Export` under the Actions. - In the Available Fields, search for `Sales Taxes` or `Purchase Taxes`, select either one, and then click `Export`. - In the Products, click Actions > Import Records, and upload the file that was recently exported. - Click import. `TypeError: Domain() invalid argument type for domain: None` This error occurs when a user imports a product template record and the system calls name_search to resolve tax_id values. When no domain is passed, it defaults to None, causing a TypeError. This commit ensures that when the system calls name_search to resolve tax_id values without a domain, an empty domain ([(1, '=', 1)]) is used instead to prevent the error. sentry-6616172972 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The CRM quick create form no longer shows recurring revenue fields when the recurring revenue option is not enabled. This prevents sales users from seeing irrelevant fields and keeps lead creation aligned with the company’s configuration.
Original PR description
Fix the recurring revenue fields that were visible in the quick create form even though the recurring revenue option wasn't activated. The group was missing after a quick create form improvement. related: odoo/odoo#206314 Task-4796880 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix updates automated checks for Avatax sales tax calculations after changes to how down payments and global discounts are rounded per line. It helps ensure tax-related sales workflows remain reliable and prevents false test failures in future releases.
Original PR description
…t with round per line opw-4685953
Appointment pages with no available staff or resources now show the unavailable slot message only once. This keeps the booking page clearer for visitors and avoids confusion when no appointments can be scheduled.
Original PR description
Reproduce: Check the front page of an appointment type with no resources or staff users. This commit avoids duplicating the ‘No slot’ message on the front page of appointment types for which there is no slot available. related: odoo/enterprise@36da382fceba76f3de69306e24c9c6fa018cde9f Task-4750234
Pinning messages in Discuss now works even when the message has no linked thread available. This prevents a user-facing error and makes the message pinning action more reliable.
Original PR description
**Before this PR:** Pinning a message would throw an error if the associated thread was not present on the message. **After this PR:** This commit ensures that pinning a message works properly. **Task**-4805076
The IoT box setup flow no longer asks users to configure a Point of Sale when no active Point of Sale is available. This removes a confusing popup that could not be completed and makes the pairing process smoother for businesses without Point of Sale configurations.
Original PR description
Before this commit, if you paired an IoT box with no Points of Sale configured, you would still get the popup prompting you to autoconfigure your IoT box with a PoS. However, since you have no PoS you cannot fill in the required field and have to dismiss the popup. After this commit, we only open the autoconfigure popup if there is at least one active PoS available. task-4797331
PR #210777 Fix the issue for master (18.4) Currently the write access right is given to the inventory user. However some customer want to revoke this access in order to avoid user messing with their location configuration. But it's not possible since it will also raise an access error when validation an inventory adjustement. opw-4782515 Forward-Port-Of: odoo/odoo#210784
Original PR description
PR #210777 Fix the issue for master (18.4) Currently the write access right is given to the inventory user. However some customer want to revoke this access in order to avoid user messing with their location configuration. But it's not possible since it will also raise an access error when validation an inventory adjustement. opw-4782515 Forward-Port-Of: odoo/odoo#210784
When posting the vendor bill before validating the receipt, and the currency rate changed between the bill and receipt: - An Exchange diff account move would be created, and the Stock Input Account would not be balanced This is because the balance of the receipt would perfectly match the balance of the vendor bill, but not the Amount in currency. So, when we try to reconcile the 2 lines, because they are in the same currency, we are reconciling the Amount in Currency. Hence, the exchange rat
Original PR description
When posting the vendor bill before validating the receipt, and the currency rate changed between the bill and receipt: - An Exchange diff account move would be created, and the Stock Input Account…
When posting the vendor bill before validating the receipt, and the currency rate changed between the bill and receipt:
- An Exchange diff account move would be created, and the Stock Input Account would not be balanced
This is because the balance of the receipt would perfectly match the balance of the vendor bill, but not the Amount in currency. So, when we try to reconcile the 2 lines, because they are in the same currency, we are reconciling the Amount in Currency. Hence, the exchange rate journal entry is created, and a discrepancy in the Stock Input Account balance is introduced.
When the bill is posted before the receipt is validated, we want the receipt to have the value of the bill, and there is no reason to have only the balance or the amount in currency from the bill, so we can take both of them.
https://github.com/user-attachments/assets/c6dc5e72-8f5b-4c0f-99fa-c5e98a9574ff
## How to reproduce:
- Install stock_account,purchase
- Create product P:
* Valued in AVCO automated.
* Control Policy to 'On ordered quantities'
- Add currency rates for the EUR currency:
* 2.0 on the 2025-01-01
* 2.1 today
- Create and Confirm a new purchase for 1 unit of P and a price of 100 Euros
- Create the Bill:
* Set the bill's accounting date & bill date to the 2025-01-01
* Confirm the bill
=> Amount in Currency: 100 Euros - Balance: $50 USD - Rate used: 2.0
- Go back to the PO and receive the product.
=> Amount in Currency: 105 Euros - Balance: $50 USD - Rate used: 2.1
- Check the created Journal Entries:
=> Currency exchange rate difference: $2.38
=> (105 - 100) / 2.1
OPW-4631348
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#210538
Forward-Port-Of: odoo/odoo#209118### Steps to reproduce: 1. Create a portal user. 2. Create an automation rule to send an email as a message. Example: https://drive.google.com/file/d/1mIa4R7a2Z2fnkngOMD7zN2t9Z2XHhGY7/view 3. Now, add the portal user as a follower on a task. 4. Change the state of a task to execute an automation rule. 5. Email will be received by a portal user but it will not be visible on the messaging history on the portal. ### Cause: This is happening because when running an automation rule that
Original PR description
### Steps to reproduce: 1. Create a portal user. 2. Create an automation rule to send an email as a message. Example: https://drive.google.com/file/d/1mIa4R7a2Z2fnkngOMD7zN2t9Z2XHhGY7/view 3. Now,…
### Steps to reproduce: 1. Create a portal user. 2. Create an automation rule to send an email as a message. Example: https://drive.google.com/file/d/1mIa4R7a2Z2fnkngOMD7zN2t9Z2XHhGY7/view 3. Now, add the portal user as a follower on a task. 4. Change the state of a task to execute an automation rule. 5. Email will be received by a portal user but it will not be visible on the messaging history on the portal. ### Cause: This is happening because when running an automation rule that will send an email we set the 'mail.message' state as System notification by default which leads that this mail will be sent normally to every follower of the record but will be only shown in the chat history for internal users not portal as we are just showing 'comment', 'incoming_email' and 'outgoing_email' messages. ### Fix: Checking if the server action that is being run is sending an email we will set the state of the 'mail.message' as 'auto_comment' -introduced in https://github.com/odoo/odoo/pull/94018/commits/d1dd307555ac78841384d1158de5a0a7787370db - and add 'auto_comment' to the domain of the field website_message_id which is for the messages shown to the portal user in his view P.S. LNA confirmed that we need to show it to the portal user. opw-4459754 Forward-Port-Of: odoo/odoo#210807 Forward-Port-Of: odoo/odoo#194401
Some views use a domain widget to edit/save a domain and use it afterwards in several places where domains must have literals only. Typically, a literal_eval is used to evaluate the (string) domain. Thus expressions like "uid" or "context_today()"" should not be used in those contexts. Here we introduce an option "allow_expressions" (default False) for the domain field and use it to mark as invalid domains that contain expressions when the option is set to False. A notification is displayed whe
Original PR description
Some views use a domain widget to edit/save a domain and use it afterwards in several places where domains must have literals only. Typically, a literal_eval is used to evaluate the (string) domain.…
Some views use a domain widget to edit/save a domain and use it afterwards in several places where domains must have literals only. Typically, a literal_eval is used to evaluate the (string) domain. Thus expressions like "uid" or "context_today()"" should not be used in those contexts. Here we introduce an option "allow_expressions" (default False) for the domain field and use it to mark as invalid domains that contain expressions when the option is set to False. A notification is displayed when a domain contains an unwanted expressions. Since we cannot expect modules like base to be updated, we have to find another system to allow the usage of expressions in the form views for the models ir.filters and base.automation: we simply hardcode those models as allowing expressions. Since for these models, the evaluation of domains is done via safe_eval but with a restricted evaluation context, we also display a notification that alerts the user that the evaluation of expressions (although accepted by the domain field) can fail. We revert the recent commit https://github.com/odoo/odoo/commit/818602363a751bf1777b57261e1accafb45e7439 that introduced potentially problematic calls to safe_eval in order to allow evaluation of expressions. The domain field passes a new prop allowExpressions to the domain selector. If that prop is false (default true), the operators "today", "next", "last" will not proposed for selection for date/datetime fields. This is done to prevent users to introduce expressions in their domains when they are not supported. Forward-Port-Of: odoo/odoo#210576 Forward-Port-Of: odoo/odoo#208876
Versions -------- - 17.0+ Steps ----- 1. Have a company partner with a credit limit; 2. add an employee partner to the company; 3. create a sales order for the employee; 4. have the total amount exceed the credit limit; 5. confirm order; 6. create a copy. Issue ----- The credit warning isn't updated with the new order's amount. Cause ----- The `credit` field gets computed on the `commercial_partner_id` while `credit_to_invoice` gets computed on the current partner. Solut
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Have a company partner with a credit limit; 2. add an employee partner to the company; 3. create a sales order for the employee; 4. have the total amount exceed the credit limit; 5. confirm order; 6. create a copy. Issue ----- The credit warning isn't updated with the new order's amount. Cause ----- The `credit` field gets computed on the `commercial_partner_id` while `credit_to_invoice` gets computed on the current partner. Solution -------- Compute the `credit_to_invoice` on the `commercial_partner_id`. Also, search sales orders on `partner_invoice_id` instead of `partner_id` to compute `credit_to_invoice`. opw-4654476 Forward-Port-Of: odoo/odoo#210698 Forward-Port-Of: odoo/odoo#210177
Versions -------- - saas-17.4+ Steps ----- 1. Go to Website / Settings; 2. scroll to Shop - Checkout Process; 3. assign portal user as salesperson for online orders. Issue ----- Portal user shouldn't be allowed as a salesperson. Cause ----- The `salesperson_id` field of `res.config.settings` is set to be related to `website_id.salesperson_id`. The `salesperson_id` field for `website` does have a domain configured, but because the domain is a string, it does not get re-used for
Original PR description
Versions -------- - saas-17.4+ Steps ----- 1. Go to Website / Settings; 2. scroll to Shop - Checkout Process; 3. assign portal user as salesperson for online orders. Issue ----- Portal user shouldn't be allowed as a salesperson. Cause ----- The `salesperson_id` field of `res.config.settings` is set to be related to `website_id.salesperson_id`. The `salesperson_id` field for `website` does have a domain configured, but because the domain is a string, it does not get re-used for related fields[^1]. [^1]: https://github.com/odoo/odoo/blob/87381d316/odoo/fields.py#L3009-L3021 Issue was introduced by commit 2f8c20d7d2385, which moved the domain from the `res.config.settings` field to the `website` field it relates to. Solution -------- Provide the domain as a list. opw-4801697 Forward-Port-Of: odoo/odoo#210612
Follow-up of https://github.com/odoo/odoo/pull/210304 PR above improve message actions placement in mobile in card layout, such as in Inbox. However it makes a regression in placement of other message actions. This commit fixes the issue by keeping the card visual of message actions as the fix for card layout and same visual as before the fix for non-card messages. Before / After in mailboxes (unchanged)    Before / After in conversation (fixed)   Forward-Port-Of: odoo/odoo#210819
Issue ===== In the test `test_stock_landed_costs_lots`, there is this `assertRecordValues`: ```python self.assertRecordValues(lc.stock_valuation_layer_ids.sorted('product_id'), [ {'lot_id': lot_product_b[0].id, 'product_id': product2.id, 'stock_valuation_layer_id': og_p2_layers[0].id, 'quantity': 0, 'value': 1.5}, {'lot_id': lot_product_b[1].id, 'product_id': product2.id, 'stock_valuation_layer_id': og_p2_layers[1].id, 'quantity': 0, 'value': 1.5}, {'lot_id': lot_product_a[0
Original PR description
Issue ===== In the test `test_stock_landed_costs_lots`, there is this `assertRecordValues`: ```python self.assertRecordValues(lc.stock_valuation_layer_ids.sorted('product_id'), [ {'lot_id':…
Issue
=====
In the test `test_stock_landed_costs_lots`, there is this `assertRecordValues`:
```python
self.assertRecordValues(lc.stock_valuation_layer_ids.sorted('product_id'), [
{'lot_id': lot_product_b[0].id, 'product_id': product2.id, 'stock_valuation_layer_id': og_p2_layers[0].id, 'quantity': 0, 'value': 1.5},
{'lot_id': lot_product_b[1].id, 'product_id': product2.id, 'stock_valuation_layer_id': og_p2_layers[1].id, 'quantity': 0, 'value': 1.5},
{'lot_id': lot_product_a[0].id, 'product_id': self.product1.id, 'stock_valuation_layer_id': og_p1_layers[0].id, 'quantity': 0, 'value': 1},
{'lot_id': lot_product_a[1].id, 'product_id': self.product1.id, 'stock_valuation_layer_id': og_p1_layers[1].id, 'quantity': 0, 'value': 1},
{'lot_id': lot_product_a[2].id, 'product_id': self.product1.id, 'stock_valuation_layer_id': og_p1_layers[2].id, 'quantity': 0, 'value': 1},
])
```
This issue is sometime the records order is not the expected one.
Cause of the issue
==================
By doing `recordset.sorted('product_id')`, it will sort the records by compare their `product_id` records, using the python built-in `sorted`. The built-in `sorted` function simply check if record A is lower than record B, using the < operation. But in Odoo, comparing two recordsets is equal than comparing their ids as a `set`:
```python
def __lt__(self, other):
try:
if self._name == other._name:
return set(self._ids) < set(other._ids)
except AttributeError:
pass
return NotImplemented
```
In python, the comparaison between two sets compares is a set is a subset of the other one, which means than:
```python
{1} < {2} # is false
{1} < {2, 1} # is true
```
So, comparing SVLs by their product won't sort them by their product's id. If we want to do that, we have to explicitly do it by passing a function as the `sorted` `key` argument.
For more information, see:
-https://docs.python.org/3/library/functions.html#sorted -https://docs.python.org/3/reference/expressions.html#comparisons
runbot-build-error: 99086
Forward-Port-Of: odoo/odoo#210514Description of the issue/feature this PR addresses: The "Quantities Available" field (shown in the product form vie smart button and the prognosis) can sometimes over-estimate the amounts actually available due to rounding. For example in the following case: Product-A is made via Kit-BoM from 2 Units of Product-B. There are 3 units of Product-B in stock. The precision of the "Unit" UoM, used for Product-A, is set to 1 (only integer amounts). The actual amount of units available is 1.5, this is
Original PR description
Description of the issue/feature this PR addresses: The "Quantities Available" field (shown in the product form vie smart button and the prognosis) can sometimes over-estimate the amounts actually…
Description of the issue/feature this PR addresses: The "Quantities Available" field (shown in the product form vie smart button and the prognosis) can sometimes over-estimate the amounts actually available due to rounding. For example in the following case: Product-A is made via Kit-BoM from 2 Units of Product-B. There are 3 units of Product-B in stock. The precision of the "Unit" UoM, used for Product-A, is set to 1 (only integer amounts). The actual amount of units available is 1.5, this is rounded as Half-Up to 2 Units. This is misleading, since only one unit of Product-A could be shipped. Current behavior before PR: For Kit-BoM Products, the quantities in _compute_quantities_dict() are all rounded with HALF-UP, potentially rounding up and claiming a higher availability than actually supported. Desired behavior after PR is merged: _compute_quantities_dict() rounds down to ensure it doesn't over-promise. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209317 Forward-Port-Of: odoo/odoo#208374
It looks like in some cases awaiting for a microtask tick is not enough for the selectionchange handlers to be called. This commit waits for a full tick instead. This is a stronger version of the original fix at https://github.com/odoo/odoo/pull/210022. Forward-Port-Of: odoo/odoo#210750
Original PR description
It looks like in some cases awaiting for a microtask tick is not enough for the selectionchange handlers to be called. This commit waits for a full tick instead. This is a stronger version of the original fix at https://github.com/odoo/odoo/pull/210022. Forward-Port-Of: odoo/odoo#210750
This reverts commit d413a9895742594d064084cd6dafbf1f2ec97221. This fix was decided after https://github.com/odoo/enterprise/pull/74127 that was trying to prevent invoicing users to see accounting features, when it seemed to be unwanted to have the two property accounts fields required while having no CoA installed. The issue is, now when having Accounting installed, we can create a user without having CoA as these two fields are not required anymore, but we end up with a error message when cre
Original PR description
This reverts commit d413a9895742594d064084cd6dafbf1f2ec97221. This fix was decided after https://github.com/odoo/enterprise/pull/74127 that was trying to prevent invoicing users to see accounting…
This reverts commit d413a9895742594d064084cd6dafbf1f2ec97221.
This fix was decided after https://github.com/odoo/enterprise/pull/74127
that was trying to prevent invoicing users to see accounting features,
when it seemed to be unwanted to have the two property accounts fields
required while having no CoA installed.
The issue is, now when having Accounting installed, we can create a user
without having CoA as these two fields are not required anymore, but
we end up with a error message when creating an invoice ('no CoA
installed') although we could be have added accounts manually instead
of installing a CoAi (which is not possible for invoicing user).
In this situation, we should be able to create a contact, and having these
fields required will force the user to create them.
Finally, it is ok to revert the full chain, as the original issue is
fixed by this commit https://github.com/odoo/enterprise/commit/68f6c1f9fd3ff6762c98e1a405ade035129efce0
Forward-Port-Of: odoo/odoo#210859
Forward-Port-Of: odoo/odoo#209832When manually changing the `discount_date` field to null in an invoice related to a customer with an Early price discount payment term, the customer will face a type error on the website when accessing their invoices. **Steps to reproduce:** * Install the accountant module * Create a new invoice for the current user as a customer (e.g., Mitchel Admin). * Set `2/7 Net 30` in payment terms and add any product. * Go to Journal Items and make Discount Date visible if not already visible. *
Original PR description
When manually changing the `discount_date` field to null in an invoice related to a customer with an Early price discount payment term, the customer will face a type error on the website when…
When manually changing the `discount_date` field to null in an invoice related to a customer with an Early price discount payment term, the customer will face a type error on the website when accessing their invoices. **Steps to reproduce:** * Install the accountant module * Create a new invoice for the current user as a customer (e.g., Mitchel Admin). * Set `2/7 Net 30` in payment terms and add any product. * Go to Journal Items and make Discount Date visible if not already visible. * Under the account field `121000 Account Receivable` remove the discount date and confirm the invoice. * Open portal View (/my) and click on Your Invoices >>> Error occurs. `TypeError: unsupported operand type(s) for -: 'bool' and 'datetime.date'` **Solution:** We use if else blocks to check if `discount_date` exists for the `days_left calculation`; if it exists, do the calculation as usual if `discount_date` is in future. Otherwise, set `days_left` to zero and continue the function as usual. Sentry-6395559503 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205306
Before this commit, it was not possible to update in batch the future driver of many vehicle because a check made during the update expects there is only one vehicle to update. This commit fixes the issue to be able to alter the future driver on many vehicle at the same time. Forward-Port-Of: odoo/odoo#210862
Original PR description
Before this commit, it was not possible to update in batch the future driver of many vehicle because a check made during the update expects there is only one vehicle to update. This commit fixes the issue to be able to alter the future driver on many vehicle at the same time. Forward-Port-Of: odoo/odoo#210862
This commit ensures that the group `uom.group_uom` is correctly applied on the test user, so that the tour doesn't fail on the step looking for "Packagings" field on the product view which happened in some [single module tests](https://runbot.odoo.com/odoo/runbot.build.error/222678). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210650 Forward-Port-Of: odoo/odoo#210536
Original PR description
This commit ensures that the group `uom.group_uom` is correctly applied on the test user, so that the tour doesn't fail on the step looking for "Packagings" field on the product view which happened in some [single module tests](https://runbot.odoo.com/odoo/runbot.build.error/222678). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210650 Forward-Port-Of: odoo/odoo#210536
Default code 'OO99999999999' should only be used if no VAT number is present. Task [link](https://www.odoo.com/odoo/project/967/tasks/4724520) task-4724520 Forward-Port-Of: odoo/odoo#207850
Original PR description
Default code 'OO99999999999' should only be used if no VAT number is present. Task [link](https://www.odoo.com/odoo/project/967/tasks/4724520) task-4724520 Forward-Port-Of: odoo/odoo#207850
Steps to reproduce the bug: - Open the website editor. - Create a mega menu. - Save changes. - Open the website in mobile. - Scroll down to the bottom of the page. - Open the hamburger menu. - Click the mega menu link. - The mega menu doesn't open. The bug was introduced by commit [1], when the mega menu in the mobile navbar was changed to "position: fixed". The issue happens because when the page is scrolled, the header gets a "transform: translate" applied to it. This creates a
Original PR description
Steps to reproduce the bug: - Open the website editor. - Create a mega menu. - Save changes. - Open the website in mobile. - Scroll down to the bottom of the page. - Open the hamburger menu. - Click the mega menu link. - The mega menu doesn't open. The bug was introduced by commit [1], when the mega menu in the mobile navbar was changed to "position: fixed". The issue happens because when the page is scrolled, the header gets a "transform: translate" applied to it. This creates a new coordinate system, which breaks the reference for the mega menu’s fixed positioning. As a result, the menu has no reliable reference to calculate its height. This commit adds a CSS rule setting the height to 100vh as a fix. It ensures the mega menu always takes the full viewport height, regardless of the transformed parent. [1]: https://github.com/odoo/odoo/commit/dc1a15539227c4c21837a7bce3fc4d81858d60b9 opw-4747373 Forward-Port-Of: odoo/odoo#210577
Before this commit it was not possible to start the Ace editor (via its owl wrapper codeEditor) with an initial cursor position. After this commit it is now possible to do just that. This comes handy in the use case where: - one makes modification on the edited resource. - saves the result. This could mean that the codeEditor must be restarted from scratch (reloading all the data) - functionally stay on the saved resource at the right position. Note that the onChange call back now recei
Original PR description
Before this commit it was not possible to start the Ace editor (via its owl wrapper codeEditor) with an initial cursor position. After this commit it is now possible to do just that. This comes handy in the use case where: - one makes modification on the edited resource. - saves the result. This could mean that the codeEditor must be restarted from scratch (reloading all the data) - functionally stay on the saved resource at the right position. Note that the onChange call back now received the position at which the edition *started*. 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#210842 Forward-Port-Of: odoo/odoo#208803
1. Display email of the recipients if email is given otherwise fallback to `Unnamed`. Steps to reproduce 1. Create a contact with no name. 2. Open the chatter from any document. 3. Try to send a message to the contact without name. -> Tag without name will be shown From [Commit 1], we added a possibility to show partner's information or enter missing email address with [Commit 2]. In the case when partner didn't have name set, tags's text was shown blank. Aft
Original PR description
1. Display email of the recipients if email is given otherwise fallback to `Unnamed`. Steps to reproduce 1. Create a contact with no name. 2. Open the chatter from any document. 3. Try to send a…
1. Display email of the recipients if email is given otherwise fallback to `Unnamed`. Steps to reproduce 1. Create a contact with no name. 2. Open the chatter from any document. 3. Try to send a message to the contact without name. -> Tag without name will be shown From [Commit 1], we added a possibility to show partner's information or enter missing email address with [Commit 2]. In the case when partner didn't have name set, tags's text was shown blank. After this commit, tags of widget many2many_tags_email having no name will show email if given otherwise "Unnamed". 2. Account Account send invoice wizard will allow partners without email as the opened wizard will ask for the email. 3. SMS If sending sms fails because of account unregistered, we will redirect the user on click of the red SMS button to the IAP SMS account if user can access, otherwise the normal popover is shown as usual. [Commit 1]: https://github.com/odoo/odoo/commit/abdb7654e463c7b20b7e0d16e0b9cb76863cbdeb [Commit 2]: https://github.com/odoo/odoo/commit/2bbf118e60d793bea98078810a282fe45e896403 Task-4711346 Forward-Port-Of: odoo/odoo#205349
**Steps to Reproduce:** 1. Install Sales module 2. Create a new quotation in mobile view **Issue:** - The input field of contact is displayed twice due to a missing `t-else` condition, causing both fields to appear simultaneously. **Solution:** - Added the missing `t-else` condition to ensure that only one input field is displayed as intended. opw-4767186 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209017
Original PR description
**Steps to Reproduce:** 1. Install Sales module 2. Create a new quotation in mobile view **Issue:** - The input field of contact is displayed twice due to a missing `t-else` condition, causing both fields to appear simultaneously. **Solution:** - Added the missing `t-else` condition to ensure that only one input field is displayed as intended. opw-4767186 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209017
Problem: In `getAdjacentCharacter`, accessing `focusNode.textContent[focusOffset - 1]` directly fails when there are child nodes between text nodes. Example: Given `<p>ab<span>\u0009</span>\u200B[]</p>`: - `focusNode.childNodes` → [text("ab"), span, text("\u200B")] - `focusNode.textContent` → ["a", "b", "/TAB/", "/ZWS/"] - `focusOffset` → 3 (nodes offset not text offset) - Accessing `focusNode.textContent[2]` is wrong because `focusOffset` counts nodes, not characters, it should return
Original PR description
Problem:
In `getAdjacentCharacter`, accessing `focusNode.textContent[focusOffset - 1]` directly fails when there are child nodes between text nodes.
Example:
Given `<p>ab<span>\u0009</span>\u200B[]</p>`:
- `focusNode.childNodes` → [text("ab"), span, text("\u200B")]
- `focusNode.textContent` → ["a", "b", "/TAB/", "/ZWS/"]
- `focusOffset` → 3 (nodes offset not text offset)
- Accessing `focusNode.textContent[2]` is wrong because `focusOffset` counts nodes, not characters, it should return `/ZWS/` not `/TAB/`.
Solution:
Align with 18.0+ (`html_editor`) behavior by calling `getDeepestPosition(focusNode, focusOffset)` inside `getAdjacentCharacter`.
Steps to reproduce:
1. Type `ab`
2. Press `Tab`
3. Press `Arrow Left` → Caret does not move left as expected.
opw-4720904
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#205745### Steps to reproduce: - Install "l10n_din5008" - In Settings > Layout, select DIN5008 as the report layout - Create a quotation, print it - The address of the partner and the sipping address have different font size ### Cause: Since this [commit](https://github.com/odoo/odoo/commit/92e4c3cb3bec0b3d5537a50fd441a22fa6509ed1) the partner address is a span which is applied a [`font-size: 0.8em;`](https://github.com/odoo/odoo/blob/f77b40bba0c92a9a225eb7ade694e79cb804f7bf/addons/l10n_din5008
Original PR description
### Steps to reproduce: - Install "l10n_din5008" - In Settings > Layout, select DIN5008 as the report layout - Create a quotation, print it - The address of the partner and the sipping address have different font size ### Cause: Since this [commit](https://github.com/odoo/odoo/commit/92e4c3cb3bec0b3d5537a50fd441a22fa6509ed1) the partner address is a span which is applied a [`font-size: 0.8em;`](https://github.com/odoo/odoo/blob/f77b40bba0c92a9a225eb7ade694e79cb804f7bf/addons/l10n_din5008/static/src/scss/report_din5008.scss#L51). But not the shipping address. ### Solution: Remove the restriction of `span` to apply the font-size. This way all text in address should have the same font-size. Before:  After:  opw-4725169 Forward-Port-Of: odoo/odoo#210606
### Approach: - When the entire content of a single table cell is selected, store the `ev.clientX` value once the cell content is fully selected. Afterward, if the mouse moves in the direction of the selection (left or right) by a sensitivity threshold of 5px, the entire cell is selected. ### Steps to Reproduce: - Create a table (e.g., using /table). - Add multiple blocks with varying text lengths inside a cell. - Try selecting all the content inside the cell using the mouse. - Obser
Original PR description
### Approach: - When the entire content of a single table cell is selected, store the `ev.clientX` value once the cell content is fully selected. Afterward, if the mouse moves in the direction of the selection (left or right) by a sensitivity threshold of 5px, the entire cell is selected. ### Steps to Reproduce: - Create a table (e.g., using /table). - Add multiple blocks with varying text lengths inside a cell. - Try selecting all the content inside the cell using the mouse. - Observe that the cell does not get selected. ### Description of the issue/feature this PR addresses: - The cell does not get selected when all content inside the cell is selected with the mouse. ### Desired behavior after PR is merged: - The entire cell is selected when the content is fully selected. task-4743170 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210794 Forward-Port-Of: odoo/odoo#207028
Some services or applications (Outlook, Google Messages) display previews of links sent through messages or email. In an effort to strengten user privacy, these services fetch the previews from their own servers rather than from the user's device. Since these services' requests had not been added to the list of known bot identifiers, they generate parasite "clicks" which don't match their user. This commit adds identifiers for the Outlook and Google Messages service requests to the l
Original PR description
Some services or applications (Outlook, Google Messages) display previews of links sent through messages or email. In an effort to strengten user privacy, these services fetch the previews from their own servers rather than from the user's device. Since these services' requests had not been added to the list of known bot identifiers, they generate parasite "clicks" which don't match their user. This commit adds identifiers for the Outlook and Google Messages service requests to the list of known bot IDs, thereby preventing the parasite clicks from generating. task-3672491 Forward-Port-Of: odoo/odoo#210268 Forward-Port-Of: odoo/odoo#167799
This commit fixes the historical unwanted change that was introduced with commit https://github.com/odoo/odoo/commit/2b3c8e6ca9777f6264ecb3d1510dd292ed30ab9f Which modifies the report name for india and replace them with the Journal name. Till saas-18.2 It was okay for indian localisation but following the changes made in PR https://github.com/odoo/odoo/pull/195279 and https://github.com/odoo/odoo/pull/189664 Which changes the journal name and takes standard xml inheritance to py method. Afte
Original PR description
This commit fixes the historical unwanted change that was introduced with commit https://github.com/odoo/odoo/commit/2b3c8e6ca9777f6264ecb3d1510dd292ed30ab9f Which modifies the report name for india…
This commit fixes the historical unwanted change that was introduced with commit https://github.com/odoo/odoo/commit/2b3c8e6ca9777f6264ecb3d1510dd292ed30ab9f Which modifies the report name for india and replace them with the Journal name. Till saas-18.2 It was okay for indian localisation but following the changes made in PR https://github.com/odoo/odoo/pull/195279 and https://github.com/odoo/odoo/pull/189664 Which changes the journal name and takes standard xml inheritance to py method. After the above mentioned PRs. It displays unwanted Report i.e. In case of Invoice it displays the `Sales INV/2025-26/01` which is unwanted. In this commit we adapt the standard `account` report name for `l10n_in` which should be removed in the `master` only one case should be adapted for India which is whenever an invoice having tax we should print it as **Tax Invoice** opw-4781816 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209579
Currently, the `Invoice report` is hidden when the user tries to select the invoice report for 'account.move'. With PR [1], we added the invisible attribute to the `is_invoice_report` field to hide it when the model is not 'account.move'. However, due to mistake, we used `'model'` instead of `model`, which caused the field to always be hidden. This commit fixes the above issue by using `model` instead of `'model'`, so the is_invoice_report field is visible only when the model is 'account.m
Original PR description
Currently, the `Invoice report` is hidden when the user tries to select the invoice report for 'account.move'. With PR [1], we added the invisible attribute to the `is_invoice_report` field to hide it when the model is not 'account.move'. However, due to mistake, we used `'model'` instead of `model`, which caused the field to always be hidden. This commit fixes the above issue by using `model` instead of `'model'`, so the is_invoice_report field is visible only when the model is 'account.move'. [1] https://github.com/odoo/odoo/pull/207635 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210832
**Description of the issue/feature this PR addresses:** - The contact-us form allows task creation without a project (project_id = None). These tasks are assigned to odoobot, have no followers, and no project, making them inaccessible due to ACL restrictions. **steps to reproduce** 1. Install website_form_project. 2. Edit the contact-us form submit button. 3. Set action to 'Create a task' and select 'None' for the project. 4. Save and submit the form. **Observation** - Tasks creat
Original PR description
**Description of the issue/feature this PR addresses:** - The contact-us form allows task creation without a project (project_id = None). These tasks are assigned to odoobot, have no followers, and…
**Description of the issue/feature this PR addresses:** - The contact-us form allows task creation without a project (project_id = None). These tasks are assigned to odoobot, have no followers, and no project, making them inaccessible due to ACL restrictions. **steps to reproduce** 1. Install website_form_project. 2. Edit the contact-us form submit button. 3. Set action to 'Create a task' and select 'None' for the project. 4. Save and submit the form. **Observation** - Tasks created under such configuration are hidden in the UI and trigger access errors when trying to open them.  Desired behavior after PR is merged: - Making the project field required, the created tasks will now be accessible/visible [opw-4664601](https://www.odoo.com/odoo/project/49/tasks/4664601) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210109 Forward-Port-Of: odoo/odoo#207871
Steps to reproduce: - Create a quotation in the Sales app. - Apply a coupon with any discount. - Modify the description of the discount SO line. - Confirm the sale order. - The discount line's description is reset. Root Cause: - `_get_reward_values_discount` recomputes discount line values, resetting the description. Fix: - Preserve the manually set name field to prevent unintended recomputation. Affected version-17.0 opw-4653070 Forward-Port-Of: odoo/odoo#203411
Original PR description
Steps to reproduce: - Create a quotation in the Sales app. - Apply a coupon with any discount. - Modify the description of the discount SO line. - Confirm the sale order. - The discount line's description is reset. Root Cause: - `_get_reward_values_discount` recomputes discount line values, resetting the description. Fix: - Preserve the manually set name field to prevent unintended recomputation. Affected version-17.0 opw-4653070 Forward-Port-Of: odoo/odoo#203411
## Issue: When converting a lead to an opportunity, a wizard (`crm.lead2opportunity.partner`) is shown. This allows merging duplicated leads. However, if the most recently created lead is selected as the primary, the wizard record may be deleted unexpectedly. This usually goes unnoticed in the UI, as the wizard disappears after the operation. The issue becomes critical when overriding the conversion flow via a custom module or in future changes to the core logic. In those cases, t
Original PR description
## Issue: When converting a lead to an opportunity, a wizard (`crm.lead2opportunity.partner`) is shown. This allows merging duplicated leads. However, if the most recently created lead is selected as…
## Issue: When converting a lead to an opportunity, a wizard (`crm.lead2opportunity.partner`) is shown. This allows merging duplicated leads. However, if the most recently created lead is selected as the primary, the wizard record may be deleted unexpectedly. This usually goes unnoticed in the UI, as the wizard disappears after the operation. The issue becomes critical when overriding the conversion flow via a custom module or in future changes to the core logic. In those cases, the deletion of the wizard can lead to empty recordsets and errors. #### Affected versions: 16.0 and later. ## Explanation The `crm.lead2opportunity.partner` model has a `Many2one` field `lead_id` that is being deleting on cascade which is the default for m2o fields on transient models. During lead conversion, action_apply() calls _action_merge() or _action_convert(). In _action_merge(), non-primary leads are unlinked. If the primary lead is the last created one, it differs from the one referenced by the wizard. This causes lead_id to be unset, triggering the cascade and deleting the wizard. ## Impact: If a custom module overrides action_apply() or _action_merge() and calls super() first, it may operate on an empty recordset, leading to failures when trying to access data or call methods. ## To reproduce: With debugger: - Set a breakpoint on the unlink call inside _action_merge - After unlink, calling self.exists() on the wizard will return an empty recordset With a custom module: - Override action_apply() or _action_merge() - Call super() first - Try to merge leads and select the most recent one as primary - The wizard record will be deleted before your custom logic executes, and will raise a "Record does not exist or has been deleted." OPW-4773172 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209795
## Pull Request HOOT (PRHOOT) 31 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Enterprise: https://github.com/odoo/enterprise/pull/83169 --- I confirm I have s
Original PR description
## Pull Request HOOT (PRHOOT) 31 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Enterprise: https://github.com/odoo/enterprise/pull/83169 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210241 Forward-Port-Of: odoo/odoo#205405
Prior to this commit, if you had been testing out adding a product to your cart on your website, and then later decided to change your default company, you would no longer be able to access your website. This was due to an access rights error when reading the sale order representing the cart, to load in the top navbar. This commit fixes this by canceling any abandoned carts when switching default companies. The choice to cancel the order outright was recommended by the PO, BOJE. However, RDE
Original PR description
Prior to this commit, if you had been testing out adding a product to your cart on your website, and then later decided to change your default company, you would no longer be able to access your…
Prior to this commit, if you had been testing out adding a product to your cart on your website, and then later decided to change your default company, you would no longer be able to access your website. This was due to an access rights error when reading the sale order representing the cart, to load in the top navbar. This commit fixes this by canceling any abandoned carts when switching default companies. The choice to cancel the order outright was recommended by the PO, BOJE. However, RDE believes that there is a deeper problem in `website_sale` if this one is showing up like this. Before 18.2, we could change the default company on a user after adding a product to our cart and then still access our website, making use of the existing cart. Again, per BOJE's request, we are handling this issue by canceling the cart outright as this is a _very_ niche case. This massive commit e3a3c58 to 18.2 changed a lot of `website_sale` code and could be worth a deeper look by the e-commerce team. Forward-Port-Of: odoo/odoo#210669
This commit addresses a typo in the archive and restore buttons within the kanban menu, introduced in this commit https://github.com/odoo/odoo/commit/d220bb4c872d3660d15373d15565c846e3a35d9f --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#193209
Original PR description
This commit addresses a typo in the archive and restore buttons within the kanban menu, introduced in this commit https://github.com/odoo/odoo/commit/d220bb4c872d3660d15373d15565c846e3a35d9f --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#193209
Before this patch, adding `l10n_mx_edi_cfdi_supplier_rfc` (or any other field filled by `_fill_from_cfdi_values`) to a tree/form view showed the field empty. Root cause ---------- `_fill_from_cfdi_values()` decoded the CFDI using `attachment.raw` with `bin_size=True` still in the context, so the ORM returned the placeholder `b'59.00 bytes'`. As a result, `_decode_cfdi_attachment()` got an empty payload and returned `{}`. Fix --- Reload the attachment without the `bin_size` flag 
Forward-Port-Of: odoo/enterprise#85333Otherwise, there's no other way for users to verify if the charged taxes are correct. task-4688950 Forward-Port-Of: odoo/enterprise#85100 Forward-Port-Of: odoo/enterprise#83464
Original PR description
Otherwise, there's no other way for users to verify if the charged taxes are correct. task-4688950 Forward-Port-Of: odoo/enterprise#85100 Forward-Port-Of: odoo/enterprise#83464
This commit fixes an issue where we had been using the UTC start and end times for a work entry when computing the correct duration for a payslip. Specifically, this is necessary when a work entry exceeds the interval of the payslip, which can happen when a work entry starts before the payslip interval or ends after the payslip interval. Previously, the UTC times were used. Consider an EST work entry that starts at 18:00 one night and ends at 01:00 the next morning. The UTC times would be 22:
Original PR description
This commit fixes an issue where we had been using the UTC start and end times for a work entry when computing the correct duration for a payslip. Specifically, this is necessary when a work entry…
This commit fixes an issue where we had been using the UTC start and end times for a work entry when computing the correct duration for a payslip. Specifically, this is necessary when a work entry exceeds the interval of the payslip, which can happen when a work entry starts before the payslip interval or ends after the payslip interval. Previously, the UTC times were used. Consider an EST work entry that starts at 18:00 one night and ends at 01:00 the next morning. The UTC times would be 22:00 and 05:00 respecively, up to a 1-hour difference for daylight savings time. Now suppose that the paysliip for this work entry only goes up to that following morning. Instead of using the local times of 18:00 and 01:00, the payslip would use the UTC times of 22:00 and 05:00, which would only count 2 of those hours instead of 6. This is resolved by converting the UTC times to local before using them to clamp the work entries to the payslip interval. opw-4790119 Forward-Port-Of: odoo/enterprise#85967 Forward-Port-Of: odoo/enterprise#85548
The redesign of the spreadsheet layout did not account for the small screen mode. Mor specifically, the breadcrumbs can be reduded to a "previous arrow" to spare some space to display the spreadsheet name. task-4774806 Forward-Port-Of: odoo/enterprise#84732
Original PR description
The redesign of the spreadsheet layout did not account for the small screen mode. Mor specifically, the breadcrumbs can be reduded to a "previous arrow" to spare some space to display the spreadsheet name. task-4774806 Forward-Port-Of: odoo/enterprise#84732
### Steps to reproduce: 1. Create a portal user. 2. Create an automation rule to send an email as a message. Example: https://drive.google.com/file/d/1mIa4R7a2Z2fnkngOMD7zN2t9Z2XHhGY7/view 3. Now, add the portal user as a follower on a task. 4. Change the state of a task to execute an automation rule. 5. Email will be received by a portal user but it will not be visible on the messaging history on the portal. ### Cause: This is happening because when running an automation rule that
Original PR description
### Steps to reproduce: 1. Create a portal user. 2. Create an automation rule to send an email as a message. Example: https://drive.google.com/file/d/1mIa4R7a2Z2fnkngOMD7zN2t9Z2XHhGY7/view 3. Now,…
### Steps to reproduce: 1. Create a portal user. 2. Create an automation rule to send an email as a message. Example: https://drive.google.com/file/d/1mIa4R7a2Z2fnkngOMD7zN2t9Z2XHhGY7/view 3. Now, add the portal user as a follower on a task. 4. Change the state of a task to execute an automation rule. 5. Email will be received by a portal user but it will not be visible on the messaging history on the portal. ### Cause: This is happening because when running an automation rule that will send an email we set the 'mail.message' state as System notification by default which leads that this mail will be sent normally to every follower of the record but will be only shown in the chat history for internal users not portal as we are just showing 'comment', 'incoming_email' and 'outgoing_email' messages. ### Fix: Checking if the server action that is being run is sending an email we will set the state of the 'mail.message' as 'auto_comment' and add 'auto_comment' to the domain of the field website_message_id which is for the messages shown to the portal user in his view opw-4459754 Forward-Port-Of: odoo/enterprise#85969 Forward-Port-Of: odoo/enterprise#82352
This reverts the commit https://github.com/odoo/enterprise/commit/fbfa23e4ee86666e6c0903206ff49a918f281c67. Indeed, for security reasons, it is preferable to avoid calling safe_eval whenever possible. Note that in https://github.com/odoo/odoo/pull/208876 a new mechanism is introduced in order to block the creation of expressions in domain fields where we only want domains with litterals because they are evaluated with literal_eval. Forward-Port-Of: odoo/enterprise#85872 Forward-Port-Of: odo
Original PR description
This reverts the commit https://github.com/odoo/enterprise/commit/fbfa23e4ee86666e6c0903206ff49a918f281c67. Indeed, for security reasons, it is preferable to avoid calling safe_eval whenever possible. Note that in https://github.com/odoo/odoo/pull/208876 a new mechanism is introduced in order to block the creation of expressions in domain fields where we only want domains with litterals because they are evaluated with literal_eval. Forward-Port-Of: odoo/enterprise#85872 Forward-Port-Of: odoo/enterprise#85298
**Issue:** A traceback error is raised when the assignee of a Field Service task has no calendar **Steps to reproduce:** - Make sure admin (Michel Admin) has no calendar in the Employee module - Field Service > New - Create a new task with Michel Admin as assignee and click save without choosing Planned Date and leave Allocated Hours at 0 - Choose Planned Date then click save again A traceback error is raised opw-4672980 Forward-Port-Of: odoo/enterprise#83839
Original PR description
**Issue:** A traceback error is raised when the assignee of a Field Service task has no calendar **Steps to reproduce:** - Make sure admin (Michel Admin) has no calendar in the Employee module - Field Service > New - Create a new task with Michel Admin as assignee and click save without choosing Planned Date and leave Allocated Hours at 0 - Choose Planned Date then click save again A traceback error is raised opw-4672980 Forward-Port-Of: odoo/enterprise#83839
…vailability ### Steps to reproduce: - In the settings enable "Rental transfers" - Create a storable product that can be rented put 100 units in stock and add a `Security Time` of 24 hours. - Create a rental order for 10 units of that product planed for the period : [today + 2 days, today + 3 days] and confirm it. - Create a rental order for 10 units of that product planed for the period : [today + 1 days, today + 2 days] and confirm it. - Look at the forecast rentable quantity. ####
Original PR description
…vailability ### Steps to reproduce: - In the settings enable "Rental transfers" - Create a storable product that can be rented put 100 units in stock and add a `Security Time` of 24 hours. - Create…
…vailability ### Steps to reproduce: - In the settings enable "Rental transfers" - Create a storable product that can be rented put 100 units in stock and add a `Security Time` of 24 hours. - Create a rental order for 10 units of that product planed for the period : [today + 2 days, today + 3 days] and confirm it. - Create a rental order for 10 units of that product planed for the period : [today + 1 days, today + 2 days] and confirm it. - Look at the forecast rentable quantity. #### > It should be 90 but it is 100. ### Cause of the issue: The `preparation_time` (`Security Time`) field is used at the sale order line creation to modify the `reservation_begin` value: https://github.com/odoo/enterprise/blob/bc3db24f83473d5646f7c2cfca8ed1c5b064ea2e/sale_stock_renting/models/sale_order_line.py#L447-L453 In particular, the `preparation_time` of the product creates a difference between the `order_id.rental_start_date` and the `reservation_begin`. This is porblematic since the `rental_start_date` is used to generate the dates of the deliveries taken into account by the forecast: https://github.com/odoo/enterprise/blob/bc3db24f83473d5646f7c2cfca8ed1c5b064ea2e/sale_stock_renting/models/sale_order_line.py#L354-L362 but the quantity considered as rented does not and is purely based on the `reservation_begin` of the line: https://github.com/odoo/enterprise/blob/bc3db24f83473d5646f7c2cfca8ed1c5b064ea2e/sale_stock_renting/models/product_product.py#L113-L117 In particular, the qunaities are not yet accounted ithe stock forecast by the `virtual_available` value of the product: https://github.com/odoo/enterprise/blob/bc3db24f83473d5646f7c2cfca8ed1c5b064ea2e/sale_stock_renting/models/sale_order_line.py#L129-L132 But will incorrectly be found and read by the rental forecast: https://github.com/odoo/enterprise/blob/bc3db24f83473d5646f7c2cfca8ed1c5b064ea2e/sale_stock_renting/models/sale_order_line.py#L133-L140 opw-4552760 Forward-Port-Of: odoo/enterprise#85949
Before this commit, when re-scheduling a call activity to a date of today or older, it raised the following error: ``` Caused by: TypeError: Cannot read properties of undefined (reading 'avatarUrl') at ActivityListPopoverItem.template ``` This happens because in this specific case of change of call activity deadline date, the VOIP softphone code is fetching activity data of today faster than odoo views, thanks to relying on bus notification, whereas odoo views and chatter rely on mostly
Original PR description
Before this commit, when re-scheduling a call activity to a date of today or older, it raised the following error: ``` Caused by: TypeError: Cannot read properties of undefined (reading 'avatarUrl')…
Before this commit, when re-scheduling a call activity to a date of today or older, it raised the following error: ``` Caused by: TypeError: Cannot read properties of undefined (reading 'avatarUrl') at ActivityListPopoverItem.template ``` This happens because in this specific case of change of call activity deadline date, the VOIP softphone code is fetching activity data of today faster than odoo views, thanks to relying on bus notification, whereas odoo views and chatter rely on mostly on returned RPCs. The code of VOIP returns activity data with a custom formatter, which omits `persona` that is important for the good templating of an activity in Chatter otherwise there's the crash above. A recent PR [1] attempted to fix this issue, but the syntax for Store was wrong: it used the syntax for an item in field list (e.g. in `_to_store_defaults`) instead of pure store data from a specific record. This bad use of Store.One() resulted in actually returning `False`. [1]: https://github.com/odoo/enterprise/pull/84970 opw-4586756 Forward-Port-Of: odoo/enterprise#85907
**[FIX] l10_ke_edi_oscu: Handle None name of fresh unposted credit notes.** To reproduce the issue: - Create an invoice with some lines - Create the first credit note and change the product set on one of the lines or its quantity to trigger the fix piece of the code (do not confirm the credit note) - Create another credit note and try to post it -> Traceback The issue is caused by the fact that newly created moves generally have `None` in the `name` field, which is only populated after
Original PR description
**[FIX] l10_ke_edi_oscu: Handle None name of fresh unposted credit notes.** To reproduce the issue: - Create an invoice with some lines - Create the first credit note and change the product set on one of the lines or its quantity to trigger the fix piece of the code (do not confirm the credit note) - Create another credit note and try to post it -> Traceback The issue is caused by the fact that newly created moves generally have `None` in the `name` field, which is only populated after posting. This fix resolve this by replacing the string shown when the name field is None. opw-4779976 Forward-Port-Of: odoo/enterprise#85345
compute imp & assert deduplicate Forward-Port-Of: odoo/enterprise#84867 Forward-Port-Of: odoo/enterprise#84842
Original PR description
compute imp & assert deduplicate Forward-Port-Of: odoo/enterprise#84867 Forward-Port-Of: odoo/enterprise#84842
…ve and reload sources In the reportEditor edit the xml, modify a view's arch and save. Before this commit, the cursor position in the XMLEditor was reset to [0,0]. After this commit, we restore the position of the cursor according to the start position of the last edition. opw-4745895 Forward-Port-Of: odoo/enterprise#85984 Forward-Port-Of: odoo/enterprise#84877
Original PR description
…ve and reload sources In the reportEditor edit the xml, modify a view's arch and save. Before this commit, the cursor position in the XMLEditor was reset to [0,0]. After this commit, we restore the position of the cursor according to the start position of the last edition. opw-4745895 Forward-Port-Of: odoo/enterprise#85984 Forward-Port-Of: odoo/enterprise#84877
Steps to reproduce: (thanks to TBS for investigating + writing the test) 1. Have a MX company with Quadrum or SwSapien 2. Create a USD bank transaction with `13220.00 USD` and `305147.51 MXN` 3. Create a USD invoice for `13220.00 USD` and send CFDI 4. Reconcile transaction and invoice 5. Click "Update payments" on the invoice => CRP20211 Looks like it comes from this rounding difference Rate is computed by odoo using `305147.51 MXN / 13220.0 USD = 23.082262481 ≃ 23.082262 MXN/USD`
Original PR description
Steps to reproduce: (thanks to TBS for investigating + writing the test) 1. Have a MX company with Quadrum or SwSapien 2. Create a USD bank transaction with `13220.00 USD` and `305147.51 MXN` 3.…
Steps to reproduce: (thanks to TBS for investigating + writing the test) 1. Have a MX company with Quadrum or SwSapien 2. Create a USD bank transaction with `13220.00 USD` and `305147.51 MXN` 3. Create a USD invoice for `13220.00 USD` and send CFDI 4. Reconcile transaction and invoice 5. Click "Update payments" on the invoice => CRP20211 Looks like it comes from this rounding difference Rate is computed by odoo using `305147.51 MXN / 13220.0 USD = 23.082262481 ≃ 23.082262 MXN/USD` PAC verify the amount paid using `13220.0 USD * 23.082262 MXN/USD = 305147.50 MXN` which is not `305147.51 MXN` Solution: There is no solution by adapting the rate: - quadrum restricts the rate to 6 decimals; - rounding the rate differently (e.g. to `23.082263`) would not help because `13220.0 USD * 23.082263 MXN/USD = 305147.52 MXN` which again is not `305147.51 MXN`. So, the only solution that I can think of is to adapt the amount in company currency so that it is exactly `round(amount_in_payment_curr / rate_rounded_to_6_decimals)`, i.e. in the example, change it to `305147.50 MXN`. In tests, both Quadrum and SwSapien seem to accept this. We don't perform the modification for Solucion Factible (the other PAC). opw-4222310 Forward-Port-Of: odoo/enterprise#85602 Forward-Port-Of: odoo/enterprise#83499
…line are postpaid Forward-Port-Of: odoo/enterprise#85644 Forward-Port-Of: odoo/enterprise#73731
Original PR description
…line are postpaid Forward-Port-Of: odoo/enterprise#85644 Forward-Port-Of: odoo/enterprise#73731
NSSF report columns "NSSF Amount Employee" and "NSSF Amount Employer" display pre-computation values which is the amount of payslip lines instead of total amount after the computation of 6% rate. task-4724292 Forward-Port-Of: odoo/enterprise#83613
Original PR description
NSSF report columns "NSSF Amount Employee" and "NSSF Amount Employer" display pre-computation values which is the amount of payslip lines instead of total amount after the computation of 6% rate. task-4724292 Forward-Port-Of: odoo/enterprise#83613
Prior to this change, if the demo data were loaded for account but couldn't be for account_loans, its installation would simply crash trying to reference an unknown xml_id 'account_loans_loan_demo1'. opw-4790398 upg-2793930 Forward-Port-Of: odoo/enterprise#85853
Original PR description
Prior to this change, if the demo data were loaded for account but couldn't be for account_loans, its installation would simply crash trying to reference an unknown xml_id 'account_loans_loan_demo1'. opw-4790398 upg-2793930 Forward-Port-Of: odoo/enterprise#85853
- Generate a new invoice in the menu ‘Accounting > Customers > Invoices’. - Add any product line. - Additionally, add a line of a Note and a line of Section - Confirm the invoicea and send it to CFDI - Click on the option ‘Cancellation request’ and select the reason ‘01’. Click on ‘Create corrective invoice’. The section and note lines disappear from the newly created invoice. In the action_create_replacement_invoice only the lines with display type product are carried over. After this
Original PR description
- Generate a new invoice in the menu ‘Accounting > Customers > Invoices’. - Add any product line. - Additionally, add a line of a Note and a line of Section - Confirm the invoicea and send it to CFDI - Click on the option ‘Cancellation request’ and select the reason ‘01’. Click on ‘Create corrective invoice’. The section and note lines disappear from the newly created invoice. In the action_create_replacement_invoice only the lines with display type product are carried over. After this commit we also include the notes and the sections. opw-4726350 Forward-Port-Of: odoo/enterprise#83578
## Pull Request HOOT (PRHOOT) 31 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Community: https://github.com/odoo/odoo/pull/205405 --- I confirm I have signed
Original PR description
## Pull Request HOOT (PRHOOT) 31 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Community: https://github.com/odoo/odoo/pull/205405 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#85664 Forward-Port-Of: odoo/enterprise#83169
The xsd changed. Now the rounding needs to be to 2 decimals everywhere. The official xsd does not mention it, but the field submit_more must appear on the xml. Also, while it's not blocking directly, the declaration will be rejected if the special deduction is filled without specifying the special %age. So we add a banner warning the user of it. opw-4789154 Forward-Port-Of: odoo/enterprise#85593 Forward-Port-Of: odoo/enterprise#85464
Original PR description
The xsd changed. Now the rounding needs to be to 2 decimals everywhere. The official xsd does not mention it, but the field submit_more must appear on the xml. Also, while it's not blocking directly, the declaration will be rejected if the special deduction is filled without specifying the special %age. So we add a banner warning the user of it. opw-4789154 Forward-Port-Of: odoo/enterprise#85593 Forward-Port-Of: odoo/enterprise#85464
**Steps to reproduce:** 1. Install `website_sale_renting` 2. Go to the website editor. 3. Drag and drop the `rental search` snippet. 4. Set the rental timing to `hour` **Issue:** - The default date was always set to the next day with the current time, making it impossible for users to select the current date without adjusting the time manually. https://github.com/odoo/enterprise/blob/a6ec35e94bdd4f721982c32716f716948f74c875/website_sale_renting/static/src/js/website_sale_renting_dateran
Original PR description
**Steps to reproduce:** 1. Install `website_sale_renting` 2. Go to the website editor. 3. Drag and drop the `rental search` snippet. 4. Set the rental timing to `hour` **Issue:** - The default date was always set to the next day with the current time, making it impossible for users to select the current date without adjusting the time manually. https://github.com/odoo/enterprise/blob/a6ec35e94bdd4f721982c32716f716948f74c875/website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js#L147-L148 **Solution:** - Updated the logic for hourly rentals to set the default date next day with adding one hour from the current time, to allow customers to select the current date. - For daily rentals, the logic remains unchanged and defaults to the next day. opw-4770823 Forward-Port-Of: odoo/enterprise#85613