Daily updates from Odoo
Navigate
Branch
Thursday, September 11, 2025
109 changes
9 changes
New functionality added to Odoo
A new bridge module connects Sign with AI features so the AI option in the Sign sending flow appears correctly. AI-related functionality now loads only when the AI module is available, avoiding confusing display issues for users without AI installed.
Original PR description
In this commit, Introduce a bridge module that integrates AI features into the Sign send wizard. Without this module, when AI is not installed, the AI button in the wizard was incorrectly rendered as a HTML field instead of a AI button. After this commit, the button displays correctly and AI features load only when AI module is available.
Point of Sale can now receive and manage orders from external food delivery platforms, starting with GrabFood and GoFood. This helps restaurants in Southeast Asia centralize online platform orders in Odoo and provides a foundation to add more providers later.
Original PR description
Introduction: This commit integrate with multiple platform order platform in SEA. This commit also implement a skeleton code base for future adding additional platform order provider. As of now, we included GoFood and GrabFood to begin with. Features list: - Skeleton code for platform order - GrabFood integration - GoFood integration task-4215826 task-3726824
Users can now send signature requests through WhatsApp as well as email. Administrators can configure a WhatsApp message template in the Sign settings, and the WhatsApp send option appears only when that template is available, giving teams another channel to collect signatures faster.
Original PR description
Implemented a new feature that allows users to send sign requests via WhatsApp in addition to email. A new global setting has been added in the Sign app configuration to let users define a WhatsApp message template for sign requests. Once configured, a new button appears in the Send Request wizard, enabling users to send the request via WhatsApp using the selected template. The system uses the defined WhatsApp template to generate the message, including placeholders such as recipient name, document title, and signing link. If no template is configured, the WhatsApp button remains hidden. This enhancement improves flexibility and expands the available communication channels for collecting digital signatures. task-5079248
Enhancements to existing features
Kitchen display screens now show stage names only when viewing all stages, reducing repeated information on individual stage views. Pending course cards now use a warning-style label, making it easier for staff to spot items that still need attention.
Original PR description
Before this commit: - Stage names were visible even when the selected stage matched the order’s stage. - Preparation cards for pending courses displayed `Pending` as a normal label. After this commit: - Stage names are now visible only when the `All` stage is selected. - Pending course preparation cards now display `Pending` as a warning label. Related: - Community: https://github.com/odoo/odoo/pull/223568 task-4985324
The point of sale now remembers the customer display selected on a mobile device and opens it automatically the next time the PoS is launched. This saves staff from manually choosing the same display each session and helps speed up store setup.
Original PR description
- Save the selected display in cookie - Open the selected display automatically when open the PoS
Resolved issues and error corrections
Changing the signing order on a document now stays in place instead of reverting automatically. This ensures notification emails go to the right people at the right time, so documents are signed in the intended sequence.
Original PR description
### Issue: - When the signing order was changed, the changes were reverted back. - Because of this, emails were sent to the wrong users (those supposed to sign later got emails earlier). ### Fix: - Updated the `_compute_signer_ids` method to correctly compute and store the signing order. ### Impact: - Users will receive emails and can sign in the correct sequence according to the set signing order.
DHL and USPS delivery integrations now retrieve package details correctly from sales orders. This prevents shipping information errors and helps ensure accurate carrier processing for affected orders.
Original PR description
This commit fixes the same issue in #89771, but for sale orders instead of pickings. opw-4979982 Forward-Port-Of: odoo/enterprise#94186
This fix restores the intended layout of the quick-create area in bank reconciliation. Users should again see the fields sized and arranged correctly, reducing confusion when entering reconciliation details.
Original PR description
In commit[1] the css handling the grid-template-columns was removed, breaking the quick-create layout. task-5079288 Follow-up of task-4749379 [1]: odoo/enterprise@f9725d7b01cbd1235f022821a6861adb2955e49e
AI chat and document features now handle invalid tool requests and usage limits more clearly instead of stalling or returning empty responses. This improves reliability for users by allowing the AI to recover from mistakes and by making failures visible when a request cannot be completed.
Original PR description
This commit introduces several related fixes to the LLM API service to make tool call processing more robust and prevent silent failures. - **Unknown Tool Calls**: When an LLM requests a tool with an…
This commit introduces several related fixes to the LLM API service to make tool
call processing more robust and prevent silent failures.
- **Unknown Tool Calls**: When an LLM requests a tool with an invalid or unknown
name, it previously resulted in an empty response, causing the conversation to
stall. This change ensures that a proper error message is now returned to the
LLM for the invalid tool call. This allows the LLM to process the failure and
continue the conversation.
- **Failing on Limits**: The query processing loop in `_request_llm` has limits
for both successive API calls and the number of tool calls per request.
Previously, these limits would be reached silently.
- **API Call Limit**: If the `AI_MAX_SUCCESSIVE_CALLS` limit is reached
without the LLM providing a final answer, a `ValueError` is now raised. This
prevents silent failures and makes it clear to the calling code that the
request could not be completed.
- **Tool Call Limit**: If the number of tool calls in a single response
exceeds `AI_MAX_TOOL_CALLS_PER_CALL`, any calls beyond the limit are now
provided with a result stating that the limit was reached. This gives the
LLM the opportunity to try the unprocessed tool calls again in a subsequent
turn.
- **Ignore Explanatory Text**: The text that LLMs often include alongside a tool
call request (the "thinking" text) is now ignored to provide a cleaner and
more concise final response to the user.70 changes
New functionality added to Odoo
Adds support for using iMin receipt printers with Odoo Point of Sale, enabling businesses with iMin hardware to print customer receipts directly from POS. This integration is limited to receipt printing and does not apply to kitchen printers.
Original PR description
- Integrated with iMin Printer. - Only work with receipt printer, won't work in kitchen printer. task-5018605
Enhancements to existing features
The color picker now has more consistent spacing and input styling across its tabs, making it easier to use and more visually polished. Popovers now handle large content better by scrolling instead of overflowing, while older RGBA input elements have been removed to simplify the experience.
Original PR description
Desired behavior after PR is merged: - Applied same padding across `Solid`, `Custom`, and `Gradient` tabs. - Applied same styles to input field (position, angle, hex). - Fixed content overflow inside the popover, allowing excess content to scroll when it exceeds the maximum height. - Removed RGBA inputs related code and tests. task-5047830 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The stock transfer list now separates date-related filters from other filter options. This makes it easier for users to find and apply date filters when managing warehouse operations.
Original PR description
Task: 5075847 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
The website shop configurator preset images have been refreshed with a new placeholder logo. This keeps the setup experience visually consistent and better aligned with current branding when users choose product and shop layouts.
Original PR description
Update configurator preset images in `website_sale` with new placeholder logo. task-5080114 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Color choices now use a rounded visual style and clearly show which color is selected. This makes color selection more consistent and easier to understand across project and general interface areas.
Original PR description
We now have rounded item colors, and we can now see which color is selected. task-5049476 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
The mail composer now better detects when users are actively editing a message, so messages can be marked as read at the right time. Its border styling also gives clearer visual feedback when the composer is focused.
Original PR description
This commit binding the focusin and focusout handlers to the HTML composer, making the mark as read feature working as expected. Also, this commit improves the border styling of the composer with focus state. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Discuss call users now get a clearer, interactive flow for camera and microphone permissions instead of relying on old notifications. The update also requires a name before joining from the welcome page and shows call action icons that reflect the current permission state, reducing confusion before and during calls.
Original PR description
Purpose of this PR: - to join channel through welcome page requires name - removed old notifications, added interactive permission dialog instead for voice sensitivity configuration and call - call actions icons change according to permission state for both call view and welcome page - rtc service tracks camera/mic permission state task-[4967087](https://www.odoo.com/mail/view?model=project.task&res_id=4967087) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Vendor bill uploads now warn users when the bill GSTIN does not match the selected company, helping prevent bills from being recorded under the wrong entity. GSTR-2B matching also handles duplicate invoice reference numbers in draft purchases more smoothly, reducing stalled background processing.
Original PR description
Use Case 1 – Bill Upload/Scan - Issue: When scanning or uploading vendor bills, system allows upload even if the bill’s GSTIN does not match the company GSTIN. This can happen when multiple companies share the same name but have different GSTINs under the same PAN. - Solution: Add a warning if the bill’s GSTIN doesn’t match the company GSTIN: *"It seems Bill’s GSTIN doesn’t match this company. Please verify before proceeding.”* Use Case 2 – Duplicate IRN in GSTR-2B Matching - Issue: Cron job gets stuck when duplicate IRN exists in both draft purchase documents and fetched GSTR-2B data. - Solution: Include draft purchase documents having IRN in the matching process for the current period, so duplicate warnings are skipped and processing continues smoothly. Task ID: 4862214 Forward-Port-Of: odoo/enterprise#92948
This update reorganizes how spreadsheet borders are handled to make editing behavior more consistent and easier to maintain. It helps reduce the risk of future issues in spreadsheet features such as list and pivot autofill, with minimal direct impact for users.
Users now manage their light, dark, or system-based color scheme from their personal preferences instead of the quick user menu. The update also makes first-time loading smoother when the system preference is dark, reducing visible flicker during startup.
Original PR description
As the backend now supports the browser/system/device color scheme, having a directly accessible switch in the UserMenu is not as necessary as before. This commit moves it to the user's preferences instead. task-5074720
Auditors can now access audit working files in PDF format when reviewing completed internal audits. This improves audit follow-up by providing the requested supporting documentation beyond the existing Trial Balance export.
Original PR description
When verifying internal audits that have been done, auditors may request reports of Audit Working files. The working file must be available in PDF. The export currently only contains the Trial Balance with the audit state and last comments (more recent annotation) during the audit. task-id: 4993075
Resolved issues and error corrections
This fix ensures the online store uses the right template when displaying an alternative website snippet. It helps prevent incorrect page elements from appearing, keeping the shopping experience consistent for visitors.
Original PR description
This commit use correct template key in alternative snippet. Issued PR: https://github.com/odoo/odoo/pull/214744
This fix prevents internal display conditions from appearing in the shop page header markup. It keeps the website storefront output cleaner and avoids unintended visible or hidden technical values in the page structure.
Original PR description
In odoo/odoo@f207c7644400228a2ee10dcb3f2731250fcbea08 we introduced conditions on the `o_wsale_products_header` to tweak its styling. However some of the conditions were returning the value of `category` instead of a False boolean. This commit replaces it with `bool(category)` to ensure the condition is False and not rendered in the DOM. task-5059179 What was rendered before this fix: <img width="365" height="157" alt="image" src="https://github.com/user-attachments/assets/ae60629b-7b3d-46bd-bfb4-d935419402a9" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website search empty-state icon has been updated to match the current user interface. This keeps the search experience visually consistent and avoids a small mismatch in the website design.
Original PR description
Before this PR, the empty search icon was not the same as the current one in the UI. task-5062081 | Before | After | |--------|--------| | <img width="469" height="288" alt="Screenshot 2025-09-03 at 11 46 46" src="https://github.com/user-attachments/assets/2d9b1a3b-bfe1-4b3a-af3a-bfc00da1f535" /> | <img width="469" height="288" alt="Screenshot 2025-09-03 at 11 46 36" src="https://github.com/user-attachments/assets/08da73c6-28fd-4ab8-8c83-034af891ca36" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users receiving a Discuss call invitation can now see and use the join button instead of only being able to refuse. This fixes a call invitation workflow issue so invited users can enter calls as expected.
Original PR description
Before this commit, when receiving a discuss call invitation, the user could only refuse the call. This happens due to wrong condition for the showing the "join" call button: this button condition had "no call invitation", which is the exact opposite of the flow that should work! This happens from https://github.com/odoo/odoo/pull/223004 that convert the call invitation buttons into call actions. When doing this improvements, it also reconciled the actions as there was a lot of code duplication, one of which was "join" button in call invitation but also "join" on the call view when not in call. PR made the mistake to have the condition of "join" in call view when not in call (and no invitation), but completely forgot the "join" from call invitation whose condition was excluded from the condition. This commit relax the condition so that it takes into account both cases for the showing of the "join" call button.
Public visitors could see a forbidden error on product pages when certain extra product fields were configured. This fix ensures those extra fields can be displayed correctly, preventing blocked product pages and improving the shopping experience.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Enable debug mode; 2. go to Website / Configuration / Websites; 3. open first website; 4. open Product Page Extra Fields tab; 5. add Icon (Product); 6. go to a product page as Public User. Issue ----- > **403: Forbidden** > [!Note] > For this issue to occur, the extra field cannot be loaded into cache yet, making it difficult to reproduce in versions before 18.3. As of 18.3, access rights are checked regardless of cache status. Cause ----- It's possible to add extra fields that don't allow access to public users by default. Solution -------- In the `ecom_show_extra_fields` template, retrieve the field values in `sudo` mode. opw-5031708 Forward-Port-Of: odoo/odoo#225352
The website shop editor now shows each sample product name only once when previewing a dynamic product catalog without real products. This avoids confusing duplicate text in the preview and makes the editing experience cleaner.
Original PR description
When editing the dynamic product catalog snippet with no real products available, a default sample is generated. Each sample product is assigned a fictitious name. However, the card template for each product also renders a default product name when sampling is enabled, leading to an issue where two names were displayed. This fix ensures only one name is shown by removing the default product name if one is already available.
This fix adjusts several spreadsheet dashboards so their charts are properly aligned. Users reviewing expense, restaurant, sales, timesheet, and eCommerce dashboards should see cleaner, more consistent layouts.
Original PR description
This commits fixes some misaligned charts. Task: 5081680 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
This fixes the compact Discuss sidebar so avatars and their clickable areas are centered. It improves visual consistency and makes the sidebar easier and more reliable to use.
Original PR description
Items were not centered, so the avatar and click zone was off-centered. This commit centers the avatar to fix the issue. Before / After <img width="56" height="578" alt="Screenshot 2025-09-10 at 14 34 09" src="https://github.com/user-attachments/assets/400de8c1-6a87-49d3-823e-157048962bca" /> <img width="59" height="578" alt="Screenshot 2025-09-10 at 14 34 21" src="https://github.com/user-attachments/assets/c4dd72cb-04e9-40df-8e13-f0fe39643c3a" />
The Indian localization now requires a PAN entity name before saving. This prevents users from encountering an error during record creation when the field is left blank.
Original PR description
Cause: When saving a PAN Entity without a PAN, `record.name` is False. The create() method calls `record.name.upper()`, which crashes with "AttributeError: 'bool' object has no attribute 'upper'". Before this commit: It was possible to save a PAN Entity without a name, leading to a traceback during record creation. After this commit: The PAN field is marked as required. Ref - https://pastebin.com/Gu15zLwA
The website builder now applies SVG dynamic colors correctly, so icons no longer disappear when users choose certain palette or grey colors. Color previews also show the actual selected color, making website editing more reliable and easier to understand.
Original PR description
__Current behavior before commit:__ The color palette for SVG Dynamic Colors doesn't work properly. The color preview doesn't show the current color and some colors make the SVG disappear.…
__Current behavior before commit:__ The color palette for SVG Dynamic Colors doesn't work properly. The color preview doesn't show the current color and some colors make the SVG disappear. __Description of the fix:__ - The [`_update_svg_colors`] backend method only works with rgb, hex and the palette colors matching `/^o-color-[1-5]$/`. So all other custom CSS variables (e.g. `var(--white)`) are converted to hex notation in the SVG URL search params. - Furthermore, to show the correct color in the little color preview circle, [`getValue`] now always returns a normalized CSS color value. - The regex matching rgba color in [`convertCSSColorToRgba`] has been fixed to include alpha values that don't have the 0 before the decimals (e.g. `rgba(255, 255, 255, .5)`). __Steps to reproduce:__ 1. Open the website builder 2. Switch to "Artists" theme 2. Drop a Horizontal Attributes snippet 3. Click on one of the SVG icon => the color previews in Image > Dynamic Colors don't correspond to the SVG colors 4. Click on one of the color to open the palette 5. Choose one in the top row => the SVG disappears 6. Go in the "Custom" tab of the color palette => the current color is not the correct one 7. Choose one of the grey shade at the top => the SVG disappears [`_update_svg_colors`]: https://github.com/odoo/odoo/blob/64efa6b7dc7/addons/html_editor/controllers/main.py#L92 [`getValue`]: https://github.com/odoo/odoo/blob/64efa6b7dc7/addons/website/static/src/builder/plugins/dynamic_svg_option_plugin.js#L29 [`convertCSSColorToRgba`]: https://github.com/odoo/odoo/blob/64efa6b7dc7/addons/web/static/src/core/utils/colors.js#L218 Forward-Port-Of: odoo/odoo#224850
Fixes an editor issue where pasting the same hyperlink twice in a row could merge both links into one element and cause an error. The editor now only merges safe text-formatting elements, improving reliability when users paste links into content.
Original PR description
Steps to reproduce: - Copy a valid hyperlink (e.g., https://example.com). - Paste it into the editor. - Without changing the selection or moving the cursor, paste the link again. - Inspect the DOM: both links are merged into single tag, causing a traceback. Description of the issue/feature this PR addresses: - When pasting the same hyperlink multiple times without moving the cursor, editor merged them into a single anchor tag, which triggered a traceback. This appeared after commit [1](https://github.com/odoo/odoo/commit/2752ca733b4feda4ef16eef02fdaba1561ceb6b7), it introduced root-level check for mergeability. Desired behavior after PR is merged: - Only formattable inline tags (SPAN, FONT, B, STRONG, I, EM, U, S) are eligible for merging. task-4965381 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223366
Website editors now see navbar logo height changes immediately while adjusting them, instead of only after saving or reloading assets. This makes the editing experience more accurate and avoids confusion when customizing a site's header.
Original PR description
Steps to reproduce: - Website > Go to Website > Edit - In the sidebar: Navbar logo, change Height - Before: the logo size does not change until clicking Save (or after bundles reload) - After: the logo resizes immediately while editing Since [1], the header logo is rendered with width and height attributes to reserve space and reduce CLS. But since [2], the `width` and `height` attributes have been removed and converted to inline styles, which take precedence over the CSS stylesheet. This commit addresses this issue. [1]: https://github.com/odoo/odoo/commit/d80b8cbc28b6e9d16608f9ecfcf4b360d0c792c7 [2]: https://github.com/odoo/odoo/commit/cb2510f4e525192e4b3d5d673218775c2d9d174e Forward-Port-Of: odoo/odoo#226283
This update fixes an error that could prevent Indian electronic invoices from being sent correctly. Businesses using India e-invoicing should see more reliable invoice processing and fewer failed submissions caused by this issue.
Original PR description
In this commit- --- Fixed a typeError in l10n_in_edi_send_invoice method Replaced - incorrect syntax `data.get['SignedInvoice']` with `data['SignedInvoice']`. opw-5071703 Forward-Port-Of: odoo/odoo#226106
This update brings the spreadsheet component up to the latest version and fixes several user-facing issues. Business users should see cleaner dashboard sorting, better translated chart labels, fewer unnecessary Excel import warnings, and more reliable copy/paste behavior with formulas.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/bd79eea46 [REL] 19.0.1 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/bd79eea46 [REL] 19.0.1 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/5c0bf705c [FIX] dashboard: align sort icon with text [Task: 5075237](https://www.odoo.com/odoo/2328/tasks/5075237) https://github.com/odoo/o-spreadsheet/commit/7c8c52255 [FIX] translation: dynamic translation for chart terms [Task: 5076040](https://www.odoo.com/odoo/2328/tasks/5076040) https://github.com/odoo/o-spreadsheet/commit/0ac0e86e0 [REL] version 19.0 [](https://www.odoo.com/odoo/2328/tasks/) https://github.com/odoo/o-spreadsheet/commit/325073b55 [FIX] Menu: Fix item text truncation [Task: 5072649](https://www.odoo.com/odoo/2328/tasks/5072649) https://github.com/odoo/o-spreadsheet/commit/3c7a71302 [IMP] carousel: improve drag & drop of chart over carousel [Task: 5059979](https://www.odoo.com/odoo/2328/tasks/5059979) https://github.com/odoo/o-spreadsheet/commit/6e09fa499 [FIX] xlsx: remove useless warnings on import [Task: 5075112](https://www.odoo.com/odoo/2328/tasks/5075112) https://github.com/odoo/o-spreadsheet/commit/b5ad83388 [FIX] selection: copy then paste instead of copy/paste loop [Task: 4930718](https://www.odoo.com/odoo/2328/tasks/4930718) https://github.com/odoo/o-spreadsheet/commit/4a4312e57 [REF] Border: Bordel [Task: 4852413](https://www.odoo.com/odoo/2328/tasks/4852413) https://github.com/odoo/o-spreadsheet/commit/6fa1bbcdc [REF] cellComputedStyle: use positionmap [Task: 4930718](https://www.odoo.com/odoo/2328/tasks/4930718) https://github.com/odoo/o-spreadsheet/commit/71360e47d [MOVE] positionMap: move to helper [Task: 4930718](https://www.odoo.com/odoo/2328/tasks/4930718) https://github.com/odoo/o-spreadsheet/commit/7be6b4636 [FIX] clipboard: insert cells bugged with array formulas [Task: 4938311](https://www.odoo.com/odoo/2328/tasks/4938311) https://github.com/odoo/o-spreadsheet/commit/27bbe0fa6 [FIX] xlsx: `=undefined` when importing array formula [Task: 4812508](https://www.odoo.com/odoo/2328/tasks/4812508) https://github.com/odoo/o-spreadsheet/commit/9bfd31dff [REV] xlsx: make import verbose [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
The Uruguay localization now points users to the dedicated Uruguay fiscal localization documentation instead of a general localization page. This makes it easier for users to find the relevant guidance directly from the app information.
Original PR description
Description of the issue/feature this PR addresses: The website link in the `l10n_uy` manifest was pointing to a generic documentation page. Current behavior before PR: Link in manifest points to `https://www.odoo.com/documentation/17.0/applications/finance/fiscal_localizations.html` Desired behavior after PR is merged: Link in manifest points to `https://www.odoo.com/documentation/17.0/applications/finance/fiscal_localizations/uruguay.html` Forward-Port-Of: odoo/odoo#226169 Forward-Port-Of: odoo/odoo#225460
This fix moves product sellability logic to the correct eCommerce module, where the required website publishing information is available. It helps prevent cart-related errors after the recent eCommerce cart redesign while keeping related sales, delivery, and loyalty behavior aligned.
Original PR description
*: sale, delivery, sale_loyalty, website_sale_loyalty In [^1], the eCommerce cart page was refactored to enhance its responsiveness and design. During development, a method closely tied to the `website_sale` module was mistakenly placed in the `sale` module. This method relies on the `is_published` field, which is only available in `website_sale`. This commit corrects the placement by moving the method to its appropriate module, `website_sale`. [^1]: https://github.com/odoo/odoo/pull/190720
Deleting a single calendar event now correctly opens the confirmation window again, so users can preview and send cancellation emails to attendees before removal. This prevents confusing redirects and failed deletion flows caused by missing email template language settings.
Original PR description
Since [1], we removed the 'lang' value from mail templates, as we allow to use a fallback on main partner's lang instead. However, when deleting a calendar.meeting (from Form or calendar) we usually…
Since [1], we removed the 'lang' value from mail templates, as we allow to use a fallback on main partner's lang instead. However, when deleting a calendar.meeting (from Form or calendar) we usually (if no sync is on, and when deleting a single event) open the wizard of confirmation that allows to preview and send cancelation email to the attendees, in order for them to have the information before complete deletion. (see the following wizard: calendar.popover.delete.wizard) Before [1], we wanted to make sure the template had a lang set. But we forgot to change that condition, resulting in a lot of cases where deletion is just not working, and redirects to the calendar view instead (default behavior), as the lang on the template is not set. We now use the ´_render_lang´ method instead in order to compute the lang value and use it in the condition as well, actively opening the confirmation modal instead of doing nothing and redirecting to the calendar event. [1]: odoo/odoo@dc016190e3f3fd90b10fb1eac07204e22d715109 Task-5079771
The Indian localization demo company data now includes a TAN number when TDS is enabled. This prevents setup or demo data issues caused by a missing mandatory tax deduction identifier.
Original PR description
TAN number is a mandatory field when TDS is enabled on a company. 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
This fix restores transparent gray color options in the website editor's custom color filter settings. Business users editing website content can now reliably select these grayscale filter options as intended.
Original PR description
Following the [refactor] of the html_builder, [addition] of the transparent grayscale, and this [commit], we had an issue when the transparent grayscale wasn't displayed as needed because it wasn't…
Following the [refactor] of the html_builder, [addition] of the transparent grayscale, and this [commit], we had an issue when the transparent grayscale wasn't displayed as needed because it wasn't added to 'EDITOR_COLOR_CSS_VARIABLES', which later were used to save colors together with the theme color prefix, i.e., --hb-cp-'color'. Steps to see the issue: - Open website and start editing - Drop a s_cover snipper and click on it - Click on the "Filter" option and select "Custom" - Click on "Color Filter" and go to the "Custom" tab -> Transparent Grayscale isn't displayed correctly. This commit copies [1], which was lost in the refactor. [refactor]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 [addition]: https://github.com/odoo/odoo/commit/55c58bf45165e3a3eafcbaecc516e7c1d19809a6 [commit]: https://github.com/odoo/odoo/commit/eb12451a169c752034abb5d4aab9926c19067ebf [1]: https://github.com/odoo/odoo/commit/5490c126f42bd1729ba0d4b4103d7284ba7ab8c0 Forward-Port-Of: odoo/odoo#225931
The wishlist checkout test now allows more time to complete, reducing false failures when automated validation runs slowly. This helps keep release checks stable without changing the customer-facing wishlist experience.
Original PR description
Increase timeout for wishlist tour. As it was taking too long to complete. runbot-229616 Forward-Port-Of: odoo/odoo#225357 Forward-Port-Of: odoo/odoo#219653
This update prevents the web app from downloading the same large JavaScript file twice when users switch between light and dark mode. It improves loading efficiency and reduces unnecessary data usage, especially for users on slower networks.
Original PR description
CSS bundles are different. JS bundles are the same. Don't download it twice. Note: this avoids downloading a duplicated 3MB compressed (12MB uncompressed) JS bundle with a different name (which avoids the cache being properly used) when switching from light to dark mode. task-5074720
Duplicating sections on invoices, quotations, and templates now preserves settings such as optional sections and hidden composition. This prevents users from having to manually reapply those choices after copying a section.
Original PR description
Steps to reproduce: - Create a quotation/invoice with a section and a product line - Mark the section as optional section or hide composition - Duplicate the section Issue: - The duplicated section does not retain its "optional/hidden composition" status. - This happens because readonly/invisible fields (like `is_optional`, `collapse_*`) are not copied when duplicating records in a StaticList. Cause: - By default, StaticList skips readonly/invisible fields during duplication to avoid issues with some technical fields (e.g., in accounting). Solution: - Introduce a `copyFields` option to `duplicateRecords` in StaticList to explicitly allow copying certain fields, even if they are readonly or invisible. Affected version: 19.0 opw-4669991 Co-Authored by: Julien Carion <juca@odoo.com> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents a confusing system error when saving a view that includes an XML encoding declaration. Users now receive a clearer, handled message explaining the issue, making the problem easier to understand and correct.
Original PR description
Currently, an error occurs when a user includes an XML encoding declaration in the view architecture. **Steps to reproduce:** - Enable **developer mode**. - Under `Settings > Technical > User…
Currently, an error occurs when a user includes an XML encoding declaration in the view architecture. **Steps to reproduce:** - Enable **developer mode**. - Under `Settings > Technical > User Interface > Views` Create or edit any view. - Enter the `view name` and select `view type`. - In the Architecture field, declare encoding as: `<?xml version='1.0' encoding='utf-8'?>`. - Attempt to save the view. **Error:** `ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.` **Root Cause:** The [1] call raises a ValueError when the XML declaration includes an encoding attribute. This low-level error is not handled and results in an ungraceful failure. [1]- https://github.com/odoo/odoo/blob/bf4ccb21f6c9c8bcda9c6f94d844c89296523954/odoo/tools/translate.py#L281 This commit ensures raising an UserError, improving the error message clarity. sentry-6505918596 Forward-Port-Of: odoo/odoo#226396 Forward-Port-Of: odoo/odoo#205324
Vendor price lists created from blanket orders now keep the unit of measure chosen on the blanket order line instead of switching to the product's default unit. This helps purchasing teams avoid pricing mistakes when negotiating or buying in alternate units.
Original PR description
This commit fixes setting the UoM of the vendor pricelist generated by a blanket order. Previously, the created pricelist had the base unit of the product. Now, it has the unit of the blanket order line. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226033
This fix prevents the Point of Sale from crashing when taxes are enabled and added to a product after that product was already used in an active POS session. It helps store staff continue selling without interruption after tax settings are changed in the backend.
Original PR description
Steps to reproduce: ---- - From accounting disable taxes - Create new product - Open PoS UI and add product in orderline - Go to backend and enable taxes - Add tax in previously created product - Open UI again Issue: ---- - We will have traceback Cause: ---- - undefined error as pos_receipt_label is undefined as we don't have chance to reload data as product is already in orderline Fix: ---- - added optional chaining so we don't have undefined error also we have to reload data after enabling taxes from the configurations in the backend ---- task - 4762770 Forward-Port-Of: odoo/odoo#208511
This fix prevents invoice creation from crashing when a company's country has been removed and VAT number verification is enabled. Users can continue creating invoices while the system safely handles incomplete company address settings.
Original PR description
The system crashes with an error when a user tries to create an invoice. **Steps to produce:-** - Install `Accounting` module and switch to `BE Company`. - Go to `Settings > Users & Companies >…
The system crashes with an error when a user tries to create an invoice.
**Steps to produce:-**
- Install `Accounting` module and switch to `BE Company`.
- Go to `Settings > Users & Companies > Companies` and remove the country from the BE company.
- Create a new customer with:-
- Country as `Belgium`.
- Tax ID as `DE123456788`.
- `Accounting > configuration > settings > enable Verify VAT Numbers`.
- Now try to make `invoice` with customer as previously created customer.
**Error:-**
`TypeError : argument of type 'bool' is not iterable`
**Root cause:-**
- At [1], the code attempts to access `company.country_id`, but since the country was manually removed from the company, it evaluates to null record, leading to the error.
**Solution:-**
- Add a safeguard to ensure `company.country_id` also exist before accessing `country_group_codes`.
[1] -https://github.com/odoo/odoo/blob/4c2330f3cc0d1a0046e28d351f894763aeea57d2/addons/base_vat/models/res_partner.py#L764
**sentry-6851141424**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#225158Portal users can now buy paid eLearning courses after completing a quiz from a shared preview link. The change restores the cart action so the purchase flow no longer fails with an error.
Original PR description
Steps to reproduce: 1) Install `website_sale_slides`. 2) Create a course with enroll policy 'On payment' and publish it. 3) Add a content allow preview it and add a quiz 4) Go to website, click Share…
Steps to reproduce:
1) Install `website_sale_slides`.
2) Create a course with enroll policy 'On payment' and publish it.
3) Add a content allow preview it and add a quiz
4) Go to website, click Share button and open the generated link in incognito.
5) Login as a portal user, pass the quiz and click "Buy this course".
Issue:
- A traceback occurred:
`Cannot read properties of undefined (reading 'addToCart')`.
Cause:
- The method call `self.call('websiteSale', 'addToCart', ...)` relied on the deprecated `call` service, which was removed in commit https://github.com/odoo/odoo/commit/b8d0ab4275b24510161de9db793020f3489b0446.
- The service and method `call('websiteSale', 'addToCart'` is not valid and was not updated here :
https://github.com/odoo/odoo/blob/35161ecf0dd3fde47db9b2166718339c2e30ac92/addons/website_sale_slides/static/src/js/slides_course_join.js#L29
- As a result, `addToCart` was no longer accessible and triggered a JS error.
Solution:
- Update the code to use the new service and method: `call('cart', 'add',`
opw-5045424
Forward-Port-Of: odoo/odoo#224760The Belgian demo company now uses a properly formatted VAT number. This prevents validation issues when users test Belgian localization features with demo data.
Original PR description
The Belgian VAT doesn't have the right length, which is causing weird behavior when testing feature with demo data.
In particular, since the company_registry is computed based on it, Odoo doesn't pass some validation since it's not a correctly formatted data.
The VAT should be following the format `^BE[0-1][0-9]{9}$`. So "BE" followed by 10 digits, while we only had 9.
task-noneThis fixes an issue where images in duplicated Team Basic blocks could not be selected or edited. Users can now duplicate team content and still adjust image options as expected in the website editor.
Original PR description
[FIX] html_builder, *: enable image options on duplicated team snippet *: html_editor Steps to reproduce the problem: - Drop the "Team Basic" snippet. - Duplicate it. -> When you click on an image of…
[FIX] html_builder, *: enable image options on duplicated team snippet *: html_editor Steps to reproduce the problem: - Drop the "Team Basic" snippet. - Duplicate it. -> When you click on an image of the duplicated block, the image is not selected and you can not change the options related to it. The problem is that the `o_editable_media` class does not appear on the images of the duplicated snippet as it is a system class. This commit removes the `o_editable_media` class from the system classes. Indeed, it was added by [1] to avoid the closest savable to be marked as dirty when this class was added. However, this class is added during the `normalize` and since [2], the mutations done at the `normalize` do not trigger the adding of the `o_dirty` class anymore. [1]: https://github.com/odoo/odoo/commit/c20dfb73528d60a079d73564504646fe7d1d4272 [2]: https://github.com/odoo/odoo/commit/7c5cdb6d70eea29dec4ba126e62eeb93c6e6eeb2 Related to task-4367641 Forward-Port-Of: odoo/odoo#226051
This update fixes errors when opening subsection options in sales orders and ensures quote PDFs respect hidden pricing for combo products. It also adds missing combo product quantities in PDFs, making customer-facing quotes clearer and consistent with the portal.
Original PR description
### **Description:** - This PR addresses two functional issues in the Sale module and a minor cleanup in `sale_management` tests. ### **Fixes:** - **Traceback on subsection options:** - Opening options for subsections in Sale Orders raised a traceback due to a missing export introduced during refactor 5f4db1d. - Fixed by restoring the missing export. - **PDF report for combo products:** - Combo product prices were shown in PDF quotes despite "hide prices" being enabled. - Quantities of combo products were also missing in the PDF. - Fixed by adding the missing condition for hidden prices and showing the quantity (e.g., Office combo x 5). **Cleanup:** - Removed redundant logic in the optional products test method in `sale_management`. task-4999851 See Also: - https://github.com/odoo/enterprise/pull/94276 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website theme settings panel now avoids unnecessary background rendering when opening sections. This reduces the delay users experience when working in the theme tab, making website customization feel faster and smoother.
Original PR description
The purpose of this commit is to reduce the rendering time of the theme tab. Currently, when we have a BuilderRow that contains a collapse slot, we always render it in order to know whether it contains content or not, so that we can display the collapse arrow. The collapse feature is widely used in the theme tab. This results in a lot of unnecessary calculations, because the only case that requires dynamic calculation of the collapse arrow is the BuilderOption for visibility. So we will therefore add the “observeCollapseContent” props to enable or disable the rendering of the slot in order to dynamically display the collapse arrow. This change saves approximately 20% of time. 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#223929
Fixes an error that blocked users from posting Work in Progress accounting entries from manufacturing orders. This keeps manufacturing accounting workflows usable after recent inventory valuation changes.
Original PR description
Steps to reproduce: * install MRP and Accounting * open an MO * go to actions -> "Post WIP Accounting Entry" Odoo shows an error message, ending with: ``` KeyError: 'property_stock_account_input_categ_id' ``` This looks like a missing part of the "New Inventory valuation" (commit https://github.com/odoo/odoo/commit/08b62a4bbcc6f9a391b2cc00a621ef4c76100229). 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
This fix makes the import screen easier to customize by allowing its startup behavior to be overridden. It helps teams and extensions adapt import workflows without changing the core application, reducing maintenance risk.
Original PR description
This commit, allows to override the `onWillStart` of the import action component.
This fixes a case where email or message processing could fail when expected message details were missing. The change helps keep mail-related workflows running smoothly instead of stopping on incomplete internal data.
Original PR description
msg_vals might not be propagated.
The purchase catalog's Add All action now adds only the currently suggested and filtered products, preventing unintended items from being added to purchase orders. This makes bulk purchasing suggestions more reliable and reduces manual cleanup for buyers.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Unbuild operations now use the current product valuation method instead of forcing a match to the original manufacturing cost. When build and unbuild costs differ, Odoo creates a corrective accounting entry so inventory values and product costs stay accurate.
Original PR description
**Current behavior:** Since https://github.com/odoo/odoo/commit/84dda968146d2f3743ab7fc516300e50780725e3, we valuate an unbuild operation by attempting to match the ensuing OUT layer with the IN…
**Current behavior:** Since https://github.com/odoo/odoo/commit/84dda968146d2f3743ab7fc516300e50780725e3, we valuate an unbuild operation by attempting to match the ensuing OUT layer with the IN layer from the original MO. The point being to eliminate a potential valuation imbalance for the manufactured product (might affect cost, etc.). **New behavior** Don't attempt to match an unbuild valuation layer with the original MO valuation layer. If there is some cost difference between build time and unbuild time, make a corrective journal entry for it. **Issue with current behavior** The following sequence: 1. Create Product A with average costing, real-time valuation 2. Create 2 components, avg costing, real-time val 3. Create a BoM for Product A with the components 4. Manufacture 3 units of Product A with different component quantities (can set flexible consumption on BoM) 5. Unbuild the first manufactured unit Results in Product A's cost not matching the expected average cost according to the valuation layers. **Cause of the issue:** Unbuilding the first MO created an out move at the original "build time" cost, but since we've built 2 additional qty, that original cost is not the current average cost- thus the "theoretically current" standard price of the product (sum of layers value divided by remaining qty) is no longer the value we see on the product form. **Fix:** Don't try and match the valuation layers. Aside from issues such as the one described above, it might not actually make functional sense to do so (e.g., FIFO isn't actually adhering to first-in-first-out if we're preferring the original IN layer for an unbuild valuation). Instead we make a journal entry with any excess cost of production (it was actually a solution proposed in the discussion on https://github.com/odoo/odoo/commit/84dda968146d2f3743ab7fc516300e50780725e3 in the first place). Additionally, now that we aren't doing this mapping, we can revert the non-test difference of https://github.com/odoo/odoo/commit/3a69456a291da593748475c86e7efc6234019e47, as this commit was fixing an issue introduced by the change which added the mapping. opw-[4877597](https://www.odoo.com/web#id=4877597&view_type=form&model=project.task) Forward-Port-Of: odoo/odoo#222014 Forward-Port-Of: odoo/odoo#221718
This fix lets users open meeting chats from embedded live chat, matching the intended live chat experience. It removes a small limitation where the meeting chat option existed but was blocked in the embedded version.
Original PR description
The embed live chat has a subset of allowed thread actions. The meeting chat action was added but not added to the allowed thread actions. In the future, we will allow most of the thread actions, at least the ones allowed for guests. Environment should not impact feature availability. However for now, let's just enable the missing action. 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
This fixes a confusing mobile display issue for product cards with secondary images. The image indicators now better reflect how shoppers can scroll through product images, reducing the chance that the product card appears broken.
Original PR description
=> https://github.com/odoo/odoo/pull/226578 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website editors can now replace background images in Banner Categories, such as sofas, drawers, and desks. This fixes a missing editing option and makes content updates easier without needing technical help.
Original PR description
Steps to reproduce: 1. Go to Website > Edit Mode. 2. Add a Banner Categories snippet from catalog. 3. Click on the image of a category (including sofas, drawers or desks) to replace it. 4. There will be no replace media button. Issue: The banner categories snippet does not contain a selector through which replace option was triggered. Fix: Added a generic selector named o_background_image to both the banner categories snippet and the replace media options. As, it is the generic selector, It can be used for other snippets too.
Restores missing context information so the Import Template button appears again where users expect it in accounting moves and timesheets. This helps users access the correct import template labels and links, reducing confusion during data import workflows.
Original PR description
The context was removed in a previous change (https://github.com/odoo/odoo/pull/222793), which caused the "Import Template" button to disappear in `account.move` and `hr.timesheet`. These models rely on context keys in `get_import_template` to display the correct label and link. This commit adds the `context` back and tests for both models.
The checkout and portal address selector now displays more consistently on mobile devices. Spacing and edit icon placement were adjusted so customers can review and manage addresses more easily during checkout and in the portal.
Original PR description
This PR fixes some issues regarding the mobile design of the address selector, mainly by adapting the margins and paddings in and between the components. 1. The 'edit' icon placement was changing if…
This PR fixes some issues regarding the mobile design of the address selector, mainly by adapting the margins and paddings in and between the components. 1. The 'edit' icon placement was changing if there was no badge on the card (address checkout & portal page). 2. Refine the spaces in the address & billing summary on the payment method page. task-5081875 | | Before | After | |--------|--------|--------| | 1 | <img width="1179" height="2556" alt="image" src="https://github.com/user-attachments/assets/33faf30b-3b6c-47ce-acef-12265b50df0d" /> | <img width="368" height="802" alt="image" src="https://github.com/user-attachments/assets/1432d00e-9d41-488d-b482-b64728319206" /> | | 2 | <img width="1179" height="2556" alt="image" src="https://github.com/user-attachments/assets/195da2f4-9f0e-4cc8-bb4d-df55fc887216" /> | <img width="1095" height="2040" alt="image" src="https://github.com/user-attachments/assets/046f1353-df4b-4b4b-b14c-1fe4d7db85c1" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A bug in the Belgian CodaBox integration could cause an error when processing company records. The fix ensures the correct company is used, helping avoid interruptions for businesses using CodaBox bank document workflows.
Original PR description
We incorrectly used the recordset `self` instead of the record `company` This commit fixes this opw-5036698 Forward-Port-Of: odoo/enterprise#94289
The Ask AI button now opens the AI chat window as expected, even when background loading is still in progress. This prevents users from clicking the button and seeing no response, improving reliability of the AI assistant experience.
Original PR description
The issue is caused by the use of orm service wrapped in "useService". When the button is clicked, it will be unmounted but an orm query is still pending. The pending query is blocked by the useService because the component is already unmounted. The remedy is to use the raw orm service.
The Swiss balance sheet now calculates previous-year unallocated earnings correctly and separates current-year earnings into retained and allocated amounts. This helps businesses reviewing Swiss financial reports see accurate profit and loss carryforward figures at fiscal year-end.
Original PR description
Before this commit, `Previous Year unallocated profit and loss` was showing wrong amount. With this commit, we adapt this line (change period of one of its expression) and we add two new lines to reflect the actual year earnings, retained and allocated. Steps, with fresh db: - 1 invoice confirmed in the past year for 1000 - Create the carryforward move (1000 debit for 999 account, and 1000 credit for 2979 account) - Go to balance sheet, set date as 'End of last fiscal year' -> See 'Previous Years Unallocated Earnings` showing -1000 opw-4054341 Forward-Port-Of: odoo/enterprise#94243 Forward-Port-Of: odoo/enterprise#91281
This fix prevents improvement suggestions from being created for extra work orders that are not part of the original bill of materials. It avoids duplicate quality check setup that could trigger an error when manufacturing orders are duplicated, improving reliability for shop floor and PLM users.
Original PR description
## Issue: Creating multiple suggestions sequences for differents Workorder in Manufacturing Orders that are added aside BoM defined WorkOrder cause an issue with a Traceback error ## Cause: In the…
## Issue: Creating multiple suggestions sequences for differents Workorder in Manufacturing Orders that are added aside BoM defined WorkOrder cause an issue with a Traceback error ## Cause: In the method `add_check_in_chain()`, the `point.sequence` cause issue because the check can have multiple points https://github.com/odoo/enterprise/blob/e85d11f9b3bf07a55e5365adac7370955a149566/mrp_workorder_plm/models/mrp_workorder.py#L58-L66 That the case because multiple quality checks sequences are created when the operation_id is False That's unexpected because PLM isn't made to suggest WorkOrder additions and Suggestions to New WO, but only Suggestions to existing operations So we avoid to create `quality.point` when there is no operation_id ## Information: To get the Traceback, you need to install Quality_control because this module will copy the QC to the MO including the one with operation_id set to False ## Steps to reproduce: Quality_control and plm need to be installed - Enable Work Orders in Settings - Create a Product with a BoM - Create a MO for the Product - Add an extra WO - In the Shop Floor, Mark as Done the BoM's WO - On the Extra WO, click Gear Icon > Update Instructions > Improvement Suggestion > Add a Step - Insert a Title and Propose Change - Duplicate the MO and redo the Shop Floor steps to get the Traceback opw-4874108 Forward-Port-Of: odoo/enterprise#92384
Several spreadsheet dashboards now display charts with improved alignment, making reports easier to read and compare. The updates also refine the Helpdesk and Operation Analysis dashboards for a cleaner viewing experience.
Archived quality control points are now correctly excluded from the product Quality Points button and its count. This prevents users from seeing outdated or inactive quality checks when reviewing products.
Original PR description
**Steps to reproduce:** 1. Install the module `quality_control`. 2. Go to **Products → select any product → Quality Points (smart button)**. * Create a new Quality Point that applies to *all…
**Steps to reproduce:** 1. Install the module `quality_control`. 2. Go to **Products → select any product → Quality Points (smart button)**. * Create a new Quality Point that applies to *all products*. 3. Open any product form. * Verify that the *Quality Points* smart button shows the created point and the correct count. 4. Archive the Quality Point. 5. Reopen the same product form and check the *Quality Points* smart button again. **Observed behavior:** - The archived Quality Point is still counted and shown in the smart button. **Root cause:** - During the refactor from raw SQL (`get_sql` + `cr.execute`) to the ORM query builder (`query.add_where(SQL(...))`), one outer bracket was dropped. [ref](https://github.com/odoo/enterprise/pull/66290/commits/a6362bc07eac7640f68d145a0f6a14a81f499913#diff-2ffdc2ffc25417076b580b772447514c7e9d8b3e2d2fff2d3100721eb5ccbaf4L542-R561) - This changed the operator precedence, causing the `active = true` condition to no longer properly apply when combined with the OR block. - As a result, archived Quality Points bypass the filter and are still counted. **Solution:** - Fix the missing bracket in the `query.add_where` SQL expression so that the `active` condition is always enforced before evaluating the OR block. opw-5046289 Forward-Port-Of: odoo/enterprise#94173
The "Count Entire Locations" button now appears correctly during regular warehouse actions such as deliveries and receipts. It remains restricted only on the physical inventory page, helping staff access the right counting action without disrupting standard operations.
Original PR description
This commit fixes showing "Count Entire Locations" button in normal operations (delivery, receipt, etc.) and only restricts it in physical inventory page.
This fixes rental pricing rules so night-based rental periods cannot be combined with other rental period types. It helps avoid incorrect rental setups and pricing issues for businesses using Odoo rental products.
Original PR description
with other rental periods. Fixes from regression testing post merge.
The Aged Receivable and Aged Payable reports now correctly expand all lines when users apply custom grouping. This prevents incomplete or broken report views, helping finance teams review outstanding customer and vendor balances more reliably.
Original PR description
We previously checked if the groupby is not changed to use the _common_custom_unfold_all_batch_data_generator. However, the user cannot change this field and is instead editing the user_groupby, so _common_custom_unfold_all_batch_data_generator was always used.
The bank synchronization duplicate-finding tool now removes wording that incorrectly suggested users could choose a journal. This avoids confusion by keeping the message aligned with what users can actually do in that screen.
Original PR description
The aim of this commit is removing a small part of sentence in the find duplicate tool in bank synchronization. Indeed, this sentence is proposing the customer to select the journal where it's not possible to do it. no task id
A bug was fixed so accounting import buttons can pass the correct target directly, instead of relying on the surrounding screen to guess it. This helps ensure each import option opens the intended workflow when several import buttons are available on the same page.
Original PR description
Since [1], the import action will infer the model from the current action. In this case, the action is a client action with multiple import buttons. This commit, adapts the extends of the import action to accept the model as as a parameter.
The Indian tax report document summary now avoids showing a misleading “Missing” status when the expected data is already available. This improves clarity for users reviewing GSTR-1 reporting information and helps prevent unnecessary follow-up on valid records.
Original PR description
Issue: - `Missing` tag appeared in document summary even when data was present. - Additionally, record_name was passed in `_check_suite_in_gstr1_report`, but as a computed field it never worked as intended. Fix: - No `missing` tag appears if document summary exists. - Replaced `record_name` with `record_model` to ensure correct record count and computed record name.
The AI context feature now safely handles files that have been added but not fully saved yet. This prevents errors during quick record creation or file uploads, improving reliability for users working with attachments.
Original PR description
When a record contains unsaved binary fields during quick creation or file upload, no ir.attachment exists yet. This leaves `raw bytes objects` in the record’s values, which caused `_get_ai_context()` to crash during `json.dumps()`. This fix updates `_ai_context_json_default()` to also handle raw bytes values (in addition to NewId), converting them into safe string representations so they can be serialized. This prevents crashes in `_get_ai_context()` and ensures consistent JSON output for records with unsaved binaries. task-19060
Code cleanup and technical improvements
The builder asset bundle was renamed to better reflect that it is now shared by website editing and mass mailing email composition. This is an internal naming cleanup that improves clarity for future maintenance without changing business workflows.
Original PR description
*: mass_mailing, portal, website, website_mail, website_mail_group, website_mass_mailing, website_payment, website_profile, website_sale The new html_builder is used by both website and mass_mailing. While the old name `[html_builder|website].assets_edit_frontend` makes sense in the context of the website builder, where the iframe is indeed used to "edit the frontend", it is not the case in mass_mailing, where the email being composed is not a "frontend". A more generic name is more appropriate.
This update tidies the internal tests for subscription optional products without changing customer-facing behavior. It helps keep the subscription area easier to maintain and reduces future risk when related features are updated.
Original PR description
See Also: - https://github.com/odoo/odoo/pull/226052
This change updates an internal asset bundle name so it better fits shared use across website building and mass mailing. It helps keep naming consistent as the same editor technology is used beyond website pages, with no expected direct impact for end users.
Original PR description
The new html_builder is used by both website and mass_mailing. While the old name `[html_builder|website].assets_edit_frontend` makes sense in the context of the website builder, where the iframe is indeed used to "edit the frontend", it is not the case in mass_mailing, where the email being composed is not a "frontend". A more generic name is more appropriate. This commit is linked to the community PR that updates the bundle name everywhere.
Miscellaneous changes
This pull request updates Odoo's release information for version 19.0. It helps ensure the product correctly identifies and communicates the new release version across business and operational contexts.
This pull request marks the Enterprise edition for the Odoo 19.0 release. It is a release-level update rather than a specific functional change, helping align the codebase with the new major version.
21 changes
Enhancements to existing features
The Peppol demo bill has been cleaned up to use clearer and safer sample information, including a distinct vendor address, a reserved example domain, and no IBAN account number. This helps avoid confusion when users or testers rely on the demo bill as a realistic example.
Original PR description
Minor improvements to the demo bill such as usage of VAT number different from belgian company in demo data, removal of IBAN account number, usage of a different address for vendor company and usage of example.com instead of beexample.com, which is not IANA reserved domain name. XML used: [INV_2025_00017_ubl_bis3.xml](https://github.com/user-attachments/files/22254686/INV_2025_00017_ubl_bis3.xml) no-task Forward-Port-Of: odoo/odoo#226305
Resolved issues and error corrections
Changing an expense product's billing policy no longer recalculates and overwrites analytic account allocations on existing expenses. This preserves previously entered expense accounting details while still applying distribution rules correctly when users create or edit expenses through the normal flow.
Original PR description
When changing the expense policy of an expense product, the compute of analytic distribution of all expenses linked to the product is triggered. Steps: - Have an expense product X with expense policy…
When changing the expense policy of an expense product, the compute of analytic distribution of all expenses linked to the product is triggered. Steps: - Have an expense product X with expense policy 'at_sales' - Create several expenses with an expense product X and any analytic account - Create an analytic distribution model that link the expense account of X with a specific analytic account AA - Create a new expense for product X, the analytic account AA should be set from the distribution model - Go to the form view of product x and change the expense policy to 'cost' - Go back to the expense list view -> All expenses having the product X have the AA account Cause: `sale_order_id` has been added to the `depends` of `hr_expense._compute_analytic_distribution` by 2b3bf5e0fe31d4b4ef6b487da493657f695b14e1 but this wrong since we have the `sale_expense._onchange_sale_order_id` that add the `analytic_dostribution` field to the fields to be computed. The compute is triggered since we change `product_id.expense_policy`, which triggers the `_compute_can_be_reinvoiced` which triggers the `_compute_sale_order_id` Fix: With this commit, we emove the depends on the compute and we also adapt `test_compute_analytic_distribution_expense` in a way that it triggers the onchange as we do in the original flow. opw-4998899
This fix ensures critical issues found during the web test runner's dry run are reported as real errors. It helps the team detect blocking test problems earlier and avoid missed failures in automated checks.
Original PR description
The test runner replaces most occurences of `console.log` with a formatted `console.trace`, as to avoid duplicate runbot error messages in general. The issue is that during the dry run, errors that are caught should be logged on the runbot since these errors are more critical (i.e. duplicate test name, which will prevent the runner to run at all). This commit ensures that errors caught during dry run are logged as actual errors to prevent this issue. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
On small screens, selecting an option such as Preferences from the user menu now closes the main menu automatically. This prevents dialogs from opening hidden behind the menu, making mobile navigation smoother and less confusing.
Original PR description
This commit ensures the BurgerMenu is closed when clicking on one of its items, and specifically on one of the BurgerUserMenu items. Steps to reproduce (on small screen): - on a "base" database (no app installed) - click on the BurgerMenu (top right) - click on "Preferences" => the user's preference dialog opens behind the BurgerMenu Forward-Port-Of: odoo/odoo#225696
Checkout payments using saved payment methods now wait until the order is validated before sending the payment request. This prevents customers from being charged when a last-minute issue, such as an expired coupon, blocks order completion.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Have a saved Stripe payment token; 2. create a discount coupon program & a coupon; 3. go to /shop & add a product to your cart; 4. go to checkout; 5. apply coupon; 6. before finalizing payment, set coupon program expiration to yesterday; 7. finalize payment. Issue ----- An error appears, because of the reward change, but a payment request has already been sent. Cause ----- For token transactions, `_send_payment_request` is called immediately upon creation, i.e. before the `WebsiteSale` controller is able to validate the transaction using `_validate_transaction_for_order`. Solution -------- If the payment flow happens via token, add a `delay_payment_request` context value. When creating a token transaction in `PaymentPortal`, only call `_send_payment_request` if this value is not set in the current context. opw-5013284 Forward-Port-Of: odoo/odoo#225008
The web test runner now correctly keeps excluded tests when simplifying test URLs. This prevents intended test exclusions from being lost, helping internal testing remain accurate and reliable.
Original PR description
Before this commit, when the test runner simplified the URL (e.g. if the runner is given the ID of every test in a suite, it will remove them and only include the suite ID), it always considered IDs as being "included", and ignored the "-" specifying that some IDs should be "excluded". --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes planning date calculations so security lead times are applied only once when one warehouse supplies another. This prevents manufacturing and delivery dates from being pushed out too far, and also ensures manufacturing lead times are considered even when a product has no bill of materials.
Original PR description
In this bug, when there are multiple warehouse, and a warehouse is supplied by another one, the security lead time is repeated in calculations. To reproduce the bug: 1- Create a db with, stock, mrp,…
In this bug, when there are multiple warehouse, and a warehouse is supplied by another one, the security lead time is repeated in calculations. To reproduce the bug: 1- Create a db with, stock, mrp, sale installed. 2- Unarchive `MTO` route. 3- Set `Security Lead` Time in Setting. 4- Create two warehouses wh1, wh2. 5- In wh1, set `Manufacture to Resupply` to True. 6- In wh2, set `Manufacture to Resupply` to False and make it resupply from wh1. 7- Create a product and track inventory. 8- Create a BOM for the product. 9- Enable `Manufacture`, `MTO`, `wh2: Supply Product from wh1` routes for the product. 10- Create a new Quote for the product and in the Delivery, select `wh2` as the warehouse. Confirm the Quote. 11- Open MO. Security lead time is considered twice in dates calculations which is mistake. To solve this issue, we must call `_get_dates_info` only once. The current condition might be True more than once for multiple moves. We should also check that it is not True for next moves which otherwise means the security lead time is already effected. This issue is reproduced because this condition is not sufficient to ensure it is called once: https://github.com/odoo/odoo/blob/c0a7b51c9e14d29cefa96c29dd716b7aec698818/addons/stock/models/stock_move.py#L1656-L1657 The above condition is written to ensure we are adding the delay only when move location is warehouse stock location. This cause problem in multi-warehouse because we have this case that move location is warehouse stock location once for wh1 and once in wh2. To solve this issue, we make sure the call `_get_dates_info` doesn't affect when the move has rules with src location in warehouse stock location. related: #112325 opw-4889642
Printing an invoice now uses the same custom PDF report selection as the send workflow. This ensures customers receive invoices with the correct partner or journal-specific layout instead of the generic template.
Original PR description
Before: Clicking 'Print' on an invoice did not respect the custom PDF report template set on the partner profile or journal. The selection was only applied in the 'Send' flow, while 'Print' always fell back to the generic invoice report. After: 'Print' now uses `_get_default_pdf_report_id()` to determine the correct PDF report. This ensures the same priority order is applied as in 'Send'. Explanation: The method `_get_default_pdf_report_id()` encapsulates the logic for choosing the report template (user → invoice default in 18.0, extended with journal in later versions). By reusing this method, we avoid duplicating logic and ensure consistency between 'Send' and 'Print'. task-5072522
Invoice imports now avoid linking products based on overly broad matches for very short item names. This reduces the risk of imported invoices being assigned to the wrong product when names are minimal or ambiguous, such as “-” or “A-1”.
Original PR description
hen resolving a product in _retrieve_product, the code searched by barcode, default_code, and then by name using both exact and ilike domains. For very short item names coming from imports (e.g., “-”, “A-1”, “0001”), the ilike fallback could match unrelated products whose names merely contain that short string. this led to incorrect product linkage on created documents (e.g., EDI-imported invoices). discussed with: Christophe (chkl) Steps to reproudce: Accounting -> Invoices upload an XML with a product name liek `-` or `a` See the product attched to the invoice line. opw-5003482 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update refreshes Odoo’s spreadsheet engine with several fixes that improve everyday spreadsheet reliability. It prevents formula-related import and clipboard issues, reduces unnecessary Excel import warnings, and improves menu text display so users see cleaner, more predictable behavior.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/7e6662c53 [REL] 18.0.44 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/7e6662c53 [REL] 18.0.44 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/9ca5b656c [FIX] Menu: Fix item text truncation [Task: 5072649](https://www.odoo.com/odoo/2328/tasks/5072649) https://github.com/odoo/o-spreadsheet/commit/6a7eee11b [FIX] xlsx: remove useless warnings on import [Task: 5075112](https://www.odoo.com/odoo/2328/tasks/5075112) https://github.com/odoo/o-spreadsheet/commit/e81d09c1e [FIX] xlsx: `=undefined` when importing array formula [Task: 4812508](https://www.odoo.com/odoo/2328/tasks/4812508) https://github.com/odoo/o-spreadsheet/commit/71808b2b1 [REV] xlsx: make import verbose [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/44df57169 [FIX] clipboard: insert cells bugged with array formulas [Task: 4938311](https://www.odoo.com/odoo/2328/tasks/4938311) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
Fixes an issue where loyalty points could be counted twice after a sales order was confirmed, preventing customers from receiving all eligible rewards. This ensures promotions are applied consistently and avoids missed discounts during order processing.
Original PR description
## Versions: 16.0+ ## Issue: After confirming a Sales Order (SO), loyalty points are incorrectly calculated when applying additional promotions. This causes only one reward to be applied instead of…
## Versions:
16.0+
## Issue:
After confirming a Sales Order (SO), loyalty points are incorrectly calculated when applying additional promotions. This causes only one reward to be applied instead of all eligible ones.
## Cause:
When the SO is confirmed, the cost in points for each line is retrieved and deducted to compute remaining available points. However, when promotions are re-applied, the system re-evaluates the total cost of the SO and deducts the points again, effectively double-counting the same lines.
## Steps to reproduce:
- Set up a `Discount & Loyalty` promotion program:
- 2 points granted per purchase (minimum $0).
- Rewards:
- 5% discount on "Simple Pen" (costs 1 point).
- 10% discount on "Whiteboard Pen" (costs 1 point).
- Create a Quotation with "Simple Pen" and "Whiteboard Pen".
- Confirm the Quotation into a Sales Order.
- Apply promotions:
- The first reward applies correctly
- The second reward does not apply
opw-4753472
Forward-Port-Of: odoo/odoo#211342Survey datetime answers now show using the current user's time zone in list labels and answer tabs. This prevents confusion when the displayed answer time differs from the value shown when opening the detailed response form.
Original PR description
Steps to reproduce ==================== 1. Create survey with some datetime questions. 2. Receive some response on it. 3. Check answer of datetime questions in answer tab. 4. Click on that answer to open form. ->The time shown in answer tab differs from actual value in form. The display_name of survey.user_input.line is computed based on the answers submitted by users. For questions of type datetime, the display_name was generated by converting the datetime value to a string without accounting for the user's timezone, leading to a mismatch between the actual value and the displayed time. After this commit ================== This commit updates the computation of display_name for datetime answers to consider the current user's timezone. Task-4890423 Forward-Port-Of: odoo/odoo#226243 Forward-Port-Of: odoo/odoo#216281
This fixes an internal server issue where a missing comma could cause thread startup to fail. The change helps prevent avoidable server errors and improves reliability without changing business workflows.
Original PR description
From the references([Reference 1],[Reference 2])issue occurred because arguments were passed without a trailing comma, which caused a string to be interpreted as multiple positional arguments instead of a tuple. This resulted in a error during thread initialization. Adding the missing comma ensures arguments are correctly passed as a tuple. Error:- `ImDispatch.run() takes 1 positional argument but **Y** were given` [Reference 1]: https://stackoverflow.com/questions/37116721/typeerror-in-threading-function-takes-x-positional-argument-but-y-were-given [Reference 2]: https://stackoverflow.com/questions/69657746/a-function-takes-1-positional-argument-but-133-were-given **sentry-3928947199**
Vendor bills in the Chilean accounting localization now use the standard invoice report unless they specifically require the Chilean electronic purchase invoice layout. This prevents company and customer information from appearing swapped on printed vendor bills, reducing confusion and document errors.
Original PR description
steps to reproduce: ------------------- 1. Install `l10n_cl`. 2. Create a new company and set Chile as the country. 3. Go to Accounting > Configuration > Journals. 4. Create a journal with type…
steps to reproduce: ------------------- 1. Install `l10n_cl`. 2. Create a new company and set Chile as the country. 3. Go to Accounting > Configuration > Journals. 4. Create a journal with type Purchase and enable Use Documents. 5. Go to Accounting > Vendors > Bills and create a bill. 6. Print Invoices / Invoices without payments. issue: ------ The customer and company data are swapped (interchanged), and It is wrong from vendor bills point of view. solution: --------- The l10n_cl reports layout should only be applied to: - out_invoice or out_refund - or when l10n_latam_document_type_id = (46) Electronic Purchase Invoice **Before:** <img width="762" height="425" alt="image" src="https://github.com/user-attachments/assets/e042485b-5d82-455f-9f34-03a0a9cdf5cc" /> **After:** <img width="770" height="624" alt="image" src="https://github.com/user-attachments/assets/c5d09e58-bcf0-48ab-a0ae-0e37c0473a67" /> opw-4937097 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224454
Due to time constraints the translations were not added in the commit adding the modules (72ac059edfcc35ad44c5faa9daf971123377af24). This commit adds the translations / fills the `.po` files. The translations were created by LMAN based on the 18.0 po files. Veri*Factu task: task-3745982 Forward-Port-Of: odoo/odoo#225173
Original PR description
Due to time constraints the translations were not added in the commit adding the modules (72ac059edfcc35ad44c5faa9daf971123377af24). This commit adds the translations / fills the `.po` files. The translations were created by LMAN based on the 18.0 po files. Veri*Factu task: task-3745982 Forward-Port-Of: odoo/odoo#225173
Scanning package type barcodes with GS1 barcode settings now works without server errors. This prevents interruptions in warehouse barcode workflows when identifying package types.
Original PR description
Steps to Reproduce: - Set the barcode nomenclature to GS1 - Scan a package type barcode - Server logs an AttributeError(in Odoo 18) or KeyError(in Odoo 16 and 17) Issue: - The model class "stock.package.type" is missing an attribute "_barcode_field" Solution: - Add the attribute "_barcode_field" to the model class "stock.package.type" Task: [4888064](https://www.odoo.com/odoo/49/tasks/4888064) Forward-Port-Of: odoo/enterprise#94108 Forward-Port-Of: odoo/enterprise#93116
UPS shipping rate checks now handle orders that include combo products correctly. This prevents valid orders from being blocked when calculating UPS delivery rates, improving checkout reliability for affected sales.
Original PR description
Versions -------- - 18.0+ Issue ----- Commit 59a79a5bc51 fixed a bug in 8 shipping connectors, preventing the retrieval of the shipping rate if combo products were present, but failed to fix it in `delivery_ups_rest`. Solution -------- Use `_get_invalid_delivery_weight_lines` helper method to check if there are any lines where a weight is expected, but is lacking. opw-4940973
This fixes a crash that could occur when a currency rate filter dropdown was closed after the accounting report view had already been left or removed. Users should see more stable accounting reports when navigating away while filters are open.
Original PR description
For the currency rate filter, applyFilters is called when the dropdown is closed. It might heppen that we have the dropdown open then we click on something that trigger the destruction of the report view but that still trigger applyFilters which try to apply filter on a destroyed component which is illegal. To prevent this we check if the component is destroyed before reloading the controller.
Financial reports now handle formulas that divide by zero without causing the report to fail. This keeps reports such as Profit & Loss accessible even when a custom formula produces an invalid division result.
Original PR description
Currently, an error is encountered when a financial report contains a line with a formula that results in a division by zero. **Steps to Reproduce:** - Install **accountant, account_reports module**…
Currently, an error is encountered when a financial report contains a line with a formula that results in a division by zero. **Steps to Reproduce:** - Install **accountant, account_reports module** (without Demo). - Navigate to Accounting>Reporting>Profit & Loss - Enable Developer mode, Click on the Edit(Gear Icon) smart button, then click Create to add a new line. - In the new expression line, set the following: >- Computation Engine: Aggregate Other Formulas >- Formula: NEP.balance / REV.balance - Save the new report line. - Reopen Profit & Loss, Report error will encounter **Error:** `ZeroDivisionError: float division by zero` **Root Cause:** At [1], in the `else` block, the case of a potential ZeroDivisionError is not handled properly, causing this issue. [1] https://github.com/odoo/enterprise/blob/770582d4c85629568b2e64f58651f59a9a9a5f86/account_reports/models/account_report.py#L3549-L3556 **Solution:** This commit prevents the error by ensuring that the case of a potential zero division is handled properly. Sentry-**6720835207**
Budget amounts in Profit and Loss reports now display with the correct positive or negative sign. This prevents budget figures and percentages from appearing reversed when budgets are selected or edited directly, improving report accuracy for financial review.
Original PR description
Step: - Create a financial budget with an items for 1000 - Go to P&L report, make sure the dates include the month of the budget item - Select previously created bugdet -> In the budget columns, amount is showing as negative value and % Same happens when setting a value directly in the editable cell. This is because we reformat the value according to the subformula '-sum' of the line's expression. opw-4982788
Documentation and clarification updates
This update records a contributor license agreement signature for tsezgin. It supports the project’s legal compliance process and does not change any product functionality.
Original PR description
The commit contains my CLA signature