Daily updates from Odoo
Friday, January 16, 2026
23 changes · saas-18.4
Resolved issues and error corrections
This update resolves an issue where applying a zero-amount discount on sale orders would trigger an error. The fix ensures the system handles zero discounts gracefully, preventing disruptions to the sales process. The change improves data integrity and user experience.
Original PR description
The system raises an error when the user tries to apply a fixed amount discount of 0.0. **Steps to produce:** - Install `Sales` module with demo data. - From the settings enable `discount`. - Make a sale order with product > click on Discount > click Fixed Amount and set amount as `0.0` > click on apply. **Error:** `ZeroDivisionError : float division by zero` **Cause:** - When the discount amount is set to 0.0, at [1] we attempt to compute the factor, which causes an error due to a division by zero. **Solution:** - Added a condition to check that current_base_amount_currency is not zero, and if it is, set the factor to 0.0. [1]: https://github.com/odoo/odoo/blob/10887c3081afbfd0734c6a3ac24301c94d14bc24/addons/account/models/account_tax.py#L3718-L3720 **sentry-6967181350** I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233151
This update resolves an issue where users would encounter access errors when closing the 'Thank You' dialog after signing a document from a record they couldn't access. The fix ensures the system verifies read access to the related record before redirecting, resulting in a smoother sign-off experience for users.
Original PR description
Version: - 18.0 Steps to reproduce: - Send a signature request to an internal user from a record that the signer cannot access. - The user signs the document and then tries to close the Thank You dialog. Before: - When a user signs a document sent from a record they don’t have access to, closing the "Thank You" dialog triggers an access error. - This happens because the system tries to open the related record after signing, but the signer does not have permission to view that record. After: - Now the system first checks if the signer has read access to the related record before redirecting. Impact: - Users will not see an access error message after signing a document. task-5353126 Forward-Port-Of: odoo/enterprise#104161 Forward-Port-Of: odoo/enterprise#100961
A customer modified their Gift Card and E-Wallet products to use inventory, causing an inconsistency in the system. This fix prevents these products from being automatically converted back to service-type products, maintaining accurate inventory counts. This change addresses a recurring customer request and highlights the need for a more general solution.
Original PR description
The customer changed the service-type products “Gift Card” and “E-Wallet” to storable products and used them in stock. May be they could use as physical gift cards, and physical e-wallets for company. As a result, these products now have on-hand quantities, which creates an issue. After the upgrade, they will be converted back to service-type products, causing an on-hand quantity inconsistency in the test case. To avoid this error, we need to keep these products as storable. TO do that we have to mark them noupdate. This is a customer-specific change, but since we have received many similar requests, we should consider making a generic fix if possible. 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#242555 Forward-Port-Of: odoo/odoo#237517
This update removes a redundant CSS class from the Point of Sale module. The class was previously used to limit button width but is no longer needed in the current design. This cleanup improves the codebase and reduces potential styling conflicts.
Original PR description
The issue was to put the button css class at a max width of 200px. But it's not used anymore. So it can be deleted bug was created from this pr : https://github.com/odoo/odoo/pull/243770 task : 5493872 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243831
This update resolves a critical issue causing the IoT Box to freeze when used as a kiosk. The team updated the browser configuration to correctly pass arguments, preventing excessive memory consumption and restoring stable operation. This ensures consistent performance for our IoT Box deployments.
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 provides users with more detailed error messages when sending documents to HMRC. By including the specific error code and message from HMRC, users can quickly diagnose and resolve issues, reducing the need for support. This enhancement improves the user experience and streamlines the process for UK VAT compliance.
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
This update fixes an issue where EU Standard invoices (Peppol Bis 3.0) were incorrectly displaying the customer's reference instead of the company registration number for key identifiers. The change ensures invoices now use the correct company identification data as required for EU e-invoice standards. This improves data accuracy and compliance.
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 corrects a bug in how the system identifies sub-locations within the stock management system. Previously, matching location IDs could lead to incorrect sub-location detection. This fix ensures accurate sub-location identification, preventing potential errors in related 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 resolves an issue where scheduled email notifications and activity updates would fail when records were deleted using a cascade delete. Now, notifications related to deleted records are automatically skipped, preventing errors and ensuring a smoother user experience. This improves reliability and avoids confusing messages for users.
Original PR description
RATIONALE When a cascade delete occurs in DB, ORM methods are not called. More specifically loosely connected records using res_model / res_id pair are not removed when unlink override exists. SPECIFICATIONS Fix various use case in mail * notifications sent for scheduled messages; * failure notifications management; * activities mark as done; Task-5138556 Forward-Port-Of: odoo/odoo#243964 Forward-Port-Of: odoo/odoo#233071
This update addresses a technical issue related to how Odoo handles record deletions, specifically cascade deletes in the database. It ensures that related records linked to messages and activities are not accessed after deletion, improving overall system performance and stability. This change was prompted by a community recommendation to enhance data management practices.
Original PR description
In order to be defensive we have to check records linked to messages, notifications or activities exist before checking related information like display_name, or even to skip them in various flows. This happens notably due to DB-level cascade deletion that does not remove side records linked through (model, res_id) pairs. It implies some additional exist queries. Task-5138556 Forward-Port-Of: odoo/enterprise#104410 Forward-Port-Of: odoo/enterprise#101185
This update resolves an error that occurred when rescheduling tasks in the Gantt chart, specifically when dependent tasks lacked defined start dates. The fix ensures the rescheduling process only calculates dates when a start date is available, preventing a 'type error' and ensuring smooth task management.
Original PR description
Currently, an error occurs when moving a task to a later date if the dependent task does not have a start date. **Steps to replicate:** * Install `mrp` with demo data and Enable `Work Order…
Currently, an error occurs when moving a task to a later date if the dependent task does not have a start date. **Steps to replicate:** * Install `mrp` with demo data and Enable `Work Order Dependencies` from settings. * Bill of Materials > Stool >Miscellaneous > Enable `Operation Dependencies` * Operations > Add a new operation and set `Blocked By` to `Assembly` * mrp > Create new manufacturing order with stool and confirm > Work orders > Start Assembly (Play button) * Planning> Planning by Work Center > Move the pill to a forward date. **Error:** `TypeError: '>' not supported between instances of 'bool' and 'datetime.datetime'` **Root cause:** * After the changes [1], `maintain buffer rescheduling` was added. It calculates the earliest possible date for the dependent task using function [2] whenever the main task is moved. This function requires the start dates to be defined to work correctly, so if a start date isn’t set yet, it causes this error. **Solution:** * Only calculate the first possible date for a dependent task if it has a start date. [1]: https://github.com/odoo/enterprise/commit/bb1da734103d47eb7b8bd47daf87579840f40a2d#diff-23c1f41bd05d5a951c68a2753826b109967d2928e05cd21893b5b3f835ba3663 [2]: https://github.com/odoo/enterprise/blob/d266cb978ff7d7c47c042e34bbe3376a3f8ac517/web_gantt/models/models.py#L404 sentry-6738017612
This update resolves an issue preventing stable IoT Box responses from being correctly interpreted. The system now prioritizes data from a specific key, ensuring that IoT Box data is reliably displayed and processed. This enhances the overall stability and functionality 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#104360 Forward-Port-Of: odoo/enterprise#104113
This update fixes a display issue where tax names and invoice labels were shown in English for Vietnamese users. By adding the necessary Vietnamese translations to the chart template CSV, users will now see these labels in Vietnamese, improving the user experience for Vietnamese-speaking businesses using Odoo.
Original PR description
The `name` and `invoice_label` fields on `account.tax` are translatable fields (translate=True), but the Vietnamese chart template CSV was missing the corresponding translation columns. This caused…
The `name` and `invoice_label` fields on `account.tax` are translatable fields (translate=True), but the Vietnamese chart template CSV was missing the corresponding translation columns. This caused tax names and invoice labels to display in English even when the user's language was set to Vietnamese. By adding the `name@vi_VN` and `invoice_label@vi_VN` columns to the tax template CSV, taxes will now display with proper Vietnamese labels when the chart of accounts is installed for Vietnamese companies, improving the user experience for Vietnamese-speaking users. Technical details: - Added `name@vi_VN` and `invoice_label@vi_VN` columns to the CSV header - Added Vietnamese translations for all tax records in the template - Translations follow Vietnamese tax terminology conventions - The chart template loader automatically processes columns with `@lang` suffix and applies them as translations for translatable fields 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#242437 Forward-Port-Of: odoo/odoo#236502
This update resolves an issue where the website builder incorrectly defaulted to the 'Add' tab when removing content from the 'Customize' tab. Previously, the builder wouldn't return to the last active tab, leading to a frustrating user experience. This fix ensures the builder correctly navigates back to the last selected tab after removing options, improving usability.
Original PR description
During [website builder refactor], there was a mistake in handling fallback of the builder tab. If the user is in the "customize" (aka "Edit") tab and changes the document in a way that there is no more options in the tab, the builder was supposed to move back to the last other tab opened, but just always fell back to "blocks" (aka "Add") Steps to reproduce: - Open website builder - Drop a section - Click on "Theme" tab - Click on the section - Click on "Remove this block" - Bug: the builder falls back to the "Add" tab instead of "Theme" tab [website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-5493971
This update fixes a critical issue where changing the backdrop color of a popup in Odoo 18.4 and 19.0 caused the popup to disappear unexpectedly. The team addressed this by switching to a class-based approach for managing popup visibility, ensuring a stable and reliable user experience.
Original PR description
Steps to reproduce in 18.4: - Add a popup on the page - Click on the popup - Change the backdrop color - Hide the popup by clicking on its entry in "Invisible Elements" - Undo - Redo - Bug: The popup disappears Steps to reproduce in 19.0: - Add a popup on the page - Click on the popup - Hover a color in the colorpicker of the backdrop option of the popup - Stop hovering the color - Bug: The popup disappears
This update fixes an issue where the link popover remained open after a snippet was removed from the website. The change ensures the popover closes automatically when a snippet is deleted, improving the user experience and preventing visual clutter. This resolves a minor usability problem.
Original PR description
Description of the issue this PR addresses:
- When removing a snippet, the link popover stayed open because its `pointerdown` handler didn’t trigger, leaving the popover visible even after its selected content element was removed.
- A previous fix used { capture: true } on the document `pointerdown` listener, but this also triggered when interacting with the link type `dropdown` and color picker, closing the popover triggers `applyCallback` and causing nested links to be created.
After this commit:
- Close the link popover from `on_will_remove_handlers` before the target element is removed from the DOM.
- This ensures the popover closes when removing the snippet.
task-5359000
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves a technical error that prevented users from processing payments through Razorpay in the POS module, specifically when using Indian localization. The fix removes a problematic code element that was causing an error, ensuring smooth payment processing for our Indian customers.
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 resolves a problem where imported sale orders containing kit products were incorrectly splitting sales into individual lots. The change prevents this behavior, ensuring accurate POS sales processing for kit products. This improves the reliability of our 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 where the 'Other Input' section of the Payroll app incorrectly displayed trailing zeros for negative salary attachment counts. The fix adjusts a widget to properly handle negative values, ensuring accurate reporting of attachment numbers. This improves the clarity and reliability of payroll data.
Original PR description
Steps to Reproduce: - install Payroll app - create an employee and create a salary attachment. - check the negative value for salary attachment - generate a payslip Issue: - In "Other Input" section, salary attachment count displays value with trailing decimal zeros for negative amounts. Reason: - The field is using the widget float_without_trailing_zeros which should remove the extra decimal zeros but it doesn't work when the value is negative. Solution: - Fix the regular expression in the float_without_trailing_zeros widget to handle negative values and properly remove trailing decimal zeros. task-5477466
This update corrects a data inconsistency in Odoo, ensuring Bulgaria's currency is accurately listed as EUR. As Bulgaria transitions to using the Euro on January 1, 2026, this change aligns Odoo's data with the latest official currency information. This ensures accurate reporting and financial processes related to 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 resolves a technical issue causing tracebacks when generating the Follow-up Report in Partner Ledger. It ensures that general accounting entries are automatically set to 'no_followup', streamlining reporting. Importantly, payments from Point of Sale (POS) systems are still included in follow-up reports.
Original PR description
* Fix traceback when opening the follow-up report and customer statement. * General(MISC) entries should be no_followup by default. Except entries coming from pos should not be excluded from follow-ups. Forward-Port-Of: odoo/enterprise#104500 Forward-Port-Of: odoo/enterprise#104433
This update fixes a bug where sale warnings weren't showing for customers linked to a company contact. The change ensures that warnings set on a company are correctly displayed when creating sales orders with customers associated with that company. This improves the accuracy of sales alerts and prevents missed opportunities.
Original PR description
### Issue: Due to this issue, the sale warning message is only shown when the warning message is set on partner itself, not partner's company. #### Steps to reproduce (with demo data): 1- Enable `Sale warnings` from setting. 2- On `Contacts` app, open `Azure Interior`, and add a sale warning from `Notes` tab. 3- Create a SO with `Brandon Freeman` from `Azure Interior` as the customer. 4- No sale warning is shown. ### Cause: The IMP #192211 replaces warning popup with a message. However, it doesn't check for the warning from `partner_id.parent_id`, which was the case before that PR. This is the case with purchase as well. opw-5404983 Forward-Port-Of: odoo/odoo#242050
This update resolves an issue where rapid receipt printing via USB printers occasionally caused errors. The fix ensures only one thread can access the printer at a time, preventing conflicts and guaranteeing reliable printing performance. This improves the overall stability of the receipt printing process.
Original PR description
When printing many receipts quickly using a USB printer, this error was occasinally occuring: ``` WARNING ? odoo.addons.iot_drivers.iot_handlers.drivers.printer_driver_base: Failed to query ESC/POS…
When printing many receipts quickly using a USB printer, this error was occasinally occuring: ``` WARNING ? odoo.addons.iot_drivers.iot_handlers.drivers.printer_driver_base: Failed to query ESC/POS status ERROR ? root: Could not set configuration: [Errno 16] Resource busy ``` This would cause `python-escpos` to be disabled and fallback to just CUPS printing. The issue was caused by two threads trying to access the printer at the same time, which could happen in two ways: - IoT thread with `python-escpos` and CUPS try to access the printer at the same time. - Two IoT threads with `python-escpos` try to access the printer at the same time (this can happen if two receipt actions are received at the same time). Both of these scenarios should now prevented: - Now, if we are using `python-escpos`, we also use it to print the receipt as well as checking the status. CUPS is never used so there should be no interference from it. - We now have an `escpos_lock` (per printer, not global) that is acquired when accessing the printer via `python-escpos`. This ensures that different threads cannot both try to access the printer at the same time. task-5490942 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr