Daily updates from Odoo
Thursday, September 25, 2025
88 changes
18 changes
Enhancements to existing features
This update improves internal tax calculation helpers used for global discounts, down payments, and future combo product changes. It helps keep invoice totals stable during tax recomputation and prepares accounting logic for upcoming product handling improvements.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228440
This improves how website translation editing identifies content that can be translated. It avoids marking non-saveable page elements as directly editable, reducing unwanted editing behavior while keeping translatable attributes available for translation.
Original PR description
[IMP] html_builder, *: improve the logic of the translation plugin *: website The goal of this commit is to improve the logic of the `TranslationPlugin` plugin. Indeed, we do not want this plugin to…
[IMP] html_builder, *: improve the logic of the translation plugin *: website The goal of this commit is to improve the logic of the `TranslationPlugin` plugin. Indeed, we do not want this plugin to handle the addition of the `o_editable` class to html elements. Instead we let this task to `SetupEditorPlugin` as usual. The problem is still that some html elements have translatable attributes and those elements will not have the `o_editable` class as they do not have the branding (oe data information). To handle those, a new `o_editable_attribute` system class is added on them. Thanks to those classes, we know which nodes are translatable (elements that are editable and elements with the `o_editable_attribute` class have an attribute that is translatable). The advantage of handling the translation that way is that we do not add the `o_editable` class on elements that are not savable. This is better also in order to not add the `contenteditable` attribute abusively. Related to task-4367641
Resolved issues and error corrections
When an Indian purchase bill is reset to draft, its GSTR-2B reconciliation is now returned to a pending state, disconnected from the GST return period, and cleared of prior exceptions. This helps finance teams reprocess changed bills cleanly and avoid stale reconciliation information.
Original PR description
When a purchase invoice (bill) is reset to Draft: - Reset GSTR-2B reconciliation status to "pending" - Unlink from GST return period - Clear any existing exceptions This ensures that the bill returns to its initial stage for proper reconciliation. Task ID: 5095582 Forward-Port-Of: odoo/enterprise#95251 Forward-Port-Of: odoo/enterprise#95026
Odoo now accepts Taiwan business VAT numbers under the country’s revised validation rules. This prevents valid newly issued Taiwanese company numbers from being incorrectly rejected when entered on customer or vendor records.
Original PR description
As the number of UBN in taiwan is expected to be exhausted, the numbers have been expended. To do so, the verification logic has been revised from the checksum being divisible by 10 to it being divisible by 5. stdnum is not yet supporting this new validation, and if it does it will take some time for Odoo to use the updated package, so we will handle the validation ourselves from now on. see https://www.ntbna.gov.tw/singlehtml/bbabfd4af20541b7859b4c5a099081f6?cntId=0625114d47274366baab1d3317f866ab task-5064712 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228385 Forward-Port-Of: odoo/odoo#225468
Users with approval rights can now view timesheets on private-project tasks they follow, matching their existing task access. This prevents missing timesheet information in task views and reports for authorized approvers.
Original PR description
**Issue:** Users with "All Timesheets" rights can't see other users’ timesheets on tasks they followed within private projects, even though they had access to the task itself. **Cause:** The security…
**Issue:** Users with "All Timesheets" rights can't see other users’ timesheets on tasks they followed within private projects, even though they had access to the task itself. **Cause:** The security rules for approvers (`timesheet_line_rule_approver` and `timesheet_analysis_report_approver`) only check project-level follower access and ignore task-level access. https://github.com/odoo/odoo/blob/48cfd650053c794a838c130605c4280351b4f5d9/addons/hr_timesheet/security/hr_timesheet_security.xml#L66-L76 https://github.com/odoo/odoo/blob/48cfd650053c794a838c130605c4280351b4f5d9/addons/hr_timesheet/security/hr_timesheet_security.xml#L108-L117 **Steps to reproduce:** 1. Create a private project (`privacy_visibility == 'followers'`) 2. Give another user (e.g., Marc Demo) "All Timesheets" rights and only "User" project access 3. Add Marc Demo as a follower of a task in that private project 4. Have another user log time on that task 5. Log in as Marc Demo Marc cannot see the other user's timesheets, neither on the task form nor in reporting. opw-5022877 Forward-Port-Of: odoo/odoo#224025
Fixes an issue where website forms configured to send an email could fail when submitted after selecting the outgoing mail option in Studio. This helps ensure visitors can submit contact or email forms without triggering backend errors.
Original PR description
Currently, an error occurs when submitting the 'Send Email' form. Steps to Reproduce: - Install the `website` and `web_studio` modules. - Go to `website` > Click on `Edit` > `Drag and drop` form. -…
Currently, an error occurs when submitting the 'Send Email' form. Steps to Reproduce: - Install the `website` and `web_studio` modules. - Go to `website` > Click on `Edit` > `Drag and drop` form. - click the form and in actions select the `more models`, and select `outgoing mails(mail.mail)` model and `save`. - Submit the form, and the error appears in the logs. `KeyError: 'website_form_signature'` This error occurs when submitting the "Send Email" form from the website. When the user chooses the model Outgoing Mails (mail.mail), the email_to hidden field is not added. This is because email_to is only added when the recipient email value is changed from the sidebar via apply [1]. As a result, the email_to hidden field is missing from the form. And the website_form_signature is added from [2], but due to the condition at [3], the code at [2] is not executed. When it is accessed at [4], KeyError is raised. This commit ensures that when the user selects the action model, if there is a hidden field email_to, it is added to the form with its default value. [1]: https://github.com/odoo/odoo/blob/3b16debc6d6557334082fdf841b20ef0e31fc9d2/addons/website/static/src/builder/plugins/form/form_option_plugin.js#L863 [2]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/tools.py#L252 [3]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/tools.py#L236 [4]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/controllers/form.py#L88 Related Community PR: https://github.com/odoo/odoo/pull/226598 sentry-6746753251
This fix ensures Turkish Nilvera e-invoice files are recognized with the correct file type during import. As a result, imported invoice records can be decoded properly instead of being left empty.
Original PR description
The imported records are not being decoded correctly due to _get_edi_decoder returning an empty value. This happens because the value of import_file_type for UBL.TR is incorrectly returned as TR by _get_import_file_type. As a result, the decoder cannot be found, and the records are left empty. task-4714467 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes editing website snippets with icons behave more predictably by preventing unwanted selections and toolbar actions. It reduces confusing highlights and error messages when users click social media, share, or rating icons in the website editor.
Original PR description
Backport of https://github.com/odoo/odoo/pull/227520.
This update prevents validation errors when users log timesheets on Helpdesk tickets linked to projects without a company set. It ensures the correct company information is preserved, helping multi-company users create timesheets reliably during normal use and migrations.
Original PR description
Steps to Reproduce: ------------------ - Open Helpdesk. - Go to Configuration → Helpdesk Teams. - Create a new team. - Enable the Billing feature and assign a project to this team. - Set the…
Steps to Reproduce: ------------------ - Open Helpdesk. - Go to Configuration → Helpdesk Teams. - Create a new team. - Enable the Billing feature and assign a project to this team. - Set the project’s Company field to Null. - Create an employee for the current user in another company. - Ensure the user has employees in both companies. - Create a new ticket (or open an existing one) in the newly created team. - Try creating a new timesheet → a Validation Error is raised. Root Cause: ----------------- When a user has employees associated with multiple companies and tries to log a timesheet with multi-company enabled, a validation error occurs. **This happens because:** - The default company is derived from the project linked to the Helpdesk team. Since the company_id field on the project is no longer required, it may be Null, leading to an error when fetching the correct [employee for the company](https://github.com/odoo/odoo/blob/6a36015e2ee69aafe3880bf1fff38439af5cd673/addons/hr_timesheet/models/hr_timesheet.py#L214-L216 ). - Additionally, the [company check](https://github.com/odoo/enterprise/blob/83a1b88c8cae4db5c9b1bf82ee7ebb4e13c41b2a/helpdesk_timesheet/models/analytic.py#L81-L82) is incorrect. The code is checking whether the `company_id` key exists in a `list of vals`, whereas it should be checked directly on the vals dict itself. Issue Faced: ------------- In version 18.3, timesheets are created during migration [here](https://github.com/odoo/upgrade/blob/24f85bbc3408bf10b1cee93e4c395edf806beaa8/migrations/helpdesk_timesheet/saas~18.3.1.0/post-migrate.py#L44-L58 ). Even though the correct company_id is passed, it gets overridden during the process. and If the associated project does not have a company set, the company_id becomes False [here](https://github.com/odoo/enterprise/blob/83a1b88c8cae4db5c9b1bf82ee7ebb4e13c41b2a/helpdesk_timesheet/models/analytic.py#L81-L82), which results in a Validation Error because the [here](https://github.com/odoo/odoo/blob/6a36015e2ee69aafe3880bf1fff38439af5cd673/addons/hr_timesheet/models/hr_timesheet.py#L214-L216) unable to determine the correct employee linked to the company. OPW: 5004092 Forward-Port-Of: odoo/enterprise#95226 Forward-Port-Of: odoo/enterprise#92507
Point of Sale now shows the optional product popup when a cashier scans a product barcode, matching the behavior already available when selecting a product on screen. This helps ensure add-on or related product offers are not missed during faster barcode-based checkout flows.
Original PR description
Before this commit, the optional product popup was only displayed when adding a product by clicking on it. When the product was added through barcode scanning, the popup did not appear. This commit ensures that the optional product popup is consistently shown both when clicking on a product and when scanning its barcode. opw-5089175 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227656
Public holidays now create timesheet entries using each employee’s flexible working schedule instead of the company default. This prevents incorrect 8-hour time off entries when an employee’s configured average day is different, improving payroll and timesheet accuracy.
Original PR description
## Issue: For employees with flexible working hours, when a Public Holiday is added, the timesheet was filled with 8h based on the company’s default calendar instead of the employee’s flexible…
## Issue: For employees with flexible working hours, when a Public Holiday is added, the timesheet was filled with 8h based on the company’s default calendar instead of the employee’s flexible schedule ## Cause: When creating `resource.calendar.leaves`, timesheets call `_work_time_per_day()` This method uses `work_hours_data` containing half-day intervals (tmp_start/tmp_end) These data come from `_attendance_intervals_batch()`, but we were passing an empty resource, so the check for `flexible_hours` failed: https://github.com/odoo/odoo/blob/bd7d5fdf8df3a4d544de3e2493cd4b3966fa7d0b/addons/resource/models/resource_calendar.py#L382-L393 We want to use the calendar itself as the calendar resource to get the `work_hours_data` ## Steps to reproduce: - On an employee, in Work Information, set the Working Hours to Flexible 40 hours/week - Modify Flexible 40 hours/week (Hours per Week: 30, Average Hour per Day: 6) - In Time Off > Configuration > Public Holidays, add a New holiday (You can leave default values) - Go in Timesheets > All Timesheets, before the fix, the flexible employee have 8h in internal for Time Off opw-4881758 Forward-Port-Of: odoo/odoo#225876
This fixes an issue where customers could hit an access error when creating an invoice from a Point of Sale QR code in multi-company setups. Businesses using branch companies with shared sales journals can now complete self-service invoicing more reliably.
Original PR description
Before this commit, in a multi-company setup, an access error could occur when generating an invoice from a QR code. Steps to reproduce: 1. Create a parent company and a branch company. 2. Create a PoS in the branch company and assign a sales journal from the parent company. 3. Create a product assigned to the branch company. 4. Enable Self Service invoicing in the PoS settings. 5. Create an order in the PoS and then try to create an invoice with the QR code. Result: an access error was raised. opw-5050536 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225483
This fix ensures Turkish Nilvera e-invoice files are recognized with the correct import type. As a result, imported invoice records can be decoded and populated instead of being left empty.
Original PR description
The imported records are not being decoded correctly due to _get_edi_decoder returning an empty value. This happens because the value of import_file_type for UBL.TR is incorrectly returned as TR by _get_import_file_type. As a result, the decoder cannot be found and the records are left empty. task-4714467 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Point of Sale cash in/out access rules were reverted to require users to have at least invoicing rights. This helps ensure cash movement actions remain limited to users with appropriate financial permissions.
Original PR description
This commit reverts the changes made in https://github.com/odoo/odoo/pull/190342/commits/d47b256a10713618a853d9eeacb2c1665330ed4f as they are not wanted. The user that wants to have access to cash in/out should have the invoicing rights at least. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220304 Forward-Port-Of: odoo/odoo#212994
The live chat widget now respects the configured delay before opening automatically. This prevents chats or chatbots from appearing immediately when a business has set a waiting period, improving the intended visitor experience.
Original PR description
### Issue: The livechat delay doesn't work as expected. #### To reproduce: 1- Create a livechat channel 2- In channel rules, set these rules: - Live Chat Button: Open automatically - Enable ChatBot: Always - Open automatically: 20 3- In widget tab, you can find channel URL, open it. 4- We expect it opens after 20s but it opens immediately ### Cause: This issue is caused during refactoring: https://github.com/odoo/odoo/commit/6d903ccd0ad48fc8f58094b45f01656b1d47acfe https://github.com/odoo/odoo/blob/6d903ccd0ad48fc8f58094b45f01656b1d47acfe/addons/im_livechat/static/src/embed/common/autopopup_service.js#L21-L27 Here storeService promise is not ready yet but we are trying to use `storeService.livechat_rule?.auto_popup_timer` which is `Nan`, as a result the timeout will be 0, opening it without delay. opw-4988003 Forward-Port-Of: odoo/odoo#228386
This fix prevents older translation entries from being deleted during upgrades when they were not explicitly marked as translated. Businesses upgrading Odoo can recover and restore more existing translations instead of seeing previously translated fields revert to English.
Original PR description
After upgrading Odoo from earlier versions to versions >= Odoo 15.5, you will notice that some fields that were translated before, are now in English. This is likely because those translations were…
After upgrading Odoo from earlier versions to versions >= Odoo 15.5, you will notice that some fields that were translated before, are now in English. This is likely because those translations were not marked as `state='translated'` in the DB. However, the missing translations were removed from the `_ir_translation` table during the upgrade. With this patch, we still keep the conservative behavior of only auto-translating fields marked as `state='translated'` in the DB (which is still probably wrong, because user translations should remain the same; if Odoo was displaying translated text before the upgrade and it is not after it, that's probably a bug; but that's another story...), but we no longer delete the other fields. This way, you can still mark them as translated after the upgrade and use the new tooling provided in https://github.com/odoo/upgrade-util/commit/fd578e31973596bf7f283ea5c6ebbdfd3314f8bc to recover those translations after the upgrade. @moduon MT-11570 cc @aj-fuentes Forward-Port-Of: odoo/odoo#228404
Creating analytic items linked to invoices with a zero total no longer causes the Accounting app to crash. This improves reliability for businesses that need to record or analyze no-cost invoices, adjustments, or fully discounted transactions.
Original PR description
The system will crash with error when try to create a analytic item. **Steps to Produce:-** 1. Install the `Accounting` module with demo data. 2. Go to `Settings > enable Analytic Accounting`. 3.…
The system will crash with error when try to create a analytic item. **Steps to Produce:-** 1. Install the `Accounting` module with demo data. 2. Go to `Settings > enable Analytic Accounting`. 3. Navigate to `Accounting > Customers > Invoices`. 4. Create a new invoice with total amount = 0 and confirm it. 5. Go to Accounting > Accounting > Transactions > Analytic Items. 6. Create a new Analytic Item and: - Set a value in the `Project` field. - Under the `Accounting` section, select the `Journal Item` linked to the last created 0-amount invoice and save. **Error:-** `ZeroDivisionError: float division by zero` **Cause:-** - At [1], when `line.balance` is 0.0 (for example, when a journal item is defined with a total of 0.0), the system raises an error. **Solution:-** - Added a condition to compute only when line.balance exists; otherwise,set the value to 100. [1]: https://github.com/odoo/odoo/blob/dff2423ac320fdb97d6bf1f106dc84be1d71cac2/addons/account/models/account_move_line.py#L3248-L3251 **sentry-6844926153** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226148 Forward-Port-Of: odoo/odoo#225068
The website shop sitemap generation was adjusted to avoid excessive memory use when stores have very large product catalogs. This helps prevent server crashes caused by search engine crawlers repeatedly requesting product sitemaps.
Original PR description
### Issue Server crashes with MemoryErrors when a database has a large product catalogs. ### Solution This commit disables the prefetcher to avoid MemoryErrors when generating the sitemap for large product catalogs as web crawlers would continously crash the server when requesting the sitemap. ### References opw-5001680 opw-4955333 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228078 Forward-Port-Of: odoo/odoo#223054
15 changes
Enhancements to existing features
Bank statement matching no longer uses a fixed tolerance for automatically reconciling slightly higher invoices against lower bank payments. The tolerance is now controlled by a system setting, defaulting to zero, so businesses can decide whether to allow partial automatic matching and suspense-account differences.
Original PR description
This commit: https://github.com/odoo/enterprise/commit/9bea3f2c517e77fdb822eb53b9648e9fc5478dac introduce a tolerance. If an invoice has a bigger amount than the bank line but within the tolerance of 3%, reconcile the invoice automatically and leave the difference in the suspense account. The statement line will be partially matched. This commit will change that tolerance to use a system parameter instead. For old DB the tolerance is at 0 and for new DB a system parameter (0 by default) will be put so that people that want to use it can. task-5106655
Resolved issues and error corrections
Odoo now accepts Taiwan business VAT numbers under the country's revised validation rules. This prevents valid newly issued numbers from being incorrectly rejected when customers or companies enter their tax details.
Original PR description
As the number of UBN in taiwan is expected to be exhausted, the numbers have been expended. To do so, the verification logic has been revised from the checksum being divisible by 10 to it being divisible by 5. stdnum is not yet supporting this new validation, and if it does it will take some time for Odoo to use the updated package, so we will handle the validation ourselves from now on. see https://www.ntbna.gov.tw/singlehtml/bbabfd4af20541b7859b4c5a099081f6?cntId=0625114d47274366baab1d3317f866ab task-5064712 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228324 Forward-Port-Of: odoo/odoo#225468
Purchase bills that are moved back to Draft now have their GSTR-2B reconciliation details reset. This prevents old return-period links or exceptions from carrying over, helping teams reconcile GST data accurately when the bill is reviewed again.
Original PR description
When a purchase invoice (bill) is reset to Draft: - Reset GSTR-2B reconciliation status to "pending" - Unlink from GST return period - Clear any existing exceptions This ensures that the bill returns to its initial stage for proper reconciliation. Task ID: 5095582 Forward-Port-Of: odoo/enterprise#95251 Forward-Port-Of: odoo/enterprise#95026
The livechat widget now respects the configured delay before opening automatically. This prevents chats or chatbots from appearing immediately when a business has chosen to wait before engaging visitors.
Original PR description
### Issue: The livechat delay doesn't work as expected. #### To reproduce: 1- Create a livechat channel 2- In channel rules, set these rules: - Live Chat Button: Open automatically - Enable ChatBot: Always - Open automatically: 20 3- In widget tab, you can find channel URL, open it. 4- We expect it opens after 20s but it opens immediately ### Cause: This issue is caused during refactoring: https://github.com/odoo/odoo/commit/6d903ccd0ad48fc8f58094b45f01656b1d47acfe https://github.com/odoo/odoo/blob/6d903ccd0ad48fc8f58094b45f01656b1d47acfe/addons/im_livechat/static/src/embed/common/autopopup_service.js#L21-L27 Here storeService promise is not ready yet but we are trying to use `storeService.livechat_rule?.auto_popup_timer` which is `Nan`, as a result the timeout will be 0, opening it without delay. opw-4988003
This fixes a problem where users with employees in multiple companies could be blocked from adding timesheets on Helpdesk tickets when the linked project had no company set. The change preserves the correct company during timesheet creation, reducing validation errors during daily work and migrations.
Original PR description
Steps to Reproduce: ------------------ - Open Helpdesk. - Go to Configuration → Helpdesk Teams. - Create a new team. - Enable the Billing feature and assign a project to this team. - Set the…
Steps to Reproduce: ------------------ - Open Helpdesk. - Go to Configuration → Helpdesk Teams. - Create a new team. - Enable the Billing feature and assign a project to this team. - Set the project’s Company field to Null. - Create an employee for the current user in another company. - Ensure the user has employees in both companies. - Create a new ticket (or open an existing one) in the newly created team. - Try creating a new timesheet → a Validation Error is raised. Root Cause: ----------------- When a user has employees associated with multiple companies and tries to log a timesheet with multi-company enabled, a validation error occurs. **This happens because:** - The default company is derived from the project linked to the Helpdesk team. Since the company_id field on the project is no longer required, it may be Null, leading to an error when fetching the correct [employee for the company](https://github.com/odoo/odoo/blob/6a36015e2ee69aafe3880bf1fff38439af5cd673/addons/hr_timesheet/models/hr_timesheet.py#L214-L216 ). - Additionally, the [company check](https://github.com/odoo/enterprise/blob/83a1b88c8cae4db5c9b1bf82ee7ebb4e13c41b2a/helpdesk_timesheet/models/analytic.py#L81-L82) is incorrect. The code is checking whether the `company_id` key exists in a `list of vals`, whereas it should be checked directly on the vals dict itself. Issue Faced: ------------- In version 18.3, timesheets are created during migration [here](https://github.com/odoo/upgrade/blob/24f85bbc3408bf10b1cee93e4c395edf806beaa8/migrations/helpdesk_timesheet/saas~18.3.1.0/post-migrate.py#L44-L58 ). Even though the correct company_id is passed, it gets overridden during the process. and If the associated project does not have a company set, the company_id becomes False [here](https://github.com/odoo/enterprise/blob/83a1b88c8cae4db5c9b1bf82ee7ebb4e13c41b2a/helpdesk_timesheet/models/analytic.py#L81-L82), which results in a Validation Error because the [here](https://github.com/odoo/odoo/blob/6a36015e2ee69aafe3880bf1fff38439af5cd673/addons/hr_timesheet/models/hr_timesheet.py#L214-L216) unable to determine the correct employee linked to the company. OPW: 5004092 Forward-Port-Of: odoo/enterprise#95226 Forward-Port-Of: odoo/enterprise#92507
This fix prepares Nemhandel-related partner information during module installation instead of calculating it later during updates. This helps reduce long update times for businesses using Danish Nemhandel integration.
Original PR description
To avoid lengthy update due to the compute of the records by the ORM, let's pre-compute the nemhandel fields on the install of the module. 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#228102
Fixed an issue where customers could hit an access error when creating a Point of Sale invoice from a QR code in a multi-company setup. This helps branches using shared parent-company journals complete self-service invoicing reliably.
Original PR description
Before this commit, in a multi-company setup, an access error could occur when generating an invoice from a QR code. Steps to reproduce: 1. Create a parent company and a branch company. 2. Create a PoS in the branch company and assign a sales journal from the parent company. 3. Create a product assigned to the branch company. 4. Enable Self Service invoicing in the PoS settings. 5. Create an order in the PoS and then try to create an invoice with the QR code. Result: an access error was raised. opw-5050536 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225483
Coupon-based discounts are now clearly identified on sales orders, so Shiprocket Cash on Delivery shipment requests include the correct discounted amount. This also prevents discount lines from being accidentally reset to zero when their quantity changes, improving order total accuracy.
Original PR description
Issue ----- When using Shiprocket with the "Cash On Delivery", the request sent to the Shiprocket API doesn't contain the amounts discounted by coupons. Steps to reproduce ----- - Set an Indian…
Issue ----- When using Shiprocket with the "Cash On Delivery", the request sent to the Shiprocket API doesn't contain the amounts discounted by coupons. Steps to reproduce ----- - Set an Indian company up (with valid address and some dummy mail & phone) - Create a customer "IN Cust" (with valid address and some dummy mail & phone) - Create a product "IN Prod" - Sale price: 1000 INR - Weight: 100g - Set some reference, eg "INPROD" - Create a Shiprocket delivery method - Payment Method: COD - Set some "Shiprocket Channel" - Enable Debug requests - In settings, enable "Promotions, Loyalty & Gift Card" - Go to Sales > Products > Discount & Loyalty - Create a new program - Name: 50% off - Program Type: Coupons - Change the existing reward to 50% discount on order - Generate some coupon - Copy the code to the generated coupon - Create a SO our product and customer - Use the coupon code & apply the 50% discount - Add shipping - Shiprocket COD - Get rate - Confirm the SO - Go to the picking & validate it - Open logs (Settings/Technical/Database Structure/Logging) - Open the "shiprocket_request_external/shipments/create/forward-shipment" log --> total_discount is 0 Cause ----- The problem comes from https://github.com/odoo/enterprise/blob/a971f55e736f9645eda137fd6dcb574483886483/delivery_shiprocket/models/shiprocket_request.py#L301 There are 2 issues here. The first and most important one is how we find the discount lines. https://github.com/odoo/enterprise/blob/a971f55e736f9645eda137fd6dcb574483886483/delivery_shiprocket/models/shiprocket_request.py#L320 Discounts from coupons don't use the `sale_discount_product_id`, we'll have to define a new function to override in `sale_loyalty` for this. The second issue is that we use the untaxed discount amount. https://github.com/odoo/enterprise/blob/a971f55e736f9645eda137fd6dcb574483886483/delivery_shiprocket/models/shiprocket_request.py#L321 This leads to an incoherent total amount, since the tax is computed on the products' full prices. We should instead be forwarding the total discount value (with tax included to offset the taxes applied on the full product price). ----- Enterprise PR: https://github.com/odoo/enterprise/pull/92310 Ticket: opw-4755357 Forward-Port-Of: odoo/odoo#228108 Forward-Port-Of: odoo/odoo#223517
Shiprocket Cash on Delivery shipments now include coupon-based discounts in the discount amount sent to Shiprocket. This helps ensure the collected COD amount matches the customer’s discounted order total, including taxes.
Original PR description
Issue ----- When using Shiprocket with the "Cash On Delivery", the request sent to the Shiprocket API doesn't contain the amounts discounted by coupons. Steps to reproduce ----- - Set an Indian…
Issue
-----
When using Shiprocket with the "Cash On Delivery", the request sent to the Shiprocket API doesn't contain the amounts discounted by coupons.
Steps to reproduce
-----
- Set an Indian company up (with valid address and some dummy mail & phone)
- Create a customer "IN Cust" (with valid address and some dummy mail & phone)
- Create a product "IN Prod"
- Sale price: 1000 INR
- Weight: 100g
- Set some reference, eg "INPROD"
- Create a Shiprocket delivery method
- Payment Method: COD
- Set some "Shiprocket Channel"
- Enable Debug requests
- In settings, enable "Promotions, Loyalty & Gift Card"
- Go to Sales > Products > Discount & Loyalty
- Create a new program
- Name: 50% off
- Program Type: Coupons
- Change the existing reward to 50% discount on order
- Generate some coupon
- Copy the code of the generated coupon
- Create a SO our product and customer
- Use the coupon code & apply the 50% discount
- Add shipping
- Shiprocket COD
- Get rate
- Confirm the SO
- Go to the picking & validate it
- Open logs (Settings/Technical/Database Structure/Logging)
- Open the "shiprocket_request_external/shipments/create/forward-shipment" log
--> total_discount is 0
Cause
-----
The problem comes from
https://github.com/odoo/enterprise/blob/a971f55e736f9645eda137fd6dcb574483886483/delivery_shiprocket/models/shiprocket_request.py#L301
There are 2 issues here.
The first and most important one is how we find the discount lines.
https://github.com/odoo/enterprise/blob/a971f55e736f9645eda137fd6dcb574483886483/delivery_shiprocket/models/shiprocket_request.py#L320
Discounts from coupons don't use the `sale_discount_product_id`. We can use the `_can_be_invoiced_alone` function to find both regular and loyalty discounts
https://github.com/odoo/odoo/blob/ee63fe7863dfa0083674dc927c1aa67c9e36c481/addons/sale/models/sale_order_line.py#L1033-L1041
def _can_be_invoiced_alone(self):
""" Whether a given line is meaningful to invoice alone.
It is generally meaningless/confusing or even wrong to invoice some specific SOlines
(delivery, discounts, rewards, ...) without others, unless they are the only left to invoice
in the SO.
"""
self.ensure_one()
return self.product_id.id != self.company_id.sale_discount_product_id.id
https://github.com/odoo/odoo/blob/ee63fe7863dfa0083674dc927c1aa67c9e36c481/addons/sale_loyalty/models/sale_order_line.py#L50-L51
def _can_be_invoiced_alone(self):
return super()._can_be_invoiced_alone() and not self.is_reward_line
We just have to be careful not to accidentally include delivery fees because of
https://github.com/odoo/odoo/blob/ee63fe7863dfa0083674dc927c1aa67c9e36c481/addons/delivery/models/sale_order_line.py#L18-L19
def _can_be_invoiced_alone(self):
return super()._can_be_invoiced_alone() and not self.is_delivery
The second issue is that we use the untaxed discount amount.
https://github.com/odoo/enterprise/blob/a971f55e736f9645eda137fd6dcb574483886483/delivery_shiprocket/models/shiprocket_request.py#L321
This leads to an incoherent total amount, since the tax is computed on the products' full prices. We should instead be forwarding the total discount value (with tax included to offset the taxes applied on the full product price).
-----
Community PR:
https://github.com/odoo/odoo/pull/223517
Ticket:
opw-4755357
Forward-Port-Of: odoo/enterprise#95262
Forward-Port-Of: odoo/enterprise#92310This change restores the requirement that Point of Sale users need at least invoicing rights to perform cash in/out operations. It prevents broader access that was previously introduced and keeps cash movement controls aligned with accounting permissions.
Original PR description
This commit reverts the changes made in https://github.com/odoo/odoo/pull/190342/commits/d47b256a10713618a853d9eeacb2c1665330ed4f as they are not wanted. The user that wants to have access to cash in/out should have the invoicing rights at least. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220304 Forward-Port-Of: odoo/odoo#212994
This fixes a rounding mismatch in Mexican electronic invoice validation by aligning calculations with the rounded values used in the XML. It helps prevent valid invoices from being rejected because of tiny decimal differences.
Original PR description
The validation in the XML are made based on values rounded to 6 digits. However in Odoo, we do the computation without any rounding. 352.2413793103448 + 876.7435344827586 + 162.92327586206898 + 198.73706896551727 + 526.0383620689655 + 17.241379310344826 = 2133.925 ~= 2133.93 352.241379 + 876.743534 + 162.923276 + 198.737069 + 526.038362 + 17.241379 = 2133.924999 ~= 2133.92 != 2133.93 opw-5096249
The Helpdesk performance dashboard now opens the SLA Success Rate view correctly. Users can see recently closed tickets that were resolved within SLA, making performance reporting accurate and actionable.
Original PR description
**Steps to Reproduce** - Install the Helpdesk module. - Check the My Performance section. - Click on SLA Success Rate. **Issue:** Clicking on SLA Success Rate does nothing. It should display the closed tickets from the past seven days that were resolved within the SLA. **Cause:** Missed a domain filter, so no data is returned or shown. **Fix:** - Add the correct domain filter to show closed tickets. - And also modified compute method as well, so both are aligned. The problem arises in this [commit](https://github.com/odoo/enterprise/pull/76079/files#diff-e145df8bcc8742bcac578d5b05b6fc1aeaef55d236952a2a58d61ac92ce84a67R258-R260) task-4781994
ENASARCO taxes are now correctly treated as both withholding and pension fund contributions in Italian electronic invoices. This ensures the required XML sections are populated properly, reducing compliance errors for Italian accounting workflows.
Original PR description
* = l10n_it, l10n_it_edi, l10n_it_edi_withholding The ENASARCO tax works both as a Withholding (negative) tax and as a Pension Fund tax. It must appear in the XML in both sections DatiRitenuta and CassaPrevidenziale. - We modified the master data to amend this error. Now the correct Withholding type appears right after installing the module. - Since there was an explicit check on taxes being both, we removed it. - Removed an exception where ENASARCO taxes were allowed to have positive values Forward-Port-Of: odoo/odoo#228161 Forward-Port-Of: odoo/odoo#226357
This fix prevents Accounting from crashing when users create analytic items linked to invoices with a total value of zero. It improves reliability for businesses that use zero-balance invoices or adjustments in their accounting workflows.
Original PR description
The system will crash with error when try to create a analytic item. **Steps to Produce:-** 1. Install the `Accounting` module with demo data. 2. Go to `Settings > enable Analytic Accounting`. 3.…
The system will crash with error when try to create a analytic item. **Steps to Produce:-** 1. Install the `Accounting` module with demo data. 2. Go to `Settings > enable Analytic Accounting`. 3. Navigate to `Accounting > Customers > Invoices`. 4. Create a new invoice with total amount = 0 and confirm it. 5. Go to Accounting > Accounting > Transactions > Analytic Items. 6. Create a new Analytic Item and: - Set a value in the `Project` field. - Under the `Accounting` section, select the `Journal Item` linked to the last created 0-amount invoice and save. **Error:-** `ZeroDivisionError: float division by zero` **Cause:-** - At [1], when `line.balance` is 0.0 (for example, when a journal item is defined with a total of 0.0), the system raises an error. **Solution:-** - Added a condition to compute only when line.balance exists; otherwise,set the value to 100. [1]: https://github.com/odoo/odoo/blob/dff2423ac320fdb97d6bf1f106dc84be1d71cac2/addons/account/models/account_move_line.py#L3248-L3251 **sentry-6844926153** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226148 Forward-Port-Of: odoo/odoo#225068
This fix prevents certain existing translations from being deleted during upgrades, even when they were not previously marked as fully translated. Businesses can recover and reuse those translations after upgrading instead of unexpectedly seeing content revert to English.
Original PR description
After upgrading Odoo from earlier versions to versions >= Odoo 15.5, you will notice that some fields that were translated before, are now in English. This is likely because those translations were…
After upgrading Odoo from earlier versions to versions >= Odoo 15.5, you will notice that some fields that were translated before, are now in English. This is likely because those translations were not marked as `state='translated'` in the DB. However, the missing translations were removed from the `_ir_translation` table during the upgrade. With this patch, we still keep the conservative behavior of only auto-translating fields marked as `state='translated'` in the DB (which is still probably wrong, because user translations should remain the same; if Odoo was displaying translated text before the upgrade and it is not after it, that's probably a bug; but that's another story...), but we no longer delete the other fields. This way, you can still mark them as translated after the upgrade and use the new tooling provided in https://github.com/odoo/upgrade-util/commit/fd578e31973596bf7f283ea5c6ebbdfd3314f8bc to recover those translations after the upgrade. @moduon MT-11570 cc @aj-fuentes Forward-Port-Of: odoo/odoo#228404
2 changes
Resolved issues and error corrections
Fixed an issue that could cause the Brazilian electronic invoicing flow to fail when users confirmed several invoices at the same time. This helps teams process invoice batches more reliably and avoid interruptions in daily billing operations.
Original PR description
opw-5107516
The manufacturing work order employee list could appear empty for users without certain HR permissions because an employee avatar field triggered an access error. The update limits use of that avatar field for users who do not have HR user rights, helping affected staff see the expected list again.
Original PR description
HR use an access right on field. However they have an issue with the avatar field that return an error while it should not. Until they provide a fix limit the avatar field when the user don't have the hr user group. Forward-Port-Of: odoo/enterprise#95424
18 changes
New functionality added to Odoo
A new link between Point of Sale and Planning helps cashiers find the right employee faster at login. Employees with active scheduled shifts are shown first, followed by other employees, reducing confusion during shift changes.
Original PR description
In this commit: ================= Added a new module `pos_planning` that links the Point of Sale and Planning modules to enhance employee shift management. Details: ----------- - Display employees with active Planning shifts (start–end) upfront on the PoS login screen. - The employee list now shows the first five upfront, prioritizing Planning employees (by shift time), followed by others sorted alphabetically. Remaining employees are accessible under the "More…" section. Task-4824283 Related PR-https://github.com/odoo/odoo/pull/213298
Enhancements to existing features
Financial reports now expand detailed lines more efficiently by removing an unnecessary processing step. This should make report navigation faster for users working with larger accounting reports, without changing the report content or workflow.
Stock forecasts now better account for subscription-related quantities and orders at the individual product level. This gives teams a clearer view of future stock needs tied to subscriptions, helping planning and fulfillment decisions.
Original PR description
Update the stock forecast backend and frontend to support per-product computation and display of subscription quantities and orders. Task [4763124](https://www.odoo.com/odoo/project/966/tasks/4763124) odoo/odoo#212774 Forward-Port-Of: odoo/enterprise#92394
Customers can now choose a country when searching for delivery pickup locations across supported carriers. This makes pickup point selection more accurate for international deliveries and keeps carrier integrations aligned with the updated checkout experience.
Original PR description
Modify sendcloud, fedex, and other delivery providers to match the changes made to include a country selector to the location selector. task-3984383 See also: https://github.com/odoo/odoo/pull/188490
Greek reporting now supports XML exports for Intrastat and EC Sales List tax reports in the required submission format. Users can also rely on defined deadlines and a guided wizard to select the correct period and return type, helping reduce manual preparation effort and compliance risk.
Original PR description
- Deadlines are defined for both the Intrastat and EC Sales List reports. - Custom report handlers were added to export data in the required file format. - A submission wizard was implemented to guide users through selecting the period and return type. Task-4781277
Serbian Intrastat and tax reporting now include defined submission deadlines, required export formats, and guided submission wizards. This helps businesses prepare compliant filings more easily and reduces manual effort when selecting reporting periods and return types.
Original PR description
- Submission deadlines are now defined for Intrastat. - Custom report handlers were added to export data in the required file format. - A submission wizard was implemented to guide users through selecting the period and return type. Task-4781290
Worksheet reports now use more balanced column widths, giving less space to labels and more space to the related values. This makes reports easier to read, especially PDFs where long values previously had limited room.
Original PR description
The column for the label and its value in the worksheet report had fixed widths that were not optimal, leading to wasted space and poor usability, especially when the label was short and the value was long. This was particularly noticeable in PDF reports. This commit improves the layout by adjusting the column widths. The label column now takes approximately 30% of the width, and the value column takes the remaining 70%. This provides a more balanced and readable report, enhancing the overall user experience. task-4968117
The German Datev report now processes large exports in smaller batches instead of loading everything at once. This reduces the risk of memory errors and helps businesses complete large accounting exports more reliably.
Original PR description
The Datev report fetches huge number of records resulting in memory error. Processing the report in batches to avoid the memory error and few code optimizations. task-4861366 After <img width="1920" height="1013" alt="image" src="https://github.com/user-attachments/assets/89cd5a32-63af-4e2e-bac6-651b99ecc902" /> Before <img width="1920" height="1036" alt="image" src="https://github.com/user-attachments/assets/2153be9f-32f0-4a48-8c3e-a3e963bc2a99" />
Resolved issues and error corrections
Czech VAT control statements now place invoices without a partner VAT number in section A5 regardless of amount. Special VAT regime entries for travel services and margin schemes are also consistently reported in A5, helping businesses avoid incorrect VAT classifications.
Original PR description
Before this commit, the l10n_cz VAT return report classified entries in section A4 if their total amount exceeded 10,000 CZK, and in section A5 if the amount was 10,000 CZK or less. - In l10n_cz, create an invoice with a cz partner without vat, over 10000. - In tax return the entry will be in section A4. With this commit: - Entries with no partner VAT number are now always classified under A5, regardless of the total amount. - Entries using a special VAT regime (l10n_cz_scheme_code), corresponding to Section 89 – travel services and Section 90 – margin scheme) are also always classified under A5, regardless of the amount. opw-4953787 Forward-Port-Of: odoo/enterprise#92833
The audit balances view now shows cumulative balances, including amounts from previous periods and unaffected earnings. This gives finance teams a more accurate view of balances for audit and reporting work.
Original PR description
The audit balances view should accumulate the balances from previous periods. Before it only computed the balance for the current period. It also take into account the unaffected earnings. Forward-Port-Of: odoo/enterprise#94634
This fixes a situation where an IoT Box action could run twice if the first connection method timed out and a fallback connection retried the same request. Each action now carries a unique identifier so repeated fallback requests can be recognized and ignored, reducing risks like duplicate prints or registrations.
Original PR description
Community PR: odoo/odoo#225678 In the following case an IoT box action can be duplicated: 1. Request is sent over longpolling 2. Action takes longer than 6s to execute, longpolling times out on the client side 3. Websocket request is sent as a fallback 4. Both requests cause an action to be executed (double blackbox registration, double print, etc.) To solve this we will send an ID with every action, and if the ID has already been recently seen we will ignore the action and log a warning. This PR handles the client side code, which just involves adding the new `action_unique_id` key to all our actions that are using fallbacks. task-5067737 Forward-Port-Of: odoo/enterprise#94031 Forward-Port-Of: odoo/enterprise#93985
This fixes an issue where Sign templates created from records such as sales orders did not use the original document to choose which fields could be added. Users can now drag and drop the expected fields for that document, while templates are protected from combining incompatible fields from different document types.
Original PR description
Before this commit, when a new template was created from a mail thread record, the reference doc was not used to filter out the fields to display. it would prevent to drag and drop sale.order fields even if the template was created from the sale application. task-5085468 Forward-Port-Of: odoo/enterprise#94591
The Indian GSTR-1 document summary now keeps existing generated data instead of recreating it each time the summary card is opened. This prevents accidental data loss, avoids unnecessary processing, and removes an incorrect “Missing” status when summary data is already available.
Original PR description
Issue: - Document summary was regenerated every time the user clicked on the document summary card. - This caused data loss for already existing summaries and unnecessary restart of the process. - 'Missing' tag appeared in document summary even when data was present. - Additionally, record_name was passed in _check_suite_in_gstr1_report, but as a computed field it never worked as intended. Fix: - Adjusted logic so the document summary is generated only when empty. - Subsequent clicks now reuse the existing summary instead of regenerating it. - No missing tag appears if document summary exists. - Replaced record_name with record_model to ensure correct record count and computed record name. Forward-Port-Of: odoo/enterprise#94447
This fixes an issue where users working across multiple companies could be blocked from creating Helpdesk timesheets when the linked project had no company set. The change preserves the correct company during timesheet creation, helping avoid validation errors in daily support and migration workflows.
Original PR description
Steps to Reproduce: ------------------ - Open Helpdesk. - Go to Configuration → Helpdesk Teams. - Create a new team. - Enable the Billing feature and assign a project to this team. - Set the…
Steps to Reproduce: ------------------ - Open Helpdesk. - Go to Configuration → Helpdesk Teams. - Create a new team. - Enable the Billing feature and assign a project to this team. - Set the project’s Company field to Null. - Create an employee for the current user in another company. - Ensure the user has employees in both companies. - Create a new ticket (or open an existing one) in the newly created team. - Try creating a new timesheet → a Validation Error is raised. Root Cause: ----------------- When a user has employees associated with multiple companies and tries to log a timesheet with multi-company enabled, a validation error occurs. **This happens because:** - The default company is derived from the project linked to the Helpdesk team. Since the company_id field on the project is no longer required, it may be Null, leading to an error when fetching the correct [employee for the company](https://github.com/odoo/odoo/blob/6a36015e2ee69aafe3880bf1fff38439af5cd673/addons/hr_timesheet/models/hr_timesheet.py#L214-L216 ). - Additionally, the [company check](https://github.com/odoo/enterprise/blob/83a1b88c8cae4db5c9b1bf82ee7ebb4e13c41b2a/helpdesk_timesheet/models/analytic.py#L81-L82) is incorrect. The code is checking whether the `company_id` key exists in a `list of vals`, whereas it should be checked directly on the vals dict itself. Issue Faced: ------------- In version 18.3, timesheets are created during migration [here](https://github.com/odoo/upgrade/blob/24f85bbc3408bf10b1cee93e4c395edf806beaa8/migrations/helpdesk_timesheet/saas~18.3.1.0/post-migrate.py#L44-L58 ). Even though the correct company_id is passed, it gets overridden during the process. and If the associated project does not have a company set, the company_id becomes False [here](https://github.com/odoo/enterprise/blob/83a1b88c8cae4db5c9b1bf82ee7ebb4e13c41b2a/helpdesk_timesheet/models/analytic.py#L81-L82), which results in a Validation Error because the [here](https://github.com/odoo/odoo/blob/6a36015e2ee69aafe3880bf1fff38439af5cd673/addons/hr_timesheet/models/hr_timesheet.py#L214-L216) unable to determine the correct employee linked to the company. OPW: 5004092 Forward-Port-Of: odoo/enterprise#95226 Forward-Port-Of: odoo/enterprise#92507
This fix restores one-time payment options in Swiss payroll and hides salary attachment items that should not be available. It helps payroll users access the correct payment actions while reducing confusion from unsupported or unwanted menu entries.
Original PR description
- Reintroduce one time payments - Blacklist salary attachments Forward-Port-Of: odoo/enterprise#95438
The mobile Point of Sale payment screen now correctly keeps the Validate button disabled when no payment method is selected. This helps prevent incomplete payments from being confirmed by mistake and improves consistency between mobile and desktop checkout flows.
Original PR description
- Fix issue where the `Validate` button (in the payment screen) was not correctly disabled on mobile devices when no payment methods was selected. community PR: https://github.com/odoo/odoo/pull/225917 task-id: 5072759 Forward-Port-Of: odoo/enterprise#95357 Forward-Port-Of: odoo/enterprise#94100
Point of Sale receipts are now sent to the receipt printer selected in the POS setup, even when other printers are also connected. This prevents customer receipts from accidentally printing on kitchen or preparation printers, reducing confusion during checkout.
Original PR description
Steps to reproduce: 1. Configure a POS with a receipt printer and a preparation printer. 2. Ensure that the preparation printer has a higher ID than the receipt printer (you can force this by deleting it and letting the IoT redetect it.) 3. Try to print a receipt. EXPECTED: The receipt is printed on the configured receipt printer. ACTUAL: The receipt is printed on the prepation printer. This was caused by the hardware proxy code assuming that there will only be 1 printer `iot.device` model loaded, and that it will correspond to the receipt printer. The fix is to ensure the hardware proxy only chooses the printer that is configured as the receipt printer. Forward-Port-Of: odoo/enterprise#93225
Purchase bills that are reset to Draft now return to their initial GSTR-2B reconciliation state. This prevents old GST return links or exception flags from carrying over, helping teams reconcile corrected bills accurately.
Original PR description
When a purchase invoice (bill) is reset to Draft: - Reset GSTR-2B reconciliation status to "pending" - Unlink from GST return period - Clear any existing exceptions This ensures that the bill returns to its initial stage for proper reconciliation. Task ID: 5095582 Forward-Port-Of: odoo/enterprise#95471 Forward-Port-Of: odoo/enterprise#95026
24 changes
Enhancements to existing features
The Turkish Nilvera integration now syncs more invoice types, including E-Archive files and invoices created directly in Nilvera. Users can retrieve invoice statuses and PDFs from one "Sync with Nilvera" action, with PDFs shown in preview and attached automatically for easier record keeping.
Original PR description
[IMP] l10n_tr_nilvera_einvoice: refactor API to include E-Invoices & E-Archive Fixed bugs in API calls triggered during fetch requests and added support for fetching the status of E-Archive files. Updated the action button label to "Sync with Nilvera", which now fetches invoice statuses, retrieves PDFs for both E-Archive and E-Invoices, and includes invoices generated directly in Nilvera, enabling support for additional invoice types currently not supported in Odoo. Invoices/Bills are marked as "Successful" once retrieved. Retrieved PDFs are displayed in the preview and automatically attached to the chatter. The original limit of fetching a maximum of 30 records (status and PDFs) is maintained. task-4714467 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225919 Forward-Port-Of: odoo/odoo#223599
When the IoT box cannot fully start because its drivers fail to load, users will now be sent to a helpful error page instead of the database selection screen. The new page better explains that the IoT box is down and provides links to log files for troubleshooting.
Original PR description
Before this commit, if the IoT box enters a state where Odoo can start but the `iot_drivers` module fails to load, the user would be redirected to the database selector instead of the IoT homepage. This commit adds an nginx redirect to instead send the user to the 502 error page, stating that the IoT box is down and with links to see the log files. This page is more representative of the situation and more helpful for the user. task-5111009 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website header and footer background choices now behave consistently when users switch between color combinations, solid colors, and gradients. Applying a color combination clears any previously selected solid color or gradient, making the design controls easier to understand and reducing unexpected results.
Original PR description
It was difficult for the user to understand how the background colorpicker works. The color combination would not be resetted when applying a solid color or a gradient, and vice versa. To simplify the behavior, applying a color combination now resets the solid color or gradient previously applied. The user will then choose to reapply its previous choice or not. task-5062183
The HTML editor now highlights code blocks by language, making technical content easier to read and present. Users can choose the language from a toolbar and copy the original code as plain text, improving the editing experience for documentation and website content.
Original PR description
This integrates the PrismJS library to provide syntax highlighting to code blocks. Whenever a `pre` element is in the editor, it gets wrapped into a `contenteditable=false` container, with an invisible editable `textarea` element overlayed on top of the `pre`. Whenever the contents of the `textarea` change, they pass through the library to get highlighted in the `pre`. A special toolbar appears at the top of the code block, for the user to pick a language and copy the code in plain text. task-4585835 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
Odoo now validates Taiwanese business VAT numbers using the latest official checksum rule. This prevents valid newer Taiwan UBNs from being incorrectly rejected as the available number range expands.
Original PR description
As the number of UBN in taiwan is expected to be exhausted, the numbers have been expended. To do so, the verification logic has been revised from the checksum being divisible by 10 to it being divisible by 5. stdnum is not yet supporting this new validation, and if it does it will take some time for Odoo to use the updated package, so we will handle the validation ourselves from now on. see https://www.ntbna.gov.tw/singlehtml/bbabfd4af20541b7859b4c5a099081f6?cntId=0625114d47274366baab1d3317f866ab task-5064712 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228385 Forward-Port-Of: odoo/odoo#225468
Point of Sale now applies fiscal position tax rules consistently with accounting. This prevents customers and staff from seeing one tax amount at checkout while the finalized backend order records a different tax treatment.
Original PR description
If a fiscal position is not related to any tax, when selecting said fiscal position in the pos, the tax from the product is kept. When looking at the paid order in the backend the tax is removed on…
If a fiscal position is not related to any tax, when selecting said fiscal position in the pos, the tax from the product is kept. When looking at the paid order in the backend the tax is removed on the order line and the price unit and price with taxes are different (although no tax recorder on the line). Steps to reproduce: ------------------- * Create a fiscal position and assign no tax to it * On the pos config, add this fiscal position and the domestic one to the available fiscal positions * Open pos session * Select a product that has a 15% tax * Change the fiscal position to the one just created > Observation: We still see that the tax is computed based on the 15% * Pay the order * Go see the order in backend > Observation: price unit: 100, no tax, price with taxes 115 Why the fix: ------------ A recent refactoring happened on the accounting side related to fiscal positions: https://github.com/odoo/odoo/commit/9a97157920c845120861dda49d81d3150e015974 https://github.com/odoo/odoo/blob/e284dfd80bde632e6446fc0b8d3276689da35200/addons/account/models/partner.py#L155-L163 The behavior after this refactoring is the following: When changing fiscal position: - If the original tax is available for the fiscal position, we use it - If the original tax is not available but the fiscal position has an available tax that is set to be replacement for the original one, we use the replacement tax - If the original tax is not available but the fiscal position has an available tax which is NOT a replacement for the original one, we keep the original one - If the fiscal position has no tax available, we remove the tax In this fix we apply the same logic inside the pos. Without the fix we would keep the original tax in the frontend but when passed in the backend the tax with fiscal position was recomputed with the logic from accounting. This explained the difference we observed. opw-4978056 Forward-Port-Of: odoo/odoo#223164
This fixes issues that could leave the IoT Box homepage blank after an update and ensures the service starts only after the update process is complete. It also keeps the IoT Box reachable on the network and improves checkout reliability when switching to Odoo 19.0.
Original PR description
This PR is made of 3 small commits: - `[FIX] iot_drivers: fix blank homepage after checkout` Due to the `odoo.service` starting before the `rc.local` file has finished updating the Odoo code, you can…
This PR is made of 3 small commits: - `[FIX] iot_drivers: fix blank homepage after checkout` Due to the `odoo.service` starting before the `rc.local` file has finished updating the Odoo code, you can end up with the old Python code running but the updated JS code loading in the browser. This can lead to a blank screen as a traceback occurs trying to read the MAC address. We fix this in two ways: - A quick fix, which is just making the JS code robust to the missing value to avoid crashing. - A proper fix that will require a new image, as it modifies the `odoo.service` file to add `rc-local.service` as a dependency. This means Odoo will not start until `rc.local` has finished executing. - `[FIX] iot_box_image: set http_interface explicitly` From Odoo 19.0, a warning is logged when your `http_interface` config setting is not explicitly set. From Odoo 20.0, the default value will change from `0.0.0.0` to `127.0.0.1`, which would break the IoT box as it would only listen to localhost requests. To fix this we explicitly set the `http_interface` value to `0.0.0.0` in `odoo.conf` so that the IoT box will listen to all requests. - `[FIX] iot_drivers: use FETCH_HEAD when checking out` The current 25.07 IoT box image cannot checkout to 19.0 databases due to an issue where the `git reset origin/19.0 --hard` command fails. In the other places where we use `git reset` in the IoT box this was fixed by using `FETCH_HEAD` (an alias for the last branch that was fetched). In this commit we apply the same fix to the `upgrade.py` checkout. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228231
Brazilian service invoices with installments now send installment amounts without taxes, preventing mismatches during tax validation. This reduces invoice rejection errors and helps ensure smoother electronic invoicing with AvaTax.
Original PR description
Service invoices require us to send installments without taxes. If we include taxes we get an error: **Errors**: Rejection: Total Installments doesn’t match Total Lines ∑ installments[m]grossValue - ∑ (lines[n].lineAmount-line[n].lineTaxedDiscount) <> 0 This **PR** clears taxes before tax calculation to ensure the installments we send are correct. **task**-4761630 Forward-Port-Of: odoo/enterprise#95331 Forward-Port-Of: odoo/enterprise#85108
This fix prevents left and right arrow keys used inside dropdowns from accidentally triggering navigation elsewhere in the interface. It also makes select menu group ordering consistent across browsers, reducing unexpected display differences for users on Firefox.
Original PR description
#### First fix because SelectMenu tests where not passing as I just switched to Firefox: The groups sorting function in the SelectMenu component (`groupsList.sort`) was not anti-symmetric, when…
#### First fix because SelectMenu tests where not passing as I just switched to Firefox: The groups sorting function in the SelectMenu component (`groupsList.sort`) was not anti-symmetric, when either group_1 or group_2 was falsy, both sortFn(group_1, group_2) and sortFn(group_2, group_1) would return 1 where it should return -1 in one of the cases. This issue only occured as Firefox seem to have a slightly different sorting algorithm, which would cause (group_2, group_1) to be called instead of (group_1, group_2), raking the group_2 before group_1. Thi commit fixes that by making the function more consistant at handling falsy values. This is probably better explained here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#description #### And the task related fix: This commit prevents arrowleft and arrowright hotkeys to trigger on other parts of the UI when navigating a dropdown. Enterprise: https://github.com/odoo/enterprise/pull/94478 Task: [5048895](https://www.odoo.com/odoo/project.task/5048895) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes misplaced pop-up elements when editing content inside centered iframe previews, such as the mobile preview in the mass mailing builder. Users should now see menus and overlays appear next to the intended item instead of incorrectly shifting to the side.
Original PR description
This commit fixes an issue with containers inside iframes that renders the position computation for the popper incorrect. The problematic situation arises when the popper needs to be positioned near…
This commit fixes an issue with containers inside iframes that renders the position computation for the popper incorrect.
The problematic situation arises when the popper needs to be positioned near an element inside an iframe and the base container used for the computation is inside the same iframe.
This case happens in the mass_mailing builder when in the mobile preview as the iframe is centered in the viewport and the element that enables the scrolling when overflowed is also inside the iframe.
When in this case, the min and max values for the variant and the direction are computed on a container that is really smaller than the viewport. Meaning that when this happens the popper is positioned on the left of the iframe, which is completely incorrect.
To fix this issue, when we detect that we are indeed in the problematic situation, we add the left and top values of the iframeBox to direction{Min/Max} and variant{Min/Max}. This way the variantOffset is computed based on the position of the container adjusted to the iframe.
before:
<img width="3021" height="1549" alt="image" src="https://github.com/user-attachments/assets/f6c6f3b7-cdd1-4699-97ab-732ef3ec5ff1" />
after:
<img width="3099" height="1502" alt="image" src="https://github.com/user-attachments/assets/00c06936-de4d-48a0-b4f7-19cab3fc821d" />
task-5109138
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prPurchase bills in the Indian GST reporting flow now return to a clean reconciliation state when reset to Draft. This prevents old GSTR-2B statuses, return-period links, or exceptions from carrying over and helps ensure the bill can be reconciled correctly again.
Original PR description
When a purchase invoice (bill) is reset to Draft: - Reset GSTR-2B reconciliation status to "pending" - Unlink from GST return period - Clear any existing exceptions This ensures that the bill returns to its initial stage for proper reconciliation. Task ID: 5095582 Forward-Port-Of: odoo/enterprise#95251 Forward-Port-Of: odoo/enterprise#95026
This fix prevents Helpdesk timesheet creation from failing when a linked project has no company set and the user works across multiple companies. It keeps the correct company information during timesheet creation, reducing validation errors for support teams and migrations.
Original PR description
Steps to Reproduce: ------------------ - Open Helpdesk. - Go to Configuration → Helpdesk Teams. - Create a new team. - Enable the Billing feature and assign a project to this team. - Set the…
Steps to Reproduce: ------------------ - Open Helpdesk. - Go to Configuration → Helpdesk Teams. - Create a new team. - Enable the Billing feature and assign a project to this team. - Set the project’s Company field to Null. - Create an employee for the current user in another company. - Ensure the user has employees in both companies. - Create a new ticket (or open an existing one) in the newly created team. - Try creating a new timesheet → a Validation Error is raised. Root Cause: ----------------- When a user has employees associated with multiple companies and tries to log a timesheet with multi-company enabled, a validation error occurs. **This happens because:** - The default company is derived from the project linked to the Helpdesk team. Since the company_id field on the project is no longer required, it may be Null, leading to an error when fetching the correct [employee for the company](https://github.com/odoo/odoo/blob/6a36015e2ee69aafe3880bf1fff38439af5cd673/addons/hr_timesheet/models/hr_timesheet.py#L214-L216 ). - Additionally, the [company check](https://github.com/odoo/enterprise/blob/83a1b88c8cae4db5c9b1bf82ee7ebb4e13c41b2a/helpdesk_timesheet/models/analytic.py#L81-L82) is incorrect. The code is checking whether the `company_id` key exists in a `list of vals`, whereas it should be checked directly on the vals dict itself. Issue Faced: ------------- In version 18.3, timesheets are created during migration [here](https://github.com/odoo/upgrade/blob/24f85bbc3408bf10b1cee93e4c395edf806beaa8/migrations/helpdesk_timesheet/saas~18.3.1.0/post-migrate.py#L44-L58 ). Even though the correct company_id is passed, it gets overridden during the process. and If the associated project does not have a company set, the company_id becomes False [here](https://github.com/odoo/enterprise/blob/83a1b88c8cae4db5c9b1bf82ee7ebb4e13c41b2a/helpdesk_timesheet/models/analytic.py#L81-L82), which results in a Validation Error because the [here](https://github.com/odoo/odoo/blob/6a36015e2ee69aafe3880bf1fff38439af5cd673/addons/hr_timesheet/models/hr_timesheet.py#L214-L216) unable to determine the correct employee linked to the company. OPW: 5004092 Forward-Port-Of: odoo/enterprise#95226 Forward-Port-Of: odoo/enterprise#92507
Fixed an issue where website event pages could identify the wrong event when the event title used non-Latin characters such as Chinese. This ensures users can reliably edit and manage events regardless of the language used in the event name.
Original PR description
Issue: The Website Event page uses a matching regex to get the event id from the url. URLs are formatted like: '/event/[event-title]-[event-id]/register' The event-id is recovered from the url by matching on the first number that is not followed by a word character. However, for non-latin event titles (e.g. Chinese), the characters are converted using '%' characters and numbers (e.g. '%E6%88%91%E'). The regex consistently fails to get the event id in this case, and returns incorrect IDs. Steps to reproduce: 1. Install `website_event` and go to the website view of any event. 2. Edit the event, to add a Chinese title 3. Save, and try to edit again the same title. Solution: The regex is modified to look for the first number that is followed by either a "/" or the end of a String. opw-5038334 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224164
This fixes an issue where non-admin website editors could see an error when changing the website menu bar. The system now avoids loading restricted view fields they are not allowed to access, so editing can continue normally without exposing protected data.
Original PR description
Scenario: - get a user with "Editor and Designer" and no admin rights - with this user, edit the website and change the menu bar Result: A traceback error is shown with this access error the logs: You do not have enough rights to access the field "visibility_password" on View (ir.ui.view). Please contact your system administrator. Operation: read Groups: allowed for groups 'Role / Administrator' Issue: In 9830f77d827c6efeb5f796caac604904350f5a80 the method ir.ui.view()._get_combined_archs was changed to prefetch more fields than before, but prefetching the "visibility_password" field was causing an access error when checking if we had access to it. Fix: prevent prefetching restricted fields. Note: the added test without the fix, fails because of the security warning error, and having the custom view still disabled. opw-4935489 Forward-Port-Of: odoo/odoo#219304
The shop price range filter now uses the corrected search term when Odoo suggests close matches, such as treating "dask" as "desk". This keeps filtering accurate and prevents shoppers from losing the ability to narrow results by price after a fuzzy search.
Original PR description
Versions
--------
- 17.0+
Steps
-----
1. Navigate to the website shop page.
2. Search for a term that is close to an existing one, but not exact ("dask" instead of "desk" for example)
Issue
-----
The price range filter will stop functioning
Cause
-----
The domain used to get the minimum and maximum prices for the price range filter used the original search term regardless of whether the actual search results are from a fuzzy search term or not
Solution
--------
When there is a fuzzy search term use it to get the minimum and maximum prices for the price range filter instead of the original search term
opw-5020545
Forward-Port-Of: odoo/odoo#228203
Forward-Port-Of: odoo/odoo#226059Point of Sale now shows the optional product popup when a cashier scans a product barcode, matching the behavior already seen when selecting a product on screen. This helps ensure upsell or add-on suggestions are not missed during faster barcode-based sales flows.
Original PR description
Before this commit, the optional product popup was only displayed when adding a product by clicking on it. When the product was added through barcode scanning, the popup did not appear. This commit ensures that the optional product popup is consistently shown both when clicking on a product and when scanning its barcode. opw-5089175 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227656
This fix prevents an access error when customers create an invoice from a QR code in Point of Sale configurations involving parent and branch companies. It helps ensure self-service invoicing works reliably when journals and products belong to related companies.
Original PR description
Before this commit, in a multi-company setup, an access error could occur when generating an invoice from a QR code. Steps to reproduce: 1. Create a parent company and a branch company. 2. Create a PoS in the branch company and assign a sales journal from the parent company. 3. Create a product assigned to the branch company. 4. Enable Self Service invoicing in the PoS settings. 5. Create an order in the PoS and then try to create an invoice with the QR code. Result: an access error was raised. opw-5050536 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225483
This fix prevents Point of Sale records created or changed on a device from disappearing during server synchronization. It also makes self-order order retrieval more reliable by tying orders to order-specific details instead of a shared table QR code, reducing confusion across devices.
Original PR description
## Commit 1: *: point_of_sale, pos_loyalty, pos_online_payment, pos_sale, pos_self_order Before this commit, when syncing records from the server, local records that were not yet synced…
## Commit 1: *: point_of_sale, pos_loyalty, pos_online_payment, pos_sale, pos_self_order Before this commit, when syncing records from the server, local records that were not yet synced (isSynced=false) could be lost if they were not present in the server response. This could happen for example when a record was created locally and the server response did not include it. This commit fixes this issue by ensuring that local records are always kept when syncing, even if they are not present in the server response. This is done by merging the local records with the server records based on their keys. --- This commit also replace all checks of the form `typeof id === "number"` with `isSynced` checks. This is because the `id` of a record can be a temporary string id before it is synced with the server. ## Commit 2 Before this commit, `table_access_token` was used to retrieve a customer's orders, making it possible to “share” orders between multiple devices by scanning the same QR code. This caused comprehension and synchronization issues. This commit rectifies this by only taking into account order-related information. - `write_date` - `state` - `access_token` If a user's device contains this information, they will be able to retrieve their orders. These changes are related to commit https://github.com/odoo/odoo/commit/b903acd72142757bfdfc31c51d78b39c8e8786b9, which adds the `self_ordering_table_id` field, allowing multiple orders from Self Order to be linked to the same table at the same time.
This fix prevents point-of-sale records created locally from being lost when data is synchronized with the server. It helps protect in-progress sales, refunds, payment settlements, and related local POS activity when connectivity or server responses are incomplete.
Original PR description
*: l10n_br_edi_pos, pos_settle_due, pos_urban_piper Before this commit, when syncing records from the server, local records that were not yet synced (isSynced=false) could be lost if they were not present in the server response. This could happen for example when a record was created locally and the server response did not include it. This commit fixes this issue by ensuring that local records are always kept when syncing, even if they are not present in the server response. This is done by merging the local records with the server records based on their keys. --- This commit also replace all checks of the form typeof id === "number" with isSynced checks. This is because the id of a record can be a temporary string id before it is synced with the server.
This fixes broken images in several Odoo email templates by replacing SVG files with PNG versions that are supported by most email clients. Customers and event attendees should now see calendar icons and logos properly in emails instead of missing-image placeholders.
Original PR description
[1] and [2] both introduced svg images in mail templates, which are not supported in most mail clients. Consequently, these emails look broken. Instead the SVGs are converted to PNGs (if not already existing) which is widely supported. PNG is required to support transparency. The custom odoo font with font_to_img route cannot be used either as it does not support colored icons. task-5095354 [1]: https://github.com/odoo/odoo/commit/376677f75192caa898dbaf7bb4e76d1a948d9471 [2]: https://github.com/odoo/odoo/commit/2e37c2ece56fa8401e9b50188f320fccbb7e0170
Salespeople can now open CRM leads even when similar leads belong to colleagues they cannot access. This prevents an error page and keeps lead review workflows moving smoothly.
Original PR description
Previously, leads belonging to a salesman with duplicates that were inaccessible to that salesman could not be accessed, instead return a traceback. Steps to reproduce: - Create a fresh database with the CRM module and demo data - Login as Marc Demo - Try to access the "DeltaPC: 10 Computer Desks" lead - A traceback is returned due to lack of access on leads - belonging to Mitchell Admin Fix: The "duplicate_lead_ids" and "duplicate_lead_count" CRM fields are computed as superuser, allowing for errorless computing even if the user does not have access to all similar leads. task-5072901
The live chat widget now respects the configured delay before opening automatically. This prevents chats from popping up immediately when a business has set a timed delay, improving the visitor experience and preserving intended engagement rules.
Original PR description
### Issue: The livechat delay doesn't work as expected. #### To reproduce: 1- Create a livechat channel 2- In channel rules, set these rules: - Live Chat Button: Open automatically - Enable ChatBot: Always - Open automatically: 20 3- In widget tab, you can find channel URL, open it. 4- We expect it opens after 20s but it opens immediately ### Cause: This issue is caused during refactoring: https://github.com/odoo/odoo/commit/6d903ccd0ad48fc8f58094b45f01656b1d47acfe https://github.com/odoo/odoo/blob/6d903ccd0ad48fc8f58094b45f01656b1d47acfe/addons/im_livechat/static/src/embed/common/autopopup_service.js#L21-L27 Here storeService promise is not ready yet but we are trying to use `storeService.livechat_rule?.auto_popup_timer` which is `Nan`, as a result the timeout will be 0, opening it without delay. opw-4988003 Forward-Port-Of: odoo/odoo#228386
This fix prevents the Point of Sale from returning to the first screen when a customer takes time to complete an online payment. It helps keep the active order details intact, avoiding empty ticket screens or unfinished orders after the payment flow resumes.
Original PR description
Description of the issue/feature this PR addresses: When doing online payment in POS, customer may take some time and the POS may go to idle state. This causes when it goes to idle and back to alive,…
Description of the issue/feature this PR addresses: When doing online payment in POS, customer may take some time and the POS may go to idle state. This causes when it goes to idle and back to alive, it will direct to the first screen. Steps to reproduce: - Create POS & setup POS online payment (use Demo online payment) - Open POS, add a product, go to payment screen, select the online payment method - Let it go to idle state (triggered by useIdleTimer) - Move the cursor, or at least make it back to active state - You'll see the screen be redirected to first screen - Do the payment, it will redirect to TicketScreen with empty order info, and when you click new order the previous one is still hanging there Alternatively take a look at the recording: https://github.com/user-attachments/assets/b8e8ae81-df04-41e0-b122-002413714735 Current behavior before PR: - Because it bounces to first screen, when attempting payment the pos does not have the order state Desired behavior after PR is merged: - Do not redirect if in payment screen, so that order context won't be lost --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215651 Forward-Port-Of: odoo/odoo#202220
Users can again add custom fields from the optional columns menu in Knowledge article lists when Studio is installed. The fix ensures Odoo correctly recognizes when this action should be editable, avoiding a blocked customization workflow.
Original PR description
Steps to reproduce ================== - Install knowledge, web_studio - Go to knowledge > Articles - Click on the optional columns dropdown - Click on "Add Custom Field" => This action is not editable by Studio Cause of the issue ================== Since https://github.com/odoo/odoo/pull/205129/commits/c18e93191c516f6e37093f068e8934cba8495891 the event ACTION_MANAGER:UI-UPDATED is triggered before the list renderer has a chance to register for it. Solution ======== We don't actually need to listen to that event to get the info we need. The action xml_id was missing, but it was added in the view subenv config. opw-5066488 Forward-Port-Of: odoo/enterprise#95433 Forward-Port-Of: odoo/enterprise#94794
5 changes
Resolved issues and error corrections
The online shop now updates available quantities correctly when customers add either a kit product or one of its components to their cart. This prevents shoppers from seeing misleading stock information and helps avoid overselling when kit items share limited inventory with individual products.
Original PR description
### Steps to reproduce: - In the settings website > Shop: - Disable `Out-of-Stock: Continue Selling`. - Enable `Show Available Qty` if below 5 units. - Create 2 storable products published on the…
### Steps to reproduce:
- In the settings website > Shop:
- Disable `Out-of-Stock: Continue Selling`.
- Enable `Show Available Qty` if below 5 units.
- Create 2 storable products published on the website:
- COMP, put 1 unit in stock.
- KIT with bom of type Kit using 1 x COMP.
- With a private window go to the shop.
- Add 1 x COMP or KIT to the chart.
#### > This is not reflected on the available quantity in stock of the other product
### Cause of the issue:
The availability on the website is computed from the product availability using the `free_qty` fetched because of this override: https://github.com/odoo/odoo/blob/d358542c9159f325b4e2ff184ed1f5cdb6b8c5a9/addons/website_sale_stock/controllers/variant.py#L10-L13 from which the cart quantity of the product itself is deduced before re-render:
https://github.com/odoo/odoo/blob/d358542c9159f325b4e2ff184ed1f5cdb6b8c5a9/addons/website_sale_stock/static/src/js/variant_mixin.js#L49-L51 https://github.com/odoo/odoo/blob/d358542c9159f325b4e2ff184ed1f5cdb6b8c5a9/addons/website_sale_stock/static/src/js/variant_mixin.js#L83-L86 While the `free_qty` is correctly computed from kit products based on the component availability:
https://github.com/odoo/odoo/blob/d358542c9159f325b4e2ff184ed1f5cdb6b8c5a9/addons/mrp/models/product.py#L211-L221 The qties in the virtual cart quantities are not recomputed base on kits.
opw-4889956
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#222945Point of Sale now alerts other devices when an order has been cancelled, paid, or invoiced elsewhere. This prevents staff from continuing to edit an order that is already finalized, avoiding errors during restaurant and checkout workflows.
Original PR description
Before this commit when another device were finalizing an order (cancel, paid or invoiced) the current device was staying on its current screen which can be PaymentScreen, SplitScreen etc. But when the user was trying to edit the order a traceback was raised because the order is finalized. Now when another device is finalizing an order, the current device will be notified and can take appropriate action, such as showing a warning message or preventing further edits to the order. taskId: 4788430
This fixes a restaurant point of sale issue where added items could fail to sync before being sent to the kitchen printer or preparation display. It helps prevent outdated order errors and keeps table orders consistent between the register and server.
Original PR description
Before this commit, if an order had no changes and no preparation display was active, adding items to the order in the restaurant PoS and then returning to the tables would sync the order to the server and mark it as not dirty. As a result, reopening the order and clicking the order button to send it to the preparation display or printer would not sync the updated changes. This caused inconsistencies and errors. Steps to reproduce: 1. Open a table, place an order, and send it to the kitchen printer 2. Add more products but instead of placing the order, go back 3. Re-enter the table, place the order, and send it 4. When placing another order, the error "Order Outdated" appears This commit fixes the syncing logic to ensure that last changes are properly synced, avoiding the "Order Outdated" error. opw-5097566 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The portal timesheet view now shows billed timesheet entries even when a customer opens it from a website linked to another company. This prevents missing timesheet information for users who are allowed to access multiple companies, improving invoice and project transparency.
Original PR description
**Steps to reproduce:** 1. Install hr_timesheet, Sales, Website > add BE company > 2. Go to website, configuration > website > update the website1 company to BE 3. Sales > create new SO > add product Junior Architect (Invoice on Timesheets) 4. Confirm > click to tasks smart-button > add timesheet > back to sales order 5. Create invoice > confirm 6. Preview > View Timesheet **Issue:** View timesheet button shows no timesheet records when accessing from different company website **Cause:** Portal timesheet domain is restricted to current website's company context. When user switches from San Francisco website to Belgium website, timesheets created under San Francisco company become invisible even though user has access to all companies. **Solution:** Add allowed_company_ids context to account.analytic.line model to include all user's accessible companies, allowing cross-company timesheet visibility. **opw-4922212**
Portal payment pages now allow a payment when the customer's linked user has access to the company tied to the document, even if their default company is different. This prevents salespeople in multi-company setups from being blocked when generating payment methods such as Brazilian boleto for the correct company.
Original PR description
Steps ----- 1. Set up a 2nd company with Brazilian l10n; 2. set up Stripe with the boleto payment method; 3. generate a sales order in BRL for BR company; 4. have the salesperson's default company be the 1st company; 5. open sale order preview; 6. attempt to generate a boleto to send to the customer. Issue ----- It wants you to switch to the other company. To do this, you either need change the company on your partner record, or your user's default company (which also changes the partner record). Changing the company in the company selector doesn't work. Cause ----- Portal payments are currently only allowed if the partner has no company, or if the partner's company matches the quotation's company. Solution -------- Also allow payments if the partner has a user profile with access to the document's company. opw-4937531
6 changes
Resolved issues and error corrections
Fixed activity date filters so completed activities that are kept for history are included in search results. This helps users find records such as CRM opportunities when filtering by an activity's completion date, reducing missing results in day-to-day follow-up and reporting.
Original PR description
## Issue: ## When using a Custom Filter on Activities > Date Done on any record like in the CRM App, the inactive activities where not included in the search domain The keep_done option on the…
## Issue: ## When using a Custom Filter on Activities > Date Done on any record like in the CRM App, the inactive activities where not included in the search domain The keep_done option on the activity_type should be activate to keep old activities The same issue occured in Activities in the Settings App in Debug Mode, with the Custom Filter on Date Done ## Cause: ## The domain in the search doesn't include inactive activities There is a lot of active test in the query ## Fix: ## When there is `date_done` in the filtered domain in functions `search_fetch()` and `_search()` in `mail_activity_mixin`, we add `active_test=False` to self context We also do tha same in the `_search()` of `mail_activity` to handle the Settings case The `search_fetch()` override is needed for App like CRM to make the full query to be executed with the `active_text` context or some informations are lost If this method doesn't include the context, the lead appeared but the linked Activities aren't fetched completely ## Limitations: ## Fixing that way can cause to get too many elements, because it will remove all the (active=True) from the all query This can lead to display inactive or archived leads in CRM, or any archived and inactive data with done activities ## Steps to reproduce: ## - Open the CRM App - Go to Configuration > Activity Types - Select Call - Toggle Keep Done to enable - Go in the CRM Pipeline - Mark any Call activity as Done - Add a Custom Filter - Set to Activities > Done Date (keep the default value for today) - Apply the filter using the Add button - Before the fix, there is nothing in the filtered pipeline opw-4744974
Helpdesk ticket lists now sort ticket references in a way that matches how users expect numbers to be ordered. This makes it easier to find the oldest or newest tickets once ticket counts reach 100 or more.
Original PR description
**Issue** With the default `helpdesk.ticket` sequence, once users reach 100 tickets, ordering tickets by `ticket_ref` in the list view is unintuitive as it is a Char field (so '11' > '100') and the results are not useful if the user wants to see the oldest/newest tickets. opw-4891916
Product searches in purchase order lines now handle product references without being affected by letter casing. This helps users find the right products more reliably and reduces delays or confusion during purchasing.
Original PR description
This commit fixes the issue where products search in PO line was case sensitive. Before this commit: Search on `product.product` (which is used in PO lines) was case sensitive if the search term matches exactly the `default_code` or `barcode` because it used exact equal `=` in the search matching. After this commit: Search on `product.product` is now case insensitive when matching with `default_code` (using `ilike`) and case sensitive when matching with `barcode` (using `like`). Task-5080161
Customer payments are no longer incorrectly included in Australia’s Taxable Payments Annual Report gross paid totals. This prevents overstated report amounts and helps businesses produce more accurate TPAR submissions.
Original PR description
Customer payment shoudn't be included in the TPAR report Steps: - Unarchive 10% TPAR tax - Make a bill for a partner X, set 10% TPAR tax on the invoice line and confirm - Create and confirm a customer payment for partner X - Go to 'Taxable Payments Annual Reports (TPAR)' -> The column 'Gross Paid' includes the customer payment Before this commit, we took all line from bank or cash journal to calculate the gross paid value. With this commit, we also restrict the lines to include only the one with 'asset_current' or 'liablility_current' account type. Ticket [link](https://www.odoo.com/odoo/project/967/tasks/5045457) opw-5045457
This update avoids repeating the same kit quantity calculations for product variants that share one bill of materials. It can greatly speed up product list loading for businesses with many automatically generated variants, reducing some searches from tens of seconds to around one second.
Original PR description
**Issue -->** When a kit/phantom BOM is used, quantity calculation for a product is overridden in `_compute_quantities_dict()`. During this override, BOMs are mapped to either `product.product`s, or…
**Issue -->** When a kit/phantom BOM is used, quantity calculation for a product is overridden in `_compute_quantities_dict()`. During this override, BOMs are mapped to either `product.product`s, or when none is specified for a BOM, to a parent `product.template` instead. This causes redundant quantity computations in the case where a BOM is mapped to a `product.template` with many variants which all in turn share one BOM record. This can happen when variants configured to be automatically created for product attributes, for example. At scale the redundant quantity computation becomes costly when repeated for every `product.product` under a single `product.template`, when all of them share the same BOM. **Solution -->** As quantities are calculated, we can cache the results of the costly `explode()` method in cases where a product's BOM is associated only with a `product.template` record, and not a `product.product`. Due to how BOM kits are identified and mapped by the domain in `_bom_find()`, any product which has been mapped to a BOM record associated only with its parent `product.template` will share an identical quantity calculation. This eliminates unnecessary recalculations for product variants which share the same BOM record. **Benchmark -->** `web_search_read` on `product.template` with several records having ~1,000 `product.product` variants | Before Fix | After Fix | |--------|--------| | ~24-40s | ~1s | opw-5051773
This fix prevents certain existing translations from being deleted during upgrades when they were not previously marked as translated. It helps businesses recover and keep translated field content after moving from older Odoo versions, reducing unexpected English text appearing in multilingual databases.
Original PR description
After upgrading Odoo from earlier versions to versions >= Odoo 15.5, you will notice that some fields that were translated before, are now in English. This is likely because those translations were…
After upgrading Odoo from earlier versions to versions >= Odoo 15.5, you will notice that some fields that were translated before, are now in English. This is likely because those translations were not marked as `state='translated'` in the DB. However, the missing translations were removed from the `_ir_translation` table during the upgrade. With this patch, we still keep the conservative behavior of only auto-translating fields marked as `state='translated'` in the DB (which is still probably wrong, because user translations should remain the same; if Odoo was displaying translated text before the upgrade and it is not after it, that's probably a bug; but that's another story...), but we no longer delete the other fields. This way, you can still mark them as translated after the upgrade and use the new tooling provided in https://github.com/odoo/upgrade-util/commit/fd578e31973596bf7f283ea5c6ebbdfd3314f8bc to recover those translations after the upgrade. @moduon MT-11570 cc @aj-fuentes Forward-Port-Of: odoo/odoo#228404