Daily updates from Odoo
Tuesday, July 29, 2025
157 changes
54 changes
Resolved issues and error corrections
Fixed an issue where changing a blog post author in the website editor did not properly refresh the displayed author avatar. This helps editors see accurate author information while preparing or updating blog content.
Original PR description
The test that check avatar update on author's changes has been skipped during the merge of the initial website builder refactor, and was not re-enabled. During this time, the change to use classes for actions has been merged but broke the patch in `website_blog`. This commit adapts the patch to apply to the action instead of the plugin Actions to classes: b4b215325db61fbbe9793545293c8b6fbc99f310 Website refactor: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
Fixes an issue in the website editor where changing a table of contents navigation from side to top could cause it to be covered by the main website header while scrolling. This keeps page navigation visible and reliable for editors and visitors after layout changes.
Original PR description
To reproduce the issue: - Open Website and start editing - Drop a table of content snippet and click on its navbar - Change the navbar's position from left to top - Scroll down => Website's main navbar appears on top of the table's navbar and hides it. We change the snapshot system's logic to refresh the table of content interaction when we change the position (i.e. switch class from s_table_of_content_horizontal_navbar to s_table_of_content_vertical_navbar). This commit follows the [html_builder refactoring]. Related to task-4367641 [html_builder refactoring]: odoo/odoo@9fe45e2b7ddb
Agents will no longer see a misleading warning when leaving a live chat that has already ended. This reduces confusion in the Discuss sidebar and keeps the warning focused on cases where leaving would actually end an active live chat.
Original PR description
Before this PR, when leaving a live chat from the discuss sidebar action as an agent, the user was always getting a warning that this action would end the livechat, even when the livechat has already ended! task-4926337 Forward-Port-Of: odoo/odoo#220754
Mobile users can now open subtasks in the main task view instead of a pop-up dialog. This makes the discussion area available, so teams can communicate with customers directly from the subtask.
Original PR description
Before this commit, when the user is in mobile view and go to a task with subtasks and selects a subtask, the form view of that subtask is opened inside a dialog form view instead of opening the…
Before this commit, when the user is in mobile view and go to a task with subtasks and selects a subtask, the form view of that subtask is opened inside a dialog form view instead of opening the record in the main view. Because of that, the chatter for that subtask is not displayed. This commit opens the form view in the main view instead of opening it inside a form view dialog to be able to display the chatter of the subtask selected. Steps to reproduce the issue: ---------------------------- 1. Install project and go to project app. 2. Create a project A. 3. Add a task inside the project A 4. Add a subtask inside the new task created in step 3 5. Open the form view of the task created in step 3 in mobile 6. Click on the kanban record contained the subtask created in step 4 Expected behavior: ----------------- The chatter should be displayed in the form view of that subtask to be able to communicate with the customer. Current behavior: ---------------- Since the form view of the subtask selected is opened inside a form view dialog the chatter for that subtask is not displayed. task-4278273 Forward-Port-Of: odoo/odoo#220814 Forward-Port-Of: odoo/odoo#200178
Fixes an issue where updating stock quantities for one company while logged into another could use the wrong product cost. This prevents incorrect inventory valuation entries and keeps product costs accurate in multi-company setups.
Original PR description
**Problem:** when updating quantity of a product in company A from a user logged in on company B the svl are created with wrong values and standard price is incorrectly updated **Steps to…
**Problem:** when updating quantity of a product in company A from a user logged in on company B the svl are created with wrong values and standard price is incorrectly updated **Steps to reproduce:** - check two companies on the top right of the screen (comp A and comp B) - create a storable product with a avco category - make sure that the cost method of the category is avco both when logged in with company A and B (the cost method is company dependent) - while logged in with comp A create, confirm, receive and validate a PO for a quantity of 1 and a unit price of 100 - do the same while logged in with comp B but with a unit price of 10 - open the product form (cost should be 100 or 10 depending on the company) - while logged in on comp B click on the 'on hand' smart button - update from 1 to 2 the on hand quantity in the WH of comp A - switch to comp A and come back to prodcut form **Current behavior:** the standard price is 55. additionaly, when opening inventory/reporting/valuation and chossing the product we see that the svl created has a value of 55 **Expected behavior:** standard price should stay at 100 and the svl should be created with a value of 100 **Cause of the issue:** Product_price_udpate_before_done calls get_price_unit to compute the new standard price. https://github.com/odoo/odoo/blob/750265bac921936a7c29cf73f8f9e926eea4a926/addons/stock_account/models/stock_move.py#L345 Inside get_price_unit, because the move has no unit_price we use self.product_id.standard_price which will take the standard price of comp B https://github.com/odoo/odoo/blob/750265bac921936a7c29cf73f8f9e926eea4a926/addons/stock_account/models/stock_move.py#L59 opw-4852096 Forward-Port-Of: odoo/odoo#219549 Forward-Port-Of: odoo/odoo#217524
This fix moves dashboard editing style rules to the correct view so they only apply where needed. It helps ensure dashboards look and behave properly when users edit them, without affecting the read-only view.
Original PR description
Some css rules required for the edition mode of dashboards was mistakenly added on the wrong (readonly) view. Task: 4962437 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 color picker now displays the correct theme colors after they are changed in the Theme tab. This makes the editing experience more reliable because users see the same colors in the interface that are applied to their content or website.
Original PR description
Before this commit, updating the theme colors in the "Theme" tab would not correctly update the interface of the colorpicker, but the colors would be applied properly. This commit adds a props to the colorpickers in order to use the correct theme colors (Odoo or Website Theme) depending on which should be used. task-4367641
This fixes issues in the website builder where clearing a date option could leave the field blank after repeated use, and where some design options no longer fell back to their intended default styling. It helps website editors get immediate, predictable results when configuring dates, numbers, borders, navigation, animations, logos, and theme settings.
Original PR description
[FIX] html_builder: handle clear button in BuilderDateTimePicker When the `clear` button was used three consecutive times in the BuilderDateTimePicker, the input field would remain empty instead of…
[FIX] html_builder: handle clear button in BuilderDateTimePicker When the `clear` button was used three consecutive times in the BuilderDateTimePicker, the input field would remain empty instead of reverting to its previous value. This occurred because `useDomState` wasn't being triggered due to no state change. Additionally, this fix ensures that the input field now updates immediately upon using the `clear` button, eliminating the need for subsequent validation or clicking outside the DateTimePicker. Steps to reproduce: - Drop `s_countdown` snippet. - Open DateTimePicker with the "Due Date" option. - Click the clear button, then apply. - Repeat the previous step two more times (for a total of three times). - The input field remains empty instead of displaying the current date. ------------------------------------------------------------------------------------------------------- [FIX] html_builder, website: reintroduce null default for options This commit restores the previous behavior where `data-customize-website-variable="null"` was used to set a null default value for website options, ensuring that SCSS correctly applies its own default styles to elements. This functionality was lost during the website refactor [1]. Additionally, the `BuilderNumberInput` now defaults to 0, aligning with the previous default in `UnitUserValueWidget`. [1]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2
This update brings the spreadsheet component to the latest 18.4.3 version and fixes several issues affecting spreadsheet editing and calculations. Users should see more reliable row sizing, cleaner pasted content, corrected formulas, and improved pivot behavior.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/4b596d77d [REL] 18.4.3 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/4b596d77d [REL] 18.4.3 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/8e43be7a8 [FIX] header_sizes_ui: preserve row sizes on insert and move ops [Task: 4885579](https://www.odoo.com/odoo/2328/tasks/4885579) https://github.com/odoo/o-spreadsheet/commit/76a224263 [FIX] evaluation: test array formula invalidation [Task: 4954710](https://www.odoo.com/odoo/2328/tasks/4954710) https://github.com/odoo/o-spreadsheet/commit/a45061c1d [FIX] auto_complete: remove toggle button for data validation [Task: 4854464](https://www.odoo.com/odoo/2328/tasks/4854464) https://github.com/odoo/o-spreadsheet/commit/30a11dd57 [FIX] Composer: Remove formatting when pasting external content [Task: 4910559](https://www.odoo.com/odoo/2328/tasks/4910559) https://github.com/odoo/o-spreadsheet/commit/71ec7d472 [FIX] Formulas: `COLUMN/ROW` spread with range [Task: 4916369](https://www.odoo.com/odoo/2328/tasks/4916369) https://github.com/odoo/o-spreadsheet/commit/cea21be36 [FIX] spreadsheet_pivot: empty row when number added to char field [Task: 4878778](https://www.odoo.com/odoo/2328/tasks/4878778) 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 website editor now stops live page interactions as soon as editing begins, preventing public-view behavior from interfering with editing tools. This helps keep pages stable and avoids potential editing glitches when website builder plugins initialize.
Original PR description
**[FIX] website: stop interactions on page edit** Since [1], interactions are restarted (stopped and started again) when the first normalize is triggered in edit. This means that all the plugins are…
**[FIX] website: stop interactions on page edit**
Since [1], interactions are restarted (stopped and started again) when
the first normalize is triggered in edit. This means that all the
plugins are started while the interactions are still in their "public"
state, potentially causing issues down the line.
By stopping all interactions as soon as the website builder switches to
edit, we ensure that the DOM is in a valid state for the edition
plugins.
Note that some edit interactions trigger some plugins shared methods
(in the website edit service, either through the `shared` object, or
through the `applyAction` method, whose action itself might then call a
shared method).
This is the reason why we do not restart them immediately. They will be
restarted with the 1st normalize anyways, which happens just after the
plugins' setup.
[1]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2Shipping connector settings no longer show installation checkboxes that pointed users to older connector modules. Users are now directed to the Apps menu to choose the appropriate carrier connector, with clearer labeling for newer REST API versions and legacy options hidden by default.
Original PR description
We have recently introduced several new versions of the delivery connectors, based on the newer REST APIs introduced by the shipping companies (USPS, FedEx, UPS, DHL). However, in the settings we still link with installation checkboxes to the old modules. To avoid confusion for the user, we remove these checkboxes and refer the user to the Apps menu instead for manual installation of the preferred shipping connector. In the apps menu, we clarify that these new modules are only compatible with the new REST APIs, and we also hide the legacy modules by default by making them application: False. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218487 Forward-Port-Of: odoo/odoo#201583
This update makes removing website building blocks more consistent and reliable in the website editor. It reduces duplicated logic and helps prevent protected elements from being removed accidentally, improving editor stability for users.
Original PR description
This commit improves the code of the `remove` plugin: - Rename the `on_remove_handlers` and `after_remove_handlers` resources as `on_will_remove_handlers` and `on_removed_handlers` respectively, to…
This commit improves the code of the `remove` plugin: - Rename the `on_remove_handlers` and `after_remove_handlers` resources as `on_will_remove_handlers` and `on_removed_handlers` respectively, to be more consistent. - Adds a `is_unremovable_selector` resource in order to use it to get the selectors of the elements that are unremovable. It allows to have the resources in the different option plugins, instead of duplicating these selectors in multiple files. - Merge back the behaviors of `removeElementAndUpdateContainers` and `removeElement` as it was not correct to split them and in order to have only one main `removeElement` function. Its goal was to replace the old `remove_snippet` event, and it was clearly not used everywhere. - Remove the use of the `remove` plugin where only the JS element `remove` function was needed. We know if a given case needs to activate the parents/siblings and there are other ways to activate them anyway. - Use the `remove` plugin when this time it was necessary (e.g. when a "Table of Content" is empty). - Clean the code. task-4367641
This fixes cases where website pages and partner-related records could show a Publish button even when publishing was not actually allowed. The change makes publishing permissions more accurately calculated, reducing confusing access warnings for users managing website content.
Original PR description
*: website_crm_partner_assign, website_customer, website_membership, website_partner Commit [1] (alongside commits [2] and [3]) introduced a new context key `can_publish_unsudo_main_object` with the…
*: website_crm_partner_assign, website_customer, website_membership, website_partner Commit [1] (alongside commits [2] and [3]) introduced a new context key `can_publish_unsudo_main_object` with the goal of properly computing `can_publish` without sudo... but it missed using it properly. The related test was passing... because it was also not properly written. This commit fixes the issue by using the context key at the proper places. However, this limits the fix to pages and partners at the moment as the bug is not critical in stable versions. It however fixes a test while run in no-demo (which becomes the norm in later versions). With that in mind, this also changes the view (by *adding* things to be as stable as possible) to go around the use of the context key and make new databases properly compute `can_publish` for all records type. Old databases will keep the old behavior for some models, which leads to displaying the "Publish" button but not be able to use it (access right warning). [1]: https://github.com/odoo/odoo/commit/d47d824fc484e1592fc4af8d0d378d5a4a579550 [2]: https://github.com/odoo/odoo/commit/1a83b2508b9383e2b7df192f8641751f71f852da [3]: https://github.com/odoo/odoo/commit/436a167dedb2ed008bcb88e8a4eccafc8d20812c Related to runbot-161791 Forward-Port-Of: odoo/odoo#220424 Forward-Port-Of: odoo/odoo#219389
Fixed an issue in Point of Sale loyalty programs where customers with existing points could still claim a reward after the program's maximum usage limit had already been reached in the session. This helps ensure promotions are applied fairly and according to configured limits.
Original PR description
When an existing partner with points tries to claim a reward from a loyalty program that has reached its max usage in the current session, he was still able to claim the reward. Steps to reproduce: ------------------- * Create a loyalty program with max usage set to 1 * Create a partner and assign points to him * Open PoS and select any partner and make an order * Claim the reward from the loyalty program * Select the partner that already has points * Make an order and try to claim the reward again > Observation: The reward can be claimed, even though the max usage is already reached. Why the fix: ------------ When updating programs, we were not removing the couponPointChanges for programs that are not applicable anymore. We now make sure to delete them when the program is not applicable anymore. opw-4805704 Forward-Port-Of: odoo/odoo#220658 Forward-Port-Of: odoo/odoo#218425
The website editor no longer shows the eCommerce categories option in a mega menu when no product categories exist. This avoids confusing website editors with an option that cannot be used.
Original PR description
To reproduce the issue: 1. Delete all ecommerce categories if you have any. 2. Open website and add a Mega Menu 3. Start editing and click on the mega Menu 4. eCommerce categories option is available which shouldn't be the case as we currently don't have any category. This commmit follows the [html_builder refactoring]. Related to task-4367641 [html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb
This update fixes broken website media replacement test flows after recent website builder changes. It re-enables the related automated test and ensures SVG images can support shapes, helping keep website editing behavior reliable.
Original PR description
test_01_replace_media tests was broken and disabled after the new website builder changes.This PR adapts the tour steps accordingly and re-enables the related test. Additionally, In this PR[1] we prevent adding shape for SVG image. now we support the shape on SVG image. [1]: https://github.com/odoo/odoo/pull/128084
Fixed the portal invitation email preview so it uses the contact's details instead of relying on incomplete portal user information. This prevents an error when staff preview the Portal: User Invite template and ensures the recipient name is shown correctly.
Original PR description
[FIX] portal: display template for portal invite Steps to reproduce: ---- - Install portal module - Grant a portal access to a contact - Go to the email template (Portal: User Invite) for the contact - Click on Preview -> Traceback Issue: --- The display was based on the user itself referencing to a partner. And there was no name for the portal users. Fix: --- Changed the view so now the different values are based on the partner.Also added the name to this function based on the partner name. opw-4444729 Forward-Port-Of: odoo/odoo#211548 Forward-Port-Of: odoo/odoo#194322
When users add a website block containing images, the image quality setting now appears immediately without requiring another edit first. This makes image optimization controls available at the expected moment and avoids confusion during page editing.
Original PR description
Since `html_builder`, when a block contains an image, its quality cannot be updated before another change is done. This commit specifies the mimetype of the image before the first transformation so that the quality option can properly evaluate its visibility condition. Steps to reproduce: - Drop a block with an image (or several images, or a background image) - Select the image (or the block with a background image) => The Quality option did not show up. task-4367641
Invoice analytic allocations now add up exactly to the original invoice line amount, avoiding small rounding differences such as a one-cent mismatch. This improves accounting accuracy and prevents confusion when reviewing analytic items.
Original PR description
**PROBLEM** Sometimes, the sum of the generated analytic lines for an invoice line doesn't equal the amount on the invoice line. For example, in invoice line with a price of 182.25, with an analytic…
**PROBLEM** Sometimes, the sum of the generated analytic lines for an invoice line doesn't equal the amount on the invoice line. For example, in invoice line with a price of 182.25, with an analytic distribution split into 98% and 2%, the generated analytic lines amount to 182.26 (off by 0.01) because of rounding. **STEP TO REPRODUCE** 1. install the accounting module and enable the Analytical Accounting option. 2. create an invoice, with a line with a price of 182.25, and a distribution of 98%/2%. 3. confirm the invoice. 4. go to Accounting/Analytics Items and notice the sum of analytical line is 182.26 instead of 182.25. **CAUSE** We only apply rounding after having calculated all the analytic line amounts. This mean we will sum the rounding error. In our example, the computation is like so: 98% of 182.25 = 178.605 rounded to 178.61 2% of 182.25 = 3.645 rounded to 3.65 178.61 + 3.65 = 182.26 **FIX** We compute the last analytic line for each plan, relatively to the other. `last_line_amount = invoice_price - sum(rounded_other_line_amount)` This ensure that the sum of analytic lines is always equal to the invoice price. opw-4848784 Forward-Port-Of: odoo/odoo#220614 Forward-Port-Of: odoo/odoo#214736
This fix prevents website forms from failing when a field is renamed and visibility rules are involved. It avoids an error caused by invalid circular dependencies, helping users keep editing forms without interruptions.
Original PR description
This PR ensures to fix the traceback-error of the circular field dependency in the form.
This fix prevents an error when users create an Analytic Distribution while working with multiple companies, including one without fiscal localization configured. It helps accounting users continue setup and configuration smoothly without being blocked by a crash.
Original PR description
Currently, an error occurs when a new company is created without selecting a `Fiscal Localization`, and then both companies are selected while creating a new `Analytic Distribution`. Steps to…
Currently, an error occurs when a new company is created without selecting a `Fiscal Localization`, and then both companies are selected while creating a new `Analytic Distribution`. Steps to reproduce: --- - Install `Accounting` module(without demo) - Enable `Analytic Accounting` - Create a New company and switch to it - Select both companies and Open `Analytic Distribution` and click `New` Traceback: --- `TypeError: 'bool' object is not subscriptable` At [1], we are searching by `account_type`, but if `Fiscal Localization` is not set for the current company, there will be no records in `account.account`. However, due to the multi-company setup, it still return accounts from the first company. In such cases, the `code` field is empty, which causes the `code` to be treated as False. [1]: https://github.com/odoo/odoo/blob/d155edfd729ab9b53f38939fe24b6d1e7b578083/addons/account/models/account_analytic_distribution_model.py#L55-L58 sentry-6754820454 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220089
Fixes purchase orders billed in a foreign currency before goods are received so invoice amounts reflect the full ordered quantity, not just one unit. It also prevents small unwanted exchange differences from being created when the receipt is later validated, improving accounting accuracy.
Original PR description
**Current behavior:** Creating a purchase order in a foreign currency and billing the product prior to reception will produce 2 issues: A) The bill line for the product will only make a conversion of…
**Current behavior:** Creating a purchase order in a foreign currency and billing the product prior to reception will produce 2 issues: A) The bill line for the product will only make a conversion of 1 single unit of the product with the defined currency exchange rate, making the amount on the line incorrect when qty > 1 B) When the receipt is finally validated, there will be an unwanted exchange difference on the journal items generated due to asymmetrical rounding for the bill AMLs and receipt valuation AMLs **Expected behavior:** Correct bill line currency amounts and symmetric rounding. **Steps to reproduce:** 1. Set the company currenct to IQD, make a product invoiced on ordered qty, for sake of example set cost to 500 IQD 2. Create a currency exchange record to USD with a company rate of `0.00756` 3. Create a PO for 13 of the product created in step 1, with a discount of 1% 4. Confirm the PO and create the bill -> post it * Issue A) look at invoice line, see only 1 unit in the converted currency amount is accounted for by the `balance` 5) Receive the product -> look at the journal items generated and see that there is a diff of 0.185 IQD **Cause of the issue:** A) commit: 90158f6 added a method to try and calculate an AML balance from its purchase line values, but mistakenly is using `qty_received` instead of `qty_to_invoice` which explains why this issue only presents for the bill-before-receipt flow B) commit: 9f046d5 is using `round=False` context for `AccountTax.compute_all()` when the expected key is `round_base` **Fix:** A) Replace `qty_received or 1` with `qty_to_invoice` * Also make the test added in 90158f6 more robust B) Add `round_base=False` alongside the `round` key (not removing as that existing one could have become expected in this context) opw-4689170 Forward-Port-Of: odoo/odoo#220323 Forward-Port-Of: odoo/odoo#205850
A live chat chatbot test now waits until form changes are fully saved before finishing. This prevents false test failures and helps keep automated quality checks stable without changing user-facing behavior.
Original PR description
Tour "test_chatbot_clear_answers_on_step_type_change" could fail with following error before this commit: ``` Tour finished with a dirty form view being open. Dirty form views are automatically saved when the page is closed, which leads to stray network requests and inconsistencies. ``` The tour was saving the changes to form view but was not awaiting a trigger when the form is saved, thus the tour could end and still see form is dirty. This commit replaces `.o_form_view` to `.o_form_saved` for awaiting the form is fully saved and not dirty at end of test tour. Fixes runbot error 230296 Forward-Port-Of: odoo/odoo#220810
Event tickets sold through Point of Sale now keep the same “Registered” status as tickets sold through the website after payment. This avoids incorrectly marking attendees as already attended and keeps event records consistent across channels.
Original PR description
Before this commit, if we buy an event registration from PoS and pay for it, its state will be 'done', i.e. "Attended" [1]. While if we buy the registration from the website and pay for it, its state is 'open', i.e. "Registered" [2]. We want the state of the registration to be 'open' when we buy it. After this commit, we set the state of events bought from PoS to 'open' as well, matching the case where we buy them from the website. [1]: https://github.com/odoo/odoo/blob/c3ae4b29c51c7b0cff11aac5f4bf4aab5fad16c9/addons/pos_event_sale/models/event_registration.py#L14 [2]: https://github.com/odoo/odoo/blob/c3ae4b29c51c7b0cff11aac5f4bf4aab5fad16c9/addons/event_sale/models/event_registration.py#L40 opw-4920574 Forward-Port-Of: odoo/odoo#219622
Fixes a visual issue where product ribbons could shift away from product images when customers zoomed in or out on website product pages. This keeps promotional or status labels correctly positioned, preserving a polished shopping experience.
Original PR description
<b>Steps to Reproduce:</b> 1. Install Sales and eCommerce modules. 2. Go to Sales → Products, open any product, go to Sales tab, and set a Ribbon. 3. Navigate to Website → Shop, search for the…
<b>Steps to Reproduce:</b> 1. Install Sales and eCommerce modules. 2. Go to Sales → Products, open any product, go to Sales tab, and set a Ribbon. 3. Navigate to Website → Shop, search for the product and open its page. 4. Zoom in or out. <b>Issue:</b> - The ribbon on the product image becomes misaligned (shifts away from the image) when zooming in or out on the product detail page. This results in a broken visual layout. <b>Cause:</b> - A previous change in [PR #175473](https://github.com/odoo/odoo/pull/175473) unintentionally replaced the height class (h-100) with width (w-100) on ribbon container, causing layout instability during zoom operations. <b>Solution:</b> - Restore the proper layout by reintroducing h-100 to both the ribbon container and inner image div. This ensures the ribbon stays correctly positioned relative to the image regardless of zoom level. <b>opw-4854217</b> <b>Before FIX :</b>  <b>After FIX:</b>  Forward-Port-Of: odoo/odoo#216545
Autocomplete fields now preserve spaces when users type multi-word search terms, preventing words from being visually joined together. This improves data entry clarity across contact, employee, resource, unit of measure, and tag selection fields.
Original PR description
This commit fixes an issue in many2x autocomplete fields where typing a complete word followed by a space would result in that space being removed, causing the next word to stick to the previous one. The problem stemmed from how highlighted search results wrap the matched text in a \<span\>, which inadvertently isolates adjacent spaces. Combined with the display: flex styling of parent elements, these isolated spaces were visually trimmed. To resolve this, each autocomplete result item is now entirely wrapped in a \<span\>, preventing space trimming and ensuring proper word separation during input. task-4898120 Forward-Port-Of: odoo/odoo#218768
Online paid self-ordering sales now appear correctly in the POS ticket list. Staff will see paid orders marked as paid and offered the refund action instead of being prompted to load them again.
Original PR description
**Steps:** - Configure POS with self-ordering via QR code and online payment. - Open a session and place a paid order through self-ordering. - In the POS UI, open the TicketScreen and apply the "Paid Orders" filter. **Issues:** - The paid order does not show the "Paid" tag. - The "Load Order" button appears instead of the "Refund" button. **Cause:** - The paid order retains an outdated uiState, with `uiState.locked` incorrectly set to false. **Fix:** - Use `finalized` instead of `uiState.locked` to determine order state on TicketScreen. - Remove the unused `locked` property from `uiState` in posOrder. Task: 4745869 Related: odoo/enterprise#86684 Forward-Port-Of: odoo/odoo#220729 Forward-Port-Of: odoo/odoo#207406
This update makes a website test wait until an image is fully loaded before checking its size. It reduces random test failures, helping keep the release process more stable without changing customer-facing behavior.
Original PR description
The goal of this commit is to avoid potential undeterminism that could occur in the `drop_404_ir_attachment_url` test (introduced by [this commit]). Before this commit, an error was thrown if the image was not loaded at the time the test checks the `naturalWidth` and `naturalHeight` property of the image. This could lead to undeterministic error as nothing ensures that the image is loaded at that time. To solve the problem this commit first waits for the image to be loaded before accessing the `naturalWidth` and `naturalHeight` property of the image. Side note: even if the source of the image is of type `data:` it is not directly loaded. [this commit]: https://github.com/odoo/odoo/commit/fbc6a697c1adf67ee8a90c49b0150d6ca170e081 task-4931144 Forward-Port-Of: odoo/odoo#220204 Forward-Port-Of: odoo/odoo#217968
Removing a background image from website cover blocks now also removes the leftover color overlay. This prevents pages from keeping an unintended tinted appearance after editors remove parallax background images.
Original PR description
Since the `html_builder`, when a block has a parallax background image and the image is removed, any applied color filter remains applied. This happens because the `editingElement` of the image toggle is the parallax span instead of the actual section - and therefore the color filter element is not properly located. This commit finds out about that situation and removes the filter from the right element. Steps to reproduce: - Drop a "Cover" block - Remove its background image => Its color filter remained present in the DOM. task-4367641
This fix makes mail conversation loading more consistent and avoids an error when a conversation is missing. It helps prevent unexpected failures when opening or reusing already loaded mail threads.
Original PR description
1. Ensure the thread is not undefined before calling exists. 2. `hasReadAccess` was only checked after the RPC, but if the thread data was already fetched the condition was not checked. The choice is made to remove the condition as it makes the code more flexible. The caller can always decide to check `hasReadAccess` afterwards if necessary. How to reproduce: https://github.com/odoo/odoo/pull/220605 Forward-Port-Of: odoo/odoo#220782
Users who leave a Discuss call while camera permission is still pending will no longer trigger an error if camera access is rejected. This makes video call handling more reliable and avoids disruptive traceback messages in edge cases.
Original PR description
Before this commit, a traceback would occur of the camera access was rejected after leaving a call that requested it. This race condition could also happen in other cases where the call is left before the camera promise resolves. Forward-Port-Of: odoo/odoo#220770
Fixes an issue in the web editor where changing a button into a regular link could leave the wrong editing controls visible and cause an error when saving. This improves reliability for website content editors making simple button style changes.
Original PR description
Problem: Saving the button snippet after changing its type to a link throws an error because `snippet_key` is `undefined`. Cause: The button snippet editor should be disabled if the button is changed…
Problem: Saving the button snippet after changing its type to a link throws an error because `snippet_key` is `undefined`. Cause: The button snippet editor should be disabled if the button is changed to a link. However, `updateOptionsUIVisibility` is only triggered on click events. In this case, the element type changes through the editor itself, not by clicking, so the UI isn't updated accordingly. Solution: Trigger a `click` event on the link element programmatically to call `updateOptionsUIVisibility` and hide the button snippet editor when the element is no longer a button. Steps to reproduce: - Drop a button snippet - Click inside the button to edit - Notice the Button snippet editor appears - Change the type to "Link" instead of "Primary" - The Button snippet editor is still visible - Click the floppy disk icon (save) in the snippet editor -> A traceback occurs opw-4936796 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220787 Forward-Port-Of: odoo/odoo#219660
This fix updates a Point of Sale automated test so it uses its own measurement unit instead of relying on demo data. This helps prevent false test failures and keeps release validation more reliable.
Original PR description
Before this commit: = - The test `test_quantity_package_of_non_basic_unit` used `product_uom_inch`, which is `archived` by default, causing the test to fail without demo data. - It only worked with demo data because `l10n_us_account` `unarchives` this UoM. After this commit: = - Created a **test UoM** to ensure consistent test behavior. Runbot-error: 223122 Forward-Port-Of: odoo/odoo#219292 Forward-Port-Of: odoo/odoo#214547
Shared Helpdesk ticket links now show the logo and branding of the company that owns the ticket, even when viewed by someone who is not logged in. This prevents customers from seeing the wrong company identity on portal pages in multi-company setups.
Original PR description
**Steps to reproduce**: 1. Install `helpdesk` only 2. Create a second company and configure a distinct logo for both the default and new companies. 3. Create a Helpdesk ticket under the new company.…
**Steps to reproduce**: 1. Install `helpdesk` only 2. Create a second company and configure a distinct logo for both the default and new companies. 3. Create a Helpdesk ticket under the new company. 4. Use the 'Share Ticket' (gear icon) feature to generate a portal link. 5. Open the link in an incognito window or a different browser (where no user is logged in). 6. Observe the logo shown in the portal navigation bar. **Observed behavior**: The portal incorrectly displays the logo and branding of the default/main company, even when the Helpdesk ticket belongs to a different company. **Issue**: When no portal user is logged in, the `res_company` used in the portal rendering context defaults to the system’s primary company (`env.company`). The template expects `res_company` to be explicitly set to reflect correct branding. See: https://github.com/odoo/odoo/blob/880954ebfc1106411b7f7a7d60aee05dfae60893/odoo/addons/base/models/ir_qweb.py#L781 **Solution**: Explicitly pass `ticket_sudo.company_id` as `res_company` in the portal view context to ensure correct company branding is used. opw-4855281 Forward-Port-Of: odoo/enterprise#90600
Sales commission achievement reports now include down payments and other invoice lines that do not have a product attached. This prevents mismatches between invoice analysis and commission results, especially for plans expected to match invoiced amounts.
Original PR description
In the sale achievement report, down payments and other account move lines that have no product attached to them would not be accounted for in the sale commission achievement report. This was due to the fact that the table was being inner joined on product_id which would get rid of records that had no product. Because of this behavior there would be a mismatch between the invoice analysis of a user and their commission even if the rate was 100% on the commission plan. Left joining the products onto the account move line keeps the lines with no products and fixes the discrepancy between the report and the invoice analysis. opw-4625340 Forward-Port-Of: odoo/enterprise#91010 Forward-Port-Of: odoo/enterprise#83477
Users working across multiple companies can now send signature templates from the company they are currently using. This prevents an access error that blocked signature requests when the template was linked to a different default company.
Original PR description
Problem: In a multi-company environment, users are unable to send templates in non-default companies despite them creating the template. A traceback gets thrown because the template is using the…
Problem: In a multi-company environment,
users are unable to send templates in non-default
companies despite them creating the template.
A traceback gets thrown because the template
is using the default company on the create user,
instead of the current environment's company.
Purpose: The user should be able to send templates they created in any allowed companies.
Steps to Reproduce on Runbot:
[ADMIN]
1. Install Sign
2. Navigate to Settings > Sign > Enable "Sign Default Terms & Conditions"
3. Create another company and allow Marc Demo access
[Marc Demo]
1. Change to a non-default company
2. Try to send a signature request (e.g. upload pdf to sign > send)
3. Traceback gets thrown
```
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/mylynahy/src/odoo/odoo/fields.py", line 1161, in __get__
value = env.cache.get(record, self)
File "/home/mylynahy/src/odoo/odoo/api.py", line 1020, in get
raise CacheMiss(record, field)
odoo.exceptions.CacheMiss: 'res.company(2,).sign_terms_type'
During handling of the above exception, another exception occurred:
...
odoo.addons.base.models.ir_qweb.QWebException: Error while render the template
AccessError: Due to security restrictions, you are not allowed to access 'Companies' (res.company) records.
Records: BE Company CoA (id=2)
User: Marc Demo (id=6)
This restriction is due to the following rules:
- company rule employee
Note: this might be a multi-company issue.
Contact your administrator to request access if necessary.
Template: sign.sign_template_mail_request
Path: /t/table/tr[5]/t[1]/td/a
Node: <a t-att-href="\'%s/sign/terms\' % record.get_base_url()" class="text-dark"/>
```
opw-4706828
Forward-Port-Of: odoo/enterprise#85402This fix removes leftover code from an earlier reconciliation model update. It reduces maintenance risk in accounting-related workflows without changing the user experience.
Original PR description
In this commit: https://github.com/odoo/enterprise/pull/80787/commits/04a304d58a56c7d2eeb70429340eb048fa9f2be6 We refactored the reconciliation model to be easier to use for users. However, by doing the refactor we forgot to remove some code. no task id Forward-Port-Of: odoo/enterprise#90310
Creating a helpdesk ticket from the timesheet timer now keeps the selected support project context, preventing validation errors about missing analytic accounts. The timer also correctly recognizes helpdesk projects even before they have existing tickets, so users see the ticket option instead of a task option.
Original PR description
Steps to reproduce: ------------------- - Install 'helpdesk_timesheet' module - Go to Timesheets and click on `Start` to launch the timer - Select `VIP Support` as Project - Create a new ticket…
Steps to reproduce: ------------------- - Install 'helpdesk_timesheet' module - Go to Timesheets and click on `Start` to launch the timer - Select `VIP Support` as Project - Create a new ticket Issue: ------ 1. Validation error raised: `At least one analytic account must be set.` 2. When we select a helpdesk project that does not have any ticket linked to it already, the field next to it is set to `Task` (task_id) instead of `Ticket` (helpdesk_ticket_id). Cause: ------ 1. When creating the ticket, we don't provide the default project who got the analytic account linked to it. 2. The field `helpdesk_ticket_id` is hidden because we consider that we the project is not linked to any helpdesk team; this is because we retrieve the projects based on tickets already created only. Solution: --------- 1. Set the default project in the context when creating the ticket (like for a task). In the create method, if no team is provided and we have a default project (from `list_value` or the `env.context`), we set the team based on the project if the project is linked to a helpdesk team. 2. Fetch all projects that have `helpdesk_team` field set. opw-4404097 Forward-Port-Of: odoo/enterprise#91110 Forward-Port-Of: odoo/enterprise#76779
Credit card payments in the Italian POS are now assigned the correct default index for fiscal printers. This prevents valid card payments from being incorrectly reported as not paid on Italian fiscal receipts.
Original PR description
In Italy if a payment method is of type 'Credit card' (type 2), and it's index is 0 the payment made with it is considered as 'Not paid' by the italian fiscal printer. Why the fix: ------------ We change the default index of the payment method to 1, so that it is considered as 'Paid' by the fiscal printer. opw-4963421 Forward-Port-Of: odoo/enterprise#90919
The Accounting dashboard now correctly opens the bank reconciliation list showing only transactions that still need review. This prevents already checked transactions from appearing in the “To Check” view, helping users focus on pending items.
Original PR description
**Issue** When accessing bank transactions via the "To check" link in the Accounting dashboard, the expected filter to show only unchecked transactions is not applied. As a result, all transactions are displayed, including those that have already been checked. **Steps to Reproduce** 1. Navigate to Accounting > Dashboard > Bank 2. Create two bank statement lines: one marked as checked, the other unchecked 3. Return to the dashboard 4. Click the “1 To Check” link 5. Observe that both entries are shown, instead of only the unchecked one **Root Cause** The corresponding filter (`to_check`) is missing from the search view of the `account.bank.statement.line model`. Although the action context correctly includes `search_default_to_check=True`, Odoo is unable to apply the filter without a matching `<filter name="to_check" ... />` in the search view definition. Opw-4945705 Forward-Port-Of: odoo/enterprise#90803
This fix moves dashboard styling rules to the correct editing view instead of applying them to the read-only dashboard view. It helps ensure dashboards look and behave correctly depending on whether users are viewing or editing them.
Original PR description
Some css rules were mistakenly added to the readonly action of the dashboard instead of it edition action. Task: 4962437
Rental orders with multiple planned service lines now check staff or resource availability before creating planning shifts. This prevents the same resource from being assigned to overlapping shifts and creates an open shift when no resource is available, reducing scheduling conflicts.
Original PR description
Steps to Reproduce: ---------------------- - Install the sale_renting_planning module. - Create a rental service product with `Plan Services` enabled. - Create a rental order with multiple lines for the same product. - Confirm the rental order Issue: --------------------------- - You'll see that some generated shifts are assigned to same resource causing conflict. Cause: --------------------------- - Shifts are being generated at the same time for all the SOL which cause them to be assigned to the same resource and make conflict. Fix: ----------------------------- - In this commit when the shift values are generated we will check if the resources are available or not. If no resource is available then it will create open shift for that SOL. task-4829807 Forward-Port-Of: odoo/enterprise#88767
Clearing a document selection from the control panel now also clears the details panel. This prevents users from seeing outdated document details after they have removed the current selection.
Original PR description
The details panel does not update when clearing the selection through the control panel. Steps to Reproduce: ==================== - Open the detailsPanel. - Select a document. - Click on a blank space, which removes the current selection. - Re-select a document. - Click the ‘x’ button on the control panel to clear the selection. - The document selection in the detailsPanel does not get cleared. Technical =========== In DocumentsRightPanel and how DocumentsDetailsPanel is handled, The panel relies on the `state.focusedRecord` to determine which record's details to display. However, when clicking the ‘X’ button in the control panel to clear the selection, the `state.focusedRecord` is not being Updated or cleared, the detail panel still shows the previously focused record. After this PR: Clicking the ‘x’ will properly clear the selection from the detailsPanel. Task-4752944 Forward-Port-Of: odoo/enterprise#85272
Shipping settings no longer show install checkboxes that pointed users to older connector versions. Users are now directed to the Apps menu to choose the right shipping connector, with clearer labels for the newer REST API versions and legacy connectors hidden by default.
Original PR description
We have recently introduced several new versions of the delivery connectors, based on the newer REST APIs introduced by the shipping companies (USPS, FedEx, UPS, DHL). However, in the settings we still link with installation checkboxes to the old modules. To avoid confusion for the user, we remove these checkboxes and refer the user to the Apps menu instead for manual installation of the preferred shipping connector. In the apps menu, we clarify that these new modules are only compatible with the new REST APIs, and we also hide the legacy modules by default by making them application: False. Forward-Port-Of: odoo/enterprise#90010 Forward-Port-Of: odoo/enterprise#81354
Bank reconciliation now handles models using a different currency correctly, so foreign currency amounts and company-currency balances are no longer treated as the same value. The receivable and payable actions also avoid creating automatic reconciliation models unexpectedly, reducing unintended accounting setup changes.
Original PR description
Before this commit when applying a reco model with a different currency, the amount currency and the balance were equals. task-4931177 Before this commit when applying the receivable or payable button, the automatic reco models would be created. We don't want that behavior task-4930730 Forward-Port-Of: odoo/enterprise#89775
This update fixes an issue that could cause automated checks to fail when preparing default Swiss payroll records. It helps keep Swiss payroll transmission workflows stable and reduces the risk of setup-related interruptions.
Original PR description
https://runbot.odoo.com/odoo/runbot.build.error/115307 Forward-Port-Of: odoo/enterprise#90487
Field service sales orders with zero-priced products now correctly show as ready to invoice when Anglo-Saxon accounting is enabled. This prevents valid no-charge items from being blocked by an incorrect 'Nothing to Invoice' status.
Original PR description
Before this commit: When Anglo-Saxon accounting is enabled and a product with sale price of zero is added to SO through field service, the invoice_status show 'Nothing to Invoice'. After this commit: With Anglo-Saxon accounting enabled, adding product with a zero sale price to an SO through field service will display the invoice_status as 'To Invoice' instead of 'Nothing to Invoice'. task-3957962 Forward-Port-Of: odoo/enterprise#70132
Fixes errors that could block customers using invitation links during appointment booking. Users can now move back to the date/time or meeting selection steps without seeing server or access errors when multiple resources are available.
Original PR description
Fixes two issues regarding the buttons on the front-end progress bar in the appointment flow, when using an invitation link. Commit messages give steps to reproduce.
1. Fix 500 error when clicking 'Date & time' with more than one resource / user configured on the invitation link.
2. Fix 403 error when using the operator ('meeting' actually) step button with more than one specific resource in the invitation link.
Task-4897098
Forward-Port-Of: odoo/enterprise#90335
Forward-Port-Of: odoo/enterprise#88521The optional columns menu no longer shows the “Add custom field” button when users view bank statement lines. This prevents users from seeing a customization option that should not be available in the bank reconciliation workflow.
Original PR description
`Add custom field` button shouldn't be displayed with `account.bank.statement.line` model. Since c6ade2de937a30a13620a64a4779ebd827088755, we use an action to open the bank reconciliation widget, therefore in the `computeStudioEditable` method, we didn't pass in the first condition `!action.xml_id` anymore and we were returning `true`. With this commit, we return `false` if model is `account.bank.statement.line`. Steps: - Install `accountant` - Go to Accounting dashboard - Click on the `Bank` card title - Toggle the list view - Open the optional columns dropdown -> The `Add custome field` button is displayed opw-4953156 Forward-Port-Of: odoo/enterprise#90935
This fixes a setup gap where the VAT return journal could be missing when accounting reports or accountant features were installed after accounting was already configured. Businesses get more reliable VAT return preparation, with the journal created only when appropriate to avoid unnecessary clutter for invoicing-only users.
Original PR description
Issue: The VAT return journal is not created when installing `account_reports` (or `accountant`) after `account`, when the CoA is already created. Solution: Create it in the post init hook. Note that…
Issue: The VAT return journal is not created when installing `account_reports` (or `accountant`) after `account`, when the CoA is already created. Solution: Create it in the post init hook. Note that we force the creation of the journal only when `accountant` is installed because it would make noise for invoicing only in most cases. It will still be created automatically when needed. Also, make the code a little bit more robust: * instead of mixing "default misc journal" and vat return journal logic, just use one logic * the function `_get_tax_closing_journal` could return multiple journals but was always used as if it could only contain one * the function `_get_tax_closing_journal` could not return any journal. Instead, we now create the journal or look for a value on the parent companies if any. * Manage `show_on_dashboard` in `create` also by using an inverse field. Even if in normal cases the journal will always be created after the company the thus set through `write`, it is not impossible to set it in `create` when creating company branches. Since it is always done when setting the journal on the company, there is no need to set the field in the post-init hook. Forward-Port-Of: odoo/enterprise#91126
The HR Referral autocomplete now keeps spaces in suggested names, making search results easier to read and recognize. This fixes a display issue so users can more confidently select the right referral-related record.
Original PR description
This commit applies the same methodology as in https://github.com/odoo/odoo/pull/218768 to resolve the missing spaces issues in many2x autocomplete search results. task-4898120 Forward-Port-Of: odoo/enterprise#90138
The point of sale integration now uses the correct order completion status when displaying tickets. This removes an unused internal flag, helping prevent incorrect order state handling and keeping the checkout experience more reliable.
Original PR description
In this commit: ==== - Use `finalized` instead of `uiState.locked` to determine order state on TicketScreen. - Remove the unused `locked` property from `uiState` in posOrder. Task-4745869 Related: odoo/odoo#207406 Forward-Port-Of: odoo/enterprise#91097 Forward-Port-Of: odoo/enterprise#86684
WhatsApp debug logging now handles file replies safely instead of trying to save raw file content as text. This prevents crashes when customers reply with PDFs, images, or other files while request debugging is enabled.
Original PR description
When Debug requests is enable on the whatsapp business account and user replies with the file, a traceback will appear. Steps to reproduce the error: - Install ``whatsapp`` and ``contacts`` - Create…
When Debug requests is enable on the whatsapp business account and user replies with the file, a traceback will appear. Steps to reproduce the error: - Install ``whatsapp`` and ``contacts`` - Create a whatsapp business account > Enable Debug requests - Create a contact > Add a phone number > send whatsapp message with any whatsapp template - Now reply with the file(ex. pdf or image) in message from the contact's whatsapp. - Traceback in terminal Traceback: ``ValueError: A string literal cannot contain NUL (0x00) characters.`` https://github.com/odoo/enterprise/blob/b52a93da7d680b60646cb08a9126cf6c12f5307d/whatsapp/models/whatsapp_account.py#L166 Here, ``message`` contains NUL (0x00) characters because user replies with the file, value for the ``message`` comes from the below response. response: https://github.com/odoo/enterprise/blob/b52a93da7d680b60646cb08a9126cf6c12f5307d/whatsapp/tools/whatsapp_api.py#L49-L57 Here, ``res.text`` contains NUL (0x00) characters. So, it will lead to the above traceback. sentry-6314521165 Forward-Port-Of: odoo/enterprise#91055 Forward-Port-Of: odoo/enterprise#83274
Saving a spreadsheet global filter with a duplicate label and a restricted value range no longer causes a crash. Users now see the duplicate label error directly, making the filter setup flow clearer and more reliable.
Original PR description
Steps to reproduce: - Create a global filter with label 'aa' - Create a new text filter with the same label - Check 'Restrict values to a range' - Select a range with some values - Confirm the range selection - Click the save button Current behavior before PR: - A traceback occurred when saving the new filter with a duplicate label and a selected range. After the crash, the duplicate label error was shown. Desired behavior after PR is merged: - The duplicate label error is raised directly without triggering a traceback. Task: [4813177](https://www.odoo.com/odoo/2328/tasks/4813177) Forward-Port-Of: odoo/enterprise#90155
46 changes
Resolved issues and error corrections
This update corrects a formula mismatch in the POS HR spreadsheet dashboard. It helps ensure dashboard figures are calculated consistently and reduces the risk of misleading reporting for point-of-sale HR metrics.
Original PR description
Task: 4930419 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#217908
This fixes an issue where Point of Sale users could not add products using already existing serial or lot numbers when the operation was configured to reuse them rather than create new ones. Businesses can now process tracked products at checkout as intended, reducing sales interruptions and inventory handling errors.
Original PR description
After commit https://github.com/odoo/odoo/commit/cb31a37508d32110731ad61b04d5d05dc7b31825, when the PoS picking type was configured to use existing lot numbers and not creating new ones, it was not possible to correctly add products with existing lot numbers. opw-4974345 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix removes pricing-list requirements from point-of-sale loyalty test setup. It helps ensure loyalty program tests can run reliably for deployments using only community apps, reducing false failures in validation.
Original PR description
Since 39b15f1 the pricelists in the loyalty programs creation made them not work if they were only using the community apps. The pricelists were removed from the loyalty program creation so that the tests can be run again. runbot-229672
Point of Sale loyalty rules now treat a combo product as a single item instead of counting each combo component separately. This prevents customers from receiving extra discounts or rewards when buying combo products, keeping promotions accurate and predictable.
Original PR description
Combo lines where counted as products in the loyalty program rules, but they are part of only one product, the combo product. So when you add a combo product to the cart, it should count as one product no matter how many items are in the combo. Steps to reproduce: ------------------- * Create a combo product with 3 products options in it * Create a loyalty program that give 1 point with a minimum quantity of 2. And 100% discount on the cheapest product in exchange of 1 point * Open PoS session * Add the combo product to the cart > Observation: You get 2 discount of 100%. Why the fix: ------------ We ignore combo lines in the loyalty program rules. This way, no matter how many products are in the combo, it will only count as one product for the loyalty program rules. opw-4783013 Forward-Port-Of: odoo/odoo#220828 Forward-Port-Of: odoo/odoo#213002
Customers ordering from a table-specific QR code are no longer asked to choose a table again at payment. This removes an unnecessary step in the self-order flow and helps restaurant orders stay linked to the correct table.
Original PR description
Before this commit, when you made a self order at Table, the table selector was trigger and you had to pick one, even if the tableIndicator was there. In practice, the `selectedTable` in `selfOrder`…
Before this commit, when you made a self order at Table, the table selector was trigger and you had to pick one, even if the tableIndicator was there.
In practice, the `selectedTable` in `selfOrder` was removed by the `selectPreset()` function of `EatingLocationPage`
```js
selectPreset(preset) {
this.selfOrder.currentOrder.setPreset(preset);
this.selfOrder.currentTable = null;
this.router.navigate("product_list");
}
```
That was fixed in 18.2 by this commit : https://github.com/odoo/odoo/commit/5e01d444cfd0594dd88a420129375ae1a6fdfc62
The test `self_mobile_auto_table_selection_takeaway_in` as been added.
Steps to reproduce (in runbot 18.1) :
- Go in Point of Sale > Configuration > Settings
- Select the Restaurant
- Set the Self Ordering Method to QR menu + Ordering
- Save
- Get the code using Print QR Codes
- Open the Table: 1 URL in incognito window
- Make sure the Restaurant is Open and the table 1 have no remaining order
- Select Eat In as eating location and make an order
- When you click pay, the table selection displayed
opw-4641352
Forward-Port-Of: odoo/odoo#219907
Forward-Port-Of: odoo/odoo#214300This update brings the spreadsheet component to its latest version and fixes several issues affecting everyday spreadsheet use. Users should see more reliable row sizing, formula behavior, editing position, pasted content handling, and pivot spreadsheet results.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/d30327ce0 [REL] 18.3.13 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/d30327ce0 [REL] 18.3.13 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/270b64f5a [FIX] header_sizes_ui: preserve row sizes on insert and move ops [Task: 4885579](https://www.odoo.com/odoo/2328/tasks/4885579) https://github.com/odoo/o-spreadsheet/commit/65a3252b4 [FIX] evaluation: test array formula invalidation [Task: 4954710](https://www.odoo.com/odoo/2328/tasks/4954710) https://github.com/odoo/o-spreadsheet/commit/056ce29b9 [FIX] GridComposer: Recompute composer position if we change edited cell [Task: 4879186](https://www.odoo.com/odoo/2328/tasks/4879186) https://github.com/odoo/o-spreadsheet/commit/994301a64 [FIX] auto_complete: remove toggle button for data validation [Task: 4854464](https://www.odoo.com/odoo/2328/tasks/4854464) https://github.com/odoo/o-spreadsheet/commit/bcf0f3ebe [FIX] Composer: Remove formatting when pasting external content [Task: 4910559](https://www.odoo.com/odoo/2328/tasks/4910559) https://github.com/odoo/o-spreadsheet/commit/b9c2fe323 [FIX] Formulas: `COLUMN/ROW` spread with range [Task: 4916369](https://www.odoo.com/odoo/2328/tasks/4916369) https://github.com/odoo/o-spreadsheet/commit/5626d48fe [FIX] spreadsheet_pivot: empty row when number added to char field [Task: 4878778](https://www.odoo.com/odoo/2328/tasks/4878778) 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>
This fix makes an automated mail test stable by removing timing-sensitive checks around repeated message edits. It helps keep Odoo's validation pipeline reliable without changing normal user-facing behavior.
Original PR description
Before this commit, the "Can edit message comment in chatter" test could fail intermittently. The test performs three edits on the same message, and due to the asynchronous nature of the bus (mock server > websocket > worker bus service > subscribers), bus notification are received later than rpc results. The test was asserting composer content between edits, which is unnecessary and sensitive to race conditions. For example: - First edit is sent. - Second edit is sent. - First edit is received. - Third edit opens the composer with outdated content. This is unlikely to occur in practice. This commit resolves the issue by removing non essential composer assertions. fixes runbot-227618 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#220389
This fixes an error that prevented accounting users without administrator rights from printing Saudi ZATCA invoices. The change ensures the invoice QR code can still be generated safely, so invoice printing works for regular authorized users.
Original PR description
**Steps to reproduce:** 1. Install Accounting and l10n_sa_edi 2. Switch to a SA company 3. Go to Accounting > Configuration > Journals > Sales > ZATCA > Re-onboard 4. Create or duplicate a customer…
**Steps to reproduce:** 1. Install Accounting and l10n_sa_edi 2. Switch to a SA company 3. Go to Accounting > Configuration > Journals > Sales > ZATCA > Re-onboard 4. Create or duplicate a customer invoice > Confirm 5. Click on blue banner "Process Now" 6. Log in as a non-admin user (e.g., Marc Demo) and Switch to a SA company 7. Go to invoice > Open Same invoice > Click to "PRINT" **Issue:** - A traceback is raised when trying to access the attachment linked to the ZATCA document. **Cause:** - Since commit https://github.com/odoo/odoo/commit/44a4cdb3944a4b722dcfbca5e2947a4372b8501d, access to EDI document's attachment (`attachment_id`) is restricted to users belonging to "Role > Administrator" group (`group_system`). - This was introduced as part of changes from Task [#4341594](https://www.odoo.com/odoo/project/49/tasks/4341594) As a result, non-admin users (even with accounting rights) are unable to access the attachment causing a traceback. **Solution:** - Apply `compute_sudo`to field `l10n_sa_qr_code_str` to bypass the restrictive access rights. So even if for any case any other field causes issues in the future, compute_sudo will take care of it **opw-4923399**
Pivot tables in spreadsheets now display the proper names when data is grouped by an ID field, instead of showing blank row or column headers. This makes spreadsheet reports easier to read and ensures test data reflects the same behavior users see in Odoo.
Original PR description
**Description of the issue/feature this PR addresses:** When inserting a pivot table in a spreadsheet and grouping by an `id` field, the pivot column or row headers appear blank instead of showing…
**Description of the issue/feature this PR addresses:** When inserting a pivot table in a spreadsheet and grouping by an `id` field, the pivot column or row headers appear blank instead of showing the expected label. This issue stems from two inconsistencies: 1. The `_sanitizeLabel` logic used to normalize pivot headers did not properly handle groupby values for `id` fields that are returned as `[id, label]` arrays. It treated them as truthy values but didn't extract the label. 2. The mock `read_group` implementation did not follow backend logic for `id` fields. It returned raw integers instead of `[id, display_name]`, breaking the label extraction expected by the pivot UI. **Current behavior before PR:** - Pivot headers for grouped `id` fields are blank in spreadsheets - Mock data returns raw IDs, causing the display logic to fail **Desired behavior after PR is merged:** - The pivot UI correctly extracts and displays labels for `id` groupings - The mock `read_group` aligns with backend by returning `[id, label]` for `id` fields, matching the behavior of relational fields Task: 4878685 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219206
On mobile, selecting a subtask from a task now opens it in the main screen instead of a pop-up. This makes the discussion area visible, so users can communicate with customers directly from the subtask.
Original PR description
Before this commit, when the user is in mobile view and go to a task with subtasks and selects a subtask, the form view of that subtask is opened inside a dialog form view instead of opening the…
Before this commit, when the user is in mobile view and go to a task with subtasks and selects a subtask, the form view of that subtask is opened inside a dialog form view instead of opening the record in the main view. Because of that, the chatter for that subtask is not displayed. This commit opens the form view in the main view instead of opening it inside a form view dialog to be able to display the chatter of the subtask selected. Steps to reproduce the issue: ---------------------------- 1. Install project and go to project app. 2. Create a project A. 3. Add a task inside the project A 4. Add a subtask inside the new task created in step 3 5. Open the form view of the task created in step 3 in mobile 6. Click on the kanban record contained the subtask created in step 4 Expected behavior: ----------------- The chatter should be displayed in the form view of that subtask to be able to communicate with the customer. Current behavior: ---------------- Since the form view of the subtask selected is opened inside a form view dialog the chatter for that subtask is not displayed. task-4278273 Forward-Port-Of: odoo/odoo#220569 Forward-Port-Of: odoo/odoo#200178
The Send & Print wizard now correctly shows relevant e-invoice warnings for Indian localization. This helps users catch and address invoice issues before sending, reducing missed compliance or processing problems.
Original PR description
Before this PR, warnings that should be displayed while sending e-invoices through the Send & Print wizard was not shown because the `_group_by_error_code` method always returned False. With this PR, the method has been corrected to return the appropriate key based on the warning, ensuring that relevant messages are now properly displayed Forward-Port-Of: odoo/odoo#220036
Analytic entries created from split invoice lines now add up exactly to the original invoice line amount. This prevents small rounding differences, such as one cent discrepancies, from appearing in accounting analytics reports.
Original PR description
**PROBLEM** Sometimes, the sum of the generated analytic lines for an invoice line doesn't equal the amount on the invoice line. For example, in invoice line with a price of 182.25, with an analytic…
**PROBLEM** Sometimes, the sum of the generated analytic lines for an invoice line doesn't equal the amount on the invoice line. For example, in invoice line with a price of 182.25, with an analytic distribution split into 98% and 2%, the generated analytic lines amount to 182.26 (off by 0.01) because of rounding. **STEP TO REPRODUCE** 1. install the accounting module and enable the Analytical Accounting option. 2. create an invoice, with a line with a price of 182.25, and a distribution of 98%/2%. 3. confirm the invoice. 4. go to Accounting/Analytics Items and notice the sum of analytical line is 182.26 instead of 182.25. **CAUSE** We only apply rounding after having calculated all the analytic line amounts. This mean we will sum the rounding error. In our example, the computation is like so: 98% of 182.25 = 178.605 rounded to 178.61 2% of 182.25 = 3.645 rounded to 3.65 178.61 + 3.65 = 182.26 **FIX** We compute the last analytic line for each plan, relatively to the other. `last_line_amount = invoice_price - sum(rounded_other_line_amount)` This ensure that the sum of analytic lines is always equal to the invoice price. opw-4848784 Forward-Port-Of: odoo/odoo#220614 Forward-Port-Of: odoo/odoo#214736
Event registrations purchased and paid through Point of Sale now stay in the same “Registered” status as registrations bought through the website. This prevents paid PoS registrations from being incorrectly marked as already attended, improving consistency in attendee tracking.
Original PR description
Before this commit, if we buy an event registration from PoS and pay for it, its state will be 'done', i.e. "Attended" [1]. While if we buy the registration from the website and pay for it, its state is 'open', i.e. "Registered" [2]. We want the state of the registration to be 'open' when we buy it. After this commit, we set the state of events bought from PoS to 'open' as well, matching the case where we buy them from the website. [1]: https://github.com/odoo/odoo/blob/c3ae4b29c51c7b0cff11aac5f4bf4aab5fad16c9/addons/pos_event_sale/models/event_registration.py#L14 [2]: https://github.com/odoo/odoo/blob/c3ae4b29c51c7b0cff11aac5f4bf4aab5fad16c9/addons/event_sale/models/event_registration.py#L40 opw-4920574 Forward-Port-Of: odoo/odoo#219622
This fix prevents an error when creating an Analytic Distribution while multiple companies are selected and one company has no fiscal localization configured. It helps accounting users continue setup work without crashes in multi-company environments.
Original PR description
Currently, an error occurs when a new company is created without selecting a `Fiscal Localization`, and then both companies are selected while creating a new `Analytic Distribution`. Steps to…
Currently, an error occurs when a new company is created without selecting a `Fiscal Localization`, and then both companies are selected while creating a new `Analytic Distribution`. Steps to reproduce: --- - Install `Accounting` module(without demo) - Enable `Analytic Accounting` - Create a New company and switch to it - Select both companies and Open `Analytic Distribution` and click `New` Traceback: --- `TypeError: 'bool' object is not subscriptable` At [1], we are searching by `account_type`, but if `Fiscal Localization` is not set for the current company, there will be no records in `account.account`. However, due to the multi-company setup, it still return accounts from the first company. In such cases, the `code` field is empty, which causes the `code` to be treated as False. [1]: https://github.com/odoo/odoo/blob/d155edfd729ab9b53f38939fe24b6d1e7b578083/addons/account/models/account_analytic_distribution_model.py#L55-L58 sentry-6754820454 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220089
This change makes an internal website test wait until an image is fully loaded before checking it. This reduces random test failures and helps keep releases more stable without changing customer-facing behavior.
Original PR description
The goal of this commit is to avoid potential undeterminism that could occur in the `drop_404_ir_attachment_url` test (introduced by [this commit]). Before this commit, an error was thrown if the image was not loaded at the time the test checks the `naturalWidth` and `naturalHeight` property of the image. This could lead to undeterministic error as nothing ensures that the image is loaded at that time. To solve the problem this commit first waits for the image to be loaded before accessing the `naturalWidth` and `naturalHeight` property of the image. Side note: even if the source of the image is of type `data:` it is not directly loaded. [this commit]: https://github.com/odoo/odoo/commit/fbc6a697c1adf67ee8a90c49b0150d6ca170e081 task-4931144 Forward-Port-Of: odoo/odoo#220204 Forward-Port-Of: odoo/odoo#217968
This fixes a display issue on eCommerce product pages where promotional ribbons could shift away from the product image when the browser zoom level changed. The ribbon now remains correctly positioned, preserving a polished shopping experience.
Original PR description
<b>Steps to Reproduce:</b> 1. Install Sales and eCommerce modules. 2. Go to Sales → Products, open any product, go to Sales tab, and set a Ribbon. 3. Navigate to Website → Shop, search for the…
<b>Steps to Reproduce:</b> 1. Install Sales and eCommerce modules. 2. Go to Sales → Products, open any product, go to Sales tab, and set a Ribbon. 3. Navigate to Website → Shop, search for the product and open its page. 4. Zoom in or out. <b>Issue:</b> - The ribbon on the product image becomes misaligned (shifts away from the image) when zooming in or out on the product detail page. This results in a broken visual layout. <b>Cause:</b> - A previous change in [PR #175473](https://github.com/odoo/odoo/pull/175473) unintentionally replaced the height class (h-100) with width (w-100) on ribbon container, causing layout instability during zoom operations. <b>Solution:</b> - Restore the proper layout by reintroducing h-100 to both the ribbon container and inner image div. This ensures the ribbon stays correctly positioned relative to the image regardless of zoom level. <b>opw-4854217</b> <b>Before FIX :</b>  <b>After FIX:</b>  Forward-Port-Of: odoo/odoo#216545
Invoices can now be confirmed when a journal sequence prefix contains Greek letters. This prevents an error in Accounting for businesses using European communication standards with localized prefixes.
Original PR description
**Issue** Using a Greek letter in the journal's sequence prefix causes a traceback error when confirming an invoice **Steps to Reproduce** 1. Install the Accounting module 2. Navigate to Accounting >…
**Issue** Using a Greek letter in the journal's sequence prefix causes a traceback error when confirming an invoice **Steps to Reproduce** 1. Install the Accounting module 2. Navigate to Accounting > Configuration > Journals 3. Open the Sales journal 4. Under the Advanced Settings tab, set the communication standard to "European" 5. Set the sequence prefix to include Greek letters (e.g., "TΠY") 6. Create and confirm a new invoice 7. Observe the traceback error **Root Cause** The prefix is used in calculating the `check_digits` via a base-36 to base-10 conversion. This conversion fails for Greek characters, which are not valid in base-36, leading to an exception **Fix** Greek letters in the prefix are transliterated to their Latin equivalents before performing the checksum calculation, ensuring compatibility with the base-36 conversion logic Opw-4813790 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212169
This fix makes mail conversation loading more consistent by avoiding an error when a conversation is missing and applying the same behavior whether data is already loaded or fetched from the server. This reduces the chance of unexpected failures when users open or access discussions.
Original PR description
1. Ensure the thread is not undefined before calling exists. 2. `hasReadAccess` was only checked after the RPC, but if the thread data was already fetched the condition was not checked. The choice is made to remove the condition as it makes the code more flexible. The caller can always decide to check `hasReadAccess` afterwards if necessary. How to reproduce: https://github.com/odoo/odoo/pull/220605 Forward-Port-Of: odoo/odoo#220782
This fix prevents an error when users edit a website button and change it into a regular link. The editor now correctly hides button-specific controls once the element is no longer a button, making saving the page work as expected.
Original PR description
Problem: Saving the button snippet after changing its type to a link throws an error because `snippet_key` is `undefined`. Cause: The button snippet editor should be disabled if the button is changed…
Problem: Saving the button snippet after changing its type to a link throws an error because `snippet_key` is `undefined`. Cause: The button snippet editor should be disabled if the button is changed to a link. However, `updateOptionsUIVisibility` is only triggered on click events. In this case, the element type changes through the editor itself, not by clicking, so the UI isn't updated accordingly. Solution: Trigger a `click` event on the link element programmatically to call `updateOptionsUIVisibility` and hide the button snippet editor when the element is no longer a button. Steps to reproduce: - Drop a button snippet - Click inside the button to edit - Notice the Button snippet editor appears - Change the type to "Link" instead of "Primary" - The Button snippet editor is still visible - Click the floppy disk icon (save) in the snippet editor -> A traceback occurs opw-4936796 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220787 Forward-Port-Of: odoo/odoo#219660
Malaysia electronic invoices now place prepaid amounts in the format expected by the MyInvois platform. This helps prevent invoice submission issues when prepayments are included.
Original PR description
Before: Prepaid Amount was submitted under LegalMonetaryTotal node, which follows UBL format but not supported for MyInvois. After: Introduced separate PrepaidAmount node used specific to Malaysia to support MyInvois. taskID-4947994 Forward-Port-Of: odoo/odoo#220612 Forward-Port-Of: odoo/odoo#219419
This fix improves Turkish Nilvera e-invoice XML generation so invoices include required exchange-rate and discount information. It also adjusts the invoice amount layout to match Nilvera validation rules, reducing the risk of rejected e-invoices.
Original PR description
This commit does following fixes for e-invoice XML generated for Nilvera. - adds currency exchange rate as note in XML if invoice currency is other than TRY. - adds total discount amount at the Invoice document level. - creates a new XML template for TR e-invoice inherited from the UBL Invoice Template. - removes the `<cac:PrepaidAmount>` node as it is not a valid node in Nilvera and adds the node value to `<cac:PayableAmount>` so that actual invoice amount is preserved while sending e-invoice. TaskID:4815875 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220513 Forward-Port-Of: odoo/odoo#216594
This fixes an issue in Discuss calls where denying camera permission after leaving a call could trigger an error. The change makes call handling more reliable when users leave before camera access finishes processing.
Original PR description
Before this commit, a traceback would occur of the camera access was rejected after leaving a call that requested it. This race condition could also happen in other cases where the call is left before the camera promise resolves. Forward-Port-Of: odoo/odoo#220770
Invoices and sales orders now correctly recognize foreign customers whose countries do not define states. This prevents them from being treated as Indian domestic customers, helping ensure accurate GST calculations and compliance for overseas transactions.
Original PR description
Before this PR: When creating invoices/orders for foreign customers that don't have states defined in their country, both **account.move** and **sale.order** models would incorrectly assign the…
Before this PR: When creating invoices/orders for foreign customers that don't have states defined in their country, both **account.move** and **sale.order** models would incorrectly assign the company's Indian state as the place of supply. This happened because the fallback logic would always use **move.company_id.state_id** without checking if the partner was actually Indian. As a result, foreign customers would be treated as Indian customers in GST calculations, leading to incorrect tax treatment and compliance issues. After this PR: Both models now correctly identify foreign customers by checking the partner's country first, before falling back to state-based logic. Foreign customers without states are now properly assigned the foreign state reference (**l10n_in.state_in_oc**) instead of the Indian company's state. This ensures accurate GST treatment where foreign customers are correctly identified as overseas transactions. Task-4900697 Forward-Port-Of: odoo/odoo#220717 Forward-Port-Of: odoo/odoo#216220
Users will now see a clear, friendly warning dialog when certain server actions need to show warnings, instead of a technical traceback. This reduces confusion and makes the issue easier to understand and act on.
Original PR description
### Description of the issue/feature this PR addresses: https://github.com/odoo/odoo/commit/ef4c1350df10c186efec79b1414306e325707549 introduced a new exception `ServerActionWithWarningsError`:…
### Description of the issue/feature this PR addresses: https://github.com/odoo/odoo/commit/ef4c1350df10c186efec79b1414306e325707549 introduced a new exception `ServerActionWithWarningsError`: https://github.com/odoo/odoo/blob/851c46923332aa13c56fbce3a5ed3c5d37a70c92/odoo/addons/base/models/ir_actions.py#L486-L488 This was not registered as an error_dialog. This led to the frontend displaying the entire traceback instead of an error dialog similar to `UserError` when a `ServerActionWithWarningsError` is raised. This commit fixes it by correctly registering the error in `error_dialog` registry category so a more user friendly dialog is displayed with the error contents. Thanks @brboi for helping with the fix ### Current behavior before PR: A traceback error is thrown when a `ServerActionWithWarningsError` is raised. Example: <img width="1896" height="904" alt="image" src="https://github.com/user-attachments/assets/0bfee329-e6c5-4652-a2ac-d41b763e2bdb" /> Video reproducing it: https://drive.google.com/file/d/1C_aE0d_9bP27f388dB1NJLeWHBpsM7AW/view?usp=drive_link (credits: gavb-odoo) ### Desired behavior after PR is merged: An error dialog similar to UserError which is easier to understand is displayed <img width="1906" height="799" alt="image" src="https://github.com/user-attachments/assets/d57c5cab-14f2-4f39-9f0c-b8099e8b0089" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr opw-4885670 Forward-Port-Of: odoo/odoo#219977
Agents now only see a warning about ending a live chat when the conversation is still active. This avoids confusing alerts after a live chat has already finished, making the support workflow clearer.
Original PR description
Before this PR, when leaving a live chat from the discuss sidebar action as an agent, the user was always getting a warning that this action would end the livechat, even when the livechat has already ended! task-4926337
This fixes an internal live chat automated test so it waits until changes are fully saved before finishing. It helps prevent false test failures and reduces the risk of inconsistent background activity during quality checks.
Original PR description
Tour "test_chatbot_clear_answers_on_step_type_change" could fail with following error before this commit: ``` Tour finished with a dirty form view being open. Dirty form views are automatically saved when the page is closed, which leads to stray network requests and inconsistencies. ``` The tour was saving the changes to form view but was not awaiting a trigger when the form is saved, thus the tour could end and still see form is dirty. This commit replaces `.o_form_view` to `.o_form_saved` for awaiting the form is fully saved and not dirty at end of test tour. Fixes runbot error 230296
Shared Helpdesk ticket links now show the logo and branding of the company that owns the ticket, even when opened by someone who is not logged in. This prevents customers from seeing the wrong company identity on portal pages in multi-company setups.
Original PR description
**Steps to reproduce**: 1. Install `helpdesk` only 2. Create a second company and configure a distinct logo for both the default and new companies. 3. Create a Helpdesk ticket under the new company.…
**Steps to reproduce**: 1. Install `helpdesk` only 2. Create a second company and configure a distinct logo for both the default and new companies. 3. Create a Helpdesk ticket under the new company. 4. Use the 'Share Ticket' (gear icon) feature to generate a portal link. 5. Open the link in an incognito window or a different browser (where no user is logged in). 6. Observe the logo shown in the portal navigation bar. **Observed behavior**: The portal incorrectly displays the logo and branding of the default/main company, even when the Helpdesk ticket belongs to a different company. **Issue**: When no portal user is logged in, the `res_company` used in the portal rendering context defaults to the system’s primary company (`env.company`). The template expects `res_company` to be explicitly set to reflect correct branding. See: https://github.com/odoo/odoo/blob/880954ebfc1106411b7f7a7d60aee05dfae60893/odoo/addons/base/models/ir_qweb.py#L781 **Solution**: Explicitly pass `ticket_sudo.company_id` as `res_company` in the portal view context to ensure correct company branding is used. opw-4855281 Forward-Port-Of: odoo/enterprise#90600
Sales commission achievement reports now include down payments and other invoice lines that do not have a product assigned. This fixes discrepancies where commission totals could be lower than invoice analysis totals, even when the commission plan rate was set to 100%.
Original PR description
In the sale achievement report, down payments and other account move lines that have no product attached to them would not be accounted for in the sale commission achievement report. This was due to the fact that the table was being inner joined on product_id which would get rid of records that had no product. Because of this behavior there would be a mismatch between the invoice analysis of a user and their commission even if the rate was 100% on the commission plan. Left joining the products onto the account move line keeps the lines with no products and fixes the discrepancy between the report and the invoice analysis. opw-4625340 Forward-Port-Of: odoo/enterprise#91010 Forward-Port-Of: odoo/enterprise#83477
This fixes how Indian GST return periods are calculated after a previous change to quarter handling. Reports will now use the correct month for quarterly return periods, helping avoid incorrect period labels in tax reporting.
Original PR description
In this commit: https://github.com/odoo/enterprise/commit/75b72df06a109b5e89a2c8e98bc29a1fe120fb68, the quarters key was updated. Previously, it used the start month of the quarter, but it now uses the end month instead. However, the `return_period_month_year` field is still being computed based on the start month. With this PR, the `return_period_month_year` will now be computed correctly based on the updated logic. **opw**-4970000
Users working in multiple companies can now send signature requests from templates they created in the company they are currently using. This prevents an access error caused by the system using the creator's default company instead of the active company for the request.
Original PR description
Problem: In a multi-company environment, users are unable to send templates in non-default companies despite them creating the template. A traceback gets thrown because the template is using the…
Problem: In a multi-company environment,
users are unable to send templates in non-default
companies despite them creating the template.
A traceback gets thrown because the template
is using the default company on the create user,
instead of the current environment's company.
Purpose: The user should be able to send templates they created in any allowed companies.
Steps to Reproduce on Runbot:
[ADMIN]
1. Install Sign
2. Navigate to Settings > Sign > Enable "Sign Default Terms & Conditions"
3. Create another company and allow Marc Demo access
[Marc Demo]
1. Change to a non-default company
2. Try to send a signature request (e.g. upload pdf to sign > send)
3. Traceback gets thrown
```
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/mylynahy/src/odoo/odoo/fields.py", line 1161, in __get__
value = env.cache.get(record, self)
File "/home/mylynahy/src/odoo/odoo/api.py", line 1020, in get
raise CacheMiss(record, field)
odoo.exceptions.CacheMiss: 'res.company(2,).sign_terms_type'
During handling of the above exception, another exception occurred:
...
odoo.addons.base.models.ir_qweb.QWebException: Error while render the template
AccessError: Due to security restrictions, you are not allowed to access 'Companies' (res.company) records.
Records: BE Company CoA (id=2)
User: Marc Demo (id=6)
This restriction is due to the following rules:
- company rule employee
Note: this might be a multi-company issue.
Contact your administrator to request access if necessary.
Template: sign.sign_template_mail_request
Path: /t/table/tr[5]/t[1]/td/a
Node: <a t-att-href="\'%s/sign/terms\' % record.get_base_url()" class="text-dark"/>
```
opw-4706828
Forward-Port-Of: odoo/enterprise#85402Bank statement imports started from the accounting dashboard now process every batch in the uploaded file instead of stopping after the first batch. The import page also shows the correct uploaded file name, making the process more reliable and clearer for users.
Original PR description
**PROBLEM** When importing bank statements from the dashboard, it only imports the first batch (by default the first 2000 lines) instead of importing the whole file. This is inconsistent with the…
**PROBLEM** When importing bank statements from the dashboard, it only imports the first batch (by default the first 2000 lines) instead of importing the whole file. This is inconsistent with the behavior of the import done from the reconcilation page. Also, on the import page, the file name is incorrect (it's always `bank_statement_import.csv`) **STEP TO REPRODUCE** file to reproduce the issue : [MP 2280260435_movements_-2025-04-01-191536.xlsx](https://github.com/user-attachments/files/20880784/MP.2280260435_movements_-2025-04-01-191536.xlsx) 1. install the accounting module 2. goes on the dashboard, click on the 3-dot button on the kanban for the bank account, and import a file. 3. make sure the file will be imported in multiple batches (reduced the batch size to 200) and click on import. 4. notice how only the first batch was imported. **CAUSE** In python, The `AccountBankStmtImportCSV` class override the execute_import method of the `base_import.import`. In this override, we add a entry in the `messages` list. (see `enterprise/account_bank_statement_import_csv/models/account_bank_statement_import_csv.py`) In JS, all entry in messages are treated as errors, and the import is interrupted. (see `odoo/addons/base_import/static/src/import_model.js`) https://github.com/odoo/odoo/blob/389b355e7ec761fe8dc2908ac5aec540b0345c48/addons/base_import/static/src/import_model.js#L410-L417 The message entry added in the python was used in the past to automatically open the reconcillation page with the statement lines added. This feature was removed, but not the message. **FIX** - Remove the problematic message entry. - Fix the name of the file in the import action. opw-4823808 Forward-Port-Of: odoo/enterprise#88343
Spreadsheet pivots grouped by ID now display the correct record names instead of blank or numeric headers. This makes pivot reports easier to read and keeps spreadsheet behavior aligned with the main Odoo server results.
Original PR description
Steps to reproduce: - Insert a pivot in a spreadsheet - Add a groupby on id - Insert the spilled formula - Headers are empty Before this commit: - _sanitizeLabel treated integer id values as raw, skipping the label in [id, label] - The mock read_group returned plain numbers for id, unlike the server - Enterprise tests still expected FALSE/ids in PIVOT.HEADER and tooltips After this commit: - _sanitizeLabel returns the label for [id, label] without numbering id - The mock read_group now returns [id, display_name] for id - Enterprise pivot tests updated to expect labels and adjusted ranges Task: 4878685 Forward-Port-Of: odoo/enterprise#90656
This fix ensures Dutch tax report submissions correctly handle cases where more than one closing entry exists for a return. Users are now warned only when at least one related closing entry is still in draft, reducing incorrect warnings and helping prevent submission issues.
Original PR description
Before this commit: As multiple closing moves can exist for a return, the check for the state of the closing move was incorrect. It was assuming only one closing move exists, which could lead to issues if multiple closing moves were present. After this commit: The code now checks if any of the closing moves are in 'draft' state before raising a warning. opw-4976827
Indian GSTR-1 HSN reports now include point-of-sale orders that were reversed after session closure. This prevents missing product and tax details in compliance reports, improving reporting accuracy for affected businesses.
Original PR description
Before this change, HSN summary generation skipped POS reversal journal entries, which could lead to missing product and tax data for reversed orders made After the session closure. This commit improves the `_get_gstr1_hsn_json` method by: * Including reversed POS orders (`reversed_pos_order_id`) in the POS order list. * Ensuring their corresponding order lines are considered during HSN data aggregation. This ensures accurate HSN reporting even for POS reversals processed as standalone entries. OPW: 4931360 Forward-Port-Of: odoo/enterprise#90248
Credit card payments in the Italian point of sale are now assigned the correct default payment index. This prevents Italian fiscal printers from incorrectly treating these card payments as unpaid.
Original PR description
In Italy if a payment method is of type 'Credit card' (type 2), and it's index is 0 the payment made with it is considered as 'Not paid' by the italian fiscal printer. Why the fix: ------------ We change the default index of the payment method to 1, so that it is considered as 'Paid' by the fiscal printer. opw-4963421 Forward-Port-Of: odoo/enterprise#90919
Sign reminders now handle requests that do not have a “Valid Until” date set. This prevents the scheduled reminder process from crashing, so reminder emails can continue to be processed reliably.
Original PR description
When a `sign.request` record has `validity` as `False`, attempting to send a reminder via the `_cron_reminder` method leads to a crash. **Steps to Reproduce:-** 1. Install the `Sign` module. 2.…
When a `sign.request` record has `validity` as `False`, attempting to send a reminder via the `_cron_reminder` method leads to a crash.
**Steps to Reproduce:-**
1. Install the `Sign` module.
2. Navigate to the Sign section and click on `Upload PDF & Sign`
3. Upload any PDF document and add your signature, then click `Send`
4. In the new wizard, remove the value for `Valid Until` and enable the `reminder` option. Set the reminder to `every 1 day.`
5. When our scheduled action named `Sign: Send Mail Reminder` executes the following day, it will throw an error.
**Error:-**
`TypeError(''<' not supported between instances of 'bool' and 'datetime.date'') while evaluating 'model._cron_reminder()''`
**Root Cause:-**
The SQL query within the `_cron_reminder()` method retrieves all records where:
- The request is `active` and in the `sent` state.
- Either:
- `validity < today` or
- A reminder is due based on `last_reminder + reminder`.
The fetched records are then iterated through at [1].
[1]
https://github.com/odoo/enterprise/blob/ac4aeeea98dcf2fc7f06e6a3fabc55e256330e2c/sign/models/sign_request.py#L454
If `validity` is `False`, this comparison raises a `TypeError` because it is invalid to compare a `boolean` with `datetime.date`.
**Solution:-**
- A safety check was added before the comparison between `request.validity` and today's date, ensuring that `request.validity` exists.
Sentry-6727599497
Forward-Port-Of: odoo/enterprise#89646Creating a helpdesk ticket from the timesheet timer now correctly uses the selected support project, preventing validation errors about missing analytic accounts. The timer also recognizes helpdesk projects even before any tickets exist, so users see the proper ticket option instead of being prompted to create a task.
Original PR description
Steps to reproduce: ------------------- - Install 'helpdesk_timesheet' module - Go to Timesheets and click on `Start` to launch the timer - Select `VIP Support` as Project - Create a new ticket…
Steps to reproduce: ------------------- - Install 'helpdesk_timesheet' module - Go to Timesheets and click on `Start` to launch the timer - Select `VIP Support` as Project - Create a new ticket Issue: ------ 1. Validation error raised: `At least one analytic account must be set.` 2. When we select a helpdesk project that does not have any ticket linked to it already, the field next to it is set to `Task` (task_id) instead of `Ticket` (helpdesk_ticket_id). Cause: ------ 1. When creating the ticket, we don't provide the default project who got the analytic account linked to it. 2. The field `helpdesk_ticket_id` is hidden because we consider that we the project is not linked to any helpdesk team; this is because we retrieve the projects based on tickets already created only. Solution: --------- 1. Set the default project in the context when creating the ticket (like for a task). In the create method, if no team is provided and we have a default project (from `list_value` or the `env.context`), we set the team based on the project if the project is linked to a helpdesk team. 2. Fetch all projects that have `helpdesk_team` field set. opw-4404097 Forward-Port-Of: odoo/enterprise#90998 Forward-Port-Of: odoo/enterprise#76779
Sales orders created from field service with zero-priced products now correctly show as ready to invoice when Anglo-Saxon accounting is enabled. This allows businesses to issue invoices for these items instead of having them incorrectly marked as having nothing to invoice.
Original PR description
Before this commit: When Anglo-Saxon accounting is enabled and a product with sale price of zero is added to SO through field service, the invoice_status show 'Nothing to Invoice'. After this commit: With Anglo-Saxon accounting enabled, adding product with a zero sale price to an SO through field service will display the invoice_status as 'To Invoice' instead of 'Nothing to Invoice'. task-3957962 Forward-Port-Of: odoo/enterprise#70132
This update fixes errors that could interrupt appointment booking when customers use invitation links with multiple assigned resources or users. Customers can now move back through the booking progress bar without seeing server or access errors, making the appointment flow more reliable.
Original PR description
Fixes two issues regarding the buttons on the front-end progress bar in the appointment flow, when using an invitation link. Commit messages give steps to reproduce.
1. Fix 500 error when clicking 'Date & time' with more than one resource / user configured on the invitation link.
2. Fix 403 error when using the operator ('meeting' actually) step button with more than one specific resource in the invitation link.
Task-4897098
Forward-Port-Of: odoo/enterprise#90335
Forward-Port-Of: odoo/enterprise#88521The optional columns menu no longer shows the “Add custom field” button when users view bank statement lines. This prevents users from trying to customize a reconciliation-related view where custom field creation is not supported, reducing confusion in Accounting workflows.
Original PR description
`Add custom field` button shouldn't be displayed with `account.bank.statement.line` model. Since c6ade2de937a30a13620a64a4779ebd827088755, we use an action to open the bank reconciliation widget, therefore in the `computeStudioEditable` method, we didn't pass in the first condition `!action.xml_id` anymore and we were returning `true`. With this commit, we return `false` if model is `account.bank.statement.line`. Steps: - Install `accountant` - Go to Accounting dashboard - Click on the `Bank` card title - Toggle the list view - Open the optional columns dropdown -> The `Add custome field` button is displayed opw-4953156 Forward-Port-Of: odoo/enterprise#90935
This update removes leftover code from a previous reconciliation workflow cleanup. It helps keep the accounting-related payment and sales features simpler and reduces the risk of confusion or unexpected maintenance issues.
Original PR description
In this commit: https://github.com/odoo/enterprise/pull/80787/commits/04a304d58a56c7d2eeb70429340eb048fa9f2be6 We refactored the reconciliation model to be easier to use for users. However, by doing the refactor we forgot to remove some code. no task id
The Accounting dashboard's "To Check" link now correctly opens only bank transactions that still need review. This prevents already-checked transactions from cluttering the list, helping accountants focus on pending work.
Original PR description
**Issue** When accessing bank transactions via the "To check" link in the Accounting dashboard, the expected filter to show only unchecked transactions is not applied. As a result, all transactions are displayed, including those that have already been checked. **Steps to Reproduce** 1. Navigate to Accounting > Dashboard > Bank 2. Create two bank statement lines: one marked as checked, the other unchecked 3. Return to the dashboard 4. Click the “1 To Check” link 5. Observe that both entries are shown, instead of only the unchecked one **Root Cause** The corresponding filter (`to_check`) is missing from the search view of the `account.bank.statement.line model`. Although the action context correctly includes `search_default_to_check=True`, Odoo is unable to apply the filter without a matching `<filter name="to_check" ... />` in the search view definition. Opw-4945705
Payroll payment reports now use the company linked to the payslip batch instead of the company currently selected by the user. This prevents confusion when working with multiple companies and helps ensure payroll payment documents show the correct business entity.
Original PR description
Steps to reproduce: - install payroll and create a batch - generate payslips - select multiple companies. - Click on "Create Payment Report." - create any payment method issue: - The report displays the currently selected company instead of the one associated with the payslip batch. reason - the default company is given on the field which is self.env.company fix - now the company field is computed to the payslip company task-4643306 Forward-Port-Of: odoo/enterprise#81812
Rental orders with multiple lines for the same planned service now avoid assigning overlapping shifts to the same resource. If no suitable resource is available, the system creates an unassigned open shift instead, helping planners avoid double-booking and scheduling conflicts.
Original PR description
Steps to Reproduce: ---------------------- - Install the sale_renting_planning module. - Create a rental service product with `Plan Services` enabled. - Create a rental order with multiple lines for the same product. - Confirm the rental order Issue: --------------------------- - You'll see that some generated shifts are assigned to same resource causing conflict. Cause: --------------------------- - Shifts are being generated at the same time for all the SOL which cause them to be assigned to the same resource and make conflict. Fix: ----------------------------- - In this commit when the shift values are generated we will check if the resources are available or not. If no resource is available then it will create open shift for that SOL. task-4829807 Forward-Port-Of: odoo/enterprise#88767
The Tax Return periodicity setting now automatically selects the dedicated Tax Return miscellaneous journal. This prevents users from being blocked when saving the setting because a required journal field was empty.
Original PR description
Before this commit: - The "Journal" field in the Tax Return periodicity setting was required but left empty by default, making it impossible to save the settings change without manually selecting a journal. After this commit: - The "Tax Return" miscellaneous journal is automatically set as the default in the Tax Return Periodicity setting. task-4938896
Installing Accounting after Point of Sale now correctly creates or assigns the default Tax Returns journal. This prevents missing tax return journal settings and helps ensure tax configuration is ready to use after installation.
Original PR description
To reproduce: ============= 1- install point of sale 2- install account => check taxes in the setting, journal item is not set Problem: ======== The accounting journal was not being set when the accounting module was installed. The tax return journal field (`account_tax_return_journal_id`) remained unset Solution: ========= if Tax Returns doesn't exist we will create it and assign it as default as accountChart is working. https://github.com/odoo/enterprise/blob/saas-18.3/accountant/models/chart_template.py#L10-L30 opw-4950538