Monday, January 20, 2025
36 changes · 18.0
Enhancements to existing features
Odoo notification emails are now more compact by hiding headers and footers unless they contain important access actions or are needed for key business documents. This reduces clutter in email threads, improves readability, and removes extra details such as the internal-email ribbon and sales order expiration date.
Original PR description
Email notifications typically include: 1) A header with elements such as an access button, title, or subtitle. 2) A footer with sender information and a "Powered by Odoo" link. While these elements…
Email notifications typically include: 1) A header with elements such as an access button, title, or subtitle. 2) A footer with sender information and a "Powered by Odoo" link. While these elements provide valuable context, they can clutter email threads, especially in interleaved responses. This commit introduces a dynamic mechanism to streamline email notifications by conditionally hiding the header and footer based on predefined criteria: By default, - The header will be displayed only if it contains an access button. - The footer will be displayed if it contains an access button and the email is sent from an internal user and if the email is a notification about an invoice, a Purchase order (PO) or a Sales order (SO). To ensure flexibility, new context variables are introduced: - `email_notification_allow_header`, `email_notification_allow_footer`: Enable or disable the conditional hiding mechanism. - `email_notification_force_header`, `email_notification_force_footer`: Force the display of the header and footer regardless of conditions. Additionally, the ribbon indicating that an email is internal has been removed to further simplify the layout. These updates reduce email size, improve readability in threaded conversations, and ensure that critical information is highlighted without unnecessary clutter. Task-4128966
Resolved issues and error corrections
This fixes an issue where opening a Point of Sale linked to a special product from another company could make all products disappear. The POS now filters those special products by company and keeps the product list usable while showing the right error when needed.
Original PR description
**Current behavior:** When a user opens a POS with any special product - such as a tip product - assigned to a different company, no products are displayed in the POS interface. **Expected…
**Current behavior:** When a user opens a POS with any special product - such as a tip product - assigned to a different company, no products are displayed in the POS interface. **Expected behavior:** The user should receive an error message indicating that the assigned special product is reserved for another company. If the default special product is associated with a different company, products should still be listed in the POS. **Steps to reproduce:** 1. Create a POS for a company C<sub>**1**</sub>. 2. Create a Tip product, reserved for company C<sub>**2**</sub>. 3. Set the Tip product for the POS of company C<sub>**1**</sub>. 4. Open the POS for company C<sub>**1**</sub>. 5. No products are listed in the POS. **Cause of the issue:** The `get_special_products()` method returns the default tip product without verifying the company assignment, leading to incorrect behavior. Additional inheriting models add more products to this method, still without checking the company assignment. **Fix:** - Modified the `_get_limited_products_loading` function to filter the special products according to the session company. - Modified the `_get_default_tip_product` function to bypass the company check if the default tip product is assigned to a different company. opw-4396020 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Miscellaneous changes
In the forward port #190318 while fixing conflict, a new empty file from another projet was accedentally sled in the commit. This commit removes this empty useless file. Forward-Port-Of: odoo/odoo#193907
Original PR description
In the forward port #190318 while fixing conflict, a new empty file from another projet was accedentally sled in the commit. This commit removes this empty useless file. Forward-Port-Of: odoo/odoo#193907
Portal chatter messages now load the needed Discuss translations on the website frontend. This prevents untranslated labels or text from appearing to portal users and improves the experience for multilingual websites.
Original PR description
Portal chatter now uses discuss, thus it relies on translation of Discuss in `mail` module. Frontend translations need to be available, they aren't by default unless the module is prefixed by `website`. This isn't the case for `mail`, and the module `website_mail` does not share the translations. This commit fixes the issue by enabling `mail` in the translations of available translations in the frontend Task-4423556
Portal users with shared access can now load chatter messages even when someone has reacted with an emoji. This prevents message-loading errors in shared projects while only exposing the reacting person's name.
Original PR description
Before this commit, when accessing a shared chatter from a portal user that has edit access, chatter messages could not be loaded when a partner added at least one emoji reaction on a message. Steps…
Before this commit, when accessing a shared chatter from a portal user that has edit access, chatter messages could not be loaded when a partner added at least one emoji reaction on a message. Steps to reproduce: - Share a project with Joel Willis with edit access - Create a task with Joel Willis on this project - Post a message as Joel Willis on the new task - Let Mitchell Admin add a reaction on the new message => Joel Willis cannot load messages: ``` An error occurred while fetching messages. ``` This happens because the custom mail message formatter of portal chatter messages was crafting the reaction data of the messages to return. When providing people that have reacted to the message, Access to reacted partners was denied due to ACL. This commit fixes the issue by sudo() the partners of message reaction to retrieve their data to the portal user. This is ok because the portal has access to the message, therefore access to the reaction and related data are fine. Note that data of partner that have reacted is very limited: only the name is returned. opw-4454427
This fixes an issue where changing an account code for a company could leave related branch companies using outdated cached values, causing validation errors. Businesses with shared accounts across a parent company and branches can now update account codes more reliably and keep records consistent.
Original PR description
When we implemented shared accounts, a design decision was that all the branches of a root company should have the same code for an account. However, updating the code for a company doesn't update it…
When we implemented shared accounts, a design decision was that all the branches of a root company should have the same code for an account. However, updating the code for a company doesn't update it for the other companies with the same root. #### Steps to reproduce: - Create a company and a branch. - With both companies active, try to modify the code of an account. - Notice the ValidationError that pops up. #### Analysis: When writing on `code`, `_inverse_code` writes on `code_store`, which is a dependency of `code`. However, because `code` is protected at that point, it isn't invalidated + recomputed for the other companies. As a result, the old, incorrect value persists in cache. #### Solution: I don't think there is a nice neat solution to this. Ideally, we would like to remove the cache values for all the companies other than the active company. However, there isn't a cache function for doing that on context-dependent fields. We try to simulate that by first invalidating, then eagerly recomputing the code again just for the active company. task-none
Cross-dock deliveries now follow the intended route when started from a sales order, without disrupting normal purchase receipts. This prevents products from being incorrectly moved to outbound areas during regular purchasing and makes cross-docking usable as a targeted exception.
Original PR description
## General Issue: Cross-dock rules cannot function as the main rule without disrupting unrelated flows (e.g., regular purchases). They also fail as exceptions, as they are not triggered in such…
## General Issue:
Cross-dock rules cannot function as the main rule without disrupting unrelated flows (e.g., regular purchases). They also fail as exceptions, as they are not triggered in such cases.
## Cause:
Push and pull rules have been refactored in saas-17.2 (see commit 11e69870db1c49d9a6af79ffd263e4e162b34b6b). Previously, most flows relied solely on pull rules, generating the entire picking chain at inventory need confirmation. With the refactoring, push rules are now prioritized, generating pickings step-by-step upon validation. While this increases route flexibility, it introduces issues for flows expected to be entirely triggered by sales order (SO) validations, such as cross-docking.
In version 18.0, cross-dock rules were refactored to rely only on push rules (see commit af5479dfdbed0959c02bd862c8184fe141b51788), but this created significant issues.
### Steps to Reproduce:
- In the settings, Enable multi-step routes.
- Configure the warehouse for 2-step receipt and delivery
> automatically unarchives the cross-dock route and updates its rules:
- Push rule: Input → Output
- Buy rule: → Partner/Customer
#### Scenario 1: Cross-dock set on the product
#### Issue: Cannot receipt in 2 steps → cross dock can not be the rule.
- Create an inventory-tracked product with the buy and cross-dock routes.
- Create and confirm a purchase order for 1 unit of the product.
- Validate the receipt from Vendor → Input.
Result:
Instead of generating a picking Input → Stock, the cross-dock push rule triggers, generating a picking Input → Output.
### Cause:
Rules are prioritized by product-specific rules, followed by warehouse rules:
https://github.com/odoo/odoo/blob/e3d54695862f73d9be6c35121def57ed641a1a45/addons/stock/models/stock_rule.py#L535-L539 The cross-dock push rule therefore overrides regular 2-step receipt rules, even though cross-dock routes only make sense for flows initiated by an SO.
#### Scenario 2: Cross-dock not set on the product
#### Issue: Cannot trigger cross-docking by any means → cross dock can not be the exception.
- Create an inventory-tracked product with only the buy route.
- Create an SO for 1 unit of the product and set the cross-dock route on the Sales Order Line (SOL). Confirm the SO.
> A purchase order (PO) is created.
- Confirm the PO.
> A regular receipt is generated.
- Confirm the receipt.
Result:
The flow proceeds as a regular 2-step delivery; the cross-dock route is not applied.
### Cause:
The SO uses the cross-dock route only for the buy rule to generate a PO. Once the PO is generated is role in this world is done. There is no way to provide a route on the PO, it will just generate a regular receipt: https://github.com/odoo/odoo/blob/e3d54695862f73d9be6c35121def57ed641a1a45/addons/purchase_stock/models/purchase_order_line.py#L343-L350 Once it is confirmed, the flow defaults to regular 2-step delivery rules, as the cross-dock route is neither a default nor set on the product.
### Fix:
We add the possibility of transmitting the route_id from the pol. As such, we make it possible to use the crossdock route by setting it on the sol, to generate a PO that will pursue with the crossdock route. Furthermore, we discourage to use the crossdock route on products/product categories by setting the default setable values to False.
opw-4380375
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe Point of Sale now handles cases where a cashier selects an order that has already been deleted. Instead of showing an error, the system switches to another draft order or creates a new one, keeping checkout workflows moving smoothly.
Original PR description
Resolved an issue where selecting a deleted order behaves correctly on the product screen but fails on the payment screen. **Steps to reproduce:** 1. create an order (order 1) 2. add product 3. go to payment screen 4. create another draft order (order 2) 5. go to Orders in the dropdown of the navbar (TicketScreen) 6. delete order 1 7. select the order you deleted from the navbar draft orders This will result in a traceback A fix was introduced in 18.1: https://github.com/odoo/odoo/commit/acb11c422ebf2b4811804a14ae12f849817f229a That commit in 18.1 can't just be backported because it changes the API of some related_models methods. This PR redirects you to Order 2 because order 1 is already Deleted If there isn't any other draft orders created, it redirects you to a new draft order. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Automation rules now correctly detect which fields should trigger them when a saved default filter is used. This prevents rules from losing their trigger settings and fixes navigation from Documents to Automation Rules.
Original PR description
Before this commit, 'trigger_field_ids' were already computed from the filter_domain, but using a default_filter_domain didn't work due to the '_onchange_trigger' method emptying 'trigger_field_ids' in the case of on_create_or_write. After this commit, we made '_onchange_trigger' take into account the filter_domain for this case. This addition fixes a window action from Documents to Automation Rules. see odoo/odoo#193206 see odoo/enterprise#75719 task-4481308 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an Accounting issue where companies using February 29 as their fiscal year end could encounter errors when journal entry placeholder names were created in non-leap years. The system now safely uses February 28 in those years, allowing accounting records to be created or updated without interruption.
Original PR description
### Description of the issue/feature this PR addresses: If the customer sets their last fiscal day and month to February 29th, a ValueError may be raised when creating a placeholder name for…
### Description of the issue/feature this PR addresses: If the customer sets their last fiscal day and month to February 29th, a ValueError may be raised when creating a placeholder name for account.move records if their dates are not in a leap year. More precisely, a ValueError is thrown when creating the starting sequence of the placeholder name, as a new date object is created using the company's last fiscal day and month and the year of the account.move. This commit adjusts the day of the created date to February 28th if the last fiscal day and month is set to February 29th and if the account.move year is not a leap year. This date was chosen since that's 365 days after February 29th. ### Current behaviour before PR: If the company's last fiscal day and month is set to February 29th, creating a placeholder name for account.move records whose date is not in a leap year raises a ValueError. Steps to reproduce: 1. Set the last fiscal day to February 29th. 2. Go to Accounting > Journal Entries (account.move). 3. Trigger the computation of the placeholder name for account.move() (edit journal_id, create record, edit date field...) 4. A ValueError exception is raised. ### Desired behaviour after PR is merged: The placeholder name for account.move records is successful and less prone to errors. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can now open Chart of Accounts entries after a company has been archived. The fix prevents inactive companies from being included in account mapping checks, avoiding an access error that interrupted accounting work.
Original PR description
After archiving a company users encounter an error when accessing any account in the CoA Steps to reproduce: - Create a second company - Archive it - Go to the Chart of Accounts - Open an account Issue: "Access to unauthorized or invalid companies" error will block the action. It occurs because the mapping is dynamically computed from the user companies, without filtering the actually active records opw-4270320 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
This fixes an access error that could block users from adding timesheets to tasks when projects are shared across multiple companies. The change helps multi-company teams record time reliably without removing sales links from tasks.
Original PR description
Steps to reproduce: ---------------------------------- 1) Create two companies and two users with employees. 2) Create a sale order with Company A. 3) Confirm the sale order. 4) Remove the company_id…
Steps to reproduce: ---------------------------------- 1) Create two companies and two users with employees. 2) Create a sale order with Company A. 3) Confirm the sale order. 4) Remove the company_id from the project. 5) Select the default company B and remove Company A. 6) Add a timesheet to the task. Issue: ------------------------ - When we try to add the timesheet for company 2 an access error will appears Cause: ------------------ - Currently, when we remove the company from the project, the project and task become accessible to all companies.The sale line item reference is not removed from the task, so when creating the timesheet, the sale item reference is passed. The user can access the sale order, but the analytic distribution is not accessible, causing an access error. If we remove the sale item from the task, there will be no access error. However, doing so is not preferable, which is why we applied sudo. Fix: ------------------------- - In this commit to resolved access error by adding `sudo()` to bypass record rules when retrieving `analytic_distribution` from `sale.order.line`. task-4206915
Paying part of a split restaurant order no longer creates duplicate preparation cards in the preparation display. This keeps kitchen and service teams working from a clean, accurate order queue and avoids confusion during table service.
Original PR description
- Avoid duplicating ticket in preparation display when paying a split order. - Don't call `this.pos.sendOrderInPreparation` after paying an order if this order is splitted or is a split from an other order. - Inside `pos_preparation_display.sync_from_ui` only call `process_order` if it the order is not splitted/splitting. Steps to Reproduce: - Add items to the cart and confirm an order. - A preparation is created in the PD (correct behavior). - Go back to the table, split the order, and pay for some lines. - Previously, a duplicate preparation card was created for split lines in the PD (incorrect behavior). enterprise PR: https://github.com/odoo/enterprise/pull/77150 task-id: 4476871 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
Quotations created from a billable project now correctly use that existing project when service lines generate tasks. This prevents Odoo from creating an extra duplicate project, keeping customer work organized in the intended place.
Original PR description
### Steps to reproduce: - Create a project and make it billable - Add a customer and add the first quotation from smart button on the project - On the quotation, add a service product that creates Project and Task and save - Notice another project has been created with a task inside ### Cause: This is happening because when creating an order that has an SO line that creates a project and a task we only check if the so_line has a project or not but we should fallback on order.project_id too. https://github.com/odoo/odoo/blob/saas-17.4/addons/sale_project/models/sale_order_line.py#L323 ### Fix: We fallback on the project of the order if we didn't find a project for the SO line. opw-4409810
This fix corrects the layout of a stock location table so it expands across the available form width as intended. It improves readability and avoids a cramped display caused by the previous automatic layout handling.
Original PR description
Commit 239e75b1385fa0 removes `colspan="2"` to guess it from the `nolabel` attribute. This is not working because of the `string=` attribute in the `group` tag that makes the DOM having two elements instead of only one. The rule in https://github.com/odoo/odoo/blob/0ba664bace1e6bbb256bd98570866df19d35f401/addons/web/static/src/views/form/form_controller.scss#L474 is not applied. 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
Purchase requests for quotation and purchase orders now show their title properly when the folder document layout is selected. This prevents malformed report headers and keeps printed documents easier to read for users and customers.
Original PR description
Steps to reproduce: ------------------ - Go to settings - Change the Document Layout to folder - Go to purchase - Print a RFQ or a PO Issue: ------ Currently the display of the folder wants the layout_document_title to fit in the upper right corner, which is not always possible especially in the purchase. This leads to the title being malformed. However this fix will also changes other apps display for this layout. Fix: ---- The fix replace the ```html <h2 t-out="layout_document_title"/> ``` where it is in every other layout. This fix the issue and does not break other apps display. opw-4380886 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
@qrtl ------------------------------- I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr) Forward-Port-Of: odoo/odoo#194087
Original PR description
@qrtl ------------------------------- I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr) Forward-Port-Of: odoo/odoo#194087
When exporting a SA E-invoice file, the system needs to collect invoice line without downpayment lines. However, when collecting tax values, because of an error correction mechanism, the tax amount will still include the amount of the downpayment tax line Steps to reproduce (with SA localization installed and SA company): - Create a SO of 1000$ with 15% tax - Make a downpayment of 100$ with 15% tax and confirm - Make the final invoice with downpayment deducted - Confirm and send e-invo
Original PR description
When exporting a SA E-invoice file, the system needs to collect invoice line without downpayment lines. However, when collecting tax values, because of an error correction mechanism, the tax amount…
When exporting a SA E-invoice file, the system needs to collect invoice line without downpayment lines. However, when collecting tax values, because of an error correction mechanism, the tax amount will still include the amount of the downpayment tax line Steps to reproduce (with SA localization installed and SA company): - Create a SO of 1000$ with 15% tax - Make a downpayment of 100$ with 15% tax and confirm - Make the final invoice with downpayment deducted - Confirm and send e-invoice for validation Issue: The invoice is validated, but a warning is logged ``` Invoice was Accepted by ZATCA (with Warnings) The invoice was accepted by ZATCA, but returned warnings. Please, check the response below: BR-CO-17: VAT category tax amount (BT-117) = VAT category taxable amount (BT-116) x (VAT category rate (BT-119) / 100), rounded to two decimals. BR-S-09: The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is Standard rated shall equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119). ``` As the warning states the is an issue with the tax computation. When collecting amounts from the final invoice, we should filter out downpayment amounts, but due to the error correction mechanism introduced to account for manual modification of the journal items, the filter is ignored, so we will have the filtered base amount (1000) and the unfiltered tax amount (135 instead of 150) A possible solution is to avoid the error correction when we know we need to filter invoice lines opw-4380798 Forward-Port-Of: odoo/odoo#192596 Forward-Port-Of: odoo/odoo#191867
The docstring of `@route` states that it accepts any iterable for the `methods` argument, but several places in the source code wrongly expected a list, and break if it is a tuple. Forward-Port-Of: odoo/odoo#193733 Forward-Port-Of: odoo/odoo#193621
Original PR description
The docstring of `@route` states that it accepts any iterable for the `methods` argument, but several places in the source code wrongly expected a list, and break if it is a tuple. Forward-Port-Of: odoo/odoo#193733 Forward-Port-Of: odoo/odoo#193621
'TestQwebFieldContact' used a demo partner to work, but we want to test independent of demo data. Forward-Port-Of: odoo/odoo#193716
Original PR description
'TestQwebFieldContact' used a demo partner to work, but we want to test independent of demo data. Forward-Port-Of: odoo/odoo#193716
**Issue:** when making a payment using 2 different payment methods (cash and bank), the change gets deducted from the bank payment not the cash payment in the invoice. **Steps To Reproduce:** On POS, for an order totaling $120. - Add a customer and ensure the "Invoice" box is checked. - pay using two payments methods bank 100$ Cash 50$ - the change is $30, everything looks fine on the ticket on the pos. - Notice on the invoice on the db backend the $30 change is inco
Original PR description
**Issue:**
when making a payment using 2 different payment methods (cash and bank), the change gets deducted from the bank payment not the cash payment in the invoice.
**Steps To Reproduce:**
On POS, for an order totaling $120.
- Add a customer and ensure the "Invoice" box is checked.
- pay using two payments methods bank 100$ Cash 50$
- the change is $30, everything looks fine on the ticket on the pos.
- Notice on the invoice on the db backend the $30 change is incorrectly deducted from the bank payment. As a result, the invoice displays: bank : $70 cash: $50
**Soltution:**
- In the `_create_payment_moves` method, ensure that cash payment method creates an `account.move` including the change amount.
opw-4076246
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#194284
Forward-Port-Of: odoo/odoo#187727Fix issue that was always displaying popup "The session is being closed by another user. The page will be reloaded." each time you close a session. Now the `login_number` is correctly send in the context and can then be used inside `close_session_from_ui` correctly. task-id: 4485659 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.co
Original PR description
Fix issue that was always displaying popup "The session is being closed by another user. The page will be reloaded." each time you close a session. Now the `login_number` is correctly send in the context and can then be used inside `close_session_from_ui` correctly. task-id: 4485659 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#194082
**Problem**: When `lot['lot_record'].product_id.valid_ean` is `False`, the `final_barcode` variable retains the value from the previous iteration. This leads to incorrect concatenation with the current `lot['name']` when `lot['lot_record'].product_id.tracking == 'lot'`. **Solution**: Reset the `final_barcode` variable at the start of each iteration. **Steps to Reproduce**: 1. Go to Inventory > Settings and enable "Print GS1 Barcodes for Lots & Serial Numbers". 2. Navigate to Inventory
Original PR description
**Problem**: When `lot['lot_record'].product_id.valid_ean` is `False`, the `final_barcode` variable retains the value from the previous iteration. This leads to incorrect concatenation with the current `lot['name']` when `lot['lot_record'].product_id.tracking == 'lot'`. **Solution**: Reset the `final_barcode` variable at the start of each iteration. **Steps to Reproduce**: 1. Go to Inventory > Settings and enable "Print GS1 Barcodes for Lots & Serial Numbers". 2. Navigate to Inventory > Products > Lots/Serial Numbers. 3. Select all records and click Print > Lot/Serial Number (ZPL). 4. Observe that some barcodes incorrectly include the previous barcode as a prefix. opw-4437745 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#193519 Forward-Port-Of: odoo/odoo#192651
**Steps to reproduce:** - Configure `Analytic Accounting` via `Accounting` module's settings; - Go to `Analytic Plans` through `Accounting / Configuration / Analytic Accounting`: - Select any record and change its name for a really long one;  - Go to `Expenses` app: - Select any expense in the list; - Open the `Analytic Distribution` widget. ___ **
Original PR description
**Steps to reproduce:** - Configure `Analytic Accounting` via `Accounting` module's settings; - Go to `Analytic Plans` through `Accounting / Configuration / Analytic Accounting`: - Select any record…
**Steps to reproduce:**
- Configure `Analytic Accounting` via `Accounting` module's settings;
- Go to `Analytic Plans` through `Accounting / Configuration / Analytic Accounting`:
- Select any record and change its name for a really long one;

