Thursday, September 25, 2025
18 changes · saas-18.4
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