Daily updates from Odoo
Navigate
Branch
Wednesday, August 6, 2025
52 changes
23 changes
New functionality added to Odoo
Adds standard Profit and Loss and Balance Sheet reports for the Vietnamese localization. This helps businesses operating in Vietnam prepare localized financial statements more easily and consistently in Odoo.
Original PR description
Add the P&L and the BS for the vietnamese localization task-2492680 Forward-Port-Of: odoo/enterprise#91672 Forward-Port-Of: odoo/enterprise#90594
Enhancements to existing features
Field service task users can now open the related Helpdesk ticket directly from a dedicated button on the task. This reduces clicks and makes it easier to move between field service work and customer support details.
Original PR description
Currently, the user opens the linked ticket from the chatter in the FSM task.In this commit, we have added a stat button to allow easy redirection to the ticket. task - 4638988
Odoo VoIP now shows a clear message when a call invite fails because the phone system is not configured for secure media. This helps users and administrators understand the configuration issue without seeing confusing browser errors or tracebacks.
Original PR description
If the PBX is not configured to use SRTP-DTLS, trying to invite a user in Odoo would result in rather obscure errors: - Chrome: Called with SDP without DTLS fingerprint - Firefox: Invalid description, no fingerprint attribute at level 0 This commit gets rid of the traceback and shows a meaningful message instead. Task-4972773
Menu items in Appointment and Sales Dashboard now use clearer, more readable web addresses. This makes links easier for users to understand, share, and recognize when navigating the website.
Original PR description
`*` = website_sale_dashboard Previously, menu item URLs for actions were not user-friendly or readable. Since we now support pretty URLs, this commit updates the above modules to use clean, readable URLs for their menu items. task-4700261
Tax return workflows now more accurately show the next available status action and keep audit completion status in sync when returns are marked or unmarked as complete. Audit returns are also excluded from a prior-period locking rule, reducing unnecessary blocking during audit-related work.
Original PR description
* Simplify the view logic for displaying the state transition buttons by adding a new computed field for the next_state of current return type. * Exclude audit returns from locking constraint of locking previous period to proceed. * Mark/Unmark as completed synchronize audit status. task-4991558
The Indian GSTR-1 report view and spreadsheet have been updated to match the latest GSTN return format, helping businesses stay compliant with current reporting requirements. The change also improves how credit and debit notes are reported by tying them to the original invoice amount and warning users when required invoice links are missing.
Original PR description
With this PR, -Refactored GSTR-1 view and spreadsheet based on the latest GSTN report. -Ensured compliance with the new GSTR return format as per the provided specification. -Some tax tags are removed so those changes applied in GSTR-3 also. -Previously, in the GSTR-1 report, credit and debit notes of unregistered interstate transactions were reported based on their own amounts, which was wrong. So from now on, reporting will check the amount of the original invoice. Additionally, if a credit note is created without an associated invoice, the user will receive a warning in the report, and a field will be displayed in those unlinked credit notes list view to select the original invoice. task-3360018 Co-authored-by: Jay Savaliya <jasa@odoo.com> Co-authored-by: Zeel Patel <zepa@odoo.com>
Spreadsheet dashboard filters now open as a dropdown instead of a separate dialog, making them quicker and less disruptive to use. This improves the dashboard filtering experience and aligns the interface naming with how the feature now works.
Original PR description
### [MOV] spreadsheet_edition: rename `filter_search_dialog` This commit renames the `filter_search_dialog` files to `filter_values_component`. "Search dialog" doesn't make sense, as it is not a dialog anymore, and we never searched anything in it. ### [IMP] spreadsheet_edition: make the filter dialog a dropdown in dashboards This commit changes the filter dialog in the spreadsheet dashboard drom a dialog to a dropdown. Task: [4816189](https://www.odoo.com/odoo/2328/tasks/4816189)
Users can no longer change DTMF tones that have already been sent during a VoIP call. This keeps phone keypad input accurate by only allowing new tones to be added from the softphone keypad.
Original PR description
The already sended DTMF signal can't be changed. In this commit, we ignore the useSelection effect when sending DTMF, user can only append new value to sended vulues. we also make the input readonly so that user can only send DTMF from the softphone keypad, since normally DTMF only support "123456789*0#" Forward-Port-Of: odoo/enterprise#91692
Resolved issues and error corrections
This fix prevents an error from appearing when a helpdesk user clears the delivery field while returning a product. It keeps the return workflow stable and lets users select a valid delivery before the system recalculates return details.
Original PR description
step to reproduce : create a sales order with a service and a consumable product deliver the consumable product enable the 'returns' feature on your helpdesk team create a helpdesk ticket in this team select the customer and the SOL you created click on return empty the delivery field => traceback source of the issue : Setting the delivery_id field to false triggers a compute, in which an ensure one is later call on the delivery_id. Since the delivery is empty, it triggers an error. Solution : The field 'delivery_id' is required. So we can simply prevent the execution of the compute when the delivery is set to false and wait for the user to put a new value to trigger the compute correctly. task - 4935957 Forward-Port-Of: odoo/enterprise#90496
Fixed an issue where the Documents details panel could keep showing a previously selected document after users cleared the selection with the control panel. This keeps the panel in sync with the user's current selection and avoids confusion when managing documents.
Original PR description
The details panel does not update when clearing the selection through the control panel. Steps to Reproduce: ==================== - Open the detailsPanel. - Select a document. - Click on a blank space, which removes the current selection. - Re-select a document. - Click the ‘x’ button on the control panel to clear the selection. - The document selection in the detailsPanel does not get cleared. Technical =========== In DocumentsRightPanel and how DocumentsDetailsPanel is handled, The panel relies on the `state.focusedRecord` to determine which record's details to display. However, when clicking the ‘X’ button in the control panel to clear the selection, the `state.focusedRecord` is not being Updated or cleared, the detail panel still shows the previously focused record. After this PR: Clicking the ‘x’ will properly clear the selection from the detailsPanel. Task-4752944 Forward-Port-Of: odoo/enterprise#91151 Forward-Port-Of: odoo/enterprise#85272
This update keeps automated Knowledge app tests working after an internal change to how embedded videos are displayed. It helps maintain product reliability without changing the user-facing Knowledge experience.
Original PR description
Before this commit: - The EmbeddedVideoComponent used a dedicated subcomponent VideoIframe to render the iframe. - The tour test patched this VideoIframe component to mock iframe behavior during tests. After this commit: - Now, the VideoIframe subcomponent was removed and the iframe rendering was moved directly into the template of EmbeddedVideoComponent. - To adapt, this commit now patches the template of EmbeddedVideoComponent directly in the tour to preserve test behavior. community-https://github.com/odoo/odoo/pull/208366 task-4742547
This change fixes an internal test setup so barcode inventory checks no longer depend on sample demo data being present. It helps keep quality checks reliable and reduces false failures during development, with no direct change for everyday users.
Original PR description
Add group 'stock.group_production_lot' to user to enable lots/SN runbot-error-230495 Forward-Port-Of: odoo/enterprise#91709
Sales achievements made on the final day of a commission period are now included in the correct commission calculation. This prevents end-of-month sales from being missed, improving accuracy for commission reports and payouts.
Original PR description
**Issue** Achievements realised on the last day of the period were not taken into account (neither in the expected one, or the next period). **Steps to reproduce** - Create a commission plan with a monthly target frequency and an achievement on "Amount sold" - Have a Sale order with a `date_order` on the last day of a month - Click on the "Commissions" smart button to open the `sale.commission.report` list view -> achieved amount for the SO's month is missing. - Click on "Details" for the line -> there should be one `sale.commission.achievement.report` record. **Cause** We were comparing a Timestamp coming from the commission line with the start/end date of the period. To perform the comparison, the date was cast to a Timestamp with 0:00:00 as the hour, resulting in all commission lines on the last day of the period to be missed. opw-4857936 opw-4934168 Forward-Port-Of: odoo/enterprise#91707 Forward-Port-Of: odoo/enterprise#90658
Changing the date of a recurring shift in Sale Planning no longer leads to a missing record error. This helps teams safely update recurring schedules without interruptions or failed saves.
Original PR description
Version: 17.0 Steps to reproduce: - Install sale_planning - Create a recurrence shift. - Change the date of second shift which is created by recurrence. - Give the edit value as All shifts. - save record, missing error occured. Issue: When a user changes the date of a shift created by recurrence, the system crash with the message, "Record does not exist or has been deleted." Cause: There was an issue between "Planning" and "Sale Planning". When a user moves a shift, "Planning" removes the old shift from the system except the first one, But 'sale planning' was still trying to work with that removed shift. Fix: Now, after 'Planning' does its work, 'Sale Planning' checks again to see that shifts are still there. It only works with shifts that actually exist. So crash no longer happens. Users can now safely change the date of recurring shifts without errors. task-4859892 Forward-Port-Of: odoo/enterprise#91236 Forward-Port-Of: odoo/enterprise#88234
Customers can now choose supported shipping carriers at checkout when their order includes combo products, as long as the combo items have weights set. This also avoids incorrect missing-weight warnings for non-shippable order lines such as down payments, reducing checkout and sales order friction.
Original PR description
\* = bpost, dhl{,_rest}, easypost, sendcloud, ups, usps{,_rest} Versions -------- - 18.0+ Steps ----- 1. Have a combo product Foo; 2. ensure the combo items have a weight set; 3. enable & publish a…
\* = bpost, dhl{,_rest}, easypost, sendcloud, ups, usps{,_rest}
Versions
--------
- 18.0+
Steps
-----
1. Have a combo product Foo;
2. ensure the combo items have a weight set;
3. enable & publish a shipping connector;
4. add combo product to cart;
5. go to checkout;
6. attempt to select shipping connector as delivery method.
A similar message appears when trying to add a delivery method to a backend order if the order has downpayment lines.
Issue
-----
> The estimated shipping price cannot be computed because the weight is missing for the following product(s): Foo
Cause
-----
The combo product doesn't have a weight, as it's not a discrete item, but a collection of multiple items.
The shipping connectors haven't been updated yet to account for this, and still expect every non-service product to have a weight.
Solution
--------
When looking for lines without weight, filter out products of type `combo` (similar to how `service` products are handled) using a new `_get_invalid_delivery_weight_liens` helper method, added to `sale.order.line`.
Also ignore lines where `product_qty` is zero, e.g. `display_type` lines & down payment lines.
Community PR: https://github.com/odoo/odoo/pull/221696
opw-4940973
Forward-Port-Of: odoo/enterprise#91684
Forward-Port-Of: odoo/enterprise#91243This fix removes duplicated rental planning logic and keeps the intended behavior in one place. It reduces the risk of inconsistent planning results for rental orders and makes future maintenance safer.
Original PR description
Before this commit, since the merge of #91164, `_planning_slot_vals_list` method is duplicated in sale_renting_planning/models/sale_order_line.py file. This commit merges the both methods together to keep the behavior added in the one initially introduced before the fix merged. Forward-Port-Of: odoo/enterprise#91696
This fixes incorrect depreciation schedules for assets imported from another system. It prevents Odoo from carrying mismatches from prior software into the next depreciation period, while keeping accurate remaining and depreciated value calculations.
Original PR description
This reverts commit 79aa48867de14a6d2315ec95b271004084d74b14. A lot of customers reported that the data was wrong in a lot of cases. For instance, when the previous software computed a lower depreciation than Odoo, Odoo was then moving the difference into the next period. The change for the computation of `asset_remaining_value` and `asset_depreciated_value` has been kept. opw-4968367 opw-4977970 opw-4961381 opw-4991216 opw-4965451 Forward-Port-Of: odoo/enterprise#91751 Forward-Port-Of: odoo/enterprise#91723
A test for partner account batch payments now correctly handles cases where the Accountant app is not installed. This helps keep automated checks stable without changing day-to-day user behavior.
Original PR description
**Issue:** "test_partner_account_batch_payments" test may fail when "accountant" module is not installed. **Solution:** Handle the case when "accountant" module is not installed separately as it is done in previous versions. runbot-230480 Forward-Port-Of: odoo/enterprise#91621
Searching for loans in the Loan Analysis view now uses the correct loan field, preventing an error screen from appearing. This helps finance users search loan records reliably without interruptions.
Original PR description
Behaviour before this commit: While searching for 'Loan' in the Loan Analysis view, a traceback appears since the filter_domain for the search is on `name` but `name` is not present in account.loan.line, instead it is `loan_name`. Desired behaviour after this commit: The filter_domain for 'Loan' is updated to search for `loan_name` instead of `loan`, and domain for `display_name` is removed. TaskID:4991369 Forward-Port-Of: odoo/enterprise#91637
Embedded accounting reports in Knowledge templates now include the identifier needed to save customized report options. This ensures users can adjust reports such as the Balance Sheet in an article and see those changes preserved when they return.
Original PR description
Currently, the embedded account reports included in templates are missing the `data-oe-id` attribute. This attribute is essential because it allows us to uniquely identify and target a specific…
Currently, the embedded account reports included in templates are missing the `data-oe-id` attribute. This attribute is essential because it allows us to uniquely identify and target a specific report element in order to update its associated options. (See: `update_embedded_audit_report_options`) Without this attribute, we are unable to locate and update the corresponding element in the DOM when the user customizes the report. As a result, users are unable to save changes to the report options for embedded reports originating from templates. Steps to reproduce the issue: 1. Create an account report 2. Open the "Balance Sheet" article 3. Click on the "Customize" button of the embedded balance sheet 4. Change the options (in the control panel) 5. Go back to the article 6. Re-Click on the "Customize" button => Changes have not been saved TO BE: When a user clicks the "Customize" button of an embedded account report and modifies the options, those changes should be saved. To resolve this issue, we will add a `data-oe-id` attribute to the embedded account reports defined in the templates. With those changes, users will be able to modify and save the options of audit reports embedded in templates. Task-4840940
DHL shipment requests now use the commodity code field name expected by DHL's API. This helps prevent shipment creation issues when commodity code information is included.
Original PR description
Changed the field name in commodityCodes from `code` to `value` to match with DHL API documentation. Check ticket log notes for details of DHL documentation. opw-4892324 Forward-Port-Of: odoo/enterprise#91645
This update corrects an import error that could cause Amazon sales integration code to crash. It helps keep Amazon account workflows stable after a prior technical change.
Original PR description
Follow up of commit https://github.com/odoo/enterprise/commit/06125d630d8d9a8a969297a7e4ef75f76f47c156 that changed the import for url_join. This commit mistakenly affected other related imports causing crash of code. Issue: - 'url_encode' is imported from urls of odoo.tools where it does not exist Fix: - 'url_encode' is simply imported from 'werkzeug.urls' Related Community PR: https://github.com/odoo/odoo/pull/221519 opw-4987797
Features or functions removed from Odoo
Payroll input types are being removed as a separate setup item and handled directly through salary rules instead. This simplifies payroll configuration and keeps related payroll, expense, commission, and localization flows aligned around one rule-based approach.
Original PR description
In this commit we remove model `hr_payslip_input_type` and repalce the relation with a salay rule of type INPUT Task: 4930632
29 changes
Resolved issues and error corrections
Fixed an issue where long product purchase descriptions could overlap the table header when a purchase order PDF continued onto multiple pages. This makes printed purchase orders easier to read and avoids confusing or unprofessional document formatting.
Original PR description
**Steps to reproduce**: 1. Install the `purchase` module. 2. Go to a product's `Purchase` tab and add a long purchase description (approx. 40–45 lines). 3. Create a Purchase Order using this product.…
**Steps to reproduce**: 1. Install the `purchase` module. 2. Go to a product's `Purchase` tab and add a long purchase description (approx. 40–45 lines). 3. Create a Purchase Order using this product. 4. Print the PDF of the Purchase Order (via gear icon). **Observation**: The long product description overlaps with the table header when the table spans multiple pages in the generated PDF. **Issue**: wkhtmltopdf does not handle multi-page table headers properly by default. causing header/content overlap when the table breaks across pages. **Solution**: Apply a known wkhtmltopdf workaround by explicitly setting: `<thead style='display: table-row-group;'>` This ensures headers will not repeat same as sale order. ref(https://github.com/odoo/odoo/pull/53909) Before: <img width="1003" height="426" alt="image" src="https://github.com/user-attachments/assets/38b7b4de-ea81-445f-8cd2-ae164fcb7531" /> After: <img width="1000" height="414" alt="image" src="https://github.com/user-attachments/assets/ef09ef94-2a26-468a-b6e7-03d93b4515b8" /> opw-4908457
Portal users can now access marketing cards in the same way public users already could. This fixes an access issue that could prevent recipients, who are often customer or partner portal users, from viewing cards intended for them.
Original PR description
The access right that allows public users to read cards should obviously apply equaly to portal users. Recipients will very often be partners so them not being allowed is very annoying. task-5000332
The HTML editor now clears multiple text styles, such as size, color, and bold, with a single click. This avoids repeated user actions and makes document editing more predictable.
Original PR description
**Current behaviour before PR:** Steps to reproduce: - Select a text - Apply font size - Apply color - Apply bold - Clicking on removeFormat button doesn't remove all formats User has to click on removeFormat button twice to remove the format. **Desired behaviour after PR is merged:** Now, all formats are getting removed at once when clicking on removeFormat button. task-4911199 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The project stock workflow no longer opens an unavailable map view in the community edition. This prevents users from seeing an error when clicking the 'From WH' button from a project task, while leaving room for the enterprise edition to add the map view where supported.
Original PR description
* STEP TO REPRODUCE: go to task of a project, enable 'From WH' in top bar button. Click on it -> error because no map view * SOLUTION: in community version we should remove map view then in enterprise we can overide to add it 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
Payment receipt PDFs now show the actual payment amount in the foreign currency instead of the company-currency equivalent. This prevents confusion for customers and accounting teams when invoices are paid and reconciled in another currency.
Original PR description
**Steps to reproduce**: 1. Install the `accounting` module. 2. Activate a foreign currency form `Accounting -> Configuration -> Currencies` and fetch its exchange rate. <img width="599" height="267"…
**Steps to reproduce**: 1. Install the `accounting` module. 2. Activate a foreign currency form `Accounting -> Configuration -> Currencies` and fetch its exchange rate. <img width="599" height="267" alt="image" src="https://github.com/user-attachments/assets/34e7c719-20f7-4cd0-a1d6-0e94764461ba" /> 3. Create an invoice using the company’s default currency (e.g., USD). 4. Register a payment using the foreign currency (e.g., VES). 5. Reconcile the payment with the invoice. 6. Print the payment receipt PDF. **Observations**: In the printed PDF, under the `Amount In Currency` column, the amount is incorrectly displayed. For example, suppose `1 USD` = `100 VES`. - An invoice of `100 USD` is created. - A payment of `10,000 Bs` is registered (equivalent to 100 USD). - When the payment receipt is printed, the output appears as: ``` | Invoice Number | Reference | Amount In Currency | Amount | |--------------------|-------------------|--------------------|-------------| | INV/2025/00001 | | | 100.00 USD | | PBNK1/2025/00001 | INV/2025/00001 | -100.00 Bs | -100.00 USD | ``` Here, the `Amount In Currency` for the payment line shows **100 Bs** instead of the correct **10,000 Bs**. **Issue**: The payment receipt uses the `_get_reconciled_invoices_partials()` method to fetch details about reconciled invoices. However, the report incorrectly uses the `amount` field (in company currency) for the `Amount In Currency` column, leading to this mismatch. **Solution**: The report now uses `(debit/credit)_amount_currency` instead of `amount` to correctly reflect the foreign currency values in the `Amount In Currency` column. opw-4898706 Forward-Port-Of: odoo/odoo#219439
The Stripe documentation link in Point of Sale payment provider settings has been corrected. This helps users quickly access the right setup instructions and avoids confusion during payment configuration.
Original PR description
Before this commit: ---------------- - The Stripe documentation link in the POS payment provider configuration was broken, leading to a poor user experience. After this commit: ------------------------------- - The Stripe documentation link has been corrected to ensure proper access to setup instructions. Task - 4797691
Email template lists in the email composer now show only templates available to the current user or templates not assigned to anyone. This prevents users from seeing templates intended for other users, keeping the send-email workflow cleaner and more accurate.
Original PR description
**Steps to reproduce:** 1. Install Sales. 2. Create an email template for the 'sale.order' model and assign it to the admin user under the settings page in the 'User' field. 3. Log in as the demo user. 4. Create a quotation and click the 'Send by Email' button. 5. In the wizard, click the three dots between the attachment and AI logo in the footer. 6. Observe the templates list. **Issue:** - The template created for the admin user appears for the demo user as well. **Cause:** https://github.com/odoo/odoo/blob/07626050bd0104fecd8799b56d30245d00da3f27/addons/mail/static/src/core/web/mail_composer_template_selector.js#L31-L44 - The domain used to fetch templates was incorrectly filtering for templates assigned to any user (instead of filtering for templates assigned to the current user or not assigned at all). **Solution:** - Corrected the domain to include only templates assigned to the current user and not assigned to anyone. opw-4901492
The messaging menu now shows only the relevant empty-state message during quick search. Users searching for a conversation that does not exist will see “No thread found” without also seeing the general “No conversation yet” message, reducing confusion.
Original PR description
**Steps to reproduce:** - Open the messaging menu with 20+ threads (quick search btn shows on 20+ threads) - Dismiss (or install) the 'Install Odoo' notification - Dismiss (or allow) the 'Turn on notifications' notification - Use quick search to look for a thread that doesn't exist => Both 'No thread found.' and 'No conversation yet...' messages are displayed This happens due to an incorrectly handled condition. This PR ensures only the relevant message is shown: - 'No thread found.' is displayed when the search yields no results. - 'No conversation yet...' is shown only when the user has no threads at all. <img width="565" height="279" alt="image" src="https://github.com/user-attachments/assets/689bc007-dfb4-4041-8543-18bc4ad2e19d" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an error that could block users from creating new work entries in the list view for French payroll. The system now handles missing start or end dates safely, making manual entry creation more reliable.
Original PR description
Currently, a traceback occurs when a user attempts to create a work entry in the list view. **To reproduce this issue:** 1) Install the `l10n_fr_hr_work_entry_holidays` module. 2) Switch to the `French` company and open the payroll. 3) Open the work entries in list view and try to create a new record. **Error:** ``` AttributeError: 'int' object has no attribute 'seconds' ``` **Cause:** By default, when creating a work entry through the list view, no `start` or `end` date is provided. This leads to the traceback originating from the following line when computing the duration. https://github.com/odoo/odoo/blob/84b15dc1f866e27d5c8a5fe3e457c2f982bcb133/addons/l10n_fr_hr_work_entry_holidays/models/hr_work_entry.py#L28-L32 **Solution:** Adding an extra check of the `start` and `end` date would resolve this issue. opw-4943104 Forward-Port-Of: odoo/odoo#220127
Purchase orders now use the supplier’s configured currency even when they are created automatically, such as from an approval request. This prevents orders from defaulting to the company currency and helps keep supplier pricing and purchasing records accurate.
Original PR description
Steps to reproduce: - Go to Invoicing > Configuration > Accounting > Currencies: - Enable the Euro currency - Set company currency to USD - Go to any partner form (e.g. Azure Interior): - In Sales &…
Steps to reproduce:
- Go to Invoicing > Configuration > Accounting > Currencies:
- Enable the Euro currency
- Set company currency to USD
- Go to any partner form (e.g. Azure Interior):
- In Sales & Purchase tab: - Set Supplier Currency to Euro
- Create a purchase order from the UI:
- Select Azure Interior → Currency is correctly updated to Euro (via onchange)
- Install the Approvals module
- Create a storable product "P1":
- Under Purchase tab: - Vendor: Azure Interior - Price unit: 5 EUR
- Create an approval request:
- Request Owner: Marc Demo
- Product: P1
- Approver: Mitchel Admin
- Submit and approve the request
- Click on "Create Purchase Order"
Issue:
The purchase order is created with the correct partner and product. But the currency is incorrectly set to the company currency (USD), instead of the supplier's currency (Euro).
Cause:
The currency was updated via an `@onchange`, which is only triggered in the UI.
When creating a PO programmatically (e.g. via approvals or in a test), the onchange is not executed and the currency falls back to the company default.
Solution:
Replace the `@onchange` logic for `currency_id` with a stored compute field.
This ensures that the correct currency is always computed, regardless of how the purchase order is created.
opw-4938390Fixes an error that could occur when users tried to add tags to a contact in the Contacts app. This keeps contact editing smooth and prevents users from being blocked by an unexpected crash.
Original PR description
**Steps to reproduce:** 1. Install the "Contacts" app. 2. Go to Contacts > Open any contact. 3. Click on the "Tags" (Partner Category) field to add a tag. **Issue:** A traceback is raised: `TypeError: can only concatenate list (not "_ProtectedDomain") to list` **Cause:** - Due to recent changes in https://github.com/odoo/odoo/commit/cd5f29b8b50ef4228be8f58a02bb328548208f77, default domains like `TRUE_DOMAIN` are now defined using a `_ProtectedDomain` class (a tuple subclass) instead of regular lists, to make them immutable. - This breaks code that tries to modify or concatenate domains assuming they are lists. - In this case, `res.partner.category._search_display_name` returned a `_ProtectedDomain` which was passed to `_search()`, leading to the error when Odoo tried to prepend additional filters. Solution: - Before using the domain in _search(), convert it to a regular list using list(domain). opw-4991994
This fix updates Canadian fiscal position mappings so products using Nova Scotia's new 14% HST are handled correctly outside Nova Scotia as well. It helps ensure the correct taxes are applied during transactions and avoids incorrect tax mapping in Canadian localizations.
Original PR description
In odoo/odoo#219117 we added the new 14% tax required for Nova Scotia's tax mandate changes, while the fiscal position was properly update for NS, the rest of the FP were ommited so as of now if any product has a HST 14% tax on it it won't be properly mapped to the correct tax. This was noticed in the saas-18.3 forward port this PR will fix the CSV in older versions and update the migration script for all FP in all versions. task-4937159 Forward-Port-Of: odoo/odoo#220280
This fixes an internal automated test for Time Off that was failing because it relied on a fragile screen element lookup. The test was rewritten to check the same behavior more reliably, helping keep future updates moving without false failures.
Original PR description
The #217517 PR is causing a test failure on runbot.
The problem was due to use of ```$('.o_stat_info:contains("Time Off")')``` to get the element in tour.
To avoid unnecessary use of tour, the test is re-written.
runbot-230486
Forward-Port-Of: odoo/odoo#221706Point of Sale loyalty rewards now correctly add the free product when the eligible item has multiple variants. This helps ensure customers receive promised rewards consistently at checkout and reduces manual corrections for cashiers.
Original PR description
Before this commit, when using a free product reward on multi products that have several variants, adding the desired product to the order would not always trigger the automatic addition of the free product as expected. opw-4841759 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes an issue in the HTML editor where starting to create a link and then clicking away could leave the link popover stuck open or cause it to reappear. This makes editing text smoother and prevents unfinished empty links from lingering after users cancel the action.
Original PR description
reproduction 18.0 and 18.1: 1. Go to the To-do app and type some text. 2. Select the typed text and click the Link button in the toolbar. 3. A link editing popover appears, without adding an href,…
reproduction 18.0 and 18.1: 1. Go to the To-do app and type some text. 2. Select the typed text and click the Link button in the toolbar. 3. A link editing popover appears, without adding an href, click anywhere outside the popover. 4. The popover does not close when clicking outside. And pressing Escape and clicking again in the editor, the popover reopens **Before this commit:** When creating a link from the toolbar, the link element is not padded with `feff` . This results in the selection remaining inside the link when clicking away and keeps the popover open. Pressing Escape only closes the popover but does not clean up the created link element. **After this commit:** We pad the newly created link element with `feff` when it is eligible for visual link isolation but not already padded. This ensures the padding is limited to newly created links. Additionally, when pressing Escape, we now clean up empty link elements after closing the popover. task-4948641 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Customers no longer receive automatic emails asking them to pay an invoice when a saved payment method is already being processed through the payment registration flow. This avoids confusing customer communication and better reflects the actual payment status.
Original PR description
**Before this commit:** When creating an invoice payment with the "automatic invoice" option enabled in Sales settings and using a saved payment token, an email is sent to the customer before the…
**Before this commit:** When creating an invoice payment with the "automatic invoice" option enabled in Sales settings and using a saved payment token, an email is sent to the customer before the transaction move is posted and the invoice payment status is updated to "In Payment." This results in the email incorrectly asking the customer to remit payment, even though the payment is already being processed. **Steps to Reproduce:** 1. Enable "Automatic Invoicing" from Sales settings. 2. Enable and publish any payment provider (e.g., Demo) in test mode. 3. Create an invoice and generate a payment link. Open the link in a new incognito tab and pay using any dummy card number (ensure the "Save my payment details" checkbox is checked). This saves the payment token for the partner. 4. Create a new invoice with the same partner, then register payment. Select the payment method and the previously saved token, then confirm. 5. Observe that the payment status is "In Payment," but the email sent to the customer incorrectly asks them to remit payment. **Fix:** This change prevents payment notification emails from being sent automatically when the payment is manually created from the payment register wizard. Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4850293) opw-4850293 Forward-Port-Of: odoo/odoo#221587
Fixes a website editor issue where pages could crash when reopening content that had a carousel inside a table of contents block with its navigation hidden. This makes editing those pages reliable again and prevents disruption for website managers.
Original PR description
Problem: When `s_carousel` is placed inside an `s_table_of_content` and the navbar of the TOC is hidden (visibility set to "Hide" on desktop), saving and reopening the editor results in a traceback.…
Problem: When `s_carousel` is placed inside an `s_table_of_content` and the navbar of the TOC is hidden (visibility set to "Hide" on desktop), saving and reopening the editor results in a traceback. Cause: The traceback occurs due to the following sequence: In `WysiwygAdapterComponent.startEdition`, calling `await super.startEdition()` will invoke `createInvisibleElement()` if the navbar is hidden. This, in turn, activates the scroll spy by calling `_activateScrollSpy()` while starting the TOC snippet. That triggers `widgets_start_request`, which starts the `s_carousel` snippet. However, at this point the `wysiwyg` instance has not yet been attached to the `wrapwrap` element. That happens later, at: https://github.com/odoo/odoo/blob/f12050f75ae9ae1125c0c01ec504a24bd401b1ea/addons/website/static/src/components/wysiwyg_adapter/wysiwyg_adapter.js#L318 and only after the `await super.startEdition()` call at: https://github.com/odoo/odoo/blob/f12050f75ae9ae1125c0c01ec504a24bd401b1ea/addons/website/static/src/components/wysiwyg_adapter/wysiwyg_adapter.js#L232 This delay causes a race condition when starting widgets like `s_carousel` that rely on the presence of the `wysiwyg` instance. Solution: Attach the `wysiwyg` instance to the DOM before `await super.startEdition()` in `WysiwygAdapterComponent.startEdition`. Steps to reproduce: - Add a Table of Content block - Insert a Carousel inside the content - Set the TOC navbar visibility to "Hide" on desktop - Save the page - Reopen the editor - A traceback occurs opw-4971409 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221200
Fixed an issue where calendar events created from a contact could lose the intended link because an empty internal value was saved instead of the default contact. This helps ensure meetings remain correctly associated with the relevant contact when users create them from the calendar flow.
Original PR description
To reproduce:
=============
- Pick any contact
- Click on meeting
- Select the time for the meeting with that contact
- Click on more options
- Add a meeting and save
- Click on meeting & contact
Problem:
========
- When creating calendar events, res_id=0 is passed in vals_list
- Events are created with res_id=0 instead of using default value
Solution:
=========
- Add separate handling for res_id in vals_list processing
- Apply defaults.get('res_id') when vals.get('res_id') is falsy
opw-4892445
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#216042Payroll now correctly avoids carrying over sick leave or other time off when it overlaps with a public holiday. This prevents employees from receiving an incorrect deferred leave adjustment on a later payslip.
Original PR description
The aim of this commit is to prevent a sick day or any other type of time off taken on a public holiday to be deferred. To reproduce: - Create a public Holiday for previous month - Regenerate the work entries for that month - Compute a batch of payslip for last month, validate and mark it as paid --> The public holiday should be on the payslip - OPTIONAL: run the cron `Payroll: Generate pdfs` to make create the payslip in document and make it available to the concerned employee. - With the concerned employee, put a time off on the whole week of the last month. It should overlap with the public holiday. - Validate the time off and defer it for next payslip - Compute a batch of payslip for following month, validate and mark it as paid Before this commit: The overlapping sick day gets deferred completely ignoring the fact it was a public holiday. After this commit: The overlapping sick day doesn't get deferred. opw-4903546 Forward-Port-Of: odoo/enterprise#89264
This fixes a timing issue that could affect invoice naming when processing Spanish Amazon sales. It helps ensure invoice references are handled correctly and reduces the risk of incorrect or prematurely locked invoice names.
Original PR description
Accessing `invoice_line_ids` was flushing and protecting `move_name` too early. runbot-162079
The journal report now keeps draft invoice lines grouped in a stable order when several draft invoices share the same date. This prevents errors when users click "Load More" while including draft entries, improving reliability for finance reporting.
Original PR description
**Issue description:** When fetching AMLs for the journal report with _query_aml(), it sorts the AMLs based on (am.date, am.name), which are not unique in case we have multiple (draft) moves with the same date. The lines will end up mixed and ordered with respect to the account, which causes errors with the "Load More" functionality, as it assumes that the lines are ordered based on their move. For posted entries, it's not an issue as the am.name is unique. **Steps to reproduce:** -Create 3 or more invoices (with 3+ AMLs each) in draft and on the same invoicing date. -Open journal report settings and set the Load More Limit to 5. -Open the journal report and set the date to this day and check the "Include Draft Entries" option. -Press "Load More", you will get an error. opw-4929907 Forward-Port-Of: odoo/enterprise#90360
WhatsApp message previews now keep underscores in links instead of treating them as italic formatting. This prevents copied URLs from being altered, helping customers and users access the correct pages from WhatsApp messages.
Original PR description
To reproduce this error: 1- Send a message that has _ in whatsapp message e.g. http://example.com/my/orders/3?access_token=ab 2- Preview the message and copy the url into browser 3- As you see _ in the url is turning into italic symbol opw-4889978
This update addresses several user-facing issues across Odoo Enterprise, including payroll offer handling, subscription discounts, accounting exports, bank synchronization, data merging, and localized financial reporting. It improves accuracy, prevents duplicate actions, and helps businesses comply with reporting requirements in Türkiye and Germany.
This fixes an issue where hidden page data could still expose a product’s original list price when a zero-priced item was unavailable for sale. The change keeps those prices hidden for public visitors and search engines while preserving the intended editing behavior for website managers.
Original PR description
Versions
--------
- 17.0+
Steps
-----
1. Create a pricelist setting product prices to zero;
2. configure website to make zero-priced products unavailable for sale;
3. go to /shop as a public user;
4. open the product page of a zero-priced product;
5. open the browser console;
6. use `document.querySelector('.css_non_editable_mode_hidden .oe_currency_value')`
Issue
-----
The query returns an element with the product's original list price.
Cause
-----
In `website_sale`, this element is part of a `t-if` that only gets rendered when `editable` is `True`. A `website_sale_renting` override changes the conditional to `not combination_info.get('is_rental')`.
Solution
--------
Instead of replacing the `t-if` attribute in the override, add `and not combination_info.get('is_rental')` to it, ensuring it remains hidden outside of editable mode.
opw-4865141
Forward-Port-Of: odoo/enterprise#91112This fix restores the previous behavior for imported assets so Odoo no longer shifts depreciation differences from prior software into the next period. It helps keep asset reports and depreciation schedules accurate for customers migrating accounting data, while preserving improved remaining and depreciated value calculations.
Original PR description
This reverts commit 79aa48867de14a6d2315ec95b271004084d74b14. A lot of customers reported that the data was wrong in a lot of cases. For instance, when the previous software computed a lower depreciation than Odoo, Odoo was then moving the difference into the next period. The change for the computation of `asset_remaining_value` and `asset_depreciated_value` has been kept. opw-4968367 opw-4977970 opw-4961381 opw-4991216 opw-4965451 Forward-Port-Of: odoo/enterprise#91751 Forward-Port-Of: odoo/enterprise#91723
Urban Piper menu synchronization now sends a DoorDash-compatible selection limit for multi-checkbox product options. This prevents checkbox-style options from appearing as single-choice radio buttons, helping restaurants present menus accurately on DoorDash.
Original PR description
Steps: - Configure urban piper in pos.config - Select products that has attribute and its type is multi-checkbox - Sync menu. Issue: - For Doordash multi-checkbox appears as radio instead of checkbox. Cause: - max_selectable is -1 which is not supported by Doordash. Fix: - Send static value as 30 instead of -1. task- 4971545
Customers no longer receive automatic emails asking them to pay when a payment has already been started through the payment registration process. This prevents confusing payment reminders and improves the customer experience for invoices paid with saved payment details.
Original PR description
**Before this commit:** When creating an invoice payment with the "automatic invoice" option enabled in Sales settings and using a saved payment token, an email is sent to the customer before the…
**Before this commit:** When creating an invoice payment with the "automatic invoice" option enabled in Sales settings and using a saved payment token, an email is sent to the customer before the transaction move is posted and the invoice payment status is updated to "In Payment." This results in the email incorrectly asking the customer to remit payment, even though the payment is already being processed. **Steps to Reproduce:** 1. Enable "Automatic Invoicing" from Sales settings. 2. Enable and publish any payment provider (e.g., Demo) in test mode. 3. Create an invoice and generate a payment link. Open the link in a new incognito tab and pay using any dummy card number (ensure the "Save my payment details" checkbox is checked). This saves the payment token for the partner. 4. Create a new invoice with the same partner, then register payment. Select the payment method and the previously saved token, then confirm. 5. Observe that the payment status is "In Payment," but the email sent to the customer incorrectly asks them to remit payment. **Fix:** This change prevents payment notification emails from being sent automatically when the payment is manually created from the payment register wizard. opw-4850293 Forward-Port-Of: odoo/enterprise#91570
Searching for loans in the Loan Analysis view now uses the correct loan field, preventing an error message from appearing. This helps users find loan records reliably without interruptions.
Original PR description
Behaviour before this commit: While searching for 'Loan' in the Loan Analysis view, a traceback appears since the filter_domain for the search is on `name` but `name` is not present in account.loan.line, instead it is `loan_name`. Desired behaviour after this commit: The filter_domain for 'Loan' is updated to search for `loan_name` instead of `loan`, and domain for `display_name` is removed. TaskID:4991369
This fix prevents Romanian SAF-T exports from being blocked when optional product group information is missing or when VAT checks incorrectly flag partners. Businesses can complete required tax reporting more smoothly with fewer false validation errors.
Original PR description
- Added fallback for missing to prevent crash during export. - Replaced incorrect usage of with to align with actual partner VAT validation logic and avoid false errors. These changes ensure smoother SAF-T export by handling optional fields and validation more robustly.