Daily updates from Odoo
Wednesday, July 23, 2025
61 changes · saas-18.4
Resolved issues and error corrections
Point of Sale no longer asks staff to choose a loyalty program every time they add a product linked to multiple standard loyalty offers. The prompt is now shown only when the choice is actually needed, such as for gift cards or eWallets, making checkout smoother and less repetitive.
Original PR description
When clicking on a product that is linked to multiple loyalty programs you are prompted to select one of them everytime you add one item via the ui. Steps to reproduce: ------------------- * Create 2 loyalty programs activated when buying a certain product * Open PoS and click on the product > Observation: You will get a prompt everytime you click on the product Why the fix: ------------ The variable `selected_program` is actually only usefull if the program selected is gift card or an eWallet program. So we filter it before and only prompt when the output will be usefull. opw-4187037 Forward-Port-Of: odoo/odoo#218170
This fix makes an automated Discuss test wait for the app and messages to fully load before checking whether a chat bubble appears. It reduces random test failures in Odoo's build system, helping keep releases and maintenance work more reliable without changing user-facing behavior.
Original PR description
Before this commit, discuss test "Show conversations with new message in chat hub (outside of discuss app)" failed non-deterministically on runbot with the following error: ``` Failed to find 0 of…
Before this commit, discuss test "Show conversations with new message in chat hub (outside of discuss app)" failed non-deterministically on runbot with the following error: ``` Failed to find 0 of ".o-mail-ChatBubble[name='Dumbledore']" (Timeout of 3 seconds). Found 1 instead. ``` The test checks that new conversations spawn in chat hub on new message when outside of discuss app. At some point, it opens discuss app and then simulate a user posting a new message. When leaving the discuss app we should not expect a chat bubble. The error above says that there's actually a chat bubble when there shouldn't be. The `await openDiscuss()` gives the impression that this waits enough time for discuss being open, but this only awaits the action service doAction() method, which doesn't necessarily mean the client action UI is fully loaded and store has exact flag `discuss.isActive`, which is essential for a new message posted being considered inside the discuss app. This commit fixes the issue by ensuring discuss app is loaded after `openDiscuss()` with `[data-active]`: this data attribute matches the flag `discuss.isActive` which is set reactively from rendering of `discuss_client_action`. Also the handling of chat window / bubble to open is handled with bus notification "discuss.channel/new_message". This is no the same bus notification that changes the counter (`mail.record/insert`), so asserting presence of counter in discuss sidebar doesn't mean the handling of chat window / bubble to open has been performed. Test had race condition to open chat bubble just after openFormView. This commit fixes it by opening the conversation in discuss app and awaiting message is loaded. This should give enough confidence that logic to auto-open chat window / bubble has been performed and decided to not open the chat window / bubble as expected. Fixes runbot-error-230138 Forward-Port-Of: odoo/odoo#220145
This fixes an issue where some template items could be skipped when a conditional section appeared alongside a comment. It helps ensure pages and documents render consistently as intended.
Original PR description
Forward-Port-Of: odoo/odoo#212159
The point of sale customer display now avoids errors when an IoT Box is unreachable by using an alternative connection method when needed. This helps cashiers keep checkout screens working smoothly and reduces interruptions during sales.
Original PR description
We fixed the customer display not opening and displaying a traceback when the Iot Box was not reachable, by calling the action via iot_http, fallbacking on websocket when needed. We also removed the "customer display with IoT Box" logic from the PoS to the module pos_iot. Enterprise PR: odoo/enterprise#90657
Quote PDFs now correctly exclude documents that were removed from the quotation template after being selected in the quote builder. This prevents outdated or unintended header documents from being shown to customers, keeping generated quotations consistent with the current template setup.
Original PR description
## Version 18.0+ ## Issue On a quotation setup with a template, when a document is selected in the quote builder and then deleted from the template, it still appears when rendering the quote PDF. ## Steps to reproduce - Create a new quotation template with a header document - Create a new quote using the quotation template: - Under the 'Quote Builder' tab, select the header document - On the quotation template, delete the header document - Come back to the quote - *(Optional: check the 'Quote Builder' tab - it should be empty)* - Print the PDF: - The header appears on the document opw-4712958 Forward-Port-Of: odoo/odoo#219089 Forward-Port-Of: odoo/odoo#213206
The website editor's gradient color picker now correctly reads gradients that use hexadecimal color values, preventing blank previews and errors when customizing button fill colors. This helps users reliably adjust website styling without interruptions.
Original PR description
Gradient picker's parsing can only cope with rgb(a) format for its colors. In some cases the gradient value is expressed with `#rrggbbaa` which is not recognized and leads to errors. This commit standardizes the gradient value before trying to parse it. Steps to reproduce: - Edit a website page - Select a button - Edit button - Change "Fill Color" - Go to "Gradient" tab - Click on "Custom" => Preview range rectangle is empty, and errors are thrown when trying to pick a color. task-4367641
This fix adds missing report name translations for local document types in Argentina, Chile, Ecuador, and Peru. It helps users in these countries see the correct localized names on reports and documents, reducing confusion in day-to-day accounting workflows.
Original PR description
opw-4659964 opw-4947238 opw-4953184 Forward-Port-Of: odoo/odoo#219889
The main task list in Project is no longer directly editable, restoring the behavior users had in version 18. This helps prevent accidental task changes or quick task creation from a view that is mainly used for reviewing work.
Original PR description
Before this commit, the list view of tasks were editable as it is the case for the list view of subtasks displayed in the task form view. However, in most of the case, the main list view of tasks are just used to see the tasks and not really quickly create tasks. This commit makes the main list view of tasks readonly to keep the behavior we had in version 18.
The website builder’s font family selector has been corrected so users can more clearly manage selected or inherited fonts. Reset and remove actions now use distinct, responsive buttons, reducing confusion when customizing website typography.
An automated website editor test was updated to match recent changes in the website builder's page structure. This helps keep quality checks reliable and reduces false test failures during development.
Original PR description
This commit adapts the test_admin_tour_rte_translator test, which was broken due to DOM structure changes in the new website builder. Enterprise PR: https://github.com/odoo/enterprise/pull/90764
This update prevents users from creating duplicate Italian electronic invoicing document type codes. It avoids invoice confirmation failures caused by duplicate document type records, improving reliability for Italian localization workflows.
Original PR description
**Issue** : The computation of `l10n_it_document_type` fails when multiple `l10n_it.document.type` records share the same code. This can happen if a user duplicates an existing Document Type or…
**Issue** : The computation of `l10n_it_document_type` fails when multiple `l10n_it.document.type` records share the same code. This can happen if a user duplicates an existing Document Type or creates a new one with the same code, causing `get()` on the grouped recordset to return multiple results.
**Traceback :**
```python
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/fields.py", line 3252, in convert_to_cache
raise ValueError("Wrong value for %s: %r" % (self, value))
ValueError: Wrong value for account.move.l10n_it_document_type: l10n_it.document.type(1, 23)
```
**Steps to Reproduce:**
1. Install the `l10n_it_edi_ndd` module.
2. Go to Customer Invoices and create a new invoice.
3. Set a Document Type, then confirm the invoice.
4. Open that Document Type and duplicate it.
5. Create another invoice without setting a Document Type, then confirm it.
observation: you will receive a traceback for wrong value error
**Solution :** This fix adds a check to ensure that the `code` field remains unique across all `l10n_it.document.type` records.
opw - 4902513
related upgrade pr : https://github.com/odoo/upgrade/pull/8032
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#218662
Forward-Port-Of: odoo/odoo#217155Resetting an invoice to draft no longer removes its existing payment reconciliation. This prevents invoices and bank statement lines from becoming unmatched and avoids extra manual reconciliation work, with related checks improved for cash-basis scenarios and access-rights consistency.
Original PR description
Since [^1], we allow reconciliation in draft. To allow that, a mechanism has been added to break the reconciliation when changing certain fields rather instead. However, resetting to draft was still…
Since [^1], we allow reconciliation in draft. To allow that, a mechanism has been added to break the reconciliation when changing certain fields rather instead. However, resetting to draft was still breaking the reconciliation, which is counter productive. Reproduce: * create an invoice * create a bank statement line with the same amount * reconcile both in the bank reco widget * reset the invoice to draft => The invoice is not marked as paid anymore, the statement line still has the amount on the receivable account, we need to reconcile manually both lines. This commit also fixes 2 related issues: * the test `test_caba_undo_reconciliation` was actually not generating a caba move. Now, it is checking that we unreconcile what we need, when we need, and that it was reconciled in the first place. * the function `_reconciled_by_number` was not using `sudo`, leading to lines potentially missing from the returned set. However, the logic using it needed to see the whole picture. Instead, we now do the search in `sudo`, while keeping the initial access rights for reading the field if necessary. task-4873072 [^1]: https://github.com/odoo/odoo/commit/404fbaeeeb16a65900c60f47967d6d79373c6213 Forward-Port-Of: odoo/odoo#214363
This update limits a behind-the-scenes cursor handling adjustment to icons placed in paragraph-like content areas. It prevents unwanted changes in other content blocks, such as alert snippets, helping the editor behave more predictably for users.
Original PR description
Description of the issue this PR addresses: Commit [1] added "\uFEFF" around icons to improve cursor movement. But it caused unintended side-effects in non-paragraph contexts (e.g., alert snippets). This commit confines the "\uFEFF" insertion to icons that are within a paragraph related element or a base container. [1]: https://github.com/odoo/odoo/commit/4c2e5925824b9bcb7bb4bcddf4aceb464c6551ff task-4942953 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Closing the link editing panel with the Escape key now properly saves link changes to the editor history. This prevents users from losing or unexpectedly reverting link edits when using undo or redo after closing the panel.
Original PR description
Closing the link tools with escape did not add a step in th history, and did not clean the change in the document. To be consistent with the click outside of th popover, pressing escape commit the changes to history. Steps to reproduce: - Select text - Click on "Add a link" - Type `#` (it create a link in the document) - Press escape to close the suggested links - Press escape to close the link tools - Bug: The link is still there, but no steps were added in the history: - undo or redo immediately: the modifications to the link are lost - edit then undo: the modifications to the link are undone as well task-4954131
Creating a user from an employee with an invalid work email no longer triggers a system error. This improves reliability for HR staff by handling invalid email data more safely during user creation.
Original PR description
A traceback occurs when the employee's work email is invalid and a user is created via the Create User action. Steps to reproduce the error: - Install ``hr`` module - Create a new employee > Add a name > Work Email: test > Save - Actions > Create User > Confirm Traceback: ``` NotNullViolation null value in column 'login' of relation 'res_users' violates not-null constraint ``` https://github.com/odoo/odoo/blob/af701b3e5bd9106c6ccea5b4a59b9e79424b3a26/addons/hr/models/hr_employee.py#L360-L370 When an employee's work email is invalid, ``tools.email_normalize(employee.work_email)`` returns ``False``. As a result, the ``login`` field becomes ``False``. So, Attempting to create a user with a ``False login`` value leads to the above traceback. sentry-6685198779 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214761
Users can now remove text from a selected table cell in the HTML editor by pressing Backspace. This fixes an editing issue that made table content harder to correct and improves reliability when working with tables.
Original PR description
**Current behavior before PR:** Steps to reproduce: - Add a 3x3 table - Type something any cell. - Select that cell using triple mouse click. - Press backspace, the text is not removed. This issue occurs because, in the `onMousedown` method, the cursor is positioned at the beginning of the cell content. To delete the cell’s text, the text must be selected. Since the cursor remains at the start of the text, pressing Backspace does not remove any content. **Desired behavior after PR:** Now, cell text is getting removed when pressing backspace. task-4941622 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Cashiers with minimal permissions in Point of Sale can no longer access the refund controls from the order list. This helps businesses enforce employee access limits and reduces the risk of accidental or unauthorized refunds.
Original PR description
Employee with minimal rights should not be able to refund a ticket an order. Steps to reproduce: ------------------- * Install pos_hr module * In the PoS settings set any employee as a cashier with minimal rights * Open a PoS session with that employee * Create a new order and validate it * Go to the order list screen * Select the order you just validated > Observation: The numpad is displayed and you can refund the order Why the fix: ------------ We hide the numpad for employees with minimal rights, so they cannot refund an order. We also moved the condition to the right module in pos_hr instead of point_of_sale. opw-4778508 Forward-Port-Of: odoo/odoo#217160
This update makes an automated website builder test more stable by waiting for the right process to finish instead of relying on timing assumptions. It helps reduce false test failures, supporting smoother validation and more reliable releases without changing user-facing behavior.
Original PR description
Commit [1] fixed the test "BuilderColorPicker with action “customizeWebsiteColor” is correctly displayed". This commit is a further effort to make it even more robust by waiting for a deferred promise instead of the exact number of ticks needed. [1]: https://github.com/odoo/odoo/commit/0b9b1a041a2a3bb218a5b518d7d397df7690b398 runbot-229604 runbot-229686
This fixes an issue where changing text size in website editor snippets could be ignored when another size style was already present. Users can now reliably apply the intended font size, making content editing more predictable.
Original PR description
Description of the issue this PR addresses: - Snippet templates include structure like `<h2 class="h3-fs">Some Text</h2>`. - When trying to change the font size of selected text inside such elements, the editor falsely detected the correct size and skipped applying the new one. Current behavior before PR: - The editor only checked if any known font size class was present on the closest block element. - As a result, users could not apply a new font size if a different font size class already existed. Desired behavior after PR is merged: - The editor now checks whether the exact font size class being applied is already present. - This ensures that applying a new font size works as expected, even when other font size classes are present on ancestor elements. task-4855154 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The time off warning label no longer appears when users message themselves or interact in AI chats. This avoids confusing users with their own absence notice in conversations where it is not useful.
Original PR description
This commit removes the holiday warning label from chats, when the correspondent is the user themselves. Basically when the user is sending a message to themselves, or with an AI chat, the holiday label (for their own holiday) will not be present in the chat. Task-4895064 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Changing the background color of a website shape no longer removes its background image. This keeps edited website sections visually intact and prevents users from unexpectedly losing their chosen shape styling.
Original PR description
To reproduce the issue: - Open Website and start editing; - Drop any block snippet and set a background's shape; - Change shape's background color (2nd colorpicker in the "Colors" option); => The shape is removed. It happens because the color plugin sets background-image property to "none", which shouldn't be the case. This commit follows the [html_builder refactoring]. Related to task-4367641 [html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb
Report layouts now handle long units of measure more gracefully by keeping quantities on one line while allowing long unit names to wrap. This prevents long unit labels from squeezing or cropping other report columns, improving readability on invoices, sales, delivery, and stock reports.
Original PR description
*: l10n_gcc_invoice,l10n_it_stock_ddt,sale,stock,web [1]: https://github.com/odoo/odoo/commit/344bdb1ed4cecdaef007200c011f87e58e36c87d Issue: [Commit](https://github.com/odoo/odoo/commit/344bdb1ed4cecdaef007200c011f87e58e36c87d) introduced a `text-nowrap` on the quantity column, this unnecessarily crops the other columns if we use a long UoM. This commit adds a max-width to the UoM column and applies the text-nowrap to the quantity only, letting the long UoM wrap if too long. task-4478718 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219129 Forward-Port-Of: odoo/odoo#194389
The partner invoicing tab now keeps the General section, including bank details, visible for basic invoicing users. Advanced accounting fields are hidden unless the full accountant app is installed, reducing confusion and showing users only the options relevant to their access.
Original PR description
In this PR: - Keep General section with bank field visible for basic invoicing users and hide account fields (receivable/payable/autopost) when only account or account_accountant is installed. - Show account fields only when full accountant module is installed . Task-4953707 Forward-Port-Of: odoo/odoo#219655
The HR Skills test data now uses a distinct name for the music certification skill type. This prevents automated tours from selecting the wrong skill type when demo data contains duplicate names, improving test reliability without changing normal user workflows.
Original PR description
Steps to reproduce: ------------------- - Install a database with demo data - launch the test test_ui in hr_skills - This test will failed because two hr_skill_type have the same name and the wrong one is chosen. Solution: --------- The skill type "Certification" is renamed to "Music certification" to avoid mis-selection. task-4908637 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue in the website builder where clicking a blog date kept it in display format instead of an editable format. Editors can now update and save blog dates correctly, avoiding failed saves or incorrect date handling.
Original PR description
The behaviour to format the date when clicking on a date field has been lost during initial website refactor. The code added in this commit is a translation of lines 564 to 580 from `addons/web_editor/static/src/js/wysiwyg/wysiwyg.js` Steps to reproduce: - On `/blog`, open website builder - Click on a date below a blog summary - Bug: the date stays in the presentation format, saving a date in this format does not work Website refactor: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
This update removes invisible leftover formatting when edited text is deleted, preventing unexpected spacing changes in website and HTML editor content. It also tidies an internal naming convention for formatting rules to make future maintenance clearer.
The Today filter in Timesheets and the Attendance report now correctly limits results to records from the current day. This prevents users from seeing unrelated entries when reviewing daily work or attendance data.
Original PR description
In this bug, the today filter in timesheet is not written correctly. To reproduce the bug: 1- Create a db with timehseet installed 2- In timesheet app, and add records with different dates 3- Add Today filter 4- The filtered records are not only from today 5- The bug is also reproducible in attendance report In the fix, the filters which are used both in timesheet and report, are fixed. opw-4936780 Forward-Port-Of: odoo/odoo#219692
Employees in Indian companies can now open their approved time off requests without encountering an access error. The fix prevents the system from trying to update sandwich leave details after a request has already been approved, preserving the expected approval restrictions.
Original PR description
**Steps to reproduce:** 1. Install l10n_in_hr_holidays and l10n_in 2. Switch to IN company 3. Create an employee related to Marc Demo in IN Company 4. Log in with Marc Demo and create a timeoff 5. Approve the timeoff by Mitchel admin 6. Open the form view of approved timeoff by Marc Demo **Issue:** - The _get_durations method in l10n_in_hr_holidays attempts to update the l10n_in_contains_sandwich_leaves field whenever it runs, including when opening the form view of an approved time off. This causes an access error, as updates are not allowed for Marc demo in the approved state. **Solution:** - Added a state check in the _get_durations method to prevent updating the field for approved records. opw-4741162 Forward-Port-Of: odoo/odoo#219816 Forward-Port-Of: odoo/odoo#209233
FacturX e-invoices now include the expected XML information for external validation tools and use the correct payment code for SEPA direct debit. This helps businesses avoid validation errors when sending compliant electronic invoices to customers or authorities.
Original PR description
### Issue: There are several issues with the XML of FacturX. ### Steps to reproduce: - Create a partner with a direct debit mandate - In the Accounting tab of the partner select "FacturX" as eInvoice…
### Issue: There are several issues with the XML of FacturX. ### Steps to reproduce: - Create a partner with a direct debit mandate - In the Accounting tab of the partner select "FacturX" as eInvoice format - Create an invoice with this partner, pay with SDD, confirm - Send to FacturX - Verify the PDF with https://www.portinvoice.com/ 1 Missing namespaces 3. In the XML the code for the payment means does not adapt to the payment method: 42 (Payment to bank account) and not 59 (SDD) ### Cause: 1. The namespaces are not there ([doc](https://fnfe-mpe.org/factur-x/factur-x_en/)). 3. We always input "42" as payment mean ### Solution: 1. Added namespaces `xmlns:qdt="urn:un:unece:uncefact:data:standard:QualifiedDataType:100"` and `xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"` 3. Added the code "59" for SDD, a lot of codes could be added but this commit only handles this one Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4907827) opw-4907827 Forward-Port-Of: odoo/odoo#219804 Forward-Port-Of: odoo/odoo#217763
Website editors can once again choose sizes for standard primary and secondary buttons without switching them to a custom style. This restores a previously available editing option and makes button formatting quicker and more convenient.
Original PR description
With the new builder, the option to choose the size of a button was removed for the buttons "primary" and "secondary", while it was an option available previously for them. The user had to set the button type to "custom" to change its size, which is not convenient. The commit reintroduces the size option for the regular buttons. task-4367641
This fixes a display issue where the picture-in-picture button icon was missing on public call pages. Users can now see the correct call control icon, making the public calling interface clearer and easier to use.
Original PR description
Before this commit, the picture in picture icon was not displayed on the public page. Call actions always add the `fa fa-fw` class. However, this action uses odoo icons. In the public page, the `fa` class is loaded after odoo icons, thus shadowing most of the `oi` class declarations. This commit ensures the correct lib prefix is used according to the action's icon. 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#219859
This fix prevents users from seeing access errors when editing activity dates in a multi-company setup. It ensures the mail module checks whether linked users are internal without relying on cached user lists that may include users from other companies.
Original PR description
To reproduce: ============= - Install project, voip - Create a second company - Switch Company - Open "Project / Tasks / All Tasks" - For the first task with activity and assigned to admin, edit the…
To reproduce: ============= - Install project, voip - Create a second company - Switch Company - Open "Project / Tasks / All Tasks" - For the first task with activity and assigned to admin, edit the activity and change the date Problem : ========= problem in this line : https://github.com/odoo/odoo/blob/saas-18.2/addons/mail/models/res_partner.py#L259 it's returning users from other companies due to cache pollution. In the ORM, the first time you access an X2many (partner.user_ids), we read it with the access rights of the current user (env.user), depending on the sudo flag (env.su), and put the result in the cache. This cached value remains valid until the end of the transaction. When you access partner.user_ids a second time with a different user and/or sudo=False, the cached value is used, which may return records that you cannot access with the current user. This is an ORM inconsistency that rd-framework-py want to fix, but it is not a small change. This issue has existed since v13.0 Solution : =========== browse partner.user_ids in sudo mode PR test link : =========== https://github.com/odoo/enterprise/pull/88999 opw-4778418 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212769
Project To-Do activity counts now use each user's own timezone when deciding whether tasks are future, due today, or overdue. This prevents mismatched activity counts between the notification menu and the detailed activity page for users in timezones different from the database server.
Original PR description
User timezone was not being used for activity states and thus the future, today, and late activities would be inaccurate. They were being computed with CURRENT_DATE through SQL which is based on the timezone that the SQL server is in. This would lead to there being a period of some hours based on the user timezone where the actual activities page that you click into and the systray showing different counts of activity states. For example, on our Odoo production database, activities that SF office members create on projects that were for tomorrow would show today after 5pm and when clicking on the today activities there would be nothing until midnight. Using the user timezone in order to compute what today is for them, then using this in the SQL query fixes this issue. This is the same behavior as the compute_state for the state field in mail.activity. opw-4893182 Forward-Port-Of: odoo/odoo#219769 Forward-Port-Of: odoo/odoo#218713
Internal links now behave correctly whether or not the Website app is installed. This prevents links from opening a 404 page or incorrectly sending users to the website homepage, improving navigation reliability in apps like To-do and Project.
Original PR description
reproduction 1: 1. create a db without website installed 2. In todo, create a link with internal link 3. click on the link, the redirection is 404 not found reproduction 2: 1. create a db installed…
reproduction 1: 1. create a db without website installed 2. In todo, create a link with internal link 3. click on the link, the redirection is 404 not found reproduction 2: 1. create a db installed website and project 2. In todo, create a link with internal link pointing to a project task 3. click the link, it always redirects to the website homepage ref pr: https://github.com/odoo-dev/odoo/pull/4465 Before this commit: With the reference PR, we introduced `navbar_link_popover` for the website menu. When the website is in editing mode, if the URL points to a page created by the website, the URL is opened in edit mode (e.g., the website edit button is unfolded). However, this functionality should only be available when the website module is installed. Additionally, the redirection condition need to be refined to apply only to website pages. After this commit: The navbar-related link code has been moved to the website module, and the link popover is patched with the `onClickForceEditMode` method. This ensures that the functionality is only applicable when the website module is installed. Note that, in link_plugin, only the added code related to menu item and nav_bar is moved, the more generalized code is kept as it extends the link plugin to support other use cases outside of html_editor. task-4879511 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an unstable automated test in the website editor related to opening offcanvas panels. It helps keep the release validation process reliable without changing customer-facing behavior.
Original PR description
By attempting to fix another indeterministic error, commit [c6d38a2d] introduced an indeterministic error in the test "Opening an offcancas should not add mutations to the history". Most of the times, the offcanvas element will have the class `.show`, but it can happen that it still has the class `.showing`. In the context of the test, we do not care which class it is, we only care that there is a class. Bootstrap manages its transitions with a `setTimeout` with a minimum delay of 5ms before removing the transitioning class (`showing`) and applying the final class (`show`). We need to wait for those in the test. [c6d38a2d]: https://github.com/odoo/odoo/commit/c6d38a2da7964baa016c05bd9e8adc0211261603 runbot-229958
The website editor no longer crashes when changing a Punchy Image snippet from grid to column layout. This keeps page editing smoother and prevents users from being blocked by a missing grid element error.
Original PR description
Steps to reproduce: - Drop a "Punchy Image" snippet - Click on the image - Select Layout > Column => The grid element cannot be found. The option component's state is updated later than the call to `isApplied`. We need to guarantee that the `"grid_mode"` option is active before displaying the option.
Button links edited in the HTML editor can now use gradient backgrounds as intended. This fixes a display issue where selected gradients were saved in the wrong place and therefore did not appear correctly in the browser.
Original PR description
The link popover of `html_editor` makes it possible to select a gradient color as button background color. Unfortunately, it stores it in the `background-color` property where it is not interpreted by the browser. This commit makes the gradient colors stored in the expected `background-image` property instead. task-4367641
Point of Sale customer displays now open more reliably even when the IoT Box cannot be reached directly. The system uses an alternate connection method when needed, preventing error screens and keeping checkout operations smoother.
Original PR description
We fixed the customer display not opening and displaying a traceback when the Iot Box was not reachable, by calling the action via iot_http, fallbacking on websocket when needed. We also removed the "customer display with IoT Box" logic from the PoS to the module pos_iot. Community PR: odoo/odoo#219917
The automated check for field service stock has been updated to match the current task list behavior. This helps keep quality checks reliable after the task list returned to a read-only view with form opening handled separately.
Original PR description
This commit adapts the `industry_fsm_stock_test_tour` tour according to the changes made in community. That is, now the main list view of tasks will now be readonly as before instead of editable with a open form view button.
Fixes an issue where moving linked tasks in the project Gantt view could fail when a related task was missing a start date or deadline. Project teams can now reschedule dependent tasks more reliably without interruption.
Original PR description
Currently, an error occurs when rescheduling a task's date from the Gantt view. **Steps to Reproduce:** - Install the `project_enterprise` module. - Go to `Settings` and enable `Task Dependencies`. -…
Currently, an error occurs when rescheduling a task's date from the Gantt view. **Steps to Reproduce:** - Install the `project_enterprise` module. - Go to `Settings` and enable `Task Dependencies`. - Go to `Projects`, create a `project`, and add `two tasks` (Task 1 and Task 2) under that project. - Open `Task 2` > `Blocked By`, click `Add a line`, and select `Task 1`. - Return to the `project's tasks`, switch to `Gantt View`, and choose `Auto-Reschedule (Keep Buffer)` as the rescheduling method. - `Double-click` on any date in the unassigned block, select `Task 1`, and `drag it to next date`. `TypeError: '>' not supported between instances of 'bool' and 'datetime.datetime'` This error occurs when rescheduling a task to a forward date, and a dependent task has no start date. When the parent task is rescheduled, the system attempts to reschedule the dependent task as well, but since it has no start date, an error occurs [1] due to condition at [3]. The same error occurs when rescheduling a task to a backward date, and a depends on task has no deadline date. When the child task is rescheduled, the system attempts to reschedule the parent task as well, but since it has no deadline date, an error occurs [2] due to condition at [3]. **Steps to Reproduce for backward rescheduling:** - Follow the first 5 steps from the forward rescheduling steps. - Remove the Deadline from Task 1, if it has. - Double-click on any date in the unassigned block, select Task 2, and drag it to previous date. This commit ensures that the incorrect condition is removed from [3]. Now, it checks whether the record is a candidate for moving, and both forward and backward rescheduling are handled safely. [1]- https://github.com/odoo/enterprise/blob/aaad26c28fd4bc1e94e99717076ecbcf74f5f357/project_enterprise/models/project_task.py#L1209 [2]- https://github.com/odoo/enterprise/blob/8cc8443dc11c176b55f7eb3efa07db5edb7e6b0c/project_enterprise/models/project_task.py#L1221 [3]- https://github.com/odoo/enterprise/blob/302f1a5e82ffbf383d37f003820fe780654fae2f/project_enterprise/models/project_task.py#L1203 sentry-6738017612
Bank statement reconciliation has been optimized to run much faster on large accounting databases, reducing the risk of slow imports or timeouts. This improves reliability for finance teams processing high volumes of bank statement lines, with benchmarks showing CSV import reconciliation completing about 3.5 times faster.
Original PR description
[FIX] account_accountant: refactor and optimize _try_auto_reconcile_statement_lines() In big databases, this method called on large recordsets of statement lines would take too much time, or worse:…
[FIX] account_accountant: refactor and optimize _try_auto_reconcile_statement_lines() In big databases, this method called on large recordsets of statement lines would take too much time, or worse: timeout. This is mainly because the 2 SQL queries are doing too complex searches and hence are badly optimized by the query planner. To solve that, * We search for reconciliable accounts outside the queries to avoid a join * We add a trigram index on statement_line.payment_ref and only use ILIKE operations for reference matching so that it can be used * Instead of using complex and costly regexp_split, we search for matches by splitting account_move_line.ref on ' - ' * We move some logic in python, amount matching, rather than in sql * We don't try anymore to match on amounts found in the payment_ref Additionnally, * The algorithm now treats the statement lines with and without partner the same for reference matching, but lines without partner are just ignored for the amount matching, as it's way too dangerous * Bug of with_prefetch, pre-loading the ids of a wrong object, has been fixed * We revert the patch https://github.com/odoo-dev/enterprise/commit/da52bc70cd745f3e9f7a0539528c84aa47b98cc5 because it was only a temporary measure while the time was back to acceptable * The test_matching_rules_with_empty_aml_ref, irrelevant, was removed Benchmark --------- Importing a csv file of 200 statement lines, on a database of 21M account.move.line, and thus triggering the culprit function, takes (hot timings): | Before | After | Speed-up | |--------|-------|----------| | 185 s | 52 s | ~3.5x | see https://github.com/odoo/odoo/pull/218642 Forward-Port-Of: odoo/enterprise#90077
The subscription product setup now shows the correct description when a goods product is invoiced based on delivered quantity. This helps users understand the option correctly and reduces confusion during product configuration.
Original PR description
To reproduce: ============== 1- go to subscription 2- go to product 3- select product type : goods and invoicing_policy : Delivered Quantity Problem: ========= wrong description. Solution: ========== update description. opw-4929735 Forward-Port-Of: odoo/enterprise#90143
The web editor setup was adjusted so automated website-building tests can consistently access the editor where needed. This helps prevent test failures and supports more reliable validation of Studio-related report editing flows.
Original PR description
This commit moves the patch of editor into html_editor to expose the editor instance globally for all the tours. Community PR: https://github.com/odoo/odoo/pull/212032
This update adjusts an automated check for SEPA direct debit so it remains reliable when payment reconciliation involves draft records. It helps ensure the direct debit workflow continues to be validated correctly without changing day-to-day user behavior.
Original PR description
See community commit for details. Forward-Port-Of: odoo/enterprise#87772
When creating a credit note from a Peruvian vendor bill, Odoo now shows the appropriate purchase journals instead of incorrectly limiting the list to sales journals. This helps accounting users select the right journal and avoids mistakes during vendor bill reversals.
Original PR description
**Issue** When creating a credit note for a vendor bill, the journal selection dropdown incorrectly shows only sales-type journals instead of purchase-type journals. **Steps to Reproduce** 1. Install the modules: Accounting, l10n_pe, and l10n_pe_edi. 2. Navigate to Accounting > Vendors > Vendor Bills. 3. Open a posted vendor bill and click Credit Note. 4. Open the journal dropdown. 5. Notice that only sales journals are shown. **Root Cause** The journal field's domain was hardcoded to type = 'sale' in the inherited view. This forces the dropdown to show only sales journals, even when reversing a vendor bill. **Fix** Removed the hardcoded domain from the XML view. This allows Odoo to apply its standard logic for journal filtering, which correctly selects purchase journals when reversing vendor bills. Opw-4913997 Forward-Port-Of: odoo/enterprise#90445
This fix restores the ability to import CSV bank statement files from the Accounting dashboard. Users can complete bank statement imports without encountering an error caused by missing import result information.
Original PR description
file.csv content: ```csv amount 1 2 ``` Steps: - Install `account_bank_statement_import_csv` - Open accounting/dashboard - Click on 3 dots on Bank - Import file - Choose file.csv (previously created) - Import - Traceback Since https://github.com/odoo/enterprise/pull/34249, a new class has been added to `ImportAction`: `BankStatementImportAction`. This class contains an override of the `exit` method that recalls `super.exit()` without including the potential arguments. This worked until recently, when https://github.com/odoo/odoo/pull/211187 finally included logic using this argument: `resIds` So now we received this domain which causes the crash ```js ["id", "in", undefined] ``` A solution would be to always call the super with arguments received. opw-4943902
Manufacturing orders created with Barcode now generate all expected stock transfers when three-step manufacturing is enabled, including component picking and finished product storage. This helps keep warehouse operations complete and consistent, and also ensures by-products are correctly linked to the manufacturing order.
Original PR description
Task: 4558792 If 3-step manufacturing is enabled, the creation of an MO should also create 2 stock transfers: "Pick Components" and "Store Finished Product". Currently, when an MO is created via Barcode, only SFP is created. The problem boils down to the newly created stock move not having a `warehouse_id` field set, which causes Odoo to miss the required stock rules. This PR fixes the issue by fetching the `warehouse_id` field in XML, from where it is later passed to JS and back to Python's `create` method. Additionally, by-product moves for MOs created via Barcode were not correctly associated with the MO. This issue was solved by passing the missing fields from XML to Python. Forward-Port-Of: odoo/enterprise#90451 Forward-Port-Of: odoo/enterprise#83895
This update adds missing internal test labels so automated checks run with the right settings. It helps keep helpdesk and subscription payment testing reliable without changing customer-facing features.
Original PR description
With the new test-tags features that allows to add additional test tags at runtime, the tests that starts a tour or that are using a query_count and that are not detected as such must be tagged respectively `is_tour` or `is_query_count`. Forward-Port-Of: odoo/enterprise#90463 Forward-Port-Of: odoo/enterprise#89934
The AI assistant now avoids sending the latest user question twice when preparing its response. This helps prevent confusion in AI replies and keeps conversations more accurate and efficient.
Original PR description
Prior to this commit, we send messages to the llm like the following:
```
[
{'content': Markup('<p>first question</p>'), 'role': 'user'},
{'content': Markup("<p>Sure, I'm here to help. What's your first question?</p>"), 'role': 'assistant'},
{'content': Markup('<p>second question</p>'), 'role': 'user'},
{'role': 'system', 'content': "You are a RAG assistant.\n\nToday's date to be used: 2025-07-18"},
{'role': 'user', 'content': 'second question'}
]
```
We're actually duplicating the user's prompt and this is because of the retrieval of the chat history. Before calling generate_response, we post the user's message. Therefore, he's message is already recorded in the db. We should then skip the most recent message to assemble the chat history since its just the same to the prompt.
Forward-Port-Of: odoo/enterprise#90502The Dutch reporting settings page now correctly shows the SBR certificate option. This prevents users from missing an important configuration needed for Dutch digital reporting.
Original PR description
Due to concurrent settings views, one of them wasn't displayed. Changed to be in one file, with different ids Forward-Port-Of: odoo/enterprise#90411
Fixed an issue in Point of Sale restaurant bookings where the appointment date filter could remain active after switching away from the kanban view. This prevents outdated filters from affecting other views and avoids duplicate date filters being created.
Original PR description
Steps to reproduce: - Open booking in a pos restaurant - Switch from kanban view to any other view - The filter on the date is not removed Issue: The onRemove method in the kanban_controller is never called. Fix: It is not possible to call the code an onWillUmount since onWillUmount is called after the onMount of the desired view. The deletion of the filter needs to be handled in the control_panel. Also each time createStartFilter was called, a new filter was added and never removed. In this commit if a filter already exists it is simply updated. Task-4916512 Forward-Port-Of: odoo/enterprise#89994
Users with Invoicing & Banks access can now see the relevant bank information fields on partner records. This fixes a visibility issue where the whole General section could be hidden unless the user had full accounting access, while keeping advanced accounting settings restricted.
Original PR description
In this PR: Changed General section groups from `account.group_account_user` to `account.group_account_basic `to ensure users with **Invoicing & Banks** access can see bank fields in partner form. This resolves the issue where the General section was completely hidden when only account_accountant was installed, while maintaining restriction of account configuration fields to full accounting users only. Task-4953707 Forward-Port-Of: odoo/enterprise#90593
Users with approved temporary lock date exceptions can now reset eligible tax closing entries without being blocked by the standard tax lock date. The change also respects stricter hard lock rules and parent company lock settings, reducing incorrect errors while preserving compliance controls.
Original PR description
Current behavior before commit: When resetting a closing entry from a tax-locked period, the system raises a lock date error, even if the user has a temporary lock date exception allowing them to…
Current behavior before commit: When resetting a closing entry from a tax-locked period, the system raises a lock date error, even if the user has a temporary lock date exception allowing them to bypass the restriction. Root Cause: The method only checks the company's permanent tax_lock_date, without considering temporary user-level exceptions. As a result, even if an exception is granted, the system still raises a lock error based on the permanent date. Additionally, the hard lock date (which overrides all other lock types and doesnt allow exceptions) and parent company lock date are ignored. Fix: Replaced the direct lock date check with _get_lock_date_violations(), which: - Correctly considers user-specific temporary lock date exceptions. - Returns violations based on effective lock rules (including hard lock). - Provides a more generic error message. Steps to reproduce: - Use a tax report with carryover values (e.g. Belgian VAT return, line 81). - Post a refund using a tax that maps to the carryover (e.g. 21% M). - Generate a closing entry. - Set the company’s tax_lock_date to a date covering the refund. - Grant a temporary lock date exception to the user, covering the same date. - Try to reset the closing entry → Lock date error is raised (incorrectly). opw-4715100 Forward-Port-Of: odoo/enterprise#87814 Forward-Port-Of: odoo/enterprise#85337
Referral refusal notifications are now sent only after the refusal is confirmed, preventing premature updates if HR closes the wizard. The notification is also attached to the correct referrer user records, avoiding unnecessary email processing slowdowns.
Original PR description
## [PERF] hr_referral: Send refusal notification to referrer's users Description ----------- Following https://github.com/odoo/enterprise/commit/764f9b6f513c90eb79935d9e8469989ea704b61b,…
## [PERF] hr_referral: Send refusal notification to referrer's users Description ----------- Following https://github.com/odoo/enterprise/commit/764f9b6f513c90eb79935d9e8469989ea704b61b, `_send_notification` will not attach the message on the `hr.applicant` itself, so a `model` was provided. But due to a missing `res_id`, `message_notify` will set both `model` & `res_id` to `False` since both are not specified. This leads to the creation of a `mail.message` with no `res_id` and no `model` (as `self` is an empty `mail.thread` recordset). This leads to a performance regression when mail references need to be computed to attach to the notification in `_notify_by_email_get_base_mail_values`, due to the missing `model` and `res_id` of the message. This commit attaches the notification to the referrer's users instead, providing its `model` and `res_id`. Reference --------- opw-4943488 --- ## [FIX] hr_referral: Do not send notif when opening the refuse wizard Description ----------- Currently, when opening the refusal wizard for an applicant, a call to `archive_applicant` is made. However, there is an override of it in `hr_referral` to send a notification for the applicant's refusal, and closing the `referral_state`, even though the applicant may have not been provided a reason for refusal, and the HR can simply close the wizard instead of confirming it. This commit removes the override of `archive_applicant` and moves its logic into `action_refuse_reason_apply` which is called when the wizard is confirmed. Reference --------- opw-4943488 Forward-Port-Of: odoo/enterprise#90563 Forward-Port-Of: odoo/enterprise#90309
This fix prevents an error when saving a Helpdesk ticket after all tags have been removed. It ensures teams using tag-based automatic assignment can update tickets normally, avoiding a disruptive save failure for support staff.
Original PR description
Currently, an error occurs when the user tries to save the ticket after removing the tag. Steps to produce: --- - Install `Helpdesk` module. - Create the `Helpdesk team` with `Automatic Assignment` as `Dispatch tickets based on tags` - `All Ticket` > Create a new ticket and set the Helpdesk Team as the newly created team and set any tag, and click save - Remove the tag and save Traceback: --- `IndexError: list index out of range` At [1], the error occurs because `added_tags` is empty, which causes `vals_list` to be empty. As a result, attempting to unpack it using `zip(*vals_list)` leads to an IndexError. [1]: https://github.com/odoo/enterprise/blob/6763c997bce8c5a42fd7c2b99d36ae8af5d8d238/helpdesk/models/helpdesk_ticket.py#L689 sentry-6754498068 Forward-Port-Of: odoo/enterprise#90526
A subscription payment test was adjusted to use a simpler invoice creation path, avoiding assumptions about how recurring invoices are generated. This reduces false test failures for custom subscription setups while keeping the business behavior being checked unchanged.
Original PR description
The commit 0d1b3dd03629c8e0499f537056c5ccd45cf094cd introduces a new test `test_subscription_invoice_after_second_period_payment` that uses `_create_recurring_invoice` to create a first invoice. However, overriding modules might consider that recurring invoices should only create invoices for subscriptions that have a payment token (as we do in our internal codebase). Since this test wants to check that the second invoice won't include the non-recurring lines, and not how the `_create_recurring_invoice` method behaves, it can use more basic calls to create this invoice. Forward-Port-Of: odoo/enterprise#90635
Fixed an issue where opening the On Hand stock information from a product linked to an approval could show an error instead of inventory details. This ensures users can reliably review available quantities while working through approval requests.
Original PR description
<b>Steps to reproduce:</b> 1. Install the `approval`,`stock` module. 2. settings Inventory> Warehouse > check storage Loaction 3. Go to approval > Manager> All Approvals 4. Select an Approval > add…
<b>Steps to reproduce:</b> 1. Install the `approval`,`stock` module. 2. settings Inventory> Warehouse > check storage Loaction 3. Go to approval > Manager> All Approvals 4. Select an Approval > add storable product with on hand quantity > 0. 5. Go through the product > stat button On Hand <b>Issue:</b> - A traceback for unknown name field occurs when opening the On hand (stock.quant list view) <b>Cause:</b> - The context `search_view_ref` is passed from the `approval_product_line_view_tree` via the `product_id` field, which interferes with the Quant list view rendering. As a result, the On Hand button fails to display the expected stock information. <b>Solution:</b> - Removed `search_view_ref` from the `product_id` field context in the approval product line tree view. This prevents the context from unintentionally affecting unrelated views i.e. stock.quant list, ensuring On Hand smart button works as expected. <b>opw-4916178</b> Forward-Port-Of: odoo/enterprise#89973
This fix prevents access errors when users update activities linked to mail and VoIP workflows. It helps ensure activity management works reliably for authorized users without unnecessary interruptions.
Original PR description
this is the test for this fix : https://github.com/odoo/odoo/pull/212769 opw-4778418 Forward-Port-Of: odoo/enterprise#88999
Fixes how Mexican electronic invoices report cuota taxes, such as fuel-related charges, so amounts are based on quantity and the configured rate. This helps ensure invoices match tax authority expectations and reduces reporting errors; related tests were also reorganized to make future validation easier.
Original PR description
**[FIX] l10n_mx_edi: Fix wrong management of Cuota taxes** Cuota taxes are wrongly reported. For example, a GAZ cuota tax expressed as 4.6555 per quantity has to be reported as TasaOCuota=4.6555 Base=quantity Importe=TasaOCuota * Base Currently, it's reported as: TasaOCuota=abs(tax_amount_currency/base_amount_currency) Base=base_amount_currency Importe is recomputed as TasaOCuota * Base instead of tax_amount_currency task-id: 4761658 **[IMP] l10n_mx_edi: Make test suite a bit less messy** Having a single test testing all taxes combination, testing 100% discount on it + IEPS breakdown and global invoice makes the whole thing difficult to debug. Also, it forces the generation of files that are not always relevant. Forward-Port-Of: odoo/enterprise#89658 Forward-Port-Of: odoo/enterprise#88357
This update prevents errors that could block users from connecting or setting up bank accounts in online synchronization. It restores the expected connection flow so businesses can continue linking bank accounts for automated banking features.
Original PR description
After [this PR](https://github.com/odoo/enterprise/pull/81894) was merged, we are encountering below errors. **Issue 1:** An error occurs when attempting to connect a new bank account. **Step to…
After [this PR](https://github.com/odoo/enterprise/pull/81894) was merged, we are encountering below errors. **Issue 1:** An error occurs when attempting to connect a new bank account. **Step to produce:** - Install the `account_online_synchronization` module and open `invoicing`. - Go to: `Configuration > Banks > Add a Bank Account`. - `Add new bank > Enter Details > Connect`. **Error:** `TypeError: AccountOnlineLink.create_new_bank_account_action() takes 2 positional arguments but 3 were given` **Root cause:** It appears that removal of `@api.model` was missed in [this PR](https://github.com/odoo/enterprise/pull/89932) during the forward-port process, leading to this error. **Fix:** This commit removes `@api.model` so that the method behaves like a recordset method, as done in [this PR](https://github.com/odoo/enterprise/pull/81894). **Issue 2:** An error occurs when attempting to Setup Bank. At [1], when an exception occurs, the method returns an empty list, and this displays the `Setup Bank` button. Upon clicking the button, an error occurs. [1] https://github.com/odoo/enterprise/blob/443d7d303ecb3bfcba6ac865cf0185b5070b6b9d/account_online_synchronization/models/account_journal.py#L88-L97 **Error:** `ValueError: Expected singleton: account.online.link()` **Root Cause:** At [2], the JS method `fallbackConnectBank` was passing only one positional argument instead of two. However, the corresponding Python method at [3] requires two positional arguments. [2] https://github.com/odoo/enterprise/blob/443d7d303ecb3bfcba6ac865cf0185b5070b6b9d/account_online_synchronization/static/src/components/bank_configure/bank_configure.js#L67-L71 [3] https://github.com/odoo/enterprise/blob/443d7d303ecb3bfcba6ac865cf0185b5070b6b9d/account_online_synchronization/models/account_online.py#L418 This commit updates the JS method `fallbackConnectBank` to pass two positional arguments as required by the python method at [3]. sentry–6745764054,6388425767 Forward-Port-Of: odoo/enterprise#90225
The asset setup now updates only accounts that already exist when adding asset models. This prevents accidental creation of blank account records, keeping accounting data cleaner and avoiding setup issues.
Original PR description
In the post init hook for account_asset we are updating the chart accounts to add the asset models, and then we load those assets. The update should only be performed on accounts that already exist, otherwise the load will create empty account records with all values null except the assets, which is not the intention here. This fix filters the update to existing accounts only, and filters the asset that use those accounts. [ci error](https://runbot.odoo.com/odoo/runbot.build.error/229788) Forward-Port-Of: odoo/enterprise#89862