- Go to `Expenses` app:
- Select any expense in the list;
- Open the `Analytic Distribution` widget.
___
**Issue:**
Long `Analytic Plans` names are wrapped and may lead to unreadable texts.

*(from the ticket - Odoo 17)*

___
**Expected:**
A smooth UI should display `Analytic Plans` as when accessed through an invoice line from `Accounting` app.

___
**Cause:**
The `Analytic Distribution` widget style of the invoice view inherits from the list renderer, forcing a `nowrap` style while the expense view of the same widget does not.
___
**Fix:**
Force a `nowrap` style for that specific widget.

___
opw-4357324
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#194162
Forward-Port-Of: odoo/odoo#192203Issue: ======= Combo product lines in the POS frontend displayed incorrect prices when order from self Order Cause: ======= The `price_unit` was being calculated without considering the `combo_item_id`. For example: price_unit += pos_order_line.combo_price + price_extra_child` Fix: ===== The `combo_item_id` was included in the calculation to ensure accuracy: price_unit += pos_order_line.`combo_item_id`.combo_price + price_extra_child Task-4464002 Forward-Port-Of: odoo/odoo#1
Original PR description
Issue: ======= Combo product lines in the POS frontend displayed incorrect prices when order from self Order Cause: ======= The `price_unit` was being calculated without considering the `combo_item_id`. For example: price_unit += pos_order_line.combo_price + price_extra_child` Fix: ===== The `combo_item_id` was included in the calculation to ensure accuracy: price_unit += pos_order_line.`combo_item_id`.combo_price + price_extra_child Task-4464002 Forward-Port-Of: odoo/odoo#193356