Daily updates from Odoo
Wednesday, July 9, 2025
98 changes · saas-18.4
Enhancements to existing features
This update re-enables automated checks for conditional visibility on website pages after changes in the website builder had broken them. It helps ensure website content visibility rules keep working reliably for editors and visitors.
Original PR description
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 translation walkthrough has been updated to work with the redesigned website builder. This restores automated checks that help ensure menu translation remains reliable for website users.
Original PR description
The ```translate_menu_name``` tour was previously broken due to DOM structure changes introduced by the new website builder and was consequently disabled. This commit updates the tour steps to align with the new DOM and re-enables the associated test. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can now adjust the exchange rate used on invoices and quickly apply the rate from a chosen date. The change helps accounting teams handle currency differences more accurately and refresh rates when they do not match the expected value.
Original PR description
- Make `invoice_currency_rate` editable. - Add a date picker widget that let the user apply the rate of a certain date. - Add a refresh button when the rate is not the expected one. To that end, the computed field `expected_currency_rate` is added. task-4378994 Forward-Port-Of: odoo/odoo#214308
Point of Sale now requires the scale reading to change before another weighed product can be added, even if regular items are added in between. This helps meet LNE certification requirements and reduces the risk of accidentally reusing an old weight for a different product.
Original PR description
In order to satisfy certification requirements from the LNE, we implement the following: - A product is weighed at e.g. 200g and added to the order - Another product is weighed. The weight must change from 200g before the user is allowed to add the item. - This should also happen even if another non-weighed product is added in-between. task-4859589 Enterprise PR: https://github.com/odoo/enterprise/pull/87296 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215084 Forward-Port-Of: odoo/odoo#213537
The website HTML builder no longer adds unnecessary internal identifiers to items in its block list. This keeps the builder output cleaner and reduces the chance of unintended metadata appearing where it is not needed.
Printer status information is now aligned with the IoT HTTP service so Odoo can better understand and display real printer conditions. Automatic confirmation of printer actions was removed to allow more accurate follow-up statuses, such as low paper or printer not ready.
Original PR description
Renamed `print_status` to `status` to conform to the status readable by `iot_http` service. We also removed the automatic event confirmation for actions on printers, as we later send the actual status of the printer (low on paper, not ready, ...). Enterprise PR: odoo/enterprise#89638 Task: 4922613
The website editing checks were updated to match the redesigned website builder. This restores automated coverage for a menu editing scenario, helping prevent regressions without changing customer-facing behavior.
Updates Belgian accounting setup data with corrected account details, clearer labels, improved translations, and tax assignments on selected accounts. This helps Belgian companies start from more accurate accounting templates and reduces manual cleanup during configuration.
Original PR description
Misc data modifications and corrections for l10n_be. * Updated the CoA (accounts, descriptions, translations) * Added taxes on some accounts, notably 21%D35 and 21%IG ND * Renamed fields to be more correct See task-4791757 for more details. Related : https://github.com/odoo/enterprise/pull/87067 Forward-Port-Of: odoo/odoo#210755
The automated walkthrough for creating website forms in Website Studio has been updated to work with the redesigned website builder. This helps keep quality checks active so future changes are less likely to break the form-building experience.
Original PR description
The `website_studio_website_form` tour was previously broken due to DOM structure changes introduced by the new website builder and was consequently disabled. This commit updates the tour steps to align with the new DOM and re-enables the associated test.
Installing the Belgian POS blackbox module no longer interrupts users with a prompt to reload IoT Box drivers. This makes setup simpler because the required blackbox driver is now included by default on IoT Boxes.
Original PR description
When we installed the module `pos_blackbox_be`, a dialog was shown to ask the user to reload his IoT Box's drivers (in order for its blackbox to be dected as a blackbox instead of an adam scale). We removed this dialog as we now download the blackbox driver by default on IoT Boxes.
This update helps prevent the same scale reading from being processed twice in Point of Sale when using IoT-connected scales. It makes weighing more reliable for store operations and reduces the risk of incorrect quantities or pricing at checkout.
Original PR description
The main changes are in the community PR odoo/odoo#213537. This commit simply adds a call in the `scale_service.js` override to ensure the new behaviour is also enabled in Enterprise. task-4859589 Forward-Port-Of: odoo/enterprise#88089 Forward-Port-Of: odoo/enterprise#87296
The printer test button now uses the same connection approach as regular receipt and report printing, making test prints behave more consistently. If the usual connection method fails, the system automatically falls back to an alternative so users are less likely to experience failed printer tests.
Original PR description
The "test" button on printer devices should behave exactly as printing a receipt/report in other apps. We now use the IoT http service to handle longpolling call then websocket if longpolling fails. We also updated all other calls to use this service instead of simple longpolling service. Community PR: odoo/odoo#217932 Task: 4922613
Belgian accounting data has been updated with corrected chart of accounts details, translations, and disallowed expense rules. The change also adds default asset model handling for Belgium, helping companies apply Belgian accounting setup more consistently and reducing manual configuration.
Original PR description
1) Misc data modifications and corrections for l10n_be. * Updated the CoA (accounts, descriptions, translations) * Fixed and updated disallowed_expenses 2) Added default asset models module for l10n_be See task-4791757 for more details. Related :https://github.com/odoo/odoo/pull/210755 Forward-Port-Of: odoo/enterprise#87067
Resolved issues and error corrections
This fix prevents the website editor from treating automatic interface changes, such as opening dropdowns or side panels, as real page edits. It helps avoid unnecessary or confusing saved changes while users build website pages.
Original PR description
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
Changing a separator's width in the website editor now keeps its selected color and style. This prevents users from having to reapply formatting and makes page editing more predictable.
Original PR description
Steps to reproduce bug - Add text snippet - Add a separator - Click on the separator - Set color/style - Click on the width - Change the width either by inserting another number or with up/down arrows => the color and style get reverted After this commit the separator style does not get reverted
This fix makes the website editor wait until the page inside the preview is fully ready before loading editing tools. It prevents rare timing-related crashes that could affect fast automated tests or users opening the editor immediately.
Original PR description
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 change prevents checkout errors when an order contains more than one delivery line. Delivery amounts are now calculated using the standard delivery logic, making checkout more reliable for affected orders.
Original PR description
Before this commit an error can appear if there two delivery line. Use method in delivery module to compute delivery amont. This method can compute if there are two line with delivery https://github.com/odoo/odoo/blob/18.0/addons/delivery/models/sale_order.py#L27 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#217705 Forward-Port-Of: odoo/odoo#217624
Users can now see complete dashboard names in the spreadsheet dashboard search panel by hovering over truncated entries. This makes it easier to identify and select dashboards with long names without guessing.
Original PR description
Before this pr: - Long dashboard names were truncated in the search panel. - There was no way for the user to see the full name. After this pr: - A tooltip has been added to display the full dashboard name on hover. Task: [4903713](https://www.odoo.com/odoo/2328/tasks/4903713) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217905 Forward-Port-Of: odoo/odoo#216578
Fixes an issue where editing an internal website link could turn it from a short relative address into a full absolute URL. This keeps website links cleaner and avoids unintended changes when users edit and save link buttons or menus.
Original PR description
> [BSO] Drop block with button link > edit link: it shows the full URL (including protocol etc) for local URLs Steps to reproduce: - Open website builder - Click on a link with a relative URL (there is `/contactus` in footer) - Bug: the url shown is an absolute url (`https://.../contactus`) - Click "Edit Link" (one of the icons) - Click "Apply" - Bug: the url in the dom has changed (it saved the absolute url) The link popover used `HTMLAnchorElement.href` to get the url. This getter returns an absolute url even if the `href` attribute is a relative url. task-4367641
Product back-in-stock reminder emails no longer display a price that could exclude taxes. This avoids confusing customers when website prices are configured to include tax.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Configure website to display prices tax-included; 2. disable selling out-of-stock products; 3. go to an out-of-stock product page; 4. request a reminder email; 5. replenish product stock; 6. run the `_send_availability_email` action; 7. check email that was sent. Issue ----- The price display in the email does not include taxes. Cause ----- The email only checks the `list_price` defined on the product. Solution -------- Don't include the price in the email: - On stable: hide the element to avoid breaking xpaths - On master: remove the price element from the email template opw-4712613 Forward-Port-Of: odoo/odoo#215292
The website editor now shows the background positioning overlay at the correct full size when editing snippets with custom height or width settings. This prevents misplaced overlays and tooltips, making background image adjustments more reliable for website editors.
Original PR description
Before this commit in some snippets background overlay wouldn't have
proper height and/or width because of the snippets `h-{}, w-{}` classes.
This commit overrides it with `!important`.
To reproduce the issue:
- open website and start editing
- drop columns snippet, add background image to one of the cards, click
on it
- Click on the background position option to change it(the one with
a crosshair icon)
- the overlay isn't shown properly, which also breaks the tooltip
position
This should be forward-ported up to 18.3 inclusive, and from 18.4 on, `background_position_overlay.js L135` should be changed because of the [html_builder refactoring].
task-4930050
[html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb
Forward-Port-Of: odoo/odoo#215377This fix makes automated messaging presence tests more stable when test servers are under heavy load. It prevents false failures in Odoo's validation pipeline, helping releases proceed with fewer interruptions while not changing user-facing behavior.
Original PR description
Since [1], https://github.com/odoo/odoo/pull/207974 websocket timeout has been increased during test. Fetching notification only returns the notifications of the last 50 seconds initially. When runbot is under high load, this can lead to non deterministic failures. This commit patches the cursor date to bypass this issue. [1]: https://github.com/odoo/odoo/pull/207974 fixes rubot-223126,223758 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#217953
Updates to analytic items now automatically keep the linked journal item’s analytic distribution in sync. This prevents accounting records from showing outdated analytic allocation information after an analytic item is changed or deleted.
Original PR description
overrode the write and unlink functions related to the analytic_line so that it synchronize the analytic distribution in the move_line every time a change happen before this commit whenever an analytic line is edited it is not reflected to its linked journal line's analytic distribution. so an update function is created so that the analytic distribution is updated whenever an analytic line is edited or deleted. task-4378407 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#218030 Forward-Port-Of: odoo/odoo#199020
A validation problem in the website form builder was corrected by allowing the active form setting to be optional. This prevents unnecessary errors during website editing and helps keep form configuration smoother for users.
Original PR description
This commit fix the props validation issue.here `activeForm` props should be optional props. runbot-227681
This fix ensures custom website snippets only appear on the website they belong to. It prevents editors from accidentally using content blocks from another website, improving consistency for businesses managing multiple sites.
Original PR description
Steps to reproduce: - Create a custom snippet. - Switch website and enter in edit mode. -> Problem: the custom snippet is present in edit mode on the second website while it should only be available on the first one. The commit adds back the `website_id` information when loading the snippets. The information was missing since [the website refactoring]. Related to task-4367641 [the website refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2
Fixes an issue where pasting preformatted text into an eCommerce product description could cause an error when saving. Product editors can now paste richer formatted content more reliably without breaking the product page editor.
Original PR description
Currently, an error occurs when a pre-formatted text is directly pasted into the product description using the website editor. **Steps to reproduce:** 1. Install the eCommerce app. 2. Open the web…
Currently, an error occurs when a pre-formatted text is directly pasted into the product description using the website editor. **Steps to reproduce:** 1. Install the eCommerce app. 2. Open the web editor on any product's detail page. 3. Add product description by copy-pasting preformatted text like; **Amazing Features** stability, durability, consistency 5. Save the changes. **Error:** KeyError - None **Cause:** The issue is caused by an invalid HTML structure. When preformatted/nested block elements are pasted, they get wrapped inside `<p>` block, which is not valid HTML. This leads to missing `data-oe-model` attributes on sub-elements, resulting in an error. Before saas-18.4, the text block used a `<div>` tag to wrap content. After [this](https://github.com/odoo/odoo/commit/bbb2d98d9ab97ce729d59b9858b63daccf5434e2) commit, the wrapper was changed to a `<p>` tag. **Fix:** This commit replaces the wrapper tag with a `<div>` to ensure that preformatted and block-level content can be added and saved. sentry-6731261789
Changing a company's country VAT label now reliably updates the label shown on contact forms. This prevents users from seeing outdated field names after their configuration change, reducing confusion in the Contacts app.
Original PR description
**PROBLEM** When changing the vat label associated to the country of the user's company, it should change the label of the `vat` field. The cached partners views are not invalidated as they should…
**PROBLEM** When changing the vat label associated to the country of the user's company, it should change the label of the `vat` field. The cached partners views are not invalidated as they should and the old views with the old label are presented to the user instead of the new ones. This can be confusing to the user, because while their change had an effect on the database, it doesn't reflect on the views showed to them. **STEP TO REPRODUCE** 1. On a fresh database, install the contact app. 2. From the contact app, Configuration->Countries, select United States which should be the country of the demo company. 3. Change the Vat Label field value. 4. Go on any contact form view, and notice the label of the `vat` field wasn't updated. 5. You can refresh the pages, and sometimes the new value will be there, sometimes not. **CAUSE** https://github.com/odoo/odoo/blob/ac106704f3c2d3e3fa94415134b9d5522b325378/odoo/addons/base/models/res_partner.py#L41C1-L55C1 In the mixin `FormatVATLabelMixin` we modify the form view, changing the label of the vat field accordingly. However, the `_get_view_cache_key` override that would add the field used to make the change (`self.env.company.country_id.vat_label`) to the cache key is missing. Which means the cache isn't invalidated when it should. **FIX** Invalidating cache when writing on `vat_label` opw-4825749 Forward-Port-Of: odoo/odoo#213101
Email recipient tags now use the contact's full display name when a contact has no individual name or email address. This prevents users from seeing vague "Unnamed" labels and makes it easier to identify the correct recipient in sales email workflows.
Original PR description
Steps to reproduce =============== 1. Create a company called Acme. 2. Create a child contact of type Invoicing address but do not give it any name. 3. Go to Sales. 4. Open send mail composer and add this partner as a recipient. ---> The recipient tag will show Unnamed. From [Commit 1], the fallback was given Unnamed. After this commit we'll use display_name as a fallback for no name and email. [Commit 1]: https://github.com/odoo/odoo/commit/cba81ac77d3bad1c686d95f3a9a67f6bde51c569 Task-4812554 Forward-Port-Of: odoo/odoo#211830
This fixes an error that could stop electronic invoice generation when an invoice line included tax details without a tax grouping. Those incomplete tax details are now skipped for the affected export field, helping invoices generate reliably.
Original PR description
Before this commit: If a tax detail of an invoice line has the None tax grouping key, there is a traceback when generating the UBL InvoiceLine/ClassifiedTaxCategory After this commit: We exclude tax details that have the None grouping key when generating the InvoiceLine/ClassifiedTaxCategory. task-none Forward-Port-Of: odoo/odoo#217731
This update corrects the display width of form options in the website HTML builder. It helps keep form configuration controls aligned and easier to use when editing pages.
Original PR description
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 update removes an outdated setting that caused a validation error when viewing a customer's Accounting tab in debug mode. It helps keep the accounting customer view clean and reliable for users and developers working in debug mode.
Original PR description
When being in debug mode and going to the customer -> accounting tab, we have a props validation error. Also some small linter issue no task id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix updates the way the web module generates internal hash values so results stay consistent across different system environments. It helps prevent false failures in nightly automated testing, improving release reliability without changing user-facing behavior.
Original PR description
The previous hashCode algorithm produced was distribution-dependent results, causing errors in the Runbot's nightly tests for different distributions. The new hashCode algorithm is the same as the one used in Hoot [1], and this algorithm produces non-distribution-dependent results. [1]: https://github.com/odoo/odoo/blob/4d7e941939b2d8b644cbf0d9a5a0aa2bb8d4c9e8/addons/web/static/lib/hoot/hoot_utils.js#L941 runbot-error : 227626
Fixes an issue where rotating certain large images could make the editing area scroll and interrupt the rotation control. Users can now keep adjusting image rotation smoothly without losing focus mid-action.
Original PR description
Problem: When a user rotates an image, certain image sizes can cause the editable area to become scrollable. This triggers `resetHandlers` from `usePositionHook`, resulting in loss of focus on the rotate controller. Solution: Add a flag to detect when the user is actively transforming (`mousedown`). Delay the reset until interaction ends (`mouseup`), preventing premature handler reset. Steps to reproduce: - Add a long image - Transform > Rotate until a scrollbar appears - You lose focus on the rotate controller opw-4890029 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215401
This fix ensures MyInvois documents created from Point of Sale consistently link back to their related orders. It prevents incomplete record updates that could cause failures or missing order references in Malaysian e-invoicing workflows.
Original PR description
Otherwise, it causes it fails to assign value to certain records, which is unadvised. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217713
Corrected a typo that prevented the HR future-status field from using the intended calculation method. This helps ensure employee version records are evaluated correctly with minimal visible impact to users.
Original PR description
This commit fixes a typo in the name of the compute method of the is_future field.
The online shop now checks category values in web addresses before using them. This prevents customer-facing errors when a category link is manually changed or contains unexpected text, keeping shopping pages available instead of crashing.
Original PR description
The system will crash when we get the `category` as `str` and we try to evaluate `int(category)` in `_validate_and_get_category` method. **Root Cause:-** - At [1] and [2], we are passing an object in…
The system will crash when we get the `category` as `str` and we try to evaluate `int(category)` in `_validate_and_get_category` method. **Root Cause:-** - At [1] and [2], we are passing an object in the arguments for the category. If we manually provide a category, it may result in a `not found` error instead of a regular error. - However, at point [3], Since the `category` is received from a `query parameter`, it can be easily tampered with, so it should be properly validated before use. - This controller makes the `older controller` (used before V14) `compatible` with the new one. [1] https://github.com/odoo/odoo/blob/1df0feb3dc1b0ac34227683337eca4d95fa986b5/addons/website_sale/controllers/main.py#L470 [2] https://github.com/odoo/odoo/blob/1df0feb3dc1b0ac34227683337eca4d95fa986b5/addons/website_sale/controllers/main.py#L247 [3] https://github.com/odoo/odoo/blob/1df0feb3dc1b0ac34227683337eca4d95fa986b5/addons/website_sale/controllers/main.py#L546 **Error:-** `ValueError: invalid literal for int() with base 10: 'duffle-bags'` **Solution:-** - We added a `validation` to ensure the category parameter is a `valid integer` before using it. - This prevents crashes when users manually input 'invalid` or `tampered category` values in the URL. **Sentry - 6658317828** I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#216791
Customer address entries without a contact name now show their address type, such as invoicing address, instead of displaying “False” in selection lists. This makes it easier for sales users to identify the correct recipient and avoids confusing placeholder text.
Original PR description
Steps to reproduce =============== 1. Create a company called Acme. 2. Create a child contact of type Invoicing address but do not give it any name. 3. Go to Sales. 4. Open the dropdown to select customer ---> Recipient without name will show False after the parent name From commit [Commit 1], formatted display name was added. After this commit, add a fallback as customer's type to the name. [Commit 1]: https://github.com/odoo/odoo/commit/4f594949164f7ee6753f1da92222d2bd904d1d58 Task-4812554 Forward-Port-Of: odoo/odoo#211865
When an Odoo database is neutralized for testing or staging, the Italian FatturaPA e-invoicing option is now turned off. This prevents the system from accidentally creating or reconnecting a live e-invoicing proxy user when settings are saved in a neutralized database.
Original PR description
**Steps to reproduce:** - Install l10n_it_edi - Switch to an Italian company (e.g. IT Company) - In Accounting settings, activate "Fattura Electronica (FatturaPA)" - When saving the settings, the…
**Steps to reproduce:** - Install l10n_it_edi - Switch to an Italian company (e.g. IT Company) - In Accounting settings, activate "Fattura Electronica (FatturaPA)" - When saving the settings, the system tries to create an EDI proxy user if there is no existing EDI proxy user in "test" or "prod" mode - Neutralize the database with the following command: `odoo-bin neutralize -d [db_name]` - Go the settings and save **Issue:** Upon save, the system will try to create an EDI proxy user in "prod" mode (or "test" mode if "l10n_it_edi.proxy_user_edi_mode" system parameter is set to "test"). The database is neutralized. It should not create an EDI proxy user in "prod" mode by default. **Cause:** An EDI proxy user is created in "prod" mode automatically when there is no existing proxy user in that mode and "FatturaPA" is activated. During the neutralization of the database, all proxy users are switched to "demo" mode, but "FatturaPA" is not deactivated. Therefore, the configuration is set to create a "prod" EDI proxy user. **Solution:** As we want to create an EDI proxy user in "prod" mode by default on a non-neutralized database, we can deactivate "FatturaPA" option during the neutralization to prevent the creation of an EDI proxy user on a neutralized database when saving the settings. opw-4795396 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217866
This update corrects an internal quality check so it no longer overlooks missing database indexes in certain test conditions. It also adds the indexes that were previously missed, improving consistency between developer checks and nightly CI runs.
Original PR description
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria…
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria used to ignore the field for indexing was if it belongs to a `test` model in some test module. The best-effort heuristic used for this is to see if there is some `ir.model. data` associated with the model in question and if all module's names associated with these data entries have `test`, then we can ignore the field for indexing. But due to the semantics of `all` for empty collections: ```py assert all([]) is True ``` models that had *no* `ir.model.data` associated at all, e.g. install `--without-demo` and no master data, the field would be ignored for indexing, leading to a passing test. But on nightly, where the CI is run with demo data also, the field isn't ignored anymore and is caught by the test's assertion for indexing suggestion as expected. This leads to errors that are never addressed by the developer that added the fields in question. This commits corrects the test and add the missing indexes that were raised from the CI's false-positive that were missed. Reference --------- runbot-227546 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#216643
The live chat button will no longer briefly show on pages where chat should not be available. This prevents visitors from seeing or trying to start a chat option that disappears moments later, creating a smoother website experience.
Original PR description
When the live chat is loaded on a page, it receives a value called `isAvailable` from the session. This name is misleading: it indicates availability if either an agent or a bot is present, but it…
When the live chat is loaded on a page, it receives a value called `isAvailable` from the session. This name is misleading: it indicates availability if either an agent or a bot is present, but it doesn’t consider the live chat rules. Since [1], we do not wait for the live chat service to be initialized, so the initial value is used instead of the corrected one.
These rules depend on the URL. Since `get_livechat_info` is called from the website template, we can’t determine which rule applies at that point. The goal is mainly to avoid calling `init_livechat` ("/mail/data") if we already know the live chat won’t be available. However, this check alone isn’t enough to decide whether to show the chat button.
This commit renames `isAvailable` to `can_load_livechat` for clarity. If `can_load_livechat` is set, we can load the live chat and call `init_livechat`, which will then set the `livechat_available` value.
task-4908197
[1]: https://github.com/odoo/odoo/pull/194399
backport-of: https://github.com/odoo/odoo/pull/216595
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#217695This fix prevents small rounding differences from causing purchase-related stock costs to become overstated. It improves inventory valuation accuracy when receiving purchase orders in parts, especially when landed costs or currency conversions are involved.
Original PR description
## Before this commit: When calculating the `price_unit` for stock moves from purchase order lines, the `remaining_qty` and `remaining_value` could be imprecise. Standard float comparisons for these…
## Before this commit: When calculating the `price_unit` for stock moves from purchase order lines, the `remaining_qty` and `remaining_value` could be imprecise. Standard float comparisons for these remaining amounts could lead to incorrect `price_unit` calculations if, for example, `remaining_qty` was a small float near zero. This could result in inaccurate stock valuations, particularly when currency conversions were involved or when landed costs were applied. For example, 70.00000003 is rounded **up** to 70.00001 (with 5 digits), resulting in a quantity difference of 0.00001, which incorrectly inflates the unit cost. ## After this commit: Change the rounding method to 'HALF-UP' instead of the default 'UP' to improve precise result for quantities. ## Steps to reproduce: 1. Configure a product with AVCO real time. Set decimal precision for price and UoM to 5 digits. 2. Create a Purchase Order (e.g., 190 units @ $110/unit). 3. Receive 70 units and create a backorder 4. Create and post a bill for the initially received quantity. 5. Apply a landed cost to the picking of the first 70 units. 6. Create a draft bill for the remaining quantity on the PO. 7. Receive the remaining 120 units from the backorder. 8. The product's cost explodes opw-4705224 Forward-Port-Of: odoo/odoo#217691 Forward-Port-Of: odoo/odoo#208815
This fixes Spanish TicketBAI electronic invoicing so the XML includes the reference to the previous document when required. This helps maintain the proper invoice chain for compliance reporting and avoids missing links in submitted data.
Original PR description
Before, the previous document chaining was not sent in the XML because with the t-if, if the variable name is unknown, it will not complain and just see it as False. (like for the first invoice that has no previous) Now, passing the correct variable name, the previous document will be included opw-4814241 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#217685
This fix ensures custom planning fields added to timesheet views are kept when a user creates and saves a timesheet. It prevents user-entered planning information from being overwritten by the default account distribution logic, improving data reliability for project time tracking.
Original PR description
### Steps to reproduce: - Navigate to a Project > View (Timesheets) - Open studio and add x_plan2_id for example to the view - Try creating a new timesheet and set a value for the field we added using studio - Save and notice the field doesn't keep its value ### Cause: This is mainly happening because when getting the plan_ids for the account we are gonna fill we just get the account in the distribution and ignore if the user is setting another value ### Fix: We check the create vals_list if a plan has value we set it before setting the account in the distribution opw-4716041 Forward-Port-Of: odoo/odoo#217715 Forward-Port-Of: odoo/odoo#214865
This fixes a website navigation issue where mega menus could close too early when using the rounded box menu style with hover-based submenus. Visitors can now move from the menu item into the mega menu content without it disappearing, improving usability for affected website layouts.
Original PR description
Scenario: - edit navigation bar to "Rounded box menu" (header_boxed_opt) - select option "Sub Menus" to "On Hover" - add a mega menu - outside of editor, hover the mega menu item and move mouse over…
Scenario: - edit navigation bar to "Rounded box menu" (header_boxed_opt) - select option "Sub Menus" to "On Hover" - add a mega menu - outside of editor, hover the mega menu item and move mouse over it Result: the mega menu content closes before we get to it. History: In saas-18.1 and saas-18.2, these menus with the show on hover have been broken and fixed through different changes: (A) normal popup menu (B) all mega menu (C) mega menu with header_boxed_opt menu bar Here is the list of commit and what was broken after them: - 671515811436a01ea8931d4aa92b62608f8aec90 (nov 2024): C - b9b3a605e0f4c5da3a258c980107d6162da7f44f (jan 2025): A+C - ddf071267bd8aca341cb9b7481f3153a254212e7 (apr 2025): B+C - e65d4cf16a2e973482497c3d9d405b566007e705 (apr 2025): C And hopefully this commit will fix C that happen since in 671515811436a01ea8931d4aa92b62608f8aec90 where we added a !important margin-top to the mega menu in case of header_boxed_opt header that is causing issue C. We do not the the change for a menu inside .o_mega_menu_is_offcanvas because in this case "header_sidebar_opt" doesn't need the fix and needs to have a margin-top because: - it is in the margin-top space that the go back button is - the height is computed taking into account the margin-top, so if we removed it the height of the megamenu+margin-top would not be 100% and there would be a gap at the bottom opw-4876149 Forward-Port-Of: odoo/odoo#217408 Forward-Port-Of: odoo/odoo#214740
Creating a new replenishment rule no longer fails when no product has been selected yet. This keeps the Inventory replenishment workflow usable and avoids blocking users with an unexpected error screen.
Original PR description
Bug introduced in: https://github.com/odoo/odoo/pull/213154/commits/ea480703b64d88ac572c3e37da3d9fb3327b4445 Steps to reproduce the bug: - Go to "Inventory" → "Operations" menu → "Replenishment" - Click "New" to create a new replenishment rule Problem: Traceback is triggered: ``` in _float_check_precision assert precision_rounding > 0,\ ^^^^^^^^^^^^^^^^^^^^^^ AssertionError: precision_rounding must be positive, got 0.0 ``` As the product is not set, the `product_uom` is not set either, which leads to a `product_uom.rounding` of 0.0. Opw-4925719 Opw-4928957 Opw-4926504 Opw-4925919 Opw-4928684 Opw-4925080 Opw-4928788 Opw-4926719 Opw-4927440 opw-4928540 Forward-Port-Of: odoo/odoo#217889
The website editor now correctly displays default spacing values, such as 0, when editing a banner. This avoids confusion for users by making the current layout settings visible instead of showing empty fields.
Original PR description
In the [html_builder refactoring] this behavior has been lost. To reproduce the issue: - Open Website and start editing - Add a "Banner" snippet - Click inside => The "spacing" option inputs are empty, but they should display 0. Related to task-4367641 [html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb
The website editor now shows the correct icon when choosing vertical alignment for floating block cards on mobile. This avoids confusion for users editing mobile page layouts and helps them select the intended alignment option.
Original PR description
Commit [1] added vertical alignment options for the s_floating_blocks cards on mobile, but the icon src was wrong. [1]: https://github.com/odoo/odoo/commit/35f184680d7cdc8dc7d2e619baf7ad0ec02de31c task-4367641
Fixed an issue where the refund reason prompt could fail to appear in Point of Sale when Spanish TicketBAI and Peruvian electronic invoicing features were both installed. This helps staff complete refunds with the required information and avoids interruptions in compliant sales workflows.
Original PR description
When both l10n_es_pos_tbai and l10n_pe_edi_pos are installed, the refund reason popup was not showing up because we were not awaiting the super method call in the l10n_pe_edi_pos override. runbot-227630 Forward-Port-Of: odoo/odoo#217358 Forward-Port-Of: odoo/odoo#216379
This fix prevents errors when editing donation blocks on a website, especially when changing display, pre-filled amount, or description options. It keeps the existing behavior intact while making the donation editor more reliable and adding tests to reduce future regressions.
Original PR description
Since [1], the conversion of actions to classes led to improper function repartition, causing tracebacks when using several `DonationOption` options. This commit resolves these tracebacks by moving the code to its correct location without altering its behavior. Additionally, tests have been added to ensure more robustness. Steps to reproduce: - Drop `s_donation` snippet - Click on it - Use any of the following options: "Display Options", "Pre-filled Options", "Descriptions" - Traceback: "this.rebuildPrefilledOptions is not a function" [1]: https://github.com/odoo/odoo/pull/212138/commits/4f7c91cdf0e6b574ef1939be926a2cfea6cfa15b Related to task-4367641
The website page creation dialog now avoids loading an unnecessary legacy component, making it leaner and easier to maintain. It also corrects how page style information is retrieved, reducing repeated lookups and improving reliability when creating new pages.
Original PR description
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
Invoices created from sales now use the delivery date when choosing exchange rates, rather than defaulting to the invoice date. This prevents incorrect currency amounts for Hungarian companies and other localizations where tax or accounting rules depend on the delivery date.
Original PR description
### Steps to reproduce: - Install l10n_hu_edi and witch to Hungarian company - Have two different rates for EUR<->HUF - Create a pricelist in EUR - Create a quotation with the pricelist and confirm -…
### Steps to reproduce: - Install l10n_hu_edi and witch to Hungarian company - Have two different rates for EUR<->HUF - Create a pricelist in EUR - Create a quotation with the pricelist and confirm - Validate the delivery on another date (which has a different rate from today) - In the sale order click "Create Invoice" - The generated invoice has lines using the rate for today ### Cause: The field `delivery_date` was `precompute=True` but on creation of the invoice, at the time of the precompute, `line_ids` is still `False`. So the invoice is first computed without the delivery date so the currency rate used is the one of the invoice date. When the delivery date is written on the invoice, the line balance is not recomputed because it is "protected". ### Solution: As the field `delivery_date` was implemented in `account_move` for localizations including l10n_hu, there are no reason to contain the fix only to l10n_hu. So we add the value of `delivery_date` in the dictionnary used to create a new invoice from sale with the method `_create_invoices`. This way the delivery date is there on creation of the invoice and is used for the currency rate. opw-4756568 Forward-Port-Of: odoo/odoo#209095
This fixes an error that could occur when checking the number of ongoing live chat sessions. Users and administrators can now access this count reliably, improving stability in live chat management.
Original PR description
**Current behavior before PR:** - accessing 'ongoing_session_count' caused a traceback. **Desired behavior after PR is merged:** - 'ongoing_session_count' should be accessible without any traceback. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an internal test setup for Malaysia's POS e-invoicing module so it no longer relies on an unavailable enterprise component. It helps ensure community-only test runs complete reliably without affecting customer-facing features.
Original PR description
The test in this module imports a common setup from account_reports which is not a dependency, and is not auto installed when the test runs with community modules only. This fix replaces the setup by the community one AccountTestInvoicingCommon. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217681
Tax reports now avoid overstating the net taxable amount when invoice lines share the same tax but use different analytic distributions. This improves financial reporting accuracy for businesses using analytic accounting, while keeping the tax amount calculation unchanged.
Original PR description
### Issue: When having two lines on an invoice with the same tax and different analytic distribution, the base value is doubled on the tax report. ### Steps to reproduce: - Create a new tax on sales…
### Issue: When having two lines on an invoice with the same tax and different analytic distribution, the base value is doubled on the tax report. ### Steps to reproduce: - Create a new tax on sales (eg 10%) - Make sure the option "Analytic Accounting" is ticked in the settings - Create an invoice with two lines (eg both at $100), add the tax on both - Change the analytic distribution on both lines to different values - Confirm the invoice - Go to the tax report - Select the report "Group By: Account > Tax" - On the report the "Net" amount is doubled ($400), the tax amount is correct ($20) ### Cause: On the invoice we can see in "Journal Items" that two tax lines are created instead of one (one for each analytic distribution). The "Group By" reports are generated by [this query](https://github.com/odoo/odoo/blob/51fcbd211d2b1abf4b93becedbcbb9e03002cdd6/addons/account/models/account_move_line_tax_details.py#L92). At the [creation of the second subtable](https://github.com/odoo/odoo/blob/51fcbd211d2b1abf4b93becedbcbb9e03002cdd6/addons/account/models/account_move_line_tax_details.py#L164-L198) the move lines are linked together based among other things on the tax id. The [filter on analytic distribution](https://github.com/odoo/odoo/blob/51fcbd211d2b1abf4b93becedbcbb9e03002cdd6/addons/account/models/account_move_line_tax_details.py#L187-L191) does not apply here as `tax.analytic = False`. The result is that each tax line is linked with both base lines. The second subtable have 4 lines in this case, with each base line doubled. The result of the query have the base amount doubled. ### Solution: We cannot fix the query as there is no link to find the tax line origin among the base lines. The method `_read_generic_tax_report_amounts` in `account_reports` is made to fix the base values in report in case of duplicate. Until now, it did not include the duplication caused by analytic distribution but duplication because of repartition lines for example. The fix is to use this method also for analytic distribution. So we add `tdr.analytic_distribution` in the `GROUP BY`. This value must be returned by the query in `account` so we add it. opw-4753676 Forward-Port-Of: odoo/odoo#217569 Forward-Port-Of: odoo/odoo#213751
This fix ensures important image-related information is kept when forum FAQ content is edited by restricted users. It prevents saved images from losing attachment and format details during content cleanup, helping maintain correct display and behavior.
Original PR description
When adding `html_builder`, some new data attributes were added on images. Those new attributes were not made safe, and might therefore be lost during HTML sanitization. This commit adds the new data attributes to the while list. Steps to reproduce: - Install `website_forum`. - Login as administrator. - Go to "Forum" then "About this forum". - Edit, add an image inside the FAQ and save. - If you inspect the image, it has `data-attachment-id` and `data-format-mimetype` attributes. - Go to Setting. - Setup a "Restricted Editor" user. - In debug mode, go to "Access Rights". - Add write access to `forum.forum` model for "Role / Member" users. - Logout. - Login as the "Restricted Editor" user. - Go to the forum's FAQ page. - Edit, change the text, save. => The attributes `data-attachment-id` and `data-format-mimetype` were lost. task-4367641
Removed outdated dashboard code that referenced information no longer provided by the system. This helps keep spreadsheet dashboards reliable and avoids unnecessary logic without changing expected user behavior.
Original PR description
`params` was removed from the action context by 1b86bd7ecf4d8 So `this.props.action.context.params` no longer makes any sense. It looks like it was useless. Everything seems to work without it. Let's remove it. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where inventory valuation for FIFO products could use the wrong company settings in multi-company setups. It helps ensure the expected accounting journal entries are created when stock moves are processed across companies with different valuation methods.
Original PR description
**Steps to reproduce:** - Install Accounting + Inventory + Sales apps - Enable Automatic Accounting in Settings - Ensure two companies are available - Set one product category (same for both…
**Steps to reproduce:**
- Install Accounting + Inventory + Sales apps
- Enable Automatic Accounting in Settings
- Ensure two companies are available
- Set one product category (same for both companies)
- For company 1 (current) -> FIFO + automatic valuation (`'real_time'`)
- For company 2 -> FIFO + manual valuation (`'manual_periodic'`)
- Create a storable product for this category
- From company 1:
- Buy 10 products at 10$ each and receive them (Purchase + Delivery)
- Sell 15 products at 10$ each and deliver them (Sale + Delivery)
- Buy 10 products at 10$ (Purchase)
- Switch to company 2 (keep company 1 checked)
- From company 2:
- Validate the third delivery order (WH/IN)
- Go to Inventory/Reporting/Valuation
- One journal entry is missing for the last move
**Issue:**
During the processing of the SVL in `_run_fifo_vacuum`, the product used its current env context company instead of the one provided explicitly in the parameters. This caused inconsistencies in valuation logic when the method used differed between the given companies, which results in a missing `account_move_id`.
**Fix:**
Ensure that the product is evaluated in the correct company context by using `product.with_company(company.id)` before the valuation logic.
opw-4732067
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#214966
Forward-Port-Of: odoo/odoo#208644Fixed an issue that could prevent shoppers from opening product pages when the product had sales tags assigned. The shop now uses the correct tag visibility setting, avoiding checkout disruption and improving storefront reliability.
Original PR description
Currently, an error occurs when opening the product in the shop. Steps to Reproduce: - Install the `website_sale` module. - Go to `Products`, open any product, navigate to the `Sales` tab, and add at…
Currently, an error occurs when opening the product in the shop. Steps to Reproduce: - Install the `website_sale` module. - Go to `Products`, open any product, navigate to the `Sales` tab, and add at least one `tag`. - Go to `Website` > `Shop`, and open the same product. `AttributeError: 'product.tag' object has no attribute 'visible_on_ecommerce'` This error occurs when opening a product in the shop. In this commit https://github.com/odoo/odoo/pull/206084/commits/6d0d8d96b603d222de5c099ca090919573d4c761, it was mentioned that the field visible_on_ecommerce has been renamed to visible_to_customers. The error started occurring after this commit https://github.com/odoo/odoo/pull/201019/commits/eac892a4ad7373d18f954afbbcd2f1213ac5f281, where the visible_on_ecommerce attribute is used as a tag attribute [1], which causes the error. [1]- https://github.com/odoo/odoo/blob/850e575b71b04597d31140cec53a596456370325/addons/website_sale/views/templates.xml#L2333 This commit ensures that visible_to_customers is used in place of visible_on_ecommerce. sentry-6731935669 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The employee payroll tab has been adjusted to render correctly. This helps HR users view payroll-related employee information without layout or display problems.
Original PR description
This fixes some rendering issues with the payroll tab. Task: 4885749
This fixes a duplicated Japan tax number example in the VAT validation data. It keeps the correct company registry example in the right place, reducing confusion when users see tax ID guidance for Japanese companies.
Original PR description
The dict contained 2 different examples for a tax number in Japan. Keeping the one that is correctly positioned in the dict. Forward-Port-Of: odoo/odoo#217710
Fixes an issue where users could see an error when opening the serial number generation dialog for products tracked by lot. This keeps warehouse operations running smoothly when generating serial or lot numbers after a recent data format change.
Original PR description
This commit adapts the `GenerateDialog` component for generating serial numbers, for the change introduced in odoo/odoo#205486, which changes the value of m2o to be an object instead of an array. Previous to this commit, an error was thrown when the dialog is opened for a lot-tracked product because the template tries to access `move.product_uom[1]` --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Long company addresses now wrap correctly in document layouts instead of overlapping the logo or being cut off in PDFs. This keeps previews, sales orders, invoices, and other printed documents looking clean and professional when company details are lengthy.
Original PR description
<b>Steps to Reproduce:</b> 1. Go to Settings > Companies > Configure Document Layout. 2. Choose layout Boxed or any layout that horizontally places the company logo and address. 3. Edit the address…
<b>Steps to Reproduce:</b> 1. Go to Settings > Companies > Configure Document Layout. 2. Choose layout Boxed or any layout that horizontally places the company logo and address. 3. Edit the address block choose long string. 4. Save the layout and click Preview Document or print SO or invoice. <b>Issue:</b> - Observe in PDF output the long text overlaps into logo or extend outside the layout bound(differ in layouts) — even though enough space is visually available <b>Cause:</b> - A previous change in [PR #201198](https://github.com/odoo/odoo/pull/201198) added the text-nowrap class to address blocks to fix a minor wrapping issue. However, this unintentionally caused layout overflow issues with long lines. <b>Solution:</b> - Added width to the address block to ensure balanced layout structure. - Removed text-nowrap from all layouts, as the original issue is now resolved by applying proper width sizing. - Removed float-end from Boxed layout, as it was contributing to misalignment. <b>Additional Notes:</b> All behaviors addressed by [PR #201198](https://github.com/odoo/odoo/pull/201198) were re-tested to ensure this fix does not reintroduce previous issues. <b>opw-4764975</b> <br> <b>[PR #201198](https://github.com/odoo/odoo/pull/201198) ISSUE : </b>  <br> <b>ISSUE after [PR #201198](https://github.com/odoo/odoo/pull/201198) FIX:</b> Folder -  Boxed -  <br> <b>After this PR FIX : </b>     Forward-Port-Of: odoo/odoo#216876
Fixes an issue where website theme fonts with multi-word names, such as Open Sans, were not applied correctly. This ensures selected fonts display as expected, improving visual consistency for websites.
Original PR description
Since `html_builder` was merged, font family selection is not implicitly quoted anymore. This is a problem for font families having names that contain spaces. This commit puts font family names between quotes before calling `customizeWebsiteVariable`. Steps to reproduce: - Go to the Theme tab - Pick "Open Sans" as font family - Inspect page => The used font was not "Open Sans". task-4367641
The website editor now hides the image quality setting when an externally linked image cannot be processed by the browser. This prevents users from selecting an option that could make the image disappear or become corrupted.
Original PR description
When an image is added from a CORS URL, the image data cannot be obtained from the web browser. Because of this, converting the image to another format, adjusting its quality or other manipulations are not possible. Currently the "Quality" option appears for CORS image - but disappear when trying to use it, which also corrupts the image. This commit hides the "Quality" option when converting to another format is anyway unavailable. Steps to reproduce: - drop an image block - replace an image by using "Add URL" and specify a [non-CORS image] - "Quality" option was available and could be used - replace an image by using "Add URL" and specify a [CORS image] => "Quality" option was available, but should not have been. Upon use, image was lost and "Quality" option disappeared. [non-CORS image]: https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Thysanoptera.jpg/420px-Thysanoptera.jpg [CORS image]: https://tinyjpg.com/images/social/website.jpg task-4367641
The test process now verifies that generated electronic invoice XML files use the correct namespace information, not just the visible content. This helps catch compliance issues earlier for localized e-invoicing formats and reduces the risk of invalid documents being released.
Original PR description
At the moment, the `assertXmlTreeEqual` test method doesn't check that the namespaces in the generated XML match the ones in the expected XML. This is a 'feature', but in practice it prevents us from ensuring that our generated XMLs are correct. From now on, we also check namespace equality. Enterprise PR: https://github.com/odoo/enterprise/pull/87950 task-none Forward-Port-Of: odoo/odoo#217182 Forward-Port-Of: odoo/odoo#214764
Bookkeepers can now open return forms from the dashboard even when no opening date has been set. Closing or resetting a tax return also works without access errors when the system updates lock dates, reducing interruptions in tax return workflows.
Original PR description
- Trying to open the returns form the dashboard failed for bookkeepers when no opening date was set, since the wizard used to set them is restricted to administrators only. - When closing a tax return, an access error was triggered when trying to set the lock date. - When resetting a tax return, an access error was triggered when trying to set the lock date. Forward-Port-Of: odoo/enterprise#89610
The Belgian point of sale fiscal device now starts listening for replies before sending a request. This prevents rare timing issues where a fast device response could be missed, leaving the checkout process waiting indefinitely.
Original PR description
Before this commit, the listener to the longpolling or the websocket was added (subscribe for websocket and addListener for longpolling) after the action was sent to the IoT. The answer could be sent before we even listen to it so the answer was never received. This could cause infinite waiting. Forward-Port-Of: odoo/enterprise#89753
Field Service users can now open and generate task report details from the customer portal without hitting an error when only the core Field Service app is installed. The report filename logic was moved into the main Field Service module so the portal flow works reliably without requiring the optional reporting add-on.
Original PR description
An error occurs when a user attempts to generate a report from the portal because the `industry_fsm_report` module is not installed. **Steps to reproduce:** * Install `industry_fsm` * Field Service>New Task>log time sheet using `start` button * open portal view( `/my/tasks` )> Your created task> `View details` `AttributeError: 'project.task' object has no attribute '_get_report_base_filename'` **Solution:** * Define `_get_report_base_filename` inside `industry_fsm` instead of `industry_fsm_report`. **Sentry-6685756279** Forward-Port-Of: odoo/enterprise#89615 Forward-Port-Of: odoo/enterprise#87949
VoIP now removes parentheses when preparing phone numbers for calls. This helps ensure numbers saved or entered with common formatting, such as area codes in parentheses, are dialed correctly.
Original PR description
Add parentheses to the list of characters that are stripped from phone numbers. Part of task-4891947. Forward-Port-Of: odoo/enterprise#89625 Forward-Port-Of: odoo/enterprise#89551
This fixes WhatsApp functionality so it loads correctly in all relevant Odoo pages, including public discussion pages, live chat, portal chatter, and back-end screens. It helps ensure WhatsApp messages and related features behave reliably no matter where users receive or view them.
Original PR description
`common` folder should be included in all bundles. This is especially necessary when broadcasting messages on the bus, because these messages will be received in all tabs, including those potentially not in the back-end, such the discuss public page, any page where a live chat is opened, or a portal page with a chatter. This is also necessary just to have all features properly working in all context, there is no reason that a whatsapp viewed in the public page should not have its features working as intended. runbot-223082
The Point of Sale appointment screen now correctly shows the empty bookings illustration when no bookings are available. This prevents an error from interrupting users after changing the booking view filters.
Original PR description
Steps to reproduce: ------------------------- - Open pos enabled with bookings. - Open booking tab and in gantt view remove groupby filter. Issue: ------- There will be a traceback. Cause: -------- When there are no bookings available it tries to load no booking svg template, which is not loaded in the assets. Fix --- We have loaded the missing asset file to ensure the SVG displays correctly when there are no bookings. task: 4912389
Swiss payroll-specific employee fields are now only shown for Swiss companies in multi-company setups. This prevents users in companies from other countries from seeing irrelevant Swiss payroll information, reducing confusion and keeping employee screens country-appropriate.
Original PR description
When using odoo in multi company with Swiss installed, we can see the fields from any other company. They should be hidden if the country is not Swiss. Task: 4788657
The signing template view now hides edit icons when users are only previewing a template, reducing visual clutter and preventing confusion. The document menu button display was also corrected, making the template viewing experience more consistent.
Original PR description
Hide the pencil (edit) icons in the sign_template_sidebar view when in template visualization mode. Also fixed the document menu button to ensure it appears correctly. These changes provide a cleaner and more consistent template viewing experience. task-4908825 This fix depends on the related [Enterprise PR #89129](https://github.com/odoo/enterprise/pull/89129), which should be merged first as it contains another part of the task.
The UAE Corporate Tax Report now prevents tax amounts from appearing as negative when taxable profit is below the exemption threshold. This avoids misleading report totals and correctly shows zero tax due in these cases.
Original PR description
The Corporate Tax Report was incorrectly showing a negative"Corporate TAX Amount" when the taxable profit fell below the exemption threshold (e.g 375,000 AED). This issue happened because the formula used to compute the Corporate TAX Amount was: `AE_CORP_TAXABLE.balance * (AE_CORP_TAX_PERC.balance / 100)` This formula applies the tax rate even when `AE_CORP_TAXABLE.balance` is negative, which results in an incorrect negative tax amount in the report. Since the report engine doesn't support conditional logic like `max(...)` or `> 0` in XML formulas, we couldn't fix this in the formula definition directly. To solve the issue, we added a check in the Python report handler `_custom_line_postprocessor` to override the value of the Corporate TAX Amount and cap it at zero when it would otherwise be negative. Steps to reproduce: In run bot or any db go to Corporate tax report OPW-4739052 Forward-Port-Of: odoo/enterprise#86087
This fix prevents an error when a user removes the description from a journal item in Uruguay electronic invoicing. It ensures invoices can still generate the required DGI XML correctly, avoiding disruption from an empty description field.
Original PR description
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description…
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description automatically populates with the product name upon line creation. However, users can intentionally clear this field. If the description field becomes empty, its value is interpreted as `False`. This leads to an `AttributeError: 'bool' object has no attribute 'replace'` traceback when the `_l10n_uy_edi_get_line_nom_and_desc` method attempts to process this boolean value, as it expects a string. This issue specifically affects the generation of the "DscItem" tag in the XML file sent to DGI. ### Solution: To prevent this error, an additional validation has been implemented for the line description. This validation ensures that if the field's value is `False`, it is not processed by the `_l10n_uy_edi_get_line_nom_and_desc` method, thus avoiding the traceback. Forward-Port-Of: odoo/enterprise#89407
The VoIP softphone now uses a minus icon instead of an X to hide the call window. This reduces confusion and hesitation for users who may worry that clicking the button will end their active call.
Original PR description
The "cross icon" (X) is believed to be too "scary"; people don't dare to click it in the middle of a call out of fear of hanging up, even though the softphone window might be in their way. The "minus icon" (-) might deceive one's expectations by hiding the window rather than minimizing it, but we decided that it was still better this way. Part of task-4891947. Forward-Port-Of: odoo/enterprise#89555
This update ensures the Indian GSTR-1 report JSON always includes an expected empty document issue section when there are no entries. It prevents automated validation failures, helping keep tax report generation checks reliable without changing business workflows.
Original PR description
- Assigned doc_issue with empty list to comply with formatting of gstr1 json. - This prevents test failures caused by missing keys during JSON validation. runbot error: 229705 Forward-Port-Of: odoo/enterprise#89711 Forward-Port-Of: odoo/enterprise#89635
Budget reports now handle negative purchase order lines, such as discounts, without creating an extra duplicated budget entry. This keeps budget figures accurate when bills include discount lines tied to a project or analytic account.
Original PR description
Steps to reproduce: - Create a new Budget with budget line having Project [TEST] - Create a purchase order with 2 lines: 1. Product A, analytic [TEST], price unit 100, qty 1 2. Product B, analytic [TEST], price unit -10, qty 1 - Confirm the PO, mark products as received - Create the bill and confirm - Go back in PO, click on Budget smart button, open list view Issue: The budget report will correctly show a line for each invoiced line, but an extra line with double discount amount is present Occurs because we use a SQL code to replicate the qty_invoiced field of a purchase order line, but we adjust the sign based on the aml balance instead of taking into account the move type opw-4775631 Forward-Port-Of: odoo/enterprise#89545
Brazilian electronic invoices now choose the correct invoice purpose in more common business cases instead of always using the standard purpose. This helps invoices, credit notes, and debit notes pass EDI validation when product, vendor, customer, or operation details require a different purpose.
Original PR description
We hardcoded the standard purpose (finNFe) and goal for invoices, credit notes and debit notes. In certain cases however, the purpose is must be different for EDI to succeed (based on the combination of sold product types, vendor and customer). In master we will likely add some fields on the operation type so the user can choose, but in stable we can already determine some other common cases based on the operation type. Using XML ids was considered but since users can create and edit operation types [1] it's better to use the technical names. [1] Since odoo/enterprise#73198 opw-4832447
Bank statement line imports now preserve an included statement reference instead of always creating a new bank statement. This prevents duplicated statements and keeps imported reconciliation data aligned with the original records.
Original PR description
…id during import In the override of execute_import of account_bank_statement_import_csv.py a new account.bank.statement was always created even if the import contained statement_id. Steps to reproduce: - Export an account.bank.statement.line in bank rec with the statement_id included. - Import it back. The statement_id of the imported lines is a new one. opw-4753864 Forward-Port-Of: odoo/enterprise#87885 Forward-Port-Of: odoo/enterprise#87165
This fix corrects an internal automated test so it no longer overlooks missing database indexes in certain data setups. It also adds the missed indexes across several Odoo Enterprise modules, helping prevent performance issues from reaching later CI runs or production environments.
Original PR description
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria…
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria used to ignore the field for indexing was if it belongs to a `test` model in some test module. The best-effort heuristic used for this is to see if there is some `ir.model. data` associated with the model in question and if all module's names associated with these data entries have `test`, then we can ignore the field for indexing. But due to the semantics of `all` for empty collections: ```py assert all([]) is True ``` models that had *no* `ir.model.data` associated at all, e.g. install `--without-demo` and no master data, the field would be ignored for indexing, leading to a passing test. But on nightly, where the CI is run with demo data also, the field isn't ignored anymore and is caught by the test's assertion for indexing suggestion as expected. This leads to errors that are never addressed by the developer that added the fields in question. This commits corrects the test and add the missing indexes that were raised from the CI's false-positive that were missed. Reference --------- runbot-227546 Forward-Port-Of: odoo/enterprise#88998
This fix prevents an error when users run reconciliation models without any bank statement lines available to process. Accounting teams can now run internal transfer reconciliation models safely even when there is nothing to reconcile.
Original PR description
SQL syntax error occurs when trying to auto reconcile transactions via reconcile models,it is because there are no statement lines to reconcile. **Steps to reproduce:** * Install `accountant` module (No demo data needed) * Accounting Dashboard> Bank dropdown menu * Under reconciliation>Models>Internal Transfers>Run Now `syntax error at or near ')' LINE 57: WHERE st_line.id IN ()` **Solution:** * Return the function if there are no statement to reconcile. **Sentry-6610155279** Forward-Port-Of: odoo/enterprise#85937
The map view now opens Google Maps using the contact's full address instead of relying on saved latitude and longitude coordinates. This avoids incorrect Google Maps results when another geolocation provider, such as OpenStreetMap, produced less precise coordinates.
Original PR description
**Steps to reproduce:** - Install Contact app - Create a contact with a specific address - Go to the Map View of the Contact app - Filter to view the new contact - Position in the map might be…
**Steps to reproduce:** - Install Contact app - Create a contact with a specific address - Go to the Map View of the Contact app - Filter to view the new contact - Position in the map might be slightly different from given one (when using OpenStreeMap) - Click on the position marker > `Navigate To` the address is recomputed correctly - Click on `View in Google Maps` the address given is often wrong **Issue:** Previous solution was trying to build the url used by the `View in Google Maps` button by using `partner_latitude` and `partner_longitude`. These were previously computed using the default geolocalization method. If it was set on OpenStreetMap, the coordinates were not precise enough and impacted the Google Maps results. As described in the documentation : `OpenStreetMap might not always be accurate.` But this shouldn't impact Google Place API results. **Fix:** Adapted the computation of `googleMapUrl()` to use `contact_address_complete` to ensure the addresses are recomputed properly when sent to Google Maps. opw-4649910 Forward-Port-Of: odoo/enterprise#87430
This fixes an issue where the refund reason prompt did not appear in Point of Sale when Spanish TicketBAI and Peruvian electronic invoicing features were both installed. Refund workflows now behave as expected, helping staff capture required refund information reliably.
Original PR description
When both l10n_es_pos_tbai and l10n_pe_edi_pos are installed, the refund reason popup was not showing up because we were not awaiting the super method call in the l10n_pe_edi_pos override. runbot-227630 Forward-Port-Of: odoo/enterprise#89423 Forward-Port-Of: odoo/enterprise#88813
This update fixes issues with the Payroll tab on employee records across multiple country-specific payroll setups. It helps HR and payroll users access the expected employee payroll information consistently, reducing confusion when working in localized payroll configurations.
Original PR description
This fixes the payroll tab in the inherited view of employee for various loca. Task: 4885749
Opening the filters panel in the subscription dashboard no longer fails when some filters do not apply to the current data model. The change skips irrelevant filters when preparing suggestions, improving dashboard editing reliability for users.
Original PR description
Steps to reproduce: 1. Edit the subscription dashboard 2. Open the filters side panel => Boom This is caused by the fact that the suggestions store was trying to match filters that are not matching the current model. Task: 4911733
Tax reports now show the correct net base amount when invoice lines share the same tax but use different analytic distributions. This prevents overstated tax report figures while keeping the calculated tax amount unchanged.
Original PR description
### Issue: When having two lines on an invoice with the same tax and different analytic distribution, the base value is doubled on the tax report. ### Steps to reproduce: - Create a new tax on sales…
### Issue: When having two lines on an invoice with the same tax and different analytic distribution, the base value is doubled on the tax report. ### Steps to reproduce: - Create a new tax on sales (eg 10%) - Make sure the option "Analytic Accounting" is ticked in the settings - Create an invoice with two lines (eg both at $100), add the tax on both - Change the analytic distribution on both lines to different values - Confirm the invoice - Go to the tax report - Select the report "Group By: Account > Tax" - On the report the "Net" amount is doubled ($400), the tax amount is correct ($20) ### Cause: On the invoice we can see in "Journal Items" that two tax lines are created instead of one (one for each analytic distribution). The "Group By" reports are generated by [this query](https://github.com/odoo/odoo/blob/51fcbd211d2b1abf4b93becedbcbb9e03002cdd6/addons/account/models/account_move_line_tax_details.py#L92). At the [creation of the second subtable](https://github.com/odoo/odoo/blob/51fcbd211d2b1abf4b93becedbcbb9e03002cdd6/addons/account/models/account_move_line_tax_details.py#L164-L198) the move lines are linked together based among other things on the tax id. The [filter on analytic distribution](https://github.com/odoo/odoo/blob/51fcbd211d2b1abf4b93becedbcbb9e03002cdd6/addons/account/models/account_move_line_tax_details.py#L187-L191) does not apply here as `tax.analytic = False`. The result is that each tax line is linked with both base lines. The second subtable have 4 lines in this case, with each base line doubled. The result of the query have the base amount doubled. ### Solution: We cannot fix the query as there is no link to find the tax line origin amongst the base lines. The method `_read_generic_tax_report_amounts` in `account_reports` is made to fix the base values in report in case of duplicate. Until now it did not include the duplication caused by analytic distribution but duplication because of repartition lines for example. The fix is to use this method also for analytic distribution. So we add `tdr.analytic_distribution` in the `GROUP BY`. This value must be returned by the query in `account` so we add it. opw-4753676 Forward-Port-Of: odoo/enterprise#89569 Forward-Port-Of: odoo/enterprise#87404
Customer follow-up reports now ignore accounting entries that do not have a due date or payment terms. This prevents customers from being incorrectly marked for follow-up and avoids misleading statements showing action needed when the balance is actually zero.
Original PR description
### Issue: It is possible to break the followup reports by directly creating entries in the past. ### Steps to reproduce: - Example on Belgian loca - Accounting Dashboard > Misc > new Entry with -…
### Issue: It is possible to break the followup reports by directly creating entries in the past. ### Steps to reproduce: - Example on Belgian loca - Accounting Dashboard > Misc > new Entry with - Date far in the past (ie 2024-01-01) - Account: "400000 Customers", Partner: "test partner", Debit: 500.0 - Account: "499000 Suspense Accounts", Credit: 500.0 - Post - In Customers > Follow-up reports, the partner is marked as "In need of action" even if no due date was specified - Accounting Dashboard > Bank > new with Amount: 500.0 - "Save & Close" then click on it - In the page "Manual Operations" change the partner to the one from the MISC entry - Change the Account to "400000 Customers" - Validate - The follow-up report is no longer "In need of action" - Create an invoice with a due date in the future - The follow-up report is back to "In need of action" with the amount of the invoice - When sending the follow-up, the Customer statement reads "your account shows an outstanding balance of 0.00€" ### Cause: The origin of this issue is that the MISC entry and the Bank payment are not reconciled. The MISC entry is used to calculate the state of the followup making it to "In need of action" but the bank entry is balancing the amount to 0.00€. The MISC entry should not be used to compute the followup state as it has no due date specified (it makes no sense, it is never linked to any invoice). But in the code when there are no `line.date_maturity` we fallback on `line.date`. ### Solution: The lines without due date or payment term should not be used to compute the state of the followup or calculate the total due. So we remove the fallbacks on `line.date` when `line.date_maturity` is False. Some tests needed to be adjusted as they were not using any payment terms or due date. They were working because of the fallback on `line.date`. opw-4784250 Forward-Port-Of: odoo/enterprise#89627 Forward-Port-Of: odoo/enterprise#87873
Fixed an issue that could stop a barcode scanner from being assigned during Point of Sale IoT setup. This helps stores complete device configuration smoothly and avoids a setup error reported in monitoring.
Original PR description
The error occurs because `append()` is used on the Many2many field `iface_scanner_ids` in `pos_config`, which is not allowed. Traceback: `AttributeError: 'iot.device' object has no attribute 'append'` Many2many fields should be updated using `|=` to add records, as the Python list method `append` is not supported for relational fields. [1]- https://github.com/odoo/enterprise/blob/5bff585cfa24940626b14cdeaeae07b50a931e94/pos_iot/wizard/auto_config_pos_iot.py#L55 sentry-6719710908 Forward-Port-Of: odoo/enterprise#89123
The Signed Contract button now opens the correct employee contract version after all required signatures are completed. This prevents confusion for HR users and helps ensure they review the right signed offer information.
Original PR description
- Fixed an issue where clicking the "Signed Contract" smartbutton after full signature opened an incorrect employee version. Task-4873800
When a new employee contract is created through the salary configurator, the previous contract now automatically ends the day before the new one starts. This prevents overlapping contract records and helps keep employee contract timelines accurate without manual correction.
Original PR description
When you create a new contract through the salary configurator flow, it will create automatically a new version with the date encoded in the offer wizard. However, the 'contract_end_date' for the old version is not automatically updated. The logic has been adjusted to end old contract date the day before the new contract's start date.
Updated automated tests now verify XML namespace details for payment and electronic invoicing files. This helps ensure country-specific EDI documents and ISO 20022 payment files match required standards more accurately, reducing the risk of undetected format issues.
Original PR description
Before, we weren't asserting XML namespaces when calling `assertXmlTreeEqual`. As a result, many expected XMLs in EDI tests had incorrect namespaces. Now that we change the test method to check namespaces, we also need to fix the expected XMLs. Community PR: https://github.com/odoo/odoo/pull/214764 task-none Forward-Port-Of: odoo/enterprise#89303 Forward-Port-Of: odoo/enterprise#87950
Website forms now correctly use automatically filled values when deciding which fields to show or hide. This prevents visitors from seeing incomplete form behavior when a field should appear based on prefilled information such as their email address.
Original PR description
When [1] introduced a cached version of the form data to compute visibility, it did not take into account the values that are completed through `prefillValues`. Because of this, input events are required for those to be taken into account. This commit fixes this by re-evaluating the form content after the execution of `prefillValues`. Steps to reproduce: - Drop a "Form" snippet - Make "Your Question" field visible only if "Your Email" is set. - Save page. => Upon display, the email is populated with the user's email, but "Your Question" did not become visible. [1]: https://github.com/odoo/odoo/commit/027ce4e3991c9fefdbbb862a69f73e865a1100c8 task-jke Forward-Port-Of: odoo/odoo#217729
The website editor test for text highlighting has been updated to match the new Website Builder layout. This helps ensure the text highlight feature continues to work reliably after its controls moved to a more convenient overlay.
Original PR description
This PR re-enables the test_website_text_highlights test, which was broken and skipped due to the DOM changes introduced by the new Website Builder. It also adapts the tour selectors accordingly. Previously, the text highlight option was available in the option bar, but in the new Website Builder, it has been moved to the overlay for easier editing.
Code cleanup and technical improvements
This change removes an obsolete duplicate calculation function from the HR Work Entry module. It does not change how users work with the system, but it reduces unnecessary code and helps keep future maintenance simpler and safer.
Original PR description
Description of the issue/feature this PR addresses: Following the merge of contracts into versions, a duplicate function _get_duration_batch was created where the old and new ones existed simultaneously with the same function skeleton, this commit removes the old _get_duration_batch Current behavior before PR: No behavior affected Desired behavior after PR is merged: dead code removed --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Miscellaneous changes
Current behavior before PR: When print an expense report with different company currency, the currency it's displayed incorrectly [bug](https://drive.google.com/file/d/1GWjcIGA_czPpl44QAORN6vj6hLcMOYhF/view?usp=sharing) [Related ticket](https://www.odoo.com/odoo/project/49/tasks/4807756) Description of the issue/feature this PR addresses: Update widget currency symbol Desired behavior after PR is merged: The report will show the correct symbol depending on the currencies used for the ex
Original PR description
Current behavior before PR: When print an expense report with different company currency, the currency it's displayed incorrectly [bug](https://drive.google.com/file/d/1GWjcIGA_czPpl44QAORN6vj6hLcMOYhF/view?usp=sharing) [Related ticket](https://www.odoo.com/odoo/project/49/tasks/4807756) Description of the issue/feature this PR addresses: Update widget currency symbol Desired behavior after PR is merged: The report will show the correct symbol depending on the currencies used for the expense fixed versions: saas-18.2 saas-18.3 master --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212858
The Italian Law requires cash payments to be rounded up to 5 cents (art. 13 del D.Lgs. 231/2007, updated in 2018). The exported XML invoice didn't have any cash rounding lines and so the sum was wrong in ImportoTotaleDocumento. This was happening because cash rounding lines (`display_type == 'rounding'`) were excluded during the export function's computation. This fix makes the function include `rounding` lines into the computation, making the invoice compliant. Steps: 1. Activate cash ro
Original PR description
The Italian Law requires cash payments to be rounded up to 5 cents (art. 13 del D.Lgs. 231/2007, updated in 2018). The exported XML invoice didn't have any cash rounding lines and so the sum was…
The Italian Law requires cash payments to be rounded up to 5 cents (art. 13 del D.Lgs. 231/2007, updated in 2018). The exported XML invoice didn't have any cash rounding lines and so the sum was wrong in ImportoTotaleDocumento. This was happening because cash rounding lines (`display_type == 'rounding'`) were excluded during the export function's computation.
This fix makes the function include `rounding` lines into the computation, making the invoice compliant.
Steps:
1. Activate cash rounding management.
2. Create a `0.05E` cash rounding.
3. Create an invoice with a total that is not rounded.
4. Set up the cash rounding on the invoice:
Other information > Cash rounding method
An invoice cash rounding line will be created, the total will be rounded.
5. Generate the XML and download it.
6. The amount in `ImportoTotaleDocumento` tag will not match the total of the invoice.
Task [link](https://www.odoo.com/odoo/project/967/tasks/4816355)
task-4816355
Forward-Port-Of: odoo/odoo#213337As for the blackbox, we now use the websocket as fallback to longpolling to print receipt. This commit also fixes an issue regarding the module `pos_blackbox_be`: if the module was installed, but no blackbox was configured, we could not print a receipt as no signature was provided. Task: 4824066 Forward-Port-Of: odoo/enterprise#87095
Original PR description
As for the blackbox, we now use the websocket as fallback to longpolling to print receipt. This commit also fixes an issue regarding the module `pos_blackbox_be`: if the module was installed, but no blackbox was configured, we could not print a receipt as no signature was provided. Task: 4824066 Forward-Port-Of: odoo/enterprise#87095