Daily updates from Odoo
Friday, January 16, 2026
25 changes · saas-18.2
Resolved issues and error corrections
This update fixes an issue where placeholder hint text in the HTML editor would wrap awkwardly onto multiple lines when the screen was narrow. Now, the text is correctly truncated when space is limited, ensuring a cleaner and more consistent user experience. This improves readability and visual appeal.
Original PR description
Description of the issue this PR addresses: - The placeholder hint text wraps onto multiple lines when the cell width is reduced. - When there is insufficient horizontal space, the text should be truncated rather than wrapped. task-5480080 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243006
This update corrects a bug where custom button snippets were incorrectly wrapped in paragraph tags when placed next to existing buttons. The fix ensures custom buttons are consistently displayed in the snippet panel, improving usability for users creating and managing buttons. This resolves an issue where custom buttons weren't always visible.
Original PR description
### Issue: When a custom button snippet was dropped next to an existing button wrapped in a `<div>`, it was incorrectly and unconditionally wrapped in a paragraph `<p>` tag. This issue did not occur…
### Issue: When a custom button snippet was dropped next to an existing button wrapped in a `<div>`, it was incorrectly and unconditionally wrapped in a paragraph `<p>` tag. This issue did not occur with standard button snippets or when the buttons were wrapped in a `<p>` tag. ### Steps to reproduce: 1. Drag a standard "Button" snippet next to an existing button (e.g., in the navbar). The structure is correctly `<a/><a/>`. 2. Save a button as a custom snippet. 3. Drag this new custom button snippet next to a button wrapped in a `<div>` (navbar in our example). 4. Observe the structure: `<div><a/><p><a class="s_custom_snippet"/></p></div>`, but it should be like `<div><a/><a class="s_custom_snippet"/></div>`. ### Fix The logic has been corrected to only wrap a button snippet in a paragraph tag if it has no sibling buttons and is not already inside a `<p>`. This ensures consistent behaviour between standard and custom button snippets. A tour test is also added, ensuring the behaviour is correct. Backport of https://github.com/odoo/odoo/commit/3a8f2cc418510c3b91f8b9086bb4a89a1745e40d task-[5032130](https://www.odoo.com/odoo/project/974/tasks/5032130) Forward-Port-Of: odoo/odoo#241937 Forward-Port-Of: odoo/odoo#224476
This update corrects a technical issue that caused the IoT Box to freeze when used as a kiosk. The team adjusted how the browser arguments are passed, preventing excessive memory consumption and ensuring stable operation. This resolves a critical bug impacting the functionality of our IoT Box devices.
Original PR description
In odoo/odoo#233676 we switched from `chromium-browser` to `chromium` to adapt to new executable name in raspbian. We also need to update this name in the check to set the arguments of the browser, or they will never be passed. This fixes the issue where the IoT Box freezes when using it for kiosk, as the browser was eating all the memory. Forward-Port-Of: odoo/odoo#243979
This update simplifies the GSTR report generation process by removing an unnecessary credit note warning. Previously, a warning appeared on GSTR reports when a credit note was present on an invoice, which has now been corrected. The warning is now cleared only after the credit note is fully posted and checked.
Original PR description
This **PR** removes the credit note warning from the GSTR report, as it is not required at the report level. Additionally, when this warning is present on an invoice and the credit note is confirmed, the credit note is set to not checked. The warning will only be cleared once the credit note is posted and checked task-5469000 Forward-Port-Of: odoo/enterprise#102106
This update provides users with detailed error messages from HMRC when document sending fails, instead of generic alerts. By displaying the specific error code and message, users can quickly diagnose and resolve issues, reducing support requests and improving efficiency.
Original PR description
Currently, when an error occurs while sending a document to HMRC, the user only receives a generic error message. This change enhances the error feedback by including the error code and message returned by HMRC, giving the user clearer insight into the cause of the failure. This helps users identify issues more easily and reduces unnecessary support requests. Forward-Port-Of: odoo/enterprise#104407
A test related to inventory adjustments was intermittently failing due to a race condition involving notification messages. This commit resolves the issue by automatically closing the initial success notification before processing subsequent adjustments, ensuring accurate test results.
Original PR description
Before this commit, it could happen the test `test_inventory_packaging` fails sometime. It fails while checking the last assert: ```python self.assertEqual(self.product1.qty_available, 15.0) ``` The…
Before this commit, it could happen the test `test_inventory_packaging` fails sometime. It fails while checking the last assert: ```python self.assertEqual(self.product1.qty_available, 15.0) ``` The error message is: `AssertionError: 16.0 != 15.0` In the tour, we do a first inventory adjustment where we set the `proquct1` qty to 16, then we do a second inventory adjustment where we set its qty to 15. Now, the assert sometime fails because in the tour, the last step check the success message is visible: ```javascript trigger: ".o_notification_bar.bg-success", ``` The issue with that is that we already do a first inventory adjstment and its success notification is still visible while processing the second inventory adjustment, creating a race condition. To fix that, we just need to close the first notification message, and to do so, this commit back-ports and uses the step utils' method `checkNotificationMessage` (see [1]) since this method checks a notification message is there and close it. [1]: https://github.com/odoo/enterprise/pull/101495 runbot-build-error: [227692](https://runbot.odoo.com/odoo/runbot.build.error/227692)
This update fixes an issue where invoices generated for EU Standard (Peppol Bis 3.0) eInvoices were incorrectly using the customer's VAT number instead of the company's registration number in the XML format. This ensures compliance with EU regulations and accurate data transmission for e-invoicing. The change prioritizes using the company's registration number (company_registry) when available.
Original PR description
The base `_get_party_node` uses `commercial_partner.ref` for `PartyIdentification` and `commercial_partner.vat` for `CompanyID`. There was no logic to prefer `company_registry` when available. Refs:…
The base `_get_party_node` uses `commercial_partner.ref` for `PartyIdentification` and `commercial_partner.vat` for `CompanyID`. There was no logic to prefer `company_registry` when available. Refs: An independent invoice example: https://developer.vertexinc.com/einvoicing/docs/belgium-example-documents https://github.com/odoo/odoo/blob/40c862476382c68d7f452284074f5b44955d1f98/addons/account_edi_ubl_cii/models/account_edi_xml_ubl_20.py#L1564-L1566 https://github.com/odoo/odoo/blob/40c862476382c68d7f452284074f5b44955d1f98/addons/account_edi_ubl_cii/models/account_edi_xml_ubl_20.py#L1585 Steps To Reproduce: - Have accounting, account_edi_ubl_cii and contacts installed. - Create a Belgian company and set the VAT, Company ID and Reference (under Sales & Purchase tab). - Create a contact and set his eInvoice format in Accounting tab to EU Standard (Peppol Bis 3.0) and make sure to give him a country. - Go to accounting -> Customers -> Invoices and create an invoice for the contact you created. - Send the invoice to the contact and download the XML from the chatter and inspect it. - PartyIdentification/ID shows the partner's ref field value (e.g., "(odoobe)") instead of the company registration number. - PartyLegalEntity/CompanyID uses the VAT number instead of the company registration number (ondernemingsnummer). Ticket [link](https://www.odoo.com/odoo/project.task/5418190) opw-5418190 Forward-Port-Of: odoo/odoo#243143
This update fixes a potential issue in how the system determines if a stock location is a child of another. The change replaces a method that could incorrectly identify related locations due to matching IDs, preventing a specific test from failing. This ensures more reliable stock management processes.
Original PR description
Previously, in the `_isSublocation`, to check if a location was a children of another location, we did that: ```javascript return childLocation.parent_path.includes(parentLocation.parent_path); ```…
Previously, in the `_isSublocation`, to check if a location was a children of another location, we did that: ```javascript return childLocation.parent_path.includes(parentLocation.parent_path); ``` The issue with that is, if locations' id are aligned, they can match even if they are not related. For example, imagine tested child location has ID 127 and the parent location has ID 7, we then check their `parent_path` (for example, '4/127/' for the child location and '7/' for the parent location), it can happen the child parent path can include the parent's parent path (in our example, '4/127/' includes '7/'.) To fix that, this commit replaces `includes` with `indexOf`, the result of the `indexOf` should always be 0 if the child location is indeed a sublocation of the parent location. Because of this issue, the second run of the tour `test_put_in_pack_new_lines` could sometime fail when the locations IDs are aligned. runbot build error: [233292](https://runbot.odoo.com/odoo/runbot.build.error/233292) Forward-Port-Of: odoo/enterprise#104350
This update fixes an issue where users couldn't easily manage their consent for online account synchronization. The change allows users to actively control their data sharing preferences, enhancing privacy and compliance. The update also modernizes the system to support various data providers.
Original PR description
In this commit:https://github.com/odoo/enterprise/commit/bf5b7d03fe8e138ee8bc0246d3d148638db5d620 we introduce a message on the account_online_link to be able to manage the consent. But since manage_consent is not a field of account.online.linki would traceback, we changed the position of the code by popping the value. Also changed the url to use the provider_type to be able to use the route with any provider if needed task-5187621 Forward-Port-Of: odoo/enterprise#104442 Forward-Port-Of: odoo/enterprise#102428
This update resolves an issue where shared subfolders within the Documents app weren't initially visible to users. The fix ensures that subfolders are correctly loaded upon first access, eliminating the need for a refresh. This enhances the user experience when accessing shared documents via links.
Original PR description
**Steps to reproduce:** - Create a portal user - Go to the documents app - Click on the marketing folder - Share the marketing folder through a link (Anyone with a link = viewer + discoverable) -…
**Steps to reproduce:** - Create a portal user - Go to the documents app - Click on the marketing folder - Share the marketing folder through a link (Anyone with a link = viewer + discoverable) - Copy the share link - Login with the portal user in an incognito window - Paste the share link in an incognito browser - Click on "brand 1" folder, result nothing is showing while there should be a folder and a picture - Click on "brand 2" - Click back on "brand 1" and now the folder and picture are visible - If you click on a subfolder of "brand 1" you also get an error **Issue:** Discoverable subfolders accessed using `accessToken` are not available on the first read of a user and this happens for each level of the hierarchy (refresh is needed each time). When using sharing link to display folders with a user, the subfolder document access is created on `/documents/touch/` using `_from_access_token`. But on the js side the call is delayed (with debounce) and occurs after the `web_search_read`. This means that subfolders are only accessible after a refresh or by switching back and forth between folders. Also, even after the folder is displayed, if there are other subfolders in it, going deeper in the hierarchy won't work as well without a refresh due to the `search_panel_select_range` missing the new folder. **Fix:** Not sure on the best way to fix this, the issue will always be related to performance. Current fix checks if a reload is needed by sending a flag in the `/documents/touch/<access_token>` request result when a new document access was created. opw-5156297 Forward-Port-Of: odoo/enterprise#99820
This update resolves an issue where the HTML editor would crash when attempting to remove formatting from a cell with a lingering color after text deletion. Now, users can reliably remove color formatting without encountering errors, improving the overall stability and usability of the HTML editor.
Original PR description
**Current behavior before PR:** Steps to reproduce: - Create a m x n table - Write some text in a cell, apply color on text - Delete text and keep empty colored element - Select cell - Trying to remove format throws infinite loop error in removeAllColor **Desired behavior after PR is merged:** Clicking on remove format button should remove color from empty colored element without causing traceback. task-5454993 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241829
This update resolves an issue where importing dates incorrectly caused errors when mapping to boolean or one-to-many fields. The fix ensures accurate handling of datetime values during the import process, preventing data import failures. This improves the reliability of data updates.
Original PR description
When mapping a datetime value to fields of type boolean or one2many, an error is raised. Steps to Reproduce: 1) Install CRM 2) Navigate to CRM and upload [this…
When mapping a datetime value to fields of type boolean or one2many, an error is raised. Steps to Reproduce: 1) Install CRM 2) Navigate to CRM and upload [this file](https://docs.google.com/spreadsheets/d/1eRhIy3Zt8kD-_sH8Lp2N9IE9zflYB5CX/edit?usp=sharing&ouid=101212513075316114369&rtpof=true&sd=true) 3) Map 'Created on' with 'Active' and click on Test. Error-1 : `AttributeError: 'datetime.date' object has no attribute 'lower'` If you upload [this file](https://docs.google.com/spreadsheets/d/18xTvxjc9EsXf86N5Y8ekq-AZocQSNwEM/edit?usp=sharing&ouid=101212513075316114369&rtpof=true&sd=true) and click on Test, the following error is raised: Error-2: `AttributeError: 'datetime.date' object has no attribute 'split'` Root Cause: This type of issue was previously addressed in [commit 1](https://github.com/odoo/odoo/commit/83034f4752fd2a126851d6308a3ad39221dcab6a), but its changes were reverted in [commit 2], which only handled char fields. As a result, cases for `bool` and `one2many` fields were missed. Since the `_parse_datetime_data` check at [1] was removed after [commit 2], the error reappears. Fix: Following the logic of [commit 2], this fix extends the handling to bool and one2many fields. [1]- https://github.com/odoo/odoo/blob/462f620803e22da4a2d08915eb31fcda876ec73e/addons/base_import/models/base_import.py#L1466-L1467 [commit 2]: https://github.com/odoo/odoo/commit/743ae7f6555160415b33ba3afb3de7bc78cede81 sentry-6979678378,6924909613
This update resolves an issue where the 'product_barcodelookup' module would crash when attempting to retrieve images for products that didn't have associated images in the Barcode Lookup API. The fix ensures the code handles cases where the API returns a different data type than expected, preventing the error and allowing image retrieval to function correctly.
Original PR description
Attempting to fetch pictures for a product via the Barcode Lookup API that has no images causes a traceback. Steps to reproduce the error: - Install ``product_barcodelookup`` module and set API Key -…
Attempting to fetch pictures for a product via the Barcode Lookup API that has no images causes a traceback. Steps to reproduce the error: - Install ``product_barcodelookup`` module and set API Key - Create a new product > Barcode: ``7896539200843`` > Save - Actions > Get Pictures from Barcode Lookup > Get Pictures Traceback: ``AttributeError: 'dict' object has no attribute 'status_code'`` https://github.com/odoo/enterprise/blob/e9bf8ee37d9fde09a1599d64b44f0c6599299cf4/product_barcodelookup/tools/barcode_lookup_service.py#L19-L25 When a product does not have picture in barcode lookup, ``barcode_lookup_request`` method returns ``dict`` instead of ``Response`` object. This causes a traceback when the code later tries to access ``status_code`` at: https://github.com/odoo/enterprise/blob/e9bf8ee37d9fde09a1599d64b44f0c6599299cf4/product_barcodelookup/wizard/product_fetch_image_wizard.py#L277-L278 ref: https://github.com/odoo/enterprise/commit/48582d98d6a1bc275a6f6c2baa83431dda085516 sentry-6886021547
This update resolves an error that prevented users from exporting CRM forecasts. The issue stemmed from changes in how forecast data is displayed, leading to a division-by-zero error when attempting to export. The fix ensures the export functionality works reliably, regardless of the data displayed in the forecast views.
Original PR description
Currently an error occurs when we try to export CRM forecast. **Steps to replicate:** - Go to CRM > Reports > Forecast. - Click on the gear menu and click `Export All`. **Error:** `ZeroDivisionError: division by zero` **Cause:** - The error due to a modification in the List and Kanban views, which are now merged into the DynamicList. - This change resulted in the `Export All` option appearing in the CRM Forecast kanban view and forecast views can have empty stages. - The issue occurs at line [1] where `self.count` becomes zero for stages without records, leading to the error. **Solution:** - This commit solves the issue by returning default value 0 when data is empty. [1]: https://github.com/odoo/odoo/blob/6be0e8ad57c531fb88dc33e126df884430f1ab21/addons/web/controllers/export.py#L97 sentry-6720460271 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects an error that prevented payslips from generating correctly when an employee was linked to multiple commission plans using the same input. The fix ensures accurate currency conversion for each commission, preventing a technical error that impacted payslip generation.
Original PR description
Currently, an error occurs while generating a payslip for an employee who is linked to more than one commission plan using the same payslip input. **Steps to Reproduce:** 1. Install the…
Currently, an error occurs while generating a payslip for an employee who is linked to more than one commission plan using the same payslip input. **Steps to Reproduce:** 1. Install the hr_payroll_sale_commission module. 2. Create a user and link to an employee. Set a contract for the employee. 3. Create two commission plans for the same user: - Use the same Payslip Input in both plans. - Set the Target Frequency to "Monthly" for both. 4. Generate a payslip for the employee. Ref: [Video](https://drive.google.com/file/d/1HhtUL2xznS_Aoi9ePL0OJLdGaXU8ZFZR/view?usp=sharing) **Error:** `ValueError - Expected singleton: sale.commission.report(30026010100009, 40026010100009)` **Cause:** When multiple commission records belong to the same payslip input, it tries to convert the commission amount using `coms.commission`, where coms has multiple recordsets. This leads to a singleton error during currency conversion. **Fix:** This commit ensures the currency conversion is applied per commission and prevents the singleton error. sentry-7187854690
This update fixes a discrepancy in the XML export of tax reports. Previously, the exported data didn't align with the report's data due to a mismatch in date calculations (invoice vs. reconciliation). This change ensures the XML export accurately reflects the data within the tax reports, improving data consistency and report accuracy.
Original PR description
## Issue: Invoices exported in the XML did not match the data in section D of the report for the same month The exported data should match the report ## Cause: XML export used the invoice dates (bills invoiced in the period), while the report data is based on the reconciliation entry dates This mismatch caused some invoices to be missing or incorrectly included in the XML ## Steps to reproduce: - Install `l10n_ma_reports` and switch to the MA company - Create and confirm a bill: Bill Date: 10/01/2025 Vendor: Azure Interior Invoice Lines: Price 100, Taxes 20% (S 140) - Go to `Bank Reconciliation` - Add a transaction (Vendor: Azure Interior, Amount: -120 DH, any Memo) - Select the transaction and the invoice, then click Validate - Open the Tax Return for November. Section D should show data linked to the created invoice - Export the XML using the Gear → XML The created bill is missing in the XML and others may be present, showing inconsistent data opw-5002779
This update fixes an issue where sorting of picking records was not functioning correctly due to a technical detail in how Odoo compares related data. The change ensures that picking records are sorted accurately, improving the reliability of inventory management processes. This resolves a potential inconsistency in how the system identifies and orders related records.
Original PR description
Ordering recordset based on relationnal field should always take the relational field's `.id` instead of the field itself. This is due to the BaseModel `__gt__` override comparing if a set is included into another and not if the `id` is bigger that the other `id`. runbot : 237512
This update resolves a technical issue that was causing an error message during Razorpay payment processing within the Point of Sale (POS) system. The fix removes an unnecessary attempt to use 'sudo' on a specific object, ensuring smooth and reliable payment transactions for Indian users.
Original PR description
Steps: - Configure a Razorpay payment method in POS with Indian localization. - Open a POS session and process an order. - Start the Razorpay transaction. Issue: - An error pop-up is shown: 'RazorpayPosRequest' object has no attribute 'sudo'. Cause: - The code attempts to call sudo() on RazorpayPosRequest, which is not a model and does not support sudo. Fix: - Remove the unnecessary sudo() access from RazorpayPosRequest. Task-5501634 Forward-Port-Of: odoo/odoo#244177
This update optimizes the SQL query for the budget report, resulting in significantly faster performance, especially when dealing with large datasets. The change separates the query logic to allow for a more efficient join strategy, reducing processing time and improving report generation speed. This improves the overall user experience for financial reporting.
Original PR description
Before this commit, the SQL query generated in `_get_aal_query` utilized a `LEFT JOIN` with a complex `OR` condition on the join clause: `(bl.company_id IS NULL OR bl.company_id = al.company_id)`.…
Before this commit, the SQL query generated in `_get_aal_query` utilized a `LEFT JOIN` with a complex `OR` condition on the join clause: `(bl.company_id IS NULL OR bl.company_id = al.company_id)`. Because this condition lacks a strict equality constraint, the planner cannot build a hash table for the join. Consequently, it is forced to fallback to a Nested Loop Join strategy, evaluating the condition as a filter for every row pair. This results in significant performance degradation on large datasets. This commit optimizes the query by splitting the logic into two separate `SELECT` statements combined with a `UNION ALL`: 1. Matches where `company_id` is explicitly equal. 2. Matches where `company_id` is NULL. By separating these conditions, the planner can now prioritize a Hash Join for the equality check and handle the NULL join separately, significantly reducing execution time. References: - Original PR introducing the logic: https://github.com/odoo/enterprise/pull/82955 - Plan Before (Join Filter): https://explain.dalibo.com/plan/a55476hgb73ea7g6#plan - Plan After (Hash Cond): https://explain.dalibo.com/plan/3b9g484569a86efb#plan opw-5460862 Forward-Port-Of: odoo/enterprise#104299
This update resolves a problem where imported sales orders containing kit products were incorrectly splitting the order into multiple lots during the POS process. The change prevents this splitting behavior, ensuring accurate sales tracking for kit products, regardless of whether they are tracked by lots. This improves the reliability of the POS system.
Original PR description
When a kit product with tracked components is sold, and if the kit is tracked by lots, the imported sale order lines were being split by lots causing issues in the POS session. Although kits are not supposed to be tracked by lots, this commit prevents the splitting of sale order lines by lots when the product is a kit. opw-5423833 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242785
This update resolves an issue preventing stable IoT Box devices from sending data correctly. The system now correctly interprets data from these devices, ensuring reliable reporting and improved functionality. This change enhances the overall stability and performance of the IoT integration.
Original PR description
We now read data in result key if it exists to ensure readability of stable IoT Box responses. Forward-Port-Of: odoo/enterprise#104194 Forward-Port-Of: odoo/enterprise#104113
This update ensures that manually set currency rates on customer invoices (especially in German and Hungarian) are correctly applied during the invoice posting process. Previously, the system automatically replaced these rates with standard currency rates, leading to potential inaccuracies. This fix maintains the user's intended rate, improving invoice accuracy and financial reporting.
Original PR description
Initial setup: Install l10n_hu_edi and l10n_de. When creating a customer invoice DE in a foreign currency, a manually edited currency rate was overridden at posting time with the rate from the currency table. Reason: l10n_de overrides `move._post` to assign the `delivery_date`. l10n_hu_edi recompute currency rates when the `delivery_date` changes. Ensure that any manually entered rate is preserved during posting by making sure that l10n_hu_edi override only affect HU moves. task-5391774 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242192
This update resolves an issue where canceling self-checkout orders scheduled for a future date didn't consistently remove them from the POS system. Now, cancellations are correctly applied in both the user interface and the POS, ensuring accurate order management. This improves the reliability of the self-checkout experience.
Original PR description
Before this fix, when we placed an order from the self-checkout with a preset slot for a future date, we weren't able to cancel it from the POS. The UI showed it as canceled, but after refreshing, the order was still there. Now, when we cancel an order scheduled for the future, it is correctly canceled both in the UI and in the POS. task : 5246089 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a data inconsistency in Odoo. Previously, Bulgaria was linked to the Bulgarian currency (BGN). Now, it’s correctly linked to the Euro (EUR) reflecting Bulgaria’s adoption of the Euro as its official currency on January 1, 2026. This ensures accurate financial reporting and data for transactions involving Bulgaria.
Original PR description
Description of the issue/feature this PR addresses: Bulgaria adopted the euro as official currency as of 2026-01-01. Update the base country data accordingly. Current behavior before PR: In `res_country_data.xml`, Bulgaria is linked to BGN. Desired behavior after PR is merged: Bulgaria is linked to EUR in `res_country_data.xml`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241957
This update corrects a bug where overdue invoices were printed twice in follow-up PDF reports. The issue stemmed from how the system attached invoices during manual follow-up creation. Now, invoices appear only once in the generated PDF, ensuring accurate reporting and reducing potential confusion for users.
Original PR description
### Issue: In a manual follow-up printed as PDF, overdue invoices appear twice. ### Step to reproduce: - Create a partner and an overdue invoice for this partner, - Send the invoice, - go to this…
### Issue: In a manual follow-up printed as PDF, overdue invoices appear twice. ### Step to reproduce: - Create a partner and an overdue invoice for this partner, - Send the invoice, - go to this Partner then in the "Accounting" sheet, - Choose follow-up as manual, - Click on send, - In the wizard select Print and "Join invoices" ### Current behavior: The PDF display the reminder, the invoice, the report and the invoice again. ### Expected behavior: Invoice should appear only once in the follow-up PDF. ### Cause : When manually sending the follow-up, the wizard attaches the invoices to the follow-up. Then in `_get_followup_attachments`, it attaches the report, template attachments and the invoices again. In a manual follow up, it should be possible to choose which invoices are sent. The method `_get_invoices_to_print` ensure this by looking at the options' attachment. Therefore, it's not possible to clear the attachment field before fetching the invoices. opw-5368870 Forward-Port-Of: odoo/enterprise#102516