Thursday, May 21, 2026
32 changes · saas-19.1
New functionality added to Odoo
This update introduces a new module, 'obox,' to connect with Obox devices – a hardware platform similar to the Odoo FDM for Belgium. The initial step is to allow the system to recognize and view the Obox's IP address and available services, laying the groundwork for future device interaction.
Original PR description
The Obox (same platform as the Odoo FDM for Belgium) will allow interfacing with hardware devices, and is intended to replace the functionality of the IoT box. This commit only adds the ability to pair an Obox to the database, and see its IP and available services. Enterprise https://github.com/odoo/enterprise/pull/110834
This update introduces the 'obox' module, enabling connection with hardware devices similar to the existing Odoo FDM. The initial step allows users to register and view basic information about their Obox devices, including IP addresses and available services – a key step towards broader device connectivity.
Original PR description
The Obox (same platform as the Odoo FDM for Belgium) will allow interfacing with hardware devices, and is intended to replace the functionality of the IoT box. This commit only adds the ability to pair an Obox to the database, and see its IP and available services. Community: https://github.com/odoo/odoo/pull/254208
Enhancements to existing features
This update enables users to reset statement lines directly within the Kanban view, mirroring functionality from previous versions. This prevents the need to manually delete numerous reconciliations associated with a single statement line, streamlining the accounting process.
Original PR description
This commit adds the possibility to reset a statement line in kanban view like in the previous versions. Function is still there but no UI button was tied to it. This is a problem if you have many reconciliations on one statement line, we do not want to delete them one by one. opw-6015838 Forward-Port-Of: odoo/enterprise#111107
Resolved issues and error corrections
This update resolves an issue that prevented users from initiating replenishment orders when no routes were associated with a product and the company's routes were not active. The fix ensures the system handles empty route lists gracefully, preventing a technical error and ensuring replenishment functionality works correctly for all products.
Original PR description
## Steps to Reproduce: 1. Install the stock module. 2. Activate "Multi-Step Routes" from settings. 3. Activate the "My Company (Chicago)" company. 4. Create a route for the Chicago company. 5. Create a new product and enable the created route on it. 6. Click on the "Replenish" button. ## Error: `IndexError - tuple index out of range` ## Cause: At [1], when none of the product routes belong to the current company or are shared routes, the filtering returns an empty recordset. As a result, trying to access the first route from the empty result raises an index error. ## Fix: This commit only assigns `route_id` when a route matches the given condition. Otherwise, it keeps the value as `False`. [1] - https://github.com/odoo/odoo/blob/13c0e082c260381a332fe1425fe2ba83a1c0c579/addons/stock/wizard/product_replenish.py#L78 sentry-7488075413 Forward-Port-Of: odoo/odoo#265179
This update enables the IoT box to broadcast its IP address via Bluetooth for 5 minutes after startup. This feature simplifies troubleshooting by providing support and clients with the IP address needed to diagnose connectivity issues. It also handles cases where no network is available by advertising 'No network connection'.
Original PR description
This PR allows the iot box to advertise its ip address over Bluetooth for 5 minutes after boot. The format is `IoT Box [S/N] - [ip]` If no network is available it would advertise "No network connection" instead of the ip This can help clients and support to troubleshoot IoT Box issues.
This update corrects a bug where users could cause an error when entering spaces in the 'Forecasted Demand' or 'Forecasted Stock' cells within the Master Production Schedule. The fix ensures that blank input is handled correctly, preventing the error and maintaining data integrity. This improves the user experience and prevents potential data issues.
Original PR description
## Steps to Reproduce:
1. Install `mrp_mps` module.
2. Manufacturing > Planning > Master Production Schedule
3. Click on "Forecasted Demand" or "Forecasted Stock" of any product.
4. Click `<SPACE>` and then `<ENTER>`.
## Error:
`ValueError: could not convert string to float: ' '`
## Cause:
When a user enters whitespace(' ') in a **Forecasted Demand** or **Forecasted Stock** cell, the string bypasses the existing `isNaN/empty` checks at [1]. Then the raw whitespace string passes to the ORM call, where `float(' ')` raised a ValueError.
## Fix:
This commit trims the value so that blank input is treated the same as an empty string, and the cell reverts to its original value.
[1] - https://github.com/odoo/enterprise/blob/6ae5d3df6e9305416e4d6f74259cd01753025f42/mrp_mps/static/src/components/line.js#L128
sentry-7473062917
Forward-Port-Of: odoo/enterprise#117052This update fixes a bug that prevented users from creating new helpdesk teams. The issue occurred when the system attempted to use a default email template after deleting all helpdesk stages. The fix ensures the template exists before attempting to use it, preventing an error and allowing team creation to proceed smoothly.
Original PR description
Currently, an error occurs when a user tries to create a helpdesk team record. **Steps to Reproduce:** - Install the `helpdesk` module without demo data. - Go to `Settings` > `Technical` > `Email` >…
Currently, an error occurs when a user tries to create a helpdesk team record. **Steps to Reproduce:** - Install the `helpdesk` module without demo data. - Go to `Settings` > `Technical` > `Email` > `Email Templates` and delete the `Helpdesk: Ticket Received` template record. - Go to `Helpdesk` > `Configuration` > `Stages` and remove all records. - Go to `Helpdesk` > `Configuration` > `Helpdesk Teams` and click `New` to create a record. `AttributeError: 'NoneType' object has no attribute 'id'` When the user deletes all stages, the system attempts to create a new stage and assign the "Helpdesk: Ticket Received" mail template to it [1]. However, if this template record does not exist, accessing its id raises the error. This commit ensures that the template record exists before accessing its id, otherwise, None is passed as the default value. [1]: https://github.com/odoo/enterprise/blob/32187f79fb0a595497a5e77db4b22b417b03b8dd/helpdesk/models/helpdesk_team.py#L34 sentry-7482994877 Forward-Port-Of: odoo/enterprise#117446
This update fixes a bug that prevented order synchronization with Lazada when package information was incomplete. The system now gracefully handles missing package data, preventing errors and ensuring orders are synced correctly. This improves the overall reliability of the Lazada integration.
Original PR description
orders can omit package data in the API payload if the package id doesn't match. When a picking still had a package_extern_id, filtering order_items by that id produced an empty list, and max() on the resulting timestamps raised ValueError and blocked order sync. Return early when no matching package lines exist so sync can continue. taskId - 6195507 Forward-Port-Of: odoo/enterprise#117194
This update fixes a bug that prevented the HTML editor from correctly converting URLs with mixed or uppercase characters into clickable links. The fix now ensures all URLs, including short domains like 'x.com', are automatically recognized and linked. This improves the user experience by making it easier to share and navigate to online resources within Odoo.
Original PR description
### Description of the issue/feature this PR addresses: - URL_REGEX was constructed with the "i" flag, but passing a RegExp object to new RegExp(regex, "g") silently drops the original flags, leaving only "g". This caused uppercase (ODOO.COM) and mixed-case (Odoo.Com) URLs to not be converted to links when pressing space. ### Desired behavior after PR is merged: - URL_REGEX.source with explicit "gi" flags to preserve case-insensitive matching in `prepareConvertToLink`. - Allow automatic URL detection for single-character domains such as `x.com`, `t.co`, and `a.io` by relaxing the minimum domain label length in the URL regex from 2 to 1 characters. task-6199269 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265409 Forward-Port-Of: odoo/odoo#263255
This update fixes an issue where the bank account currency wasn't correctly reflected in the XML files generated for Polish e-invoices (Ksef). The change ensures that the 'OpisRachunku' field in the XML accurately displays the bank account currency, resolving a potential reporting discrepancy. This improves the accuracy of e-invoice data transmission.
Original PR description
**STEP TO REPRODUCE** 1. Create a partner with a bank account and setup its currency. 2. Create an invoice using a different currency. 3. Send the invoice to Ksef. 4. Notice the generated xml contains the invoice currency in the field OpisRachunku, but it should be the bank account currency instead. opw-6150563 Forward-Port-Of: odoo/odoo#263842
This update fixes a bug where selecting a table cell would sometimes incorrectly select the entire table. Previously, selection started in a cell and ended outside the cell wasn't properly handled. This change ensures that table selections work consistently, regardless of how the user initiates the selection process.
Original PR description
The previous commit fixes a behavior that is expected when the user makes a selection that starts in any element and ends in a table cell (the whole table gets selected), but the reverse case was never handled, namely when the selection starts in a table cell and ends outside of it. backport-https://github.com/odoo/odoo/pull/239270/changes/68e71fad5bbb0445bb1850bf694235f3235b602f task-5420366 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265464 Forward-Port-Of: odoo/odoo#264722
This update ensures that WhatsApp channel avatars in the sidebar accurately reflect the member who added the channel, rather than defaulting to a generic avatar. Previously, adding a member caused the incorrect avatar to be shown. This fix improves the user experience and visual consistency within the WhatsApp channel interface.
Original PR description
WhatsApp sidebar avatars should be resolved from the channel's whatsapp member, not from an arbitrary non-self member. Before this fix, adding a member to a WhatsApp channel caused the default Discuss avatar to be displayed instead of the actual WhatsApp member's avatar. This happened because the correspondent was not correctly computed for channels of type whatsapp. task-[5879840](https://www.odoo.com/odoo/project/1519/tasks/5879840) Forward-Port-Of: odoo/enterprise#117633 Forward-Port-Of: odoo/enterprise#115745
This update resolves an issue where the Send & Print wizard would fail when proforma PDFs weren't generated for invoices. The change ensures the system handles cases where these PDFs aren't available gracefully, preventing errors and improving the reliability of invoice sending. This primarily affects invoices processed with specific localization modules.
Original PR description
`_generate_and_send_invoices` raises `KeyError: 'proforma_pdf_attachment'` when `_get_invoice_extra_attachments` returns an empty recordset for a move in the `success` dict. The…
`_generate_and_send_invoices` raises `KeyError: 'proforma_pdf_attachment'` when `_get_invoice_extra_attachments` returns an empty recordset for a move in the `success` dict.
The `proforma_pdf_attachment` key is only populated in `_generate_invoice_fallback_documents`, which is called exclusively when `allow_fallback_pdf=True`. However, the code at the return step also triggers when `allow_fallback_pdf=False` (normal wizard path), where the key is never set.
Replace the bare dict access `move_data['proforma_pdf_attachment']` with `move_data.get('proforma_pdf_attachment', self.env['ir.attachment'])` so the flow returns an empty attachment recordset instead of raising a `KeyError` when no fallback proforma PDF was generated.
Fixes: KeyError: 'proforma_pdf_attachment' in account.move.send.wizard Steps to reproduce:
1. Use the Send & Print wizard on a posted invoice
2. Trigger a condition where _get_invoice_extra_attachments returns an empty recordset (e.g. via l10n_vn_edi_viettel with sinvoice files not yet fetched) despite no error being raised
Forward-Port-Of: odoo/odoo#264564This update resolves an issue preventing normal users from canceling approval requests they created. The fix uses 'sudo' to grant the necessary permissions, ensuring users can now successfully cancel their own approvals without errors. This improves user experience and streamlines the approval process.
Original PR description
Issue: - A user who created an approval request could cancel it. But a rights error appeared during the cancellation. Steps to Reproduce: - Create an approval being a normal user. - Try to cancel the approval. - A ValidationError is raised eventhough the approvals can be cancelled by creator of it. Fix: - Changed the cancel action to use the sudo for the user who created the task and can cancel it Impact: - Users can cancel their own approval requests without errors. Task: 6123104 Forward-Port-Of: odoo/enterprise#114189
This update fixes a minor visual issue on the Odoo website's shop page. Specifically, it prevents the 'clear' button from shrinking, ensuring a consistent and professional look for customers. This improves the overall user experience and brand image.
Original PR description
task-6145581 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262183
This update corrects a technical issue causing unnecessary chatter logging when changing employee pay categories. The change prevents Odoo from tracking a specific field, ensuring smoother operation and reducing potential log clutter. This improves system performance and simplifies payroll management.
Original PR description
Steps to reproduce the issue: 1. Ensure Payroll is installed (the other necessary modules will be installed) 2. Create a new employee, and assign them a new pay category 3. In the new pay category,…
Steps to reproduce the issue: 1. Ensure Payroll is installed (the other necessary modules will be installed) 2. Create a new employee, and assign them a new pay category 3. In the new pay category, assign it a new pay structure 4. In the new pay structure, create a new salary rule with the following options a. Based On → Salary Input b. Unit → Monetary (should be checked by default) c. Available on → Employee d. Default Value → > 0 5. Go back to the employee, go in the payroll tab, scroll to the bottom, and add a new input 6. Select the salary rule you made, and give it a value > 0 7. Save the record 8. Try to change the employee's pay category and observe traceback When changing an employee's pay category, Odoo attempts to log this change in the chatter, even though it is not explicitly a tracked field. The reason for this is because when changing the pay category, `payroll_properties` is also changed in some circumstances. For `properties` fields, they are only logged if it's parent field is updated, and if the `tracking` attribute is not set to `False`. Previously, this was not an issue, as `hr_employee.structure_id` (the parent field of `payroll_properties`) was not a tracked field. The same is true for `hr_version.structure_id`. However, as of this commit (https://github.com/odoo/odoo/pull/156236), they are now tracked fields, as they are not explicitly marked as `tracking=False`. This causes `payroll_properties` to be picked up as a tracked field, since the `tracking` attribute is not explicitly set to `False` This commit will ensure that we explicitly do not track this field, as it was not tracked before these changes. [opw-6173051](https://www.odoo.com/odoo/project/49/tasks/6173051?debug=assets)
This pull request addresses a reported error related to the salary configurator within Odoo. The fix removes a problematic code section that was causing the error, ensuring the configurator functions correctly. This resolves a potential disruption for users managing employee compensation.
Original PR description
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 update fixes a technical error that prevented users from completing orders with the 'Ship Later' option in the Point of Sale (POS) system. The issue stemmed from how the system handled date formatting, specifically when clearing the 'Ship Later' date field. The fix ensures the system correctly processes orders with this feature.
Original PR description
Steps: = - Enable Allow Ship Later in POS configuration. - Open POS and add any product. - Proceed to the Payment screen. - Click Ship Later, clear the date field, and confirm Issue: = - A traceback occurs: `TypeError: this.state.shippingDate.toISODate is not a function` Reason: = - Here, shippingDate is a Luxon DateTime object when provided. when cleared, it becomes null, so converting it to ISO format is casung the error. Fix: = - Removed unnecessary conversion using `.toISODate()`. - Removed unnecessary hoot test. - Added validation on shippingDate to prevent selecting a past date. task-5406969
This update fixes an issue where guests rejoining public discuss meetings would be redirected to a welcome page without their name pre-filled. The change restores the previous behavior, allowing users to quickly rejoin with a single action and improving the meeting experience.
Original PR description
Previously, when a guest joined a discuss meeting, and the page was reloaded, the user was redirected to the welcome page without the guest name being pre-filled in the input. This PR restores the previous behavior by pre-filling the guest name in the input, allowing users to rejoin the meeting quickly with a single action. task-6192285 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a discrepancy in how contract type IDs are defined within Odoo's payroll modules. Specifically, the definition was standardized across all modules, resolving potential conflicts and ensuring accurate reporting for Belgian payroll calculations. This change is limited to version 17 and will be addressed in a separate update.
Original PR description
[IMP] hr_contract_salary: fix contract_type_id definition The definitions of the contract_type_id in hr_contract_salary_offer and l10n_be_hr_contract_salary/hr_contract_salary_offer should be same I converted the definition of contract_type_id in the base module to the Belgium one. Also, the contract_type_id was inserted to the view in Belgium one as well, I deleted that part to prevent double appearance. This task is only for v.17, after this version I will open a new PR to handle them. Do not forward the task after v.17 (only for v.17) task - 6101717 Forward-Port-Of: odoo/enterprise#117708 Forward-Port-Of: odoo/enterprise#113244
This update fixes an issue where recurring plans weren't appearing in quotations generated using the DIN5008 template. The change adds a simple styling rule to ensure recurring plans are consistently displayed in all reports, regardless of the template used. This improves the accuracy of subscription reporting for Swiss customers.
Original PR description
When generating a quotation for a recurring plan, if the quotation uses the DIN5008 template, the recurring plan is not shown in the report. Steps to reproduce: ------------------- * Make sure…
When generating a quotation for a recurring plan, if the quotation uses the DIN5008 template, the recurring plan is not shown in the report. Steps to reproduce: ------------------- * Make sure l10n_din5008 is installed * Create a Swiss company * Go to the subscription app and create an order with a recurring plan * Print the quotation > Observation: The recurring plan is not shown in the report. Why the fix: ------------ We add a new scss rule to make sure the recurring plan is always shown in the report. https://github.com/odoo/enterprise/blob/fb2eb6cfdc4527e102dd22321975ab3f0d24b88b/sale_subscription/views/subscription_templates.xml#L7-L23 Before: <img width="790" height="677" alt="image" src="https://github.com/user-attachments/assets/342753fa-9655-41ac-a958-f94f6ae2b6c7" /> After: <img width="808" height="756" alt="image" src="https://github.com/user-attachments/assets/4ed726c5-0702-48ee-8578-8b0d2c0f4e55" /> opw-5960219 Forward-Port-Of: odoo/odoo#261727
This update fixes a potential issue where the website incorrectly displayed unavailable unit of measure (UOM) information for products. This change ensures that users receive accurate UOM feedback, preventing confusion and potential errors when placing orders. It’s a minor improvement to the website’s sales functionality.
Original PR description
In some case, the requested uom might not be available (anymore) depending on the product latest changes. Followup on 4ac31e3545f009d0f96462f6a9098d5163ad521b --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265231
This update resolves an issue where the 'is typing' indicator incorrectly appeared in muted conversations. By setting the 'is typing' status to false for muted channels, we ensure a cleaner and more accurate experience for users. This improves the overall usability of the chat feature.
Original PR description
Before this PR, the "is typing" indicator could be shown on a muted conversation. This PR disables this feature for muted conversations by forcing the isTyping field to false when muted. Ideally, we should not even send the is typing notification, but that is not possible since we broadcast them to the entire channel. task-6154090
This update corrects a bug where certain quality control test types were incorrectly visible during manufacturing operations. The change ensures that these test types are hidden by default, aligning with the intended functionality. This prevents users from accidentally selecting inappropriate test types, improving data accuracy.
Original PR description
### Issue: The `Print Label`, `Register Production`, `Register By-products`and `Register Consumed Materials` are all available in the test types at control point creation. ### Expected behavior:…
### Issue:
The `Print Label`, `Register Production`, `Register By-products`and `Register Consumed Materials` are all available in the test types at control point creation.
### Expected behavior:
These test types are only meant for manufacturing operations and are supposed to be hidden by the field domain:
https://github.com/odoo/enterprise/blob/f56aa85b4ad32c5d9ad5593df1366d72e88da0e4/mrp_workorder/models/quality.py#L102-L104 https://github.com/odoo/enterprise/blob/00d6cccd75c402378698a6fd11ee2692f2361c7f/mrp_workorder/models/quality.py#L20-L24
### Cause of the issue:
Since saas-18.1: 5ef007a2116e528b796ebe80fb291ba5f1a94c8f domains are optimised into equivalents SQL clause with better sql performances. This optimization results in the following match for boolean fields:
`('field', '=', True)` -> `('field', 'in', OrderedSet([True]))`
`('field', '=', False)` -> `('field', ' not in', OrderedSet([True]))`
Because of these:
https://github.com/odoo/odoo/blob/82b16e8feb3d60a9a3855e3adb3164ae5a6c041d/odoo/orm/domains.py#L1058-L1079 https://github.com/odoo/odoo/blob/82b16e8feb3d60a9a3855e3adb3164ae5a6c041d/odoo/orm/domains.py#L1215-L1236
Now the issue is that the specific `search_method` of the `allow_registration` field is then called with this optimized domain: https://github.com/odoo/odoo/blob/82b16e8feb3d60a9a3855e3adb3164ae5a6c041d/odoo/orm/domains.py#L860-L866 https://github.com/odoo/enterprise/blob/00d6cccd75c402378698a6fd11ee2692f2361c7f/mrp_workorder/models/quality.py#L20-L24
And since `value` is defined as a non empty ordered set in both cases it the search method returns a True leaf as search domain.
opw-5915197
Forward-Port-Of: odoo/enterprise#117068This update resolves a technical issue that prevented invoices with Early Payment Discounts (EPD) and 0% tax from passing schematron validation, a requirement for Peppol compliance. The fix ensures correct VAT breakdown generation, addressing a previous error where duplicate tax categories were created and a hardcoded tax code was used, now guaranteeing accurate invoice generation.
Original PR description
Before this commit, creating an invoice with an Early Payment Discount (EPD) as a payment term could cause the schematron validation of the generated invoice to fail when an invoice line had a 0% tax. The issue was caused by generating two TaxSubtotal nodes for the same TaxCategory (0%, exemption code 'E'): - one for the 0% VAT - one for the EPD discount applied to the total amount However, Peppol requires a single VAT breakdown (TaxSubtotal) per VAT category (in this case: E) Additionally, when VAT was set to 0%, the allowance charge TaxSubtotal incorrectly used 'S' as a hardcoded tax category code. This commit fixes both issues. task-5900496 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264302 Forward-Port-Of: odoo/odoo#254199
This update resolves an issue where PDFs with multiple XML attachments (using the /Kids structure) weren't being correctly processed, leading to empty bills. The change expands the PDF extractor to recognize both common PDF attachment formats, ensuring all XML attachments are now extracted and included.
Original PR description
Steps to reproduce: - From the accounting dashboard, upload a PDF containing intermediate /Kids nodes representing separate xml attachments Issue: No xml will be extracted, as result the bill will be empty. However, in the chatter pdf preview, the js pdf toolkit correctly show the xml attachemnts. Analysis: The PDF spec defines two ways to organize embedded files under /EmbeddedFiles in the document's name dictionary: - /Names: a flat array of pairs located directly under /EmbeddedFiles - /Kids: an array of child nodes, each of which carries its own /Names array. The extractor currently only handled the /Names case, not detecting embedded attachments in case of PDF using a /Kids tree. This change add lookup for both structures. opw-5929274 Forward-Port-Of: odoo/odoo#252523
This update corrects a visual issue where the project sharing notebook was using dark styles, causing a conflict with the standard light mode appearance. The team removed a specific style file to ensure consistent and correct display for all users.
Original PR description
The project sharing notebook previously used dark-themed styles, which conflicted with the light mode .Removing the notebook.dark.scss file from the imported files in the manifest. task-4922564 Forward-Port-Of: odoo/enterprise#99161
This update resolves an issue where UBL invoices would fail to import due to extra spaces in the 'EndpointID' field. The change automatically removes these spaces, ensuring invoices are correctly processed. This prevents import failures and improves the reliability of our UBL billing integration.
Original PR description
**PROBLEM** When importing a ubl that, for some reason, have trailing space on the text of the EndpointID node, we refuse it. This PR strips the trailing spaces on the import. **STEP TO REPRODUCE** 1. Import a ubl as a bill, with a trailing space in the EndpointID of the other party. 2. Notice the import fail, with the error: The Peppol endpoint (50238597645 ) is not valid. It should contain only letters and digit. opw-6227395 Forward-Port-Of: odoo/odoo#265266
This update resolves an issue where contact display names were not correctly reflecting the associated company when the company's country was set to Brazil. The fix ensures that child contacts linked to Brazilian companies maintain their correct display name association, improving data accuracy for Brazilian users.
Original PR description
### Steps to reproduce: - Install Brazilian localization and 'Contacts' app - Create a contact linked to a company - Change company's country to 'Brazil' - Reload the page and check the contact display name > Contact name no longer shows the associated company name ### Cause of Issue: Upon changing the country on the company's contact form, `_compute_is_company()` method is called for this `partner` and all of its children. https://github.com/odoo/odoo/blob/795fc4706ad9d6fa7389996800e642ebbaaf395d/addons/l10n_latam_base/models/res_partner.py#L37-L40 Since all the `partners` (either companies or individuals) that have 'Brazil' as their country have `l10n_latam_identification_type_id.is_vat` by default, the child contact is switched to a company due to the condition above. ### Fix: Ensure the LATAM-specific `is_company` logic only applies to independent partners (root contacts), not to child contacts created from/linked to a company. opw-6213562
This update fixes an issue where multiple attachments to invoices (like timesheets) sometimes used the same filename, leading to confusion. The change ensures that each additional report has a unique filename, preventing attachment conflicts and improving email reliability. This ensures consistent and accurate attachments for users.
Original PR description
Problem: When adding additional dynamic reports to the “Invoice: Send by Email” template, reports without a configured `print_report_name` incorrectly use the invoice filename. This is an issue because multiple attachments can have the same exact filename. Example from related ticket: the user attached timesheets to their template and both the invoice PDF and timesheet attachment used the same filename. Expected: The additional report should use its own fallback filename (ex: `timesheets_INV_XXX.pdf`) or its configured `print_report_name`. Actual: The additional report uses the invoice filename instead. To fix this, reports without `print_report_name` now fallback to: `<report name>_<invoice name>.pdf` as done in v18.0 Related Ticket: 6207518 and 6175376 Forward-Port-Of: odoo/odoo#264841
This update corrects a bug where portal users could inadvertently delete documents they shouldn't have, potentially leading to data loss during automated cleanup. The fix ensures portal users can only delete documents they own, aligning with the intended functionality. This change improves data integrity and reduces the risk of unintended data deletion.
Original PR description
Reproduce: with rpc call as portal user, you can archive documents you have access to. This is not desired as this may lead to records being deleted when the cron collects the trash, but we only wanted to support portal users deleting only records they own. What we did when calling toggle_active should be done for all calls to `write` with `active`. It also removes the need for `_raise_if_unauthorized_archive` and `_unlink_except_unauthorized`. Task-6205627 Forward-Port-Of: odoo/enterprise#117647 Forward-Port-Of: odoo/enterprise#116886
This update fixes a performance issue in the partner update process. Specifically, it ensures that VAT checks and related updates only happen when a partner's parent ID is actually changed. This prevents unnecessary processing and potential errors, especially when updating partners through the API.
Original PR description
When updating a partner's parent_id, ensure the VAT check and move line updates are only triggered if the parent_id actually changes. This prevents unnecessary validations and side effects when writing the same parent_id value. This fix improves performance and avoids spurious errors when updating partners via the API. task-[6214466](https://www.odoo.com/odoo/project.task/6214466) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264175