Thursday, September 25, 2025
35 changes · saas-18.4
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
Opening a Knowledge activity now shows only the articles linked to that activity instead of the full article list. This helps users quickly find the relevant Knowledge article that needs their attention.
Original PR description
Currently, when the user tries to open any activity of the knowledge article, it opens all articles instead of the one which has an activity assigned to them. **Steps to reproduce this issue:** 1) Install the Knowledge module 2) Set up an activity for yourself on a Knowledge article 3) Open the activities from Activities (top left corner) **Issue:** You will end up in the all articles list, with no filters applied. **Cause:** When the user clicks on the activities, a default search filter is added in the context, which is then applied on the view. But in the knowledge article, we don't have any search filters for the activities. Therefore, it renders all knowledge article records. **Solution:** Add search filters for the knowledge articles. opw-4997201 Forward-Port-Of: odoo/enterprise#93609
General Ledger PDF footers now allow longer company names, so businesses with names over 24 characters will see their full name instead of a truncated version. The footer spacing was also increased to keep the report layout clean when longer names are printed.
Original PR description
**Steps to reproduce:** 1. Install the Accounting module. 2. Set a company name longer than 24 characters. 3. Go to Accounting → Reporting → General Ledger. 4. Print the report → in the PDF footer,…
**Steps to reproduce:** 1. Install the Accounting module. 2. Set a company name longer than 24 characters. 3. Go to Accounting → Reporting → General Ledger. 4. Print the report → in the PDF footer, the company name is truncated. **Issue:** - The company name in the General Ledger report footer is cut off if it exceeds 24 characters. **Cause:** - The footer uses a static value limited to 24 characters: https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/account_reports/models/account_report.py#L5850-L5860 **Solution:** - Increased the footer text limit from 24 to 80 characters. - Adjusted page margin by changing `'data-report-margin-bottom': 15` → `'data-report-margin-bottom': 20` to ensure proper spacing for longer company names in the PDF. **After Apply Solution** <img width="1038" height="86" alt="After solution" src="https://github.com/user-attachments/assets/51ece47c-1950-4a54-8be3-f7ac2bbd8a0d" /> **Before Without Solution** <img width="1050" height="66" alt="Before Solution" src="https://github.com/user-attachments/assets/a13b9132-bf04-422a-8e32-1db5225afc33" /> opw - 5025972 Forward-Port-Of: odoo/enterprise#94535
Users can no longer try to send a WhatsApp message without choosing a template. This prevents an error and gives a clearer, safer sending flow for customer communications.
Original PR description
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the…
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the templates. 2. Open any contact and click the **WhatsApp** button next to the phone number. 3. Remove the template and click **Send Message**. **Error:** `ValueError - Expected singleton: whatsapp.template()` **Cause:** At [1], it attempts to fetch the formatted body and header from the template ID. Since no template is selected, it results in an error. **Fix:** This commit makes the field `wa_template_id` required, preventing users from sending a whatsapp message without a template. In stable versions, raise a validation error if a user attempts to send a message without selecting a template. [1] - https://github.com/odoo/enterprise/blob/fff9ad7999d4ff13adf899b2517e750a36c1261a/whatsapp/wizard/whatsapp_composer.py#L319 sentry-6854466874 Forward-Port-Of: odoo/enterprise#93898
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
This fix prevents validation errors when editing the address of a Czech company that was installed with demo data. It aligns demo invoice dates with the required tax supply dates so accounting references remain consistent and users can save company details normally.
Original PR description
## [FIX] l10n_cz: prevent error with misaligned accounting date and sequence number of demo moves #### Description of the issue/feature this PR addresses: Editing CZ Company address while having demo…
## [FIX] l10n_cz: prevent error with misaligned accounting date and sequence number of demo moves #### Description of the issue/feature this PR addresses: Editing CZ Company address while having demo data throws Validation Error #### Current behavior before PR: When trying to change address of CZ Company while l10n_cz with demo data is present an error popup is displayed and it's not possible to to save the changes. Steps to reproduce: - Install l10n_cz with demo data - Open CZ Company in form view - Change address (e.g. change city Praha -> Brno) - Click Save #### Desired behavior after PR is merged: The address changes are saved without any error. #### Solution: This change adds `taxable_supply_date` date values for CZ demo moves that are compatible with `invoice_date` values to make sure that accounting date values are the same on each recomputatation and do not lead to new sequence numbers that are not aligned with the previous ones which would cause errors being raised by sequence mixin. Related to: #226152 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228157 Forward-Port-Of: odoo/odoo#227847
The bank reconciliation search dialog no longer triggers a crash when users tap the reconcile button on mobile devices. The custom reconciliation behavior is now limited to desktop views, where it is properly supported, improving reliability for mobile users.
Original PR description
When clicking on the reconcile button in mobile, the js_class of the custom list view is never triggered because, in small screens (aka. "mobile"), by default, kanban views are used instead of list views (or at least take precedence). To avoid having a traceback, we will keep the custom behavior in desktop only no task id Forward-Port-Of: odoo/enterprise#95145
This fixes automated online shop tour tests so browser redirect warnings no longer interrupt or delay them. It helps keep test runs reliable by allowing page reloads to complete smoothly and updates a few test selectors for better accuracy.
Original PR description
During page redirection in tours, the browser was showing a warning about unsaved/incomplete data loss. This warning is not relevant in the context of tours. To address this, the expectUnloadPage attribute is added to the tour test. It prevents unnecessary pauses/timeouts caused by the browser’s warning and ensures smooth redirection handling. Additionally, few tour selectors have been corrected to improved. runbot-231587 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
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
This fixes an internal Inventory configuration issue by restoring a missing database index on stock rules by company. It helps upgrades run with clearer logs and avoids misleading warnings, with no expected change to day-to-day user workflows.
Original PR description
due to conflict on this forward port https://github.com/odoo/odoo/pull/113045 ``index=True`` was removed according to this pr https://github.com/odoo/odoo/pull/90531 So, adding it back during upgrade it shows misleading logs ``` 2025-08-26 22:19:25,039 23 INFO db_3112946 odoo.schema: Keep unexpected index stock_rule_company_id_index on table stock_rule ``` opw-5052223 upg-3112946 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226268
This fixes an issue where some users could see an empty employee list in manufacturing work orders because employee avatar access was blocked by HR permissions. The change hides that avatar field for users without the necessary HR access so the list can load normally.
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
Scheduled account report sends now skip partners that were deleted after the send was prepared. This prevents the automatic job from failing and helps ensure remaining reports continue to be processed reliably.
Original PR description
When a partner included in a batch send is deleted before the cron "Send account reports automatically" runs, the cron fails because the partner no longer exists. Steps to reproduce: 1. Create partner A and a draft invoice linked to it 2. Go to Partner Ledger and select Customer Statement report 3. Click on Send and validate - Ensure the scheduled action is not executed immediately (e.g. by deactivating it) 4. Delete partner A 5. Run the cron "Send account reports automatically" -> Cron fails with "Record does not exist or has been deleted" This fix ensures only existing partners are kept for processing. opw-5085571 Forward-Port-Of: odoo/enterprise#95127
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
The kiosk online payment page now shows its background only once. This removes a duplicated visual layer on the QR code payment screen, making the checkout experience cleaner for customers.
Original PR description
pos_online_* = pos_online_payment_self_order This commit ensures that only one background is displayed on the kiosk online payment page. The background is correctly displayed in 'pos_self_order.PaymentPage', and it should not be displayed again in the “Scan the QR code to pay” subcomponent. <img width="688" height="485" alt="Screenshot 2025-09-24 at 13 49 00" src="https://github.com/user-attachments/assets/e521ffce-82db-4900-828a-5d086fa9b4ac" /> --- 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
This fix ensures timesheet reports correctly include helpdesk ticket information when it should be shown. It corrects a prior update that did not properly target the report field, helping users see complete ticket context in exported or printed timesheet reports.
Original PR description
Description of the issue/feature this PR addresses: The previous commit attempted to extend the timesheet report to display tickets by using position="attributes" on a new . This approach does not work in Odoo reports because position="attributes" can only modify existing elements. There is no indication that the behavior of not displaying tickets was intentional, so this PR corrects that implementation. Current behavior before PR: The previous fix did not correctly locate the existing element for task/project info. Desired behavior after PR is merged: The existing is correctly found and updated to include show_ticket in its t-if. Forward-Port-Of: odoo/enterprise#95206
Resetting a user's Odoo Calendar no longer fails because of permission checks on events they cannot edit. This prevents an unnecessary error during calendar cleanup and makes the Google Calendar reset process smoother for users.
Original PR description
Before this commit, when resetting the Odoo Calendar of an user, it would trigger a ValidationError for updating events that the current user wasn't able to update, even though it was not an updated per se, but just a deletion of it in Odoo. After this commit, we no longer trigger that ValidationError during resets of Odoo Calendars, fixing the error. task-5103918 Forward-Port-Of: odoo/odoo#228195 Forward-Port-Of: odoo/odoo#227991
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 change speeds up installation and updates for the Danish Nemhandel module by preparing partner-related Nemhandel information during setup. It helps avoid long delays caused by recalculating these details later, improving reliability during module installation or upgrades.
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
This update corrects an internal HR helper so it properly finds all versions linked to an employee contract. This helps ensure contract history is retrieved accurately, reducing the chance of incomplete HR contract information.
Original PR description
The helper method to get all versions related to a contract was missing an '='.
This fix restores the PayPal payment button during mobile checkout, so customers can complete purchases from phones or mobile views. It resolves a display conflict caused by duplicate checkout sections and helps prevent lost sales for merchants using PayPal.
Original PR description
## Version saas-18.4+ ## Issue *Use mobile device or mobile view* - Configure Paypal as a Payment Provider; - Go to the shop and buy an article; - Move to checkout and select PayPal; - No PayPal…
## Version saas-18.4+ ## Issue *Use mobile device or mobile view* - Configure Paypal as a Payment Provider; - Go to the shop and buy an article; - Move to checkout and select PayPal; - No PayPal button is displayed. ## Cause In saas-18.4, a refactoring of the checkout layout (7a564237579603bcaef46efd6ffaaaffefb54b11) introduced the `o_mobile_summary` block which results in the full payment form being duplicated in the DOM: - One copy for desktop: - https://github.com/odoo/odoo/blob/de3d09ab8592c87b9d747a33cded93a90387b797/addons/website_sale/views/templates.xml#L3524-L3529 - One copy inside `.o_mobile_summary` for mobile: - https://github.com/odoo/odoo/blob/de3d09ab8592c87b9d747a33cded93a90387b797/addons/website_sale/views/templates.xml#L3557-L3560 This causes the `payment.submit_button` template (and its extension by PayPal) to be injected twice. As a result, the DOM ends up with two elements sharing the same IDs (`o_paypal_button_container`) which breaks PayPal’s SDK rendering logic. ## Fix JavaScript logic based on cca908741c7fdd701a4539e5d43c71248b73b14f has been added to detect and rename the duplicated DOM structure: The PayPal button can be rendered everywhere based on unique IDs. opw-4942831