Wednesday, May 21, 2025
16 changes · saas-18.2
Resolved issues and error corrections
The email composer now shows a recipient's email address when their contact name is blank. This prevents the "To" field from appearing empty and reassures users that invoices or other emails are addressed correctly.
Original PR description
To reproduce: ============= 1. In v18.2, create a contact/invoicing address under a company without specifying a name. 2. Send an invoice to this contact. 3. Observe the "To" field in the email composer — it appears blank. Problem: ======== In v18.2, the "To" field only displays the contact name. If the name is missing, the field appears empty, which can confuse users and make it unclear whether the email will be sent correctly. In v18.1, the field displayed both the name (if available) and the associated email, providing better clarity. Solution: ========= Update the template logic to fall back to displaying the email address when the contact name is missing, ensuring the "To" field is always informative. opw-4748001
Miscellaneous changes
## 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
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
**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
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
…count value Steps to reproduce: 1. Create an invoice with a product 2. Set quantity to 3, price to 11.34 3. Confirm & get the invoice PDF 4. Upload the PDF in accounting app 5. Check the "discount" value Issue: Visually the result is correct, but the stored value (in db) is not -2.220446049250313e-14 != 0.0 Cause: ``` >>> 3 * 11.34 34.019999999999996 ``` Creating a slight error of -0.0000000000002 opw-4675079 Forward-Port-Of: odoo/odoo#210672 Forward-Port-Of: odoo/odoo
Original PR description
…count value Steps to reproduce: 1. Create an invoice with a product 2. Set quantity to 3, price to 11.34 3. Confirm & get the invoice PDF 4. Upload the PDF in accounting app 5. Check the "discount" value Issue: Visually the result is correct, but the stored value (in db) is not -2.220446049250313e-14 != 0.0 Cause: ``` >>> 3 * 11.34 34.019999999999996 ``` Creating a slight error of -0.0000000000002 opw-4675079 Forward-Port-Of: odoo/odoo#210672 Forward-Port-Of: odoo/odoo#206107
Steps to reproduce: - Install accounting, Sales apps - Setup two companies for the current user with two diff currencies - In company A, make a SO on a product and create an invoice - Validate and confirm the invoice. - Go to accounting, reporting, invoice analysis, and add group for the product - Select the report of that specific invoice posted - Observe the values untaxed_total, avg_price, inventory_value and price_margin - Switch to company B, and add a currency rate between both cur
Original PR description
Steps to reproduce: - Install accounting, Sales apps - Setup two companies for the current user with two diff currencies - In company A, make a SO on a product and create an invoice - Validate and…
Steps to reproduce: - Install accounting, Sales apps - Setup two companies for the current user with two diff currencies - In company A, make a SO on a product and create an invoice - Validate and confirm the invoice. - Go to accounting, reporting, invoice analysis, and add group for the product - Select the report of that specific invoice posted - Observe the values untaxed_total, avg_price, inventory_value and price_margin - Switch to company B, and add a currency rate between both currencies to observe a difference - Make sure that you are selecting both companies, but B as the main company - Go again to the report of the same Invoice. - Observe the values again. Issue: When changing the currency, the fields untaxed_total and price_avg are updated using the currency rate of the current main company. However, inventory_value is not updated. This inconsistency affects the calculation of price_margin, which relies on both untaxed_total and inventory_value. As a result, price_margin is computed incorrectly. opw-4582973 Forward-Port-Of: odoo/odoo#210453 Forward-Port-Of: odoo/odoo#206582
### 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
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:** 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
## Description In spreadsheet, the mail composer is used to write comments on cells. In this context, the file upload button is unnecessary. However, setting props allowUpload: false or overriding the allowUpload getter was not hiding the upload button as expected. This issue was caused by a missing allowUpload check in the composer actions logic. This PR adds the missing condition and refactors related checks into their respective modules, improving modularity. Task: [4708400](https
Original PR description
## Description In spreadsheet, the mail composer is used to write comments on cells. In this context, the file upload button is unnecessary. However, setting props allowUpload: false or overriding the allowUpload getter was not hiding the upload button as expected. This issue was caused by a missing allowUpload check in the composer actions logic. This PR adds the missing condition and refactors related checks into their respective modules, improving modularity. Task: [4708400](https://www.odoo.com/odoo/project/2328/tasks/4708400) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208556
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
1. Create a quote using a quote template that uses the quote calculator (e.g. the demo one, works fine), 2. Modify it using the quote calculator, 3. Duplicate it, 4. Open the quote calculator in the new quote -> it's filled with default values instead of the one from the other quote you dpulicated one could expect after duplication (and so if you save without changing anything in the spreadsheet, you 'reset' the quote even though it's probably not what you wanted to do), Expected behaviour
Original PR description
1. Create a quote using a quote template that uses the quote calculator (e.g. the demo one, works fine), 2. Modify it using the quote calculator, 3. Duplicate it, 4. Open the quote calculator in the…
1. Create a quote using a quote template that uses the quote calculator (e.g. the demo one, works fine), 2. Modify it using the quote calculator, 3. Duplicate it, 4. Open the quote calculator in the new quote -> it's filled with default values instead of the one from the other quote you dpulicated one could expect after duplication (and so if you save without changing anything in the spreadsheet, you 'reset' the quote even though it's probably not what you wanted to do), Expected behaviour: the quote calculator spreadsheet is duplicated for the new quote with the same values. Implementation note: Why not just `copy=True` on field `spreadsheet_ids`? Because the spreadsheet should be copied, but not only! The `spreadsheet.revision` linked to the spreadsheet also need to be copied. If they are not copied, revisions which are not part of the last snapshot will be lost on the new spreadsheet record and it won't lead to the same spreadsheet data. Task: 4801418 Forward-Port-Of: odoo/enterprise#85746
## Description This PR fixes several issues related to comments in spreadsheet cells: - **Dark Mode Styling** The comment styles were broken in dark mode because the dark SCSS file was in the wrong asset bundle. It's now removed from `assets_backend` and added to `assets_web_dark` to fix the issue. - **Focus Issue When Using Keyboard** When using the keyboard to move around the spreadsheet, opening a comment popup would focus the composer, stopping navigation. The composer now
Original PR description
## Description This PR fixes several issues related to comments in spreadsheet cells: - **Dark Mode Styling** The comment styles were broken in dark mode because the dark SCSS file was in the wrong…
## Description This PR fixes several issues related to comments in spreadsheet cells: - **Dark Mode Styling** The comment styles were broken in dark mode because the dark SCSS file was in the wrong asset bundle. It's now removed from `assets_backend` and added to `assets_web_dark` to fix the issue. - **Focus Issue When Using Keyboard** When using the keyboard to move around the spreadsheet, opening a comment popup would focus the composer, stopping navigation. The composer now doesn’t take focus, so keyboard navigation keeps working smoothly. - **Upload Button & Error Fixes** - The upload button was showing for spreadsheet cell comments but didn’t work. It’s now hidden. - There was also an error when editing a comment because `this.thread` wasn’t always available. Now it falls back to `this.message?.thread` when editing the message. - **Popover Visibility Fix** When posting the first comment and hovering over it, the action buttons (edit, favorite, delete) were partly cut off. This is now fixed by adding some padding to the thread style.  **Task**: [4708400](https://www.odoo.com/odoo/project/2328/tasks/4708400) Forward-Port-Of: odoo/enterprise#84458 Forward-Port-Of: odoo/enterprise#83410
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