Daily updates from Odoo
Tuesday, February 3, 2026
194 changes
32 changes
Resolved issues and error corrections
The portal payment screen now displays a warning message when no payment providers are available, preventing the screen from scrolling to the bottom when the 'Pay' button is clicked. This ensures a better user experience and clearly communicates to customers that payment options are unavailable.
Original PR description
The portal payment screen incorrectly scrolls to the bottom when the Pay button is clicked, but no payment methods or warning message are shown. This happens when no payment provider is published. This PR fixes the issue by ensuring the "no provider" warning message appears in all cases. task-5388313 Forward-Port-Of: odoo/enterprise#101632
This update ensures that dates sent to ECPay (a payment gateway) are correctly formatted in Taiwan's time zone. Previously, dates were stored in UTC, leading to errors when ECPay searched for invoices. This fix prevents invoice retrieval failures and ensures accurate processing.
Original PR description
sending to ECPay The date store in Odoo is in utc format, we need to convert it to tw time when sending the date to ECPay. The APIs are using the date to search for the invoices, if the date is not correct, it cannot find the invoices and return error. task-5884616 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#246504 Forward-Port-Of: odoo/odoo#246039
This update resolves an issue preventing the burndown chart from loading correctly in sample mode. The change ensures the necessary context is set for the chart's data retrieval, addressing a 'TypeError' error. This improvement ensures the burndown chart functions as expected across all Odoo environments.
Original PR description
The burndown chart embedded actions use action_id which bypasses the
Python method that sets required context (stage_name_and_sequence_per_id).
Without this context, the JS model makes RPC calls that fail in sample
mode when no project record is selected.
This change replaces action_id with python_method, following the same
pattern used by hr_timesheet for similar embedded actions.
Steps to reproduce:
1. Open Project app
2. Access burndown chart via embedded action without records
3. Sample mode triggers the crash
Current behavior: TypeError reading undefined field type
Expected behavior: Burndown chart loads with proper context
task-5347524
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-prThis update fixes a visual inconsistency in the live chat info panel. Previously, the 'Open Tickets' and 'Open Leads' section titles had a different font size than other sections. This change ensures a uniform and professional appearance for the live chat interface, improving the overall user experience.
Original PR description
**Description of the issue this PR addresses:** ------------------------------------------------ In the live chat info side panel, the "Open Tickets" and "Open Leads" section titles were displayed with a different font size compared to the other section titles. This created an inconsistent visual appearance in the info side panel. **Current behavior before PR:** --------------------------------- - "Open Tickets" and "Open Leads" titles use a different font size **Desired behavior after PR is merged:** ----------------------------------------- - "Open Tickets" and "Open Leads" titles use the same font size as other sections - Info side panel displays a consistent and uniform style **Task:** [5385392](https://www.odoo.com/odoo/project/1519/tasks/5385392) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244699
This update ensures Odoo correctly processes refund notifications from QFPay. QFPay recently changed the notification type for refunds, and this fix adjusts Odoo's system to recognize and handle these 'refund' notifications accurately. This ensures that refunds are processed correctly and reported accurately within Odoo.
Original PR description
QFPay changed the notify_type for refund notifications from "cancel" to "refund". https://sdk.qfapi.com/docs/common-api/async-notifications/ --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245834
This update resolves a crash that occurred when users selected taxes within Journal Entry items in the mobile view. The fix replaces a problematic widget with a standard one, ensuring tax changes are saved correctly and preventing the web client from freezing. This improves stability for mobile users.
Original PR description
**Steps to reproduce:** * Install the **Accounting** module. * Open a **Journal Entry** in mobile view. * Add a **Journal Item**, opening it in a form dialog. * Select a tax in the **Taxes Applied**…
**Steps to reproduce:** * Install the **Accounting** module. * Open a **Journal Entry** in mobile view. * Add a **Journal Item**, opening it in a form dialog. * Select a tax in the **Taxes Applied** field. * Click on the **Save and close** button. **Observed behavior:** * The web client crashes with `TypeError: Cannot read properties of undefined (reading 'resId')`. **Cause:** * The `autosave_many2many_tags` widget triggers `model.root.save()` immediately when a tag is selected. * When executing this save from within a transient dialog (common in mobile views), the client fails to correctly handle the record reload/synchronization leading to a crash when accessing `resId`. **Fix:** * Replace the autosave widget with the standard `many2many_tags` widget for **Journal Items** for form. * Tax changes are now kept locally in the dialog and saved only when the user explicitly saves and closes it. **Note:** * The crash happens when `autosave_many2many_tags` calls `model.root.save()` on a **new** `account.move` from within a dialog. * In QUnit tests, the mock server (`mockWebSave`) [1](https://github.com/odoo/odoo/blob/ca4d74c2a5d749ff8d41cd2fff80a73ba550a843/addons/web/static/tests/helpers/mock_server.js#L627). which creates records [2.](https://github.com/odoo/odoo/blob/ca4d74c2a5d749ff8d41cd2fff80a73ba550a843/addons/web/static/tests/helpers/mock_server.js#L1936) in-memory and does not trigger form reloads or component destruction. * As a result, the crash cannot be reproduced in tests. opw-5497342 Forward-Port-Of: odoo/odoo#246699 Forward-Port-Of: odoo/odoo#246084
This update resolves a warning that occurred when updating the Chart of Accounts in the l10n_ie module. The issue stemmed from updating the Chart of Accounts too late – after the main Odoo modules had loaded. Moving the update to an ‘end-script’ ensures it happens when all modules are ready, preventing the warning and maintaining system stability.
Original PR description
We faced a warning because this update doing a try_loading is called in `post-` scripts (after the module is loaded) and not in `end-` scripts (when all modules are loaded). All l10n_* modules were changed in this PR: https://github.com/odoo/odoo/pull/183359 Regarding the changes in this PR related to Registry: https://github.com/odoo/odoo/pull/186467 see: https://github.com/odoo/odoo/pull/222186 upg-3828301 **Reference Image** <img width="1769" height="39" alt="2026-01-28_18-44" src="https://github.com/user-attachments/assets/8aa5f213-b150-403b-b2a1-0bc9ed4a4ccc" /> 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#246541
This update resolves an issue where customer invoices sent via Peppol were generating duplicate attachments, leading to a cluttered user experience. The fix ensures that attachments are updated instead of created anew, preventing this duplication and streamlining the invoicing process. This improves the clarity and efficiency of invoice delivery.
Original PR description
When sending a customer invoice via Peppol, the system creates duplicate attachments (4 instead of 2 expected), cluttering the chatter and the attachment sidebar. This commit: - Implements a search-and-update logic for attachments to ensure idempotency (updates existing instead of creating duplicates). task-5438951 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#246345 Forward-Port-Of: odoo/odoo#241130
This update resolves an issue that prevented invoices with specific attachments from being correctly imported into Odoo. The problem stemmed from a double decoding of base64-encoded data, causing an error. This fix ensures invoices with attachments are now imported successfully, improving the reliability of invoice processing.
Original PR description
When importing invoices, some text files encoded in `<Attachments>` cause a traceback and prevent the XML from importing. This error appears to be the direct result of decoding the text files twice, introduced in PR #212726. Steps to reproduce: 1. Install `l10n_it_edi`. 2. Create a customer invoice for Biscotti Oslengi, then send the xml to the SDI. Download the XML file. 3. In a text editor, replace the base64-encoded PDF information inside `<Attachments>` with `VGhpcyBpcyBhIHRlc3Qgc3RyaW5nLg0K`. This is the base64 encoded string `"This is a test string.\r\n"`. 4. Change the `<FormatoAttachment>` from `PDF` to `TXT`. 5. Upload the edited invoice file to Accounting > Customers > Invoices. 6. The exception `Invalid base64-encoded string` is raised. [opw-5388360](https://www.odoo.com/odoo/unassigned-tasks/5388360) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246220
This update fixes an issue where the total quantity and value were incorrectly calculated in the Avco report when the report was displayed in multiple pages. The fix prevents errors when processing records not visible on the current page, ensuring accurate reporting of inventory values. This improves the reliability of the Avco audit report.
Original PR description
**Problem:** when there is multiple pages for the avco reports the total value and quantity are not correctly computed **Steps to reproduce:** - create an avco storable product with a cost of 10 -…
**Problem:** when there is multiple pages for the avco reports the total value and quantity are not correctly computed **Steps to reproduce:** - create an avco storable product with a cost of 10 - create and validate 3 in moves for a quantiy of 1 each - navigate to Inventory/ Stock and search your product - click on the unit cost - (see how the total quantity is 3 and total value is 30) - change the view to display only the first 2 records (write 1-2/4 on the top write) **Current behavior:** the total quantity is now 2 and total value 20 **Expected behavior:** it should still be 3 and 30 **Cause of the issue:** inside _compute_cumulative_fields, we start with a total_value and total_quantity of 0, then those variables are increased or decreased by each record in records https://github.com/odoo/odoo/blob/89cc95266fa0d9a0fd4caae9abe1effbfea1a41a/addons/stock_account/report/stock_avco_audit_report.py#L94-L104 but records is computed based on self which contains the lines displayed on the view https://github.com/odoo/odoo/blob/89cc95266fa0d9a0fd4caae9abe1effbfea1a41a/addons/stock_account/report/stock_avco_audit_report.py#L91 **fix** I need to add an if statement to avoid writing on the records not displayed on the view because this causes an access_error opw-5421925 Forward-Port-Of: odoo/odoo#244070
This update resolves an issue where auto-batching wasn't triggered for deliveries with partially assigned moves. The fix ensures that a batch transfer is created automatically when a delivery is ready, regardless of the initial stock levels, improving inventory management efficiency. This change corrects a bug impacting delivery processing.
Original PR description
### Steps to reproduce: - In the settings enable: Batch, Wave & Cluster transfers - Inventory > Configuration > > Warehouse Management > Operation types - Enable Auto-batches, Batch grouping by…
### Steps to reproduce: - In the settings enable: Batch, Wave & Cluster transfers - Inventory > Configuration > > Warehouse Management > Operation types - Enable Auto-batches, Batch grouping by partner on Delivery orders - Create and confirm a delivery for 2 units of a storable product that you do not have in stock. - Change the quantity of the move to 1 unit #### > The delivery is not auto-batched ### Expected behavior: As the delivery becomes ready a batch transfer containing your delivery should be created. This is by the way what happens if you had at least 1 unit in stock when you confirm the deliver. ### Cause of the issue: The auto-batching is suppose to be applied on assigned pickings via the `_find_auto_batch` method: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/stock_picking_batch/models/stock_picking.py#L194-L198 That being said a picking is only batchable if it is Ready hence his state is 'assigned'. Now, the issue is that the `_find_auto_batch` is only callable in two places in our workflow: First at confirmation: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/stock_picking_batch/models/stock_picking.py#L138-L142 Which will fail in our case but wokrs in the use case where you have at least one unit in stock since the delivery is respectively not "assigned" or "assigned" at this point. And, else, wehn the sate of a move of the delivery is assigned: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/stock_picking_batch/models/stock_move.py#L30-L38 Now, the only issue with this call is that the picking becomes assigned if a move is partially assigned: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/stock/models/stock_picking.py#L841-L845 But since the move is not "assigned" but only "partially_vailable" this will not trigger a call of the `_find_auto_batch`. opw-5441718 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246164 Forward-Port-Of: odoo/odoo#245542
This update resolves a technical issue causing live chat tabs to occasionally freeze or consume excessive CPU resources. The fix prevents conflicting updates to local storage, ensuring a smoother and more reliable chat experience for users. It addresses a race condition related to how live chat data was being synchronized across tabs.
Original PR description
A bad pattern has been used for some time in discuss for fields stored in localStorage. The field updates via the `onUpdate` function in the current tab and writes to localStorage. Other tabs use the `storage` event to update their field. This pattern can cause race conditions, leading to loops, high CPU usage, and freezes. When a tab receives a storage event, it may write back an outdated value, triggering further writes and conflicts across tabs. Storage events should be treated as read-only. Only user actions should update the local storage. This commit fixes the problematic fields. 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#246588 Forward-Port-Of: odoo/odoo#245717
This update resolves a problem with a test related to image saving on the website. Previously, the test was unreliable because the image modification process wasn't consistently triggered. The fix ensures the test runs predictably by waiting for the necessary image update to complete, improving the stability of our website tests.
Original PR description
The purpose of this commit is to fix the non-deterministic test “Save image with correct parameter.” There is no guarantee that ‘modify_image’ will be executed during the next animationFrame. Solution: Use “expect.waitForSteps” to wait for “modify_image” to be executed. error-238377 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#246788
A recent test for adding cover images to the website was occasionally failing. This was caused by delays in loading images through a system process, which exceeded a pre-set time limit. This update ensures the test consistently passes by waiting for the image loading process to complete, improving website image functionality.
Original PR description
The test "Add image as cover" was failing intermittently due to image loading depending on an RPC with an unpredictable duration. This could exceed the 200ms timeout used in waitFor. Use `waitSidebarUpdated`` to wait for the ongoing action to finish and ensure the sidebar is fully updated. error-Add image as cover 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#246553 Forward-Port-Of: odoo/odoo#246470
This update resolves a technical problem in Odoo's API documentation that prevented accurate representation of list type annotations in Python 3.10. The change ensures that list type definitions are correctly formatted for documentation, improving the clarity and reliability of the API reference.
Original PR description
In python 3.10, `parse_signature` causes some issues with some of the newer type annotations (eg: `list[int]`). This broke several test cases in api_doc where signatures were stringified except when converted from `Self`, `models.BaseModel` and `models.Model`. This commit forces those type aliases to be replaced by the string `'list[int]'`. runbot-237792 Forward-Port-Of: odoo/odoo#246563
This update resolves a visual bug in Firefox where the separator line below list headers would disappear at certain zoom levels when sticky headers were enabled. The fix ensures the list header border remains visible, improving the user experience and consistency across browsers.
Original PR description
In Firefox, the separator below the list header could disappear at certain zoom levels when using sticky headers. After this commit, the list header border will not disappear. Task-5249221 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245405
This update resolves a testing issue by streamlining the dependencies for the hr_payroll_account_iso20022 module. It now relies solely on hr_payroll and account_iso20022, eliminating errors caused by an outdated dependency requirement. This ensures smoother testing and consistent functionality.
Original PR description
hr_payroll_account_iso20022 did not depend on hr_payroll_account but only on hr_payroll and account_iso20022. This was causing some errors in tests that were expecting hr_payroll_account to be installed. Runbot Error: 237797
This update resolves issues with the generation of XML invoices for HR EDI, specifically correcting an incorrect XML structure and improving error handling during payment reporting. These changes ensure accurate invoice processing and a more reliable user experience for users of the HR EDI module.
Original PR description
- Adjusting the hrextac xmlns to the updated one - Adjusting MER payment report button to not show incorrectly - Improving error handling for MER payment reporting task-none --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246654 Forward-Port-Of: odoo/odoo#246083
This update fixes a technical issue that was causing intermittent errors during the website tour setup. The fix ensures the system correctly waits for the main loading screen to disappear, preventing a confusing warning message and improving the overall tour experience for users. This resolves a stability problem.
Original PR description
`insertSnippet` has a step to wait for `o_loading_screen` to disappear, but it is querying the iframe inside the dialog instead of the main iframe. This issue causes the following undeterministic warning error: ``` should not have any "characterData", "remove" or "add" mutations in current step when you update the selection ``` Ensure we are waiting for the loading screen of the correct iframe. runbot-229803 Backport-Of: https://github.com/odoo/odoo/pull/246750 Forward-Port-Of: odoo/odoo#246819
This update resolves an issue that caused a display error when creating and previewing subscription quotations/orders. Specifically, the system was encountering a problem when accessing price information for subsections. This fix ensures a smoother and more reliable preview experience for users.
Original PR description
Steps to reproduce: ------------------- 1. Install sale_management with demo data 2. Create a new quotation/order and add a section and a subsection 3. Drag the subsection line above the section line…
Steps to reproduce:
-------------------
1. Install sale_management with demo data
2. Create a new quotation/order and add a section and a subsection
3. Drag the subsection line above the section line
4. Confirm it and click on Preview
Issue:
------
```python
Traceback (most recent call last):
The error occurred while rendering the template sale_subscription.subscription_portal_content and evaluating the following expression: <t t-set="collapse_prices" t-value="current_section.collapse_prices or line.collapse_prices"/>
Error while rendering the template:
AttributeError: 'NoneType' object has no attribute 'collapse_prices'
Template: sale_subscription.subscription_portal_content
Reference: 1713
Path: /t/div[4]/section[1]/div[1]/table/tbody/t[4]/t[11]/t[3]
Element: <t t-set="collapse_prices" t-value="current_section.collapse_prices or line.collapse_prices"/>
From: (1712, '/t/t', '<t t-call="portal.portal_layout"/>')
(1712, '/t/t/body/div[1]/div/div[2]/div[11]/div/t', '<t t-call="#{sale_order._get_name_portal_content_view()}"/>')
(1713, '/t/div[4]/section[1]/div[1]/table/tbody/t[4]/t[11]/t[3]', '<t t-set="collapse_prices" t-value="current_section.collapse_prices or line.collapse_prices"/>')
```
Cause:
------
Since current_section is None in this case, it leads to the
above traceback when trying to fetch the collapse_prices value.
Solution:
---------
Convert subsection lines without a parent_id into section lines
to prevent the traceback.
Related enterprise PR: https://github.com/odoo/enterprise/pull/103686
opw-5367739
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#241634This update resolves a technical issue that prevented the subscription preview from displaying correctly for certain subscription types. The problem stemmed from how recurring products were being handled within the subscription setup, specifically related to section and subsection pricing. This fix ensures the preview renders accurately, improving the user experience.
Original PR description
Steps to reproduce: ------------------- 1. Install sale_subscription with demo data. 2. Create a new subscription and add a Section and a Subsection. 3. Add a recurring product (Invoice_policy =…
Steps to reproduce:
-------------------
1. Install sale_subscription with demo data.
2. Create a new subscription and add a Section and a Subsection.
3. Add a recurring product (Invoice_policy = 'order') and configure a recurring plan.
4. Confirm the subscription and click Preview.
Issue:
------
```python
Traceback (most recent call last):
The error occurred while rendering the template sale_subscription.subscription_portal_content and evaluating the following expression: <t t-set="collapse_prices" t-value="current_section.collapse_prices or line.collapse_prices"/>
Error while rendering the template:
AttributeError: 'NoneType' object has no attribute 'collapse_prices'
Template: sale_subscription.subscription_portal_content
Reference: 1713
Path: /t/div[4]/section[1]/div[1]/table/tbody/t[4]/t[11]/t[3]
Element: <t t-set="collapse_prices" t-value="current_section.collapse_prices or line.collapse_prices"/>
From: (1712, '/t/t', '<t t-call="portal.portal_layout"/>')
(1712, '/t/t/body/div[1]/div/div[2]/div[11]/div/t', '<t t-call="#{sale_order._get_name_portal_content_view()}"/>')
(1713, '/t/div[4]/section[1]/div[1]/table/tbody/t[4]/t[11]/t[3]', '<t t-set="collapse_prices" t-value="current_section.collapse_prices or line.collapse_prices"/>')
```
Cause:
------
`_get_invoiceable_lines` does not treat subsection lines as children of their parent section.
As a result, `lines_to_report` contains a subsection without its corresponding section,
leaving current_section set to None and causing the traceback when accessing current_section.collapse_prices.
Solution:
---------
Ensure subsection lines are appended together with their parent section
when an invoiceable line is encountered
Related community PR: https://github.com/odoo/odoo/pull/241634
opw-5367739
Forward-Port-Of: odoo/enterprise#103686This update fixes an issue where certain Odoo records wouldn't open correctly in their default form view. The change ensures that records can be opened with other views enabled, providing a smoother and more flexible user experience. This resolves a technical glitch that was impacting how records are accessed.
Original PR description
Records of some models may not want to be shown in their form view by default. See related ENT PR for documents. We re-export to avoid patching order issues. In particular, this makes sure that if we are in the webclient, the chat window is opened before executing the "real" open. Task-5386466 Forward-Port-Of: odoo/odoo#246525 Forward-Port-Of: odoo/odoo#244289
This update refines how the HTML editor handles selections, particularly within nested editing contexts. The change resolves issues where nested edits could corrupt cursor states, ensuring consistent and reliable selection management across the editor. This improves the overall stability and usability of the HTML editor.
Original PR description
Summary: Refactor `preserveSelection()` to use a stack-based approach (`preservedCursors` array) instead of a single cursor reference. This allows nested calls to `preserveSelection()` to operate…
Summary:
Refactor `preserveSelection()` to use a stack-based approach (`preservedCursors` array) instead of a single cursor reference. This allows nested calls to `preserveSelection()` to operate independently while keeping cursor updates synchronized across active contexts.
Problem:
Using a single stored cursor caused issues in nested calls to `preserveSelection()`:
1. **State overwrite:** Inner calls could overwrite or clear the outer cursor.
2. **Stale references:** If an inner function replaced a DOM node, the outer cursor could still point to a removed node and fail on restore.
Solution:
Use an array of cursor subscribers
- **Shared updates:** When calling `remapNode` on a cursor, it iterates over all active subscribers in the stack. This ensures node replacements performed in inner contexts also update outer cursor references.
- **Scoped cleanup:** `restore()` now removes only the corresponding cursor instance from the stack, ensuring proper lifecycle management.
Example:
The key improvement is that outer scopes receive updates performed by inner scopes.
```javascript
// Function A (outer)
function wrapperFunction() {
const cursor = this.preserveSelection();
replaceTextWithSpan();
cursor.restore();
}
// Function B (inner)
function replaceTextWithSpan() {
const innerCursor = this.preserveSelection();
const oldNode = document.querySelector('text');
const newNode = document.createElement('span');
oldNode.replaceWith(newNode);
innerCursor.remapNode(oldNode, newNode);
innerCursor.restore();
}
```
opw-5386862
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#244758
Forward-Port-Of: odoo/odoo#238989This update resolves an issue where the background color of nested columns within tabs was being incorrectly overridden. The fix ensures that tab styling applies correctly, regardless of the column structure used within the tab panes. This improves the visual consistency of the Odoo interface.
Original PR description
Steps to reproduce: =================== 1- Drop the block tab snippet 2- Inside one of the tab panes, drop a Columns snippet. 3- Select background_color for one of the columns 4- Change tab style to…
Steps to reproduce: =================== 1- Drop the block tab snippet 2- Inside one of the tab panes, drop a Columns snippet. 3- Select background_color for one of the columns 4- Change tab style to tab -> The background color of the inner column is overridden. Cause: ====== When the "Tabs" snippet style is set, a `.card` class is added to its container (See [1]) A generic CSS rule, intended to style these tabs, was targeting any `.card` element with a `.card-body` child. (See [2]) However, the Columns snippet also uses a `.card > .card-body` structure (distinguished by a `data-vxml` attribute). This caused the overly broad tab-styling rule to incorrectly cascade and override the background color of the nested column. Solution ======== The SCSS selector has been made more specific so that works if `card-body` class doesn't have any parent class with class `card` and has attribute `data-vxml` [1]: https://github.com/odoo/odoo/blob/4cb3ffc09507fdfdb1aeabb70b2c93105f992700/addons/website/static/src/snippets/s_tabs/options.js#L149 [2]: https://github.com/odoo/odoo/blob/4cb3ffc09507fdfdb1aeabb70b2c93105f992700/addons/web/static/src/scss/bootstrap_review_frontend.scss#L55 opw-5394480 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241118
This update fixes an issue where new CRM contacts created using the quick create feature weren't automatically linked to the company's address. The fix ensures that when a company is selected, the new contact's address is correctly populated, improving data accuracy and streamlining CRM workflows. This enhancement impacts the Sales and CRM applications.
Original PR description
**Steps to reproduce:** - Install Sales/CRM apps - Go to CRM app - Create new opportunity card - Set a company (`commercial_partner_id`) - Create a new contact using `quick_create` - The new contact is linked to the company but it doesn't inherit the company address **Issue:** Kanban quick create of crm app was modified to allow a company field, which is used as `default_parent_id` when creating a new partner from the card. This properly set the partner `parent_id` and `commercial_partner_id` but without applying the logic of `_fields_sync()` which also added the address (only for quick_create). **Fix:** Check if a default value was given for `parent_id` in `_fields_sync()`. related: https://github.com/odoo/odoo/commit/a6c3ebc21c066ab4d5711f535ca5fc858e6485b0 opw-4932114 Forward-Port-Of: odoo/odoo#229234
This update fixes an issue where multiple product filters were not consistently saved during pagination, leading to incorrect product listings. The change ensures that all selected filters are correctly passed to the URL, maintaining accurate filtering across different pages. This improves the user experience and ensures products are displayed as intended.
Original PR description
Current behavior: When a user selects multiple filters (attributes) that result in multiple pages of products, navigating to the second page causes some filters to be lost. Specifically, only the…
Current behavior:
When a user selects multiple filters (attributes) that result in multiple pages of products, navigating to the second page causes some filters to be lost. Specifically, only the last selected attribute value is kept in the URL of the pager.
This happens because the `/shop` controller processes query parameters using a standard Python dictionary (**post). Since a dictionary cannot hold duplicate keys, an URL like `?attrib=1&attrib=2` is reduced to `{'attrib': '2'}`, losing all previous values.
Steps to reproduce:
1. Install `website_sale`.
2. Reduce "Products per Page" (e.g., to 4) to easily trigger pagination.
3. Go to the /shop page.
4. Select a first attribute (e.g., Color: White).
5. Select a second attribute (e.g., Size: M).
6. Ensure the result spans at least two pages.
7. Click on page "2".
8. Observation: The second attribute filter is lost, and the product list changes incorrectly.
Fix:
Ensure that `attribute_values` are stored as a list within the `url_args` passed to the pager. Since Odoo's `website.pager` uses `url_encode` internally, passing a list of values for a single key correctly generates repeated parameters in the resulting URL (e.g., `attrib=1&attrib=2`).
opw-4152637
Forward-Port-Of: odoo/odoo#245784
Forward-Port-Of: odoo/odoo#244941This update addresses a visual issue in the Point of Sale action dialog where disabled buttons had insufficient contrast. We've enhanced button visibility by using a consistent lighter background color for disabled states and added a border, ensuring better clarity for users, especially in bright environments. This improves the overall user experience and accessibility.
Original PR description
Before this PR there was a contrast issue between disabled and active secondary buttons in the action dialog. This was due to a customization where the `btn-secondary`'s default background color was…
Before this PR there was a contrast issue between disabled and active secondary buttons in the action dialog. This was due to a customization where the `btn-secondary`'s default background color was lightened. To fix this, we used the same lighter background color for disabled `.btn-secondary`, reduced the opacity of its text and desaturated tho whole button for whenever there is color such as the "reward" button. This way we can distinguish between the two states. A border was added to `.btn-secondary` in order to make the button more visible in light-challenging situations (in broad daylight for example). task-5186928 | Before | After | | ------------- | ------------- | | <img width="1002" height="647" alt="Screenshot 2025-11-06 at 13 17 27" src="https://github.com/user-attachments/assets/cc63d6e1-8587-427e-b5cd-de99e96df8c0" />|<img width="1004" height="645" alt="Screenshot 2025-11-06 at 12 58 07" src="https://github.com/user-attachments/assets/f199fd94-1223-4c6b-869b-e8d66d99bc82" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232969
This update makes it easier to manage channel members by displaying the '...' action (for options) directly on member items within the 'Members' panel. This enhancement, similar to the 'Discuss' sidebar, ensures actions are readily discoverable, especially on mobile devices. Additionally, the ability to remove guests from the member list has been added, addressing a previous limitation.
Original PR description
Before this commit, the channel member actions were hard to find: - Click on Members panel. - Click on Member to open popover card. - Click on "..." in top-right corner of card. This is hard because…
Before this commit, the channel member actions were hard to find: - Click on Members panel. - Click on Member to open popover card. - Click on "..." in top-right corner of card. This is hard because only this avatar card from this menu has the "..." button, and the actions are hidden in this menu. This is easy to miss since avatar cards in message list or other places don't have this "...", and since the actions are hidden there many people could easily miss these actions. This commit improves the visibility of action by their showing as a "..." on the member item on hover in the "Members" panel. This works like the "..." button in the discuss left sidebar, where the button is shown on mouse-hover. Mobile view (small or mobile device) shows the button all the time next to member, making the discoverability of the action very clear. Task-5871730 Before / After <img width="589" height="385" alt="Screenshot 2026-01-23 at 14 45 17" src="https://github.com/user-attachments/assets/bca66975-13cd-423a-a43d-9eb2be03741a" /> <img width="249" height="270" alt="Screenshot 2026-01-26 at 11 56 09" src="https://github.com/user-attachments/assets/edfe34c9-6b4c-4394-b532-7f79f9653b4a" /> ---- This PR also makes channel member actions available in guest items, so we can now "Remove Member" on guests too. <img width="252" height="296" alt="Screenshot 2026-01-27 at 18 25 54" src="https://github.com/user-attachments/assets/ee4b1271-0529-4e96-bda1-e621d7592555" />
This update enhances the Point of Sale mobile experience by ensuring that product categories are displayed efficiently on smaller screens. The UI now automatically scrolls to show all categories when more than three are present, and a small visual improvement (padding) has been added to the product list for a cleaner look. This improves usability for mobile sales staff.
Original PR description
Only three rows needs be displayed on small devices and if there are more, it must be scrollable. Adding of padding for the product in the product list to render a bit prettier. task : 5490918 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where product descriptions couldn't be edited on completed or cancelled stock picks. Now, users can correct descriptions for finished orders, improving data accuracy and reducing manual rework. This change ensures that product information is always up-to-date.
Original PR description
Once a picking is no longer in draft, it's not possible to edit a product description anymore and there's no easy way to correct a mistake. Solution: only make it readonly in done or cancel state. task 5083104 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246611 Forward-Port-Of: odoo/odoo#243109
This update fixes a bug related to how Odoo handles responses from the Zatca system when obtaining CCSID or PCSID information. Previously, missing error messages caused confusing tracebacks for users. Now, the system checks CSR field lengths and displays a helpful message to the user, ensuring smoother Zatca onboarding.
Original PR description
Previously, it was assumed that if no 'error' or 'errors' key was present that means we've received a valid response for obtaining CCSID or PCSID. But sometimes the error is not sent with those keys, and the binarySecurityToken is missing, therefore a traceback is shown to the user because the invalid requests passes through the validation unnoticed. This kind of response is the result of a new change introduced by zatca requiring csr fields to be at most 64 characters long. This commit improves the error handling mechanism of CSID responses, to show the user an informative message, and handles the length check for csr fields on the client side before sending to zatca. task-5347269 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246714 Forward-Port-Of: odoo/odoo#244507
This update allows users to star persistent messages like sign requests, even if they aren't part of a conversation thread. Previously, these messages couldn't be starred. This change simplifies the starring process and improves user functionality.
Original PR description
**Description of the issue this PR addresses:** Starring a message should depend on whether the message is persistent and whether the current user is allowed to star it, not on whether the message is attached to a thread. **Current behavior before PR:** Some persistent messages (such as user notifications) can be displayed in Inbox without an associated thread. In such cases, the star action was unavailable even though the message itself was valid and persistent. **Desired behavior after PR is merged:** This change removes the dependency on thread presence when determining whether a message can be starred. As a result, users can now star persistent messages without a thread, including Inbox notifications such as sign requests. task-[5473438](https://www.odoo.com/odoo/project/1519/tasks/5473438) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246787 Forward-Port-Of: odoo/odoo#244204
4 changes
Resolved issues and error corrections
This update simplifies the subscription plan view by removing irrelevant order line details like sections and discounts. The change focuses only on subscription products, making the plan configuration easier to understand and use for users. This improves the overall user experience and reduces confusion.
Original PR description
The subscription plan view was displaying all order line types, including sections, notes, and discount lines, which added unnecessary clutter. This update filters the order lines to display only actual subscription products, improving clarity and usability in the plan configuration. task-5404614 Forward-Port-Of: odoo/enterprise#106076 Forward-Port-Of: odoo/enterprise#101796
This update fixes an issue where lengthy reconciled names on bank statements were being displayed as a long list of commas. The change involves repositioning a text truncation element, resulting in a cleaner and more readable statement line display. This enhances the user experience when reviewing financial transactions.
Original PR description
When we have a lot of reconciled names, it can happens that you just have a long list of comma. It's because the text truncate was misplaced. This commit will fix this by moving the text truncate no task id Forward-Port-Of: odoo/enterprise#105674
This update resolves an issue where outdated account synchronization records could cause problems, preventing new connections. By focusing on fresh, uninitialized links, the system is now more stable and reliable for account synchronization. This ensures a smoother experience for users.
Original PR description
Prevent reusing stale account.online.link records that have a provider_type set, which can leave an unusable row and block new connections. By adjusting the search domain in action_new_synchronization, we only reuse clean, uninitialized links. opw-5868438 opw-5867799 Forward-Port-Of: odoo/enterprise#105187
This update fixes a confusing error message users received when the IoT box or a connected device was unavailable. The PR now includes the device ID in the error, allowing for clearer distinction between issues with the IoT box and individual devices. This improves troubleshooting and user experience.
Original PR description
Currently, whether the device is disconnected from the iot box or the iot box itself is unreachable the user gets "Failed to reach IoT Box for device [id]" For websocket the [id] here was "undefined". This PR adds the device id as expected and makes the error message more clear, making a difference between iot box disconnections and device disconnections. task-5496890
15 changes
Resolved issues and error corrections
This update simplifies the subscription plan view by removing irrelevant order line details like sections and discounts. The change focuses only on displaying the actual subscription products, making it easier for users to configure and understand their plans. This improves usability and reduces visual clutter.
Original PR description
The subscription plan view was displaying all order line types, including sections, notes, and discount lines, which added unnecessary clutter. This update filters the order lines to display only actual subscription products, improving clarity and usability in the plan configuration. task-5404614 Forward-Port-Of: odoo/enterprise#106076 Forward-Port-Of: odoo/enterprise#101796
This update ensures Odoo correctly generates ZATCA XML files for non-Saudi partners by making the 'additional buyer ID' visible when operating in Saudi Arabia. It prioritizes VAT as the buyer ID if available, and uses the 'additional identification number' as a backup, ensuring compliance with Saudi regulations.
Original PR description
This commit makes l10n_sa_additional_identification_number visible for non-Saudi individuals and company partners when the active company is in Saudi Arabia and keeps the identification scheme fixed to OTH, keeping it invisible. When generating ZATCA XML for non-Saudi partners, VAT is used as the primary buyer ID if present, and fall back to the additional identification number when VAT is missing. task-4525956 Forward-Port-Of: odoo/odoo#245832
This update allows users to star persistent messages like sign requests, even if they aren't part of a conversation thread. Previously, some Inbox notifications couldn't be starred because they lacked a thread association. This change improves usability by allowing users to easily mark important messages for follow-up.
Original PR description
**Description of the issue this PR addresses:** Starring a message should depend on whether the message is persistent and whether the current user is allowed to star it, not on whether the message is attached to a thread. **Current behavior before PR:** Some persistent messages (such as user notifications) can be displayed in Inbox without an associated thread. In such cases, the star action was unavailable even though the message itself was valid and persistent. **Desired behavior after PR is merged:** This change removes the dependency on thread presence when determining whether a message can be starred. As a result, users can now star persistent messages without a thread, including Inbox notifications such as sign requests. task-[5473438](https://www.odoo.com/odoo/project/1519/tasks/5473438) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244204
This update corrects a problem where the carrier type selection was incorrectly disabled after validating a mobile barcode. The fix ensures the carrier number input remains editable when the carrier type is changed, allowing users to accurately select and input their carrier information during the order process. This prevents data loss and improves the checkout experience.
Original PR description
carrier type After the user clicks on "Validate" button to validate the mobile barcode, the carrier type selection is disabled and the carrier type pass to the SO is None. This commit fixes the issue by instead of disabling the carrier type selection, we just set the input box of carrier number to readonly and set back the carrier number to not readonly when the user changes the carrier type to ensure the carrier number input is editable. task-5880421 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#246438 Forward-Port-Of: odoo/odoo#246053
This update fixes a potential issue where outdated account synchronization links could cause problems, preventing new connections. By ensuring only fresh, uninitialized links are reused, the system is now more stable and reliable for account synchronization. This resolves a previous bug reported by our support team.
Original PR description
Prevent reusing stale account.online.link records that have a provider_type set, which can leave an unusable row and block new connections. By adjusting the search domain in action_new_synchronization, we only reuse clean, uninitialized links. opw-5868438 opw-5867799 Forward-Port-Of: odoo/enterprise#105187
This change reverts a recent update that prevented public holidays from being correctly applied to work schedules without a company assigned. This resulted in public holidays not appearing in the Time Off dashboard and incorrectly including them in requested time off durations. The fix will be implemented directly in the 'project' module to avoid impacting other Odoo modules.
Original PR description
Revert of https://github.com/odoo/odoo/commit/a95af8b78a94a795e05a0adf299837adc0ef2117 and https://github.com/odoo/odoo/commit/f4f9ecb3e4801b3d382abc24c478fe5e533c9bf8 **Steps to reproduce** 1.…
Revert of https://github.com/odoo/odoo/commit/a95af8b78a94a795e05a0adf299837adc0ef2117 and
https://github.com/odoo/odoo/commit/f4f9ecb3e4801b3d382abc24c478fe5e533c9bf8
**Steps to reproduce**
1. Remove the company of the Working Schedule (needs to be done in
a multi-company environment from the UI) used by an employee.
2. Using the company of this employee, create a Public Holiday
(for the employee's schedule or all schedules).
Issues:
- the public holiday doesn't appear in the Time Off dashboard
- when taking a time off on that day, the public holiday is
included in the duration
**Cause**
After the fix in https://github.com/odoo/odoo/commit/a95af8b78a94a795e05a0adf299837adc0ef2117 , it will lead
to a search domain for public holidays of `('company_id', 'in', [False])`
when the working schedule has no company, ignoring any public
holidays with a company set. This is especially problematic since the
company of the public holiday is always forced.
https://github.com/odoo/odoo/blob/7bce5f3f95429a4d4ba034a66c350ee2a5868567/addons/resource/models/resource_calendar_leaves.py#L49-L51
**Solution**
Since the intent of the original fix https://github.com/odoo/odoo/commit/f4f9ecb3e4801b3d382abc24c478fe5e533c9bf8
was to correct an issue related to the computation of some `project.task`
fields calling a resource method (`get_work_duration_data`), we can revert
the fix and later fix the original issue directly in `project`, without
impacting `hr`/`resource` modules.
opw-5496999
opw-5401425
Forward-Port-Of: odoo/odoo#244052This update fixes an issue where purchase orders generated through the MTO route were incorrectly using expired vendor information. Now, the system prioritizes vendors with active contracts, ensuring purchase orders are based on current supplier availability. This prevents the creation of purchase orders with outdated supplier details, improving order accuracy and supply chain efficiency.
Original PR description
_______________________________________ ## Short functional explanation of the error Let's say we have a products that has 2 suppliers. In the list of suppliers, the first one set has an expired…
_______________________________________ ## Short functional explanation of the error Let's say we have a products that has 2 suppliers. In the list of suppliers, the first one set has an expired date. If we generate a PO from an SO with the MTO route, the assigned supplier for this product will be the first one set in the list, therefore having an expired date. ## Reproduction Steps 1. Go to Inventory > Configuration > settings. Check the option Multi-Step routes. 2. Click on Configuration > routes and unarchive the Replenish On Order (MTO) route. 3. Create or use an already existing product. Go to the Inventory tab, and under Operations, check the routes Replenish on Order (MTO) and Buy. 4. Click on the Purchase tab. There, set a first vendor for which the end date is earlier than today. For the second one, set an end date for which the date is later than today. 5. Go to Sales and create a new quotation. Set a customer and add a line with the product you just set. Click confirm. A smart button 'Purchase' should appear. Click on it. ### Expected behavior The assigned vendor of the PO should be the second vendor as it isn't expired yet. ### Unexpected behavior The assigned vendor is the first vendor, expired. ## Origin of the issue When generating a PO from an SO, the partner is the person ordering the product, not the vendor. Therefore, when this code is executed: https://github.com/odoo/odoo/blob/6b677319c47baacb5bee829b7e41448dec4136eb/addons/purchase_stock/models/stock_rule.py#L62-L66 no corresponding supplier is found, as ```self._get_partner_id(procurement.values, rule)``` returns the customer and not the vendor. This leads us to the fallback: https://github.com/odoo/odoo/blob/6b677319c47baacb5bee829b7e41448dec4136eb/addons/purchase_stock/models/stock_rule.py#L68-L72 which doesn't take into account the end date of vendors. __ opw-5030849 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#245313 Forward-Port-Of: odoo/odoo#225684
This update corrects a bug where canceled refunds were incorrectly included in global invoices generated from Point of Sale (PoS) orders. The fix filters out canceled refund lines during invoice generation, ensuring accurate reporting and invoicing for Mexican VAT (EDI) transactions. This improves data integrity and compliance.
Original PR description
When generating global invoices for orders in the PoS, refund of those orders are also included in the global invoice. However, if the refund has been canceled, it should not be included in the global invoice. Steps to reproduce: ------------------- * Create a PoS order and validate it. * Go to the backend and create a refund for that order. * Cancel the refund. * Go to the PoS order list and select the original order * Click on "Generate Global Invoice" > Observation: The canceled refund is included in the global invoice. Why the fix: ------------ We simply filter out the canceled orders when searching for refunded order lines. opw-5492576 Forward-Port-Of: odoo/enterprise#105959 Forward-Port-Of: odoo/enterprise#105868
This update fixes a bug that occurred when users copied and then undid copying planning slots. The issue arose because the system incorrectly flagged deleted records as still existing, leading to an error. Now, the system verifies record existence before deleting, ensuring a smoother and more reliable process.
Original PR description
### Steps to reproduce: - Install Planning - Navigate to the gantt view for planning slots - Copy previous week's slots - Delete one of the newly copied records - Undo the copying action - Notice an Error is raised that a record doesn't exist ### Cause: When undoing the copy process we unlink all the newly created records but if the user has already deleted one of them it will trigger an error that this record doesn't exist and it has already been deleted ### Fix: We check the existence of the records before deleting them. opw-5490327 Forward-Port-Of: odoo/enterprise#105530
This update resolves a bug where the timer stopped appearing for survey participants after submitting their answers in live sessions. The fix ensures the timer correctly displays for the intended time limit, improving the participant experience and data accuracy. This change was made to align the survey logic with live session behavior.
Original PR description
Description of the issue/feature this PR addresses: Fixes timer not showing to participants of a live session after submitting an answer. Current behavior before PR: Steps to reproduce: Create a…
Description of the issue/feature this PR addresses: Fixes timer not showing to participants of a live session after submitting an answer. Current behavior before PR: Steps to reproduce: Create a Survey with two questions of any type. Set some Question Time Limit on both. Create Live Session for that Survey. Access Live Session as a participant. Start Survey as the host. The first question appears to the participant, with the timer on the top right. Answer the question as the participant and click Submit or press Enter. On the host side move to the next question. Bug: timer for the second question does not appear to the participant. Desired behavior after PR is merged: Fix: The logic to hide the timer is on `survey_form.js`. In the `_nextScreen` function. Specifically, when `options.isFinish` is set to `true`. It is set to `true` in the `_onSubmit` function. This function triggers when the participant submits an answer. The fix: only set that flag to `true` if there isn't a session in progress. This aligns with the other calls to `_nextScreen` for live sessions. That is, when a timer expires and the form is submitted: `'isFinish': !this.options.sessionInProgress` and when a notification is received for the session: `isFinish: nextPageEvent.type === 'end_session'` Meaning that for live sessions the only time `isFinish` should be set to `true`, is when the `end_session` notification is received. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246147 Forward-Port-Of: odoo/odoo#241086
This update fixes an issue where the 'Next Booking Start' time wasn't accurately displayed for rooms with upcoming bookings. The change removes a filtering step that prevented the system from considering occupied rooms when calculating availability. Now, the 'Next Booking Start' field correctly reflects the earliest available time for all rooms.
Original PR description
Steps to reproduce:
1. Install `room`
2. Create a room.
3. Create a booking for the current time (so the room becomes occupied).
4. Create another booking for tomorrow.
5. Open the list view of rooms.
Current Behavior:
- The `Next Booking Start` field is empty for the created room, despite Having future bookings.
Cause:
- The method `_compute_next_booking_start` filters the rooms using `self.filtered('is_available')`. Since the room is currently occupied (due to the active booking), the room is excluded from the query entirely.
Solution:
- Remove the `is_available` filter from the search domain. The next booking start time is now calculated for all rooms, regardless of whether they are currently available or occupied.
opw-5360101
Forward-Port-Of: odoo/enterprise#102129This update fixes an issue where the Point of Sale tour experience wouldn't reliably work with infinite scrolling. By searching for the customer before a click, the system now handles this feature correctly, ensuring a smoother and more consistent user experience. This change also includes updates to related tests.
Original PR description
Make clickPartner search for the partner first to handle infinite scroll. Fixes: - test_preset_customer_selection - test_not_create_loyalty_card_expired_program - test_not_create_loyalty_card_max_usage_programm task-id: 5897380 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the background color of nested columns within tabs was being incorrectly overridden. The fix ensures that tab styling applies correctly to all columns, regardless of their structure, improving the visual consistency of the user interface. This change enhances the overall user experience.
Original PR description
Steps to reproduce: =================== 1- Drop the block tab snippet 2- Inside one of the tab panes, drop a Columns snippet. 3- Select background_color for one of the columns 4- Change tab style to…
Steps to reproduce: =================== 1- Drop the block tab snippet 2- Inside one of the tab panes, drop a Columns snippet. 3- Select background_color for one of the columns 4- Change tab style to tab -> The background color of the inner column is overridden. Cause: ====== When the "Tabs" snippet style is set, a `.card` class is added to its container (See [1]) A generic CSS rule, intended to style these tabs, was targeting any `.card` element with a `.card-body` child. (See [2]) However, the Columns snippet also uses a `.card > .card-body` structure (distinguished by a `data-vxml` attribute). This caused the overly broad tab-styling rule to incorrectly cascade and override the background color of the nested column. Solution ======== The SCSS selector has been made more specific so that works if `card-body` class doesn't have any parent class with class `card` and has attribute `data-vxml` [1]: https://github.com/odoo/odoo/blob/4cb3ffc09507fdfdb1aeabb70b2c93105f992700/addons/website/static/src/snippets/s_tabs/options.js#L149 [2]: https://github.com/odoo/odoo/blob/4cb3ffc09507fdfdb1aeabb70b2c93105f992700/addons/web/static/src/scss/bootstrap_review_frontend.scss#L55 opw-5394480 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241118
This update fixes a visual inconsistency in video link previews. Previously, thumbnails for YouTube videos left blank spaces, leading to a broken layout. Now, thumbnails consistently fill the container, ensuring a uniform and professional appearance for all video previews.
Original PR description
**Purpose of this PR:** Before this commit, video thumbnails from youtube left blank spaces in the container, creating inconsistent layouts across different video links. After this commit, thumbnails consistently fill the entire container, ensuring uniform appearance for all video link previews. **Before/After:** <img width="533" height="407" alt="image" src="https://github.com/user-attachments/assets/ce2ba872-27b7-4be5-9d85-fbbe6f272e14" /> <img width="481" height="386" alt="image" src="https://github.com/user-attachments/assets/523f5d16-2983-49c1-9dcc-01adb4284e56" /> task-5424534 Forward-Port-Of: odoo/odoo#244176
This update resolves a bug where discarding a combo product in the Point of Sale (POS) system incorrectly created empty order lines with a zero price. The fix ensures that the system accurately handles product discards, preventing this issue and improving the POS user experience. This ensures accurate order processing.
Original PR description
When discarding a combo product in the POS, it was creating an empty orderline with the product with a price of 0.0$. How to reproduce ? 1. Open a POS 2. Click on a combo product 3. Press ESC or press the cross icon 4. It creates an order line with the parent combo with a quantity of 0 and a price of 0.0 Fix : It’s because the popup payload returns undefined when the user discards it, but the condition was checking for false instead of undefined. task: 5868094 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
4 changes
Resolved issues and error corrections
This update resolves a test failure within the Web Studio module's export functionality. The change prevents unintended modifications to a key configuration setting, ensuring test stability and preventing disruptions during the full enterprise test run. This improves the reliability of our core export processes.
Original PR description
Updating the fieldsets of `DEFAULT_FIELDS_TO_EXECUTE` in place changes the behaviour of `test_23_export_hardcoded_models_and_fields` if that test runs after `_compute_excluded_fields` has been executed for one reason or an other, which apparently does not occur during post_install but *does* occur during at_install, and so fails in the "full" enterprise test running everything in a single job. https://runbot.odoo.com/odoo/error/238451 https://runbot.odoo.com/odoo/error/238449 https://runbot.odoo.com/odoo/error/238497
This update resolves an issue where the FAIA report incorrectly classified partners as suppliers instead of customers, particularly when credit notes were involved. The change allows a partner to be both a customer and supplier, ensuring accurate reporting of balances and improving the reliability of the SAFT report.
Original PR description
1. Create a contact (with minimal details). 2. Create a customer invoice for that contact **last month** with `quantity = 300`. 3. Create a credit note for that invoice **this month**. 4. Create…
1. Create a contact (with minimal details). 2. Create a customer invoice for that contact **last month** with `quantity = 300`. 3. Create a credit note for that invoice **this month**. 4. Create another customer invoice for the same contact **this month** with `quantity = 100`. In the FAIA report (XML), within the General Ledger section, the partner is incorrectly classified as a supplier instead of a customer. In the method _saft_fill_report_partner_ledger_values from account_saft, he partner type is determined based on whether the balance is negative. However, a negative balance can result from a credit note, where the partner is still a customer and not a supplier. Furthermore, a partner can be both a supplier and a customer. This commit allows a partner to be both a customer and a supplier. If both receivable and payable are 0 we set the partner type to customer to keep the behavior from e9640caf29e967fe7d8c6fe303b5a8d7a866437e opw-5360924 Forward-Port-Of: odoo/enterprise#105405 Forward-Port-Of: odoo/enterprise#100749
This update fixes an issue where outdated account synchronization links could cause problems, preventing new connections. By ensuring only clean, uninitialized links are reused, the system is now more reliable and stable for account synchronization.
Original PR description
Prevent reusing stale account.online.link records that have a provider_type set, which can leave an unusable row and block new connections. By adjusting the search domain in action_new_synchronization, we only reuse clean, uninitialized links. opw-5868438 opw-5867799 Forward-Port-Of: odoo/enterprise#105187
A recent error message appearing during payment processing for Avatax-enabled Point of Sale (POS) orders has been resolved. This was caused by an outdated method that no longer existed. The fix removes this unused method, ensuring smooth and reliable payment processing for Avatax users.
Original PR description
Step to reproduce: - configure pos for Avatax from settings - open pos and settle a order - notice a error message on payment page Cause: - error is due to usage of `replaceDataByKey` which is removed in [1] [1] https://github.com/odoo/odoo/commit/3e94fe90ded58d498f0098cd9ed8679cbe500b8f Fix: - we removed the method as now we do not rely on it. opw-5089351 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#102101
12 changes
Resolved issues and error corrections
This update resolves a bug that prevented automated tours from correctly initializing drag actions on the Gantt chart. The change re-enabled a safety check during pill dragging, ensuring actions work as expected while still allowing users to drag pills outside the chart's grid.
Original PR description
In PR https://github.com/odoo/enterprise/pull/103230, a fail-safe was removed to allow dragging pills outside the grid (for unscheduling). This caused issues in automated tours where actions triggered on off-screen pills (where no cell is hovered) failed to initialize the drag properly. This commit reinstates a validation check within `onWillStartDrag`. This ensures the drag only starts if a valid target is confirmed, fixing the tour failures while preserving the ability to drag pills out of the grid. runbot-error-238521
This update fixes a bug in our VoIP system that prevented users from initiating multiple calls simultaneously and displayed incorrect session status. The change ensures calls are tracked earlier, limiting active sessions to two, and provides clearer notifications to the user. It also simplifies terminology for better clarity.
Original PR description
Previously, SIP sessions were only considered active after the associated call was ready. This led to two issues: incoming invitations that were terminated before call readiness could block the UI with already ended sessions, and users could initiate multiple concurrent calls due to makeCall not being guarded. This change pushes sessions as early as possible and notifies the user when a call cannot be started, ensuring that no more than two sessions can be active at any time. Additionally, the activeSession terminology has been replaced with frontSession and backSession.
This update resolves a test issue related to a recent change in how the select component is implemented. The new component uses a popover instead of the traditional `<select>` tag, requiring adjustments to the tests to account for changes in how the user interface is rendered, particularly on smaller screens.
Original PR description
Following the current introduction of a new select component, we no longer rely on the native `<select>` tag, and instead invoke a popover that displays the select possible values. Since our new component relies on `<div>` and a popover which can be set as invisible if the browser window is too small, the tests needed to be adapted so that the dom helpers (that are sensitive to a node visibility by default) can still work. runbot error - 238438
This update fixes an issue where Swiss payslips were generated with the generic name "new Payslip" instead of the correct name including the employee's details. The fix ensures that payslips now display the employee's name and pay period, improving clarity and accuracy for payroll reports. This resolves a minor user experience problem.
Original PR description
_ ## Short functional explanation of the error When generating a payslip from a payrun for an employee on the swiss localization, the name of the PDF payslip is simply "new payslip" instead of…
_ ## Short functional explanation of the error When generating a payslip from a payrun for an employee on the swiss localization, the name of the PDF payslip is simply "new payslip" instead of "Salary Slip - <name of employee> - <time period of the slip>" ## Reproduction Steps 1. Install the app l10n_ch_hr_payroll. 2. Make sure you use a Swiss company. 3. Go to Payroll and click on the Payslips tab > payslips. 4. Click on Pay Run. Select Switzerland: ELM salaries and click Continue. 5. Select an employee for which you'd like to generate the payslip. 6. Click on the employee row in the list view. 7. Click Compute sheet > Print. ## Expected behavior A PDF with name "Salary Slip - <employee name> - <time period>" is generated. ## Unexpected Behavior A PDF with name "new Payslip" is generated. ## Origin of the issue When printing the slip with this flow, we don't call the method ```_compute_name()``` used to compute the name of the current slip. Therefore, it stays at 'New Slip', which is the default name. Henceforth, we have to call this method manually when printing the slip. _ opw-5253811 Forward-Port-Of: odoo/enterprise#103471
This update corrects a previous issue where the payslip report displayed the company's working schedule instead of the employee's. The report has been updated to accurately reflect the employee's individual working schedule, providing more accurate payroll information.
Original PR description
-The display for working schedule info in the payslip report was referring to the company's working schedule. -The report has been adjusted to include the employee's working schedule.
This update fixes an issue where credit notes didn't properly reverse commissions. The change ensures that a negative commission line is created for credit notes, accurately reflecting refunds and enabling correct commission calculations. This improves financial reporting accuracy.
Original PR description
**Steps to reproduce:** * Install the **Accounting** and **partner_commission** modules. * Create a contact and set a **commission plan (e.g. 50%)** in the *Partner Assignment* tab. * Create and…
**Steps to reproduce:** * Install the **Accounting** and **partner_commission** modules. * Create a contact and set a **commission plan (e.g. 50%)** in the *Partner Assignment* tab. * Create and confirm a customer invoice with multiple lines (e.g. 750, 750). * Then go to **Dashboard → Transactions**, create a new transaction (e.g. 750) and reconcile it with the created invoice. * Create a **credit note** from the invoice and confirm it. * Open the contact and access **Purchase Orders** from the stat button. **Observed behavior:** * Only the commission line from the original invoice appears in the partner purchase order. * No **negative commission line** is created for the credit note. **Cause:** * Credit notes reused the original commission linkage instead of generating a dedicated commission entry. * This prevented commission reversal from being recorded for refunds. **Fix:** * Generate a **separate commission line** with a negative amount for each credit note. * Assign a dedicated `commission_po_line_id` to credit notes. * Copy only the `referrer_id` to credit notes, not the original commission line reference. opw-5357773 Forward-Port-Of: odoo/enterprise#103328
A recent test failure related to restaurant appointment tours has been resolved. The fix ensures the test accurately simulates the Point of Sale system's time, preventing inconsistencies and improving the reliability of our automated testing process. This ensures that the tour behaves predictably during testing.
Original PR description
The `RestaurantAppointmentTour` was failing inconsistently because the browser used the real system clock during the initial Point of Sale load, while the test data was created for a specific mock date (Jan 28). Because the PoS logic filters appointments based on the current time, the test data was being misinterpreted or "normalized" by the application before the tour had a chance to freeze the clock. Moving `Chrome.freezeDateTime` to the absolute first step of the tour ensures the simulated time is applied as early as possible, making the test deterministic. runbot-232601 Forward-Port-Of: odoo/enterprise#106024
This update enhances the performance of account reporting by optimizing the way data is filtered within key tables. The changes address inefficiencies in the account reports module, leading to faster report generation and improved system responsiveness. This ensures smoother operations for financial reporting.
Original PR description
In addition to: - [x] #104936 And other PRs in Odoo core: - [x] odoo/odoo#243833 - [x] odoo/odoo#243967 - [x] odoo/odoo#246440 Forward-Port-Of: odoo/enterprise#106080 Forward-Port-Of: odoo/enterprise#105960
This update resolves an issue preventing Odoo payments using Swedbank's Bankgiro accounts. Swedbank requires a specific 'RfdDocAmt' field in the payment XML, which was missing in Odoo's generated batches. Adding this field ensures successful payment processing and avoids rejection by the bank.
Original PR description
**PROBLEM** Swedbank requires the RfdDocAmt Element for Bankgiro account. [documentation](https://internetbank.swedbank.se/ConditionsEarchive/download?bankid=1111&id=WEBDOC-PRODE211415244). Payment batches generated by Odoo don't contains this fields, meaning they are refused by the bank. **REPRO STEPS** We can't reproduce the error the client have because it would require a valid bankgiro account. To generate the payment batch xml you have to: 1. Install l10n_se. 2. Create a vendor bank account of type bankgiro. 3. Create a vendor payment with this vendor bank account. 4. Create a batch payment and validate it. 5. There should be a xml in the chatter, you can look at it to see there is no RfdDocAmt element. opw-5427505 Forward-Port-Of: odoo/enterprise#104777
This update fixes a potential error in the achievement reports that could cause issues when dealing with large order IDs. By using a bitwise operation instead of multiplication, the system now correctly handles IDs, preventing errors and ensuring accurate report generation. This improves the stability and reliability of the sales commission reporting.
Original PR description
Before this commit, we had issues on odoo.com when the ids of the account move, account move line, sale order or sle order line were too high. We would end up with ids bigger than BIGINT limit. This commit ensure it does not happen anymore by using bitwise operation on ids istead of multiplying the values. task-5423978 Forward-Port-Of: odoo/enterprise#105643 Forward-Port-Of: odoo/enterprise#103264
This update resolves an issue where confirming one upsell within a subscription didn't properly cancel the remaining alternative quotations. Now, confirming any upsell automatically cancels all related upsells, ensuring accurate subscription management and preventing unnecessary charges.
Original PR description
Currently, when creating multiple upsells for a specific subscription, confirming one of them leaves the others in the sent state instead of cancelling them. This fix ensures that all other upsells for the same subscription are cancelled once one upsell is confirmed. task-5270139 Forward-Port-Of: odoo/enterprise#105694 Forward-Port-Of: odoo/enterprise#100058
This update resolves an issue that prevented the subscription preview from displaying correctly when using sections and subsections. The fix ensures that all related invoice lines are properly processed, preventing a technical error that caused the preview to fail. This improves the user experience for subscription management.
Original PR description
Steps to reproduce: ------------------- 1. Install sale_subscription with demo data. 2. Create a new subscription and add a Section and a Subsection. 3. Add a recurring product (Invoice_policy =…
Steps to reproduce:
-------------------
1. Install sale_subscription with demo data.
2. Create a new subscription and add a Section and a Subsection.
3. Add a recurring product (Invoice_policy = 'order') and configure a recurring plan.
4. Confirm the subscription and click Preview.
Issue:
------
```python
Traceback (most recent call last):
The error occurred while rendering the template sale_subscription.subscription_portal_content and evaluating the following expression: <t t-set="collapse_prices" t-value="current_section.collapse_prices or line.collapse_prices"/>
Error while rendering the template:
AttributeError: 'NoneType' object has no attribute 'collapse_prices'
Template: sale_subscription.subscription_portal_content
Reference: 1713
Path: /t/div[4]/section[1]/div[1]/table/tbody/t[4]/t[11]/t[3]
Element: <t t-set="collapse_prices" t-value="current_section.collapse_prices or line.collapse_prices"/>
From: (1712, '/t/t', '<t t-call="portal.portal_layout"/>')
(1712, '/t/t/body/div[1]/div/div[2]/div[11]/div/t', '<t t-call="#{sale_order._get_name_portal_content_view()}"/>')
(1713, '/t/div[4]/section[1]/div[1]/table/tbody/t[4]/t[11]/t[3]', '<t t-set="collapse_prices" t-value="current_section.collapse_prices or line.collapse_prices"/>')
```
Cause:
------
`_get_invoiceable_lines` does not treat subsection lines as children of their parent section.
As a result, `lines_to_report` contains a subsection without its corresponding section,
leaving current_section set to None and causing the traceback when accessing current_section.collapse_prices.
Solution:
---------
Ensure subsection lines are appended together with their parent section
when an invoiceable line is encountered
Related community PR: https://github.com/odoo/odoo/pull/241634
opw-5367739
Forward-Port-Of: odoo/enterprise#1036869 changes
Resolved issues and error corrections
A recent test failure related to restaurant appointment tours has been resolved. The fix ensures the test accurately reflects the system's time by applying a simulated time early in the process, preventing inconsistencies. This improves the reliability of our test suite.
Original PR description
The `RestaurantAppointmentTour` was failing inconsistently because the browser used the real system clock during the initial Point of Sale load, while the test data was created for a specific mock date (Jan 28). Because the PoS logic filters appointments based on the current time, the test data was being misinterpreted or "normalized" by the application before the tour had a chance to freeze the clock. Moving `Chrome.freezeDateTime` to the absolute first step of the tour ensures the simulated time is applied as early as possible, making the test deterministic. runbot-232601 Forward-Port-Of: odoo/enterprise#106024
A crash in the Accounting module's Working Files feature, triggered during mass edits, has been resolved. The fix utilizes optional chaining to safely handle situations where configuration data is temporarily unavailable, preventing the web client from freezing.
Original PR description
**Steps to reproduce:** * Install **Accounting** with the **account_reports** module. * Go to **Accounting → Review → Working Files**. * Create or open an audit. * Open any line under **To Review**. * Set the status to **No Error** individually. * Select multiple lines and set the status to **Error** using mass edit. **Observed behavior:** * The web client crashes with `TypeError: Cannot read properties of undefined (reading 'viewType')`. **Cause:** * The status badge component assumes `env.config` is always defined. * When mass editing, the component is rendered in a context where `this.env.config` is undefined, causing the crash. **Fix:** * Add optional chaining (`?.`) to safely access `viewType`: `this.env.config?.viewType` instead of `this.env.config.viewType`. * This ensures the component handles contexts where `env.config` is undefined. opw-5481071
This update fixes a potential issue in the US payroll module by establishing a standardized way to manage city information for employees. Instead of free-form editing, a linked list of cities is now used, ensuring data consistency and accuracy for tax reporting. This improves the reliability of payroll calculations within the US.
Original PR description
**Description:** In United States we load all cities in the L10N package. idea was to make the city field on employee personal address a M2O referring to the list and not something freely editable. **Implementation:** . Add l10_us_private_city_id which's a M2O field referring to the list and not something freely editable. task-5877610
This update resolves an issue where sending voice messages without text would trigger an error. The fix prevents the system from incorrectly interpreting empty HTML as a required text message, ensuring voice messages are successfully sent via WhatsApp.
Original PR description
Sending a voice message without any text can trigger a WhatsApp API error because the empty HTML body is incorrectly treated as a valid text message. ### Reproduction Steps 1. Open the Discuss app.…
Sending a voice message without any text can trigger a WhatsApp API error because the empty HTML body is incorrectly treated as a valid text message. ### Reproduction Steps 1. Open the Discuss app. 2. Select a WhatsApp channel. 3. Record and send a voice message without typing any text in the composer. 4. Observe the message status. Result: The status changes from "Sent" to "Failed" with the error `(#100) The parameter text['body'] is required`. ### Cause The WhatsApp API does not support captions for audio files. Messages containing both audio and text are split into two separate WhatsApp messages: one for the audio file and one for the text body. Whether the text message is created depends on whether the message body is considered non-empty. Since commit odoo/odoo@f4dcc83adf552466ba7b05f09a4c651fe69f18ff , the composer’s default content is an empty HTML element. Although visually empty, this HTML is still a non-empty string at the data level. As a result, the system incorrectly determines that a text message is required and creates a secondary `whatsapp.message` record. When processed, the empty HTML is converted to a plain text string (`""`). Sending this as a text message fails validation because WhatsApp requires a non-empty body for text messages. ### Fix 1. Update `DiscussChannel.message_post()` to use `tools.is_html_empty(body)` to detect semantically empty HTML. This prevents creating a separate text message for audio attachments when the composer content is effectively empty. 2. Update `WhatsappMessage._send_message()` to check the truthiness of the converted plaintext `body` rather than the raw HTML field before adding a caption. This prevents sending an empty `caption` parameter for attachments when the body is empty. opw-5266805
This update resolves an issue preventing the 'compare' button from appearing on the website's rental product selection page. The fix ensures users can now correctly compare rental options, improving the overall user experience. It also adds a waiting step to ensure the comparison process completes reliably.
Original PR description
This commit fixes the issue where the "compare" button wasn't visible in the view. Now, the compare button is accessible within the process. Additionally, it addresses the indeterminacy by adding a step where the comparison bar is explicitly waited for before adding a product. runbot-error-id~231524
This update corrects a technical issue related to a tour (tutorial) within the Swiss localization of Odoo's payroll system. Specifically, the tour was incorrectly guiding users through work entries, which aren't relevant for Swiss companies. This fix ensures the tour functions correctly for Swiss businesses.
Original PR description
The Work Entries button on the form view of the hr_payslips is defined differently in the Swiss localization. We need to override the tour to make it work for swiss companies. Runbot Error: 234647
A bug preventing the sign tour from completing was resolved. The fix ensures the sign UI tests run correctly by using a reliable selector for the document signing button, eliminating a timeout error. This improves the reliability of the document signing process.
Original PR description
The sign_tour was failing because the `.o_sign_sign_directly` button was not found in the document view, causing the tour step to timeout and breaking both sign UI tests. This was due to the tour not properly opening the document in the signing view. The tour now relies on a stable selector, restoring successful execution of `test_sign_tour` and `test_sign_tour_without_sign`. Runbot issue: https://runbot.odoo.com/odoo/runbot.build.error/234923
This update corrects a bug in the salary configurator where the fuel card benefit would incorrectly appear enabled if no company car was chosen. The change ensures the field is properly initialized and remains disabled until a car is selected, preventing data inconsistencies. This improves the user experience and data accuracy.
Original PR description
On first load of the salary configurator, the fuel-card benefit could appear enabled even when no company car was selected. The dependency logic reacted to in-page changes but did not initialize the field correctly on page load. Initialize the fuel-card field from the current car selection and keep it non-selectable until a car is chosen to prevent inconsistent packages. task-5156562
This update resolves an issue where outdated account synchronization records could cause problems, preventing new connections. By focusing on fresh, uninitialized links, the system now reliably establishes and maintains account connections. This ensures smoother operation for our users.
Original PR description
Prevent reusing stale account.online.link records that have a provider_type set, which can leave an unusable row and block new connections. By adjusting the search domain in action_new_synchronization, we only reuse clean, uninitialized links. opw-5868438 opw-5867799 Forward-Port-Of: odoo/enterprise#105187
17 changes
Resolved issues and error corrections
This update fixes an error in the POS module's calculation of unpaid amounts during online payments. When 'Automatic Invoice' is enabled, the system was incorrectly subtracting both the invoice total and paid amounts, leading to an inaccurate unpaid amount figure. The fix ensures the correct calculation by skipping duplicate invoice references during the total amount computation.
Original PR description
**Steps to produce:** - Install `pos_sale` module. - Enable `Automatic Invoice` in settings - Create a new SO with product price 1000. - In `Other Info`, set `Online Payment` to 30%. - Preview > make…
**Steps to produce:** - Install `pos_sale` module. - Enable `Automatic Invoice` in settings - Create a new SO with product price 1000. - In `Other Info`, set `Online Payment` to 30%. - Preview > make payment. **Issue:** - The computed value of amount_unpaid is 400, whereas it should be 700. **Root cause:** - When Automatic Invoice is enabled and an online payment is made, the invoice is automatically created and amount_paid is also updated. - At [1], the logic subtracts both the total invoice amount and amount_paid from the actual total, which results in an incorrect calculation. **Solution:** - When an online payment is made, a transaction is created and linked to an invoice. - While computing the total invoice amount, if the transaction’s invoice ID is encountered again, it should be skipped to avoid double-counting. [1]https://github.com/odoo/odoo/blob/75f6be6744006ed1a3c0857881822723f90f5d4a/addons/pos_sale/models/sale_order.py#L46-L51 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a minor error in the invoice XML formatting within the Odoo Enterprise accounting module. Specifically, a misplaced closing tag was causing issues with how invoices are generated. This fix ensures proper XML structure and accurate invoice processing.
Original PR description
Currently, the `account_move_form_invoice_and_withhold_view` contains an invalid closing group tag (`</group>>`) introduced by PR [1], at [2]. The extra `>` results in malformed XML. This commit removes the stray character and restores a properly closed `</group>` tag. [1]: https://github.com/odoo/enterprise/pull/77592 [2]: https://github.com/odoo/enterprise/blob/7c574d758ff5b1404b808cc647d4a2ae40f5f0c0/l10n_ec_edi/views/account_move_views.xml#L79 **No task Id**
This update fixes a previous issue in the US payroll module by establishing a standardized list of cities for employee addresses. Previously, the city field was editable, which created inconsistencies. Now, it's a linked field referencing a pre-defined list, ensuring accurate and reliable payroll data for US employees.
Original PR description
**Description:** In United States we load all cities in the L10N package. idea was to make the city field on employee personal address a M2O referring to the list and not something freely editable. **Implementation:** . Add l10_us_private_city_id which's a M2O field referring to the list and not something freely editable. task-5877610
This update corrects an issue where project forms accessed through SmartButtons were initially displayed as uneditable. The fix removes a redundant setting that was causing this behavior, ensuring users can properly interact with project forms. The reason for the original setting remains unclear.
Original PR description
Issue: When navigating to any form view related to an FSM Project via
SmartButtons, they are loaded as uneditable
Solution: Remove "edit":False in _update_action_context method
Note: It is unknown why this was added in the first place, since
removing it does not cause any crashes
opw-5413753This update corrects a bug in the salary configurator where the fuel card benefit could incorrectly appear enabled when no company car was selected. The change ensures the field is properly initialized based on the chosen car, preventing inconsistent data and improving the user experience. This resolves a potential issue with incorrect benefit configurations.
Original PR description
On first load of the salary configurator, the fuel-card benefit could appear enabled even when no company car was selected. The dependency logic reacted to in-page changes but did not initialize the field correctly on page load. Initialize the fuel-card field from the current car selection and keep it non-selectable until a car is chosen to prevent inconsistent packages. task-5156562
This update resolves an issue where outdated account synchronization records could cause problems, preventing new connections. By focusing on fresh, uninitialized links, the system is now more stable and reliable for account synchronization. This ensures a smoother experience for users.
Original PR description
Prevent reusing stale account.online.link records that have a provider_type set, which can leave an unusable row and block new connections. By adjusting the search domain in action_new_synchronization, we only reuse clean, uninitialized links. opw-5868438 opw-5867799 Forward-Port-Of: odoo/enterprise#105187
This update resolves a bug where images added to email templates were being unexpectedly deleted upon saving. The issue stemmed from a problem with how the editor tracked changes, leading to incorrect history management. The fix ensures images are saved correctly without being removed during the save process.
Original PR description
**Steps to reproduce:** - Install Email Marketing app - Create a new campaign with Subject and Recipients - Set plain text mail body - Add one image using /img or /image command - Save the template -…
**Steps to reproduce:**
- Install Email Marketing app
- Create a new campaign with Subject and Recipients
- Set plain text mail body
- Add one image using /img or /image command
- Save the template
- Remove the image
- Save the template
- Try to re-add an image, on save it will be deleted everytime
**Issue:**
During `commitChanges`, the history of the editor is in a wrong state which triggers a cleanup on
`this.wysiwyg.odooEditor.historyRevertCurrentStep();`.
This is caused by the `await saveCallback(element);` of `_onMediaDialogSave` which never resolve and never call its follow-up:
```js
this.odooEditor.historyUnpauseSteps();
this.odooEditor.historyStep();
```
The resolve is event-dependent and doesn't seem to be triggered in current versions:
`const event = $.Event("image_changed", {_complete: resolve});`
**Fix:**
Check that the current element is listening to the given event.
Might not be the proper fix as I wasn't able to reproduce the expected behavior with `image_changed` event.
related PR: https://github.com/odoo/odoo/pull/205594
opw-5245367This update resolves a problem where formatting the user's signature in the email editor could cause multiple 'Read More' links to appear in the chat. The fix ensures that the signature container is correctly marked for quoting, preventing this duplication and maintaining proper email functionality. This was previously addressed in version 19.0.
Original PR description
**Steps to reproduce:** - Go to the current user preferences - Go to its signature field - The current state should be something like: ``` -- Mitchell Admin ``` - Apply bold formatting on the text -…
**Steps to reproduce:** - Go to the current user preferences - Go to its signature field - The current state should be something like: ``` -- Mitchell Admin ``` - Apply bold formatting on the text - Save the changes - Refresh - Remove the bold formatting - Press enter between the two lines (at the end of `--`) - Save the changes - Go to the Contact app - Select any record - Go to its chatter - Click on `Send Message` and then the `Full Composer` expand button - Send the mail - In the chatter multiple `Read More` are added for the same signature (I think it can appears in multiple operations, this is just an example related to the `<strong>` element becoming `<span>` on removal) **Issue:** Playing with the html editor on the signature field can break the `tag_quote` flow due to the added elements. **Fix:** Explicitly add `"data-o-mail-quote"` to the signature container which is added when opening the `fullComposer`. It could also be an issue related to the html_editor but this seems cleaner to fix it here. This issue was fixed in 19.0 in a similar way by adding a common div around the signature and adding the same attribute. related: https://github.com/odoo/odoo/commit/6eb55c42158b08652c4c533bf56b5333c162bd3a opw-5149505
This update streamlines Odoo tests by disabling automatic device detection during testing. Previously, tests were performing unnecessary queries to check device information, slowing down the testing process. This change improves test execution speed and efficiency.
Original PR description
In tests, when using `authenticate`, we create a session. When this session is retrieved (for example because we use `url_open`), we detect a new device and insert a log. The consequence is that a query is performed in many tests and that is not necessary. The fix consists of disabling the `res.device.log` feature by default in tests. task-5894825
This update fixes an issue where the 'Next Booking Start' time was not being displayed correctly for rooms with upcoming bookings. The change removes a filter that prevented the system from considering occupied rooms when calculating availability, ensuring accurate display of the next available time. This improves the user experience when managing room bookings.
Original PR description
Steps to reproduce:
1. Install `room`
2. Create a room.
3. Create a booking for the current time (so the room becomes occupied).
4. Create another booking for tomorrow.
5. Open the list view of rooms.
Current Behavior:
- The `Next Booking Start` field is empty for the created room, despite Having future bookings.
Cause:
- The method `_compute_next_booking_start` filters the rooms using `self.filtered('is_available')`. Since the room is currently occupied (due to the active booking), the room is excluded from the query entirely.
Solution:
- Remove the `is_available` filter from the search domain. The next booking start time is now calculated for all rooms, regardless of whether they are currently available or occupied.
opw-5360101
Forward-Port-Of: odoo/enterprise#102129This update fixes an issue where the overtime indicator displayed incorrect hours when employees worked across multiple companies. The fix ensures that the employee's company is correctly considered during timesheet calculations, accurately reflecting actual work hours and preventing inaccurate overtime reporting. This improves the reliability of time tracking data.
Original PR description
Steps to reproduce: ------------------------- 1. Install Timesheets and Time Off. 2. Create an employee and create a Time Off in the past week, then approve it. 3. Open All Timesheets for that employee and observe the overtime indicator. 4. Enable a multi-company environment by creating another company. 5. Remove the `company_id` from the employee’s working schedule (40h/week). Issue: ---------- The overtime indicator shows an incorrect value. It displays 40h instead of the expected 32h. Cause: ---------- Since there is no company defined on the working schedule, `self.company_id.id` becomes False. The actual leave records are linked with the employee’s company, so the search results in an empty recordset. As a result, the employee leave is ignored. Solution: -------------- Take the resource company into account when building the domain, before falling back to the calendar company. opw-5499737
This update corrects a bug where the overtime indicator displayed incorrect hours (40h) when employees worked across multiple companies. The fix ensures that the system correctly considers the employee's company affiliation when calculating overtime, resulting in accurate time tracking across all company setups. This improves the reliability of time reporting.
Original PR description
Steps to reproduce: ------------------------- 1. Install Timesheets and Time Off. 2. Create an employee and create a Time Off in the past week, then approve it. 3. Open All Timesheets for that…
Steps to reproduce: ------------------------- 1. Install Timesheets and Time Off. 2. Create an employee and create a Time Off in the past week, then approve it. 3. Open All Timesheets for that employee and observe the overtime indicator. 4. Enable a multi-company environment by creating another company. 5. Remove the `company_id` from the employee’s working schedule (40h/week). Issue: ---------- The overtime indicator shows an incorrect value. It displays 40h instead of the expected 32h. Cause: ---------- Since there is no company defined on the working schedule, `self.company_id.id` becomes False. The actual leave records are linked with the employee’s company, so the search results in an empty recordset. As a result, the employee leave is ignored. Solution: -------------- Take the resource company into account when building the domain, before falling back to the calendar company. opw-5499737 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This pull request addresses several key issues within the account_edi_ubl_cii module, primarily focusing on ensuring correct export of UBL invoice data according to PEPPOL standards. Specifically, it fixes inconsistencies in `DeliveryParty` node structure, adds support for intrastat commodity codes, and updates allowance charge reasons for improved accuracy and compliance with business expert group requirements.
Original PR description
#### [FIX] account_edi_ubl_cii: `DeliveryParty` export Follow-up to commit 0b3c12670e5f606a36e7d94982656ed998d67322 In the aforementioned commit we added the `DeliveryParty` node under the `Delivery`…
#### [FIX] account_edi_ubl_cii: `DeliveryParty` export
Follow-up to commit 0b3c12670e5f606a36e7d94982656ed998d67322
In the aforementioned commit we added the `DeliveryParty` node under
the `Delivery` tag.
But there are 2 remaining issues with it.
- In BIS 3.0 the `DeliveryParty` tag has only one child `PartyName` (which is mandatory)
https://docs.peppol.eu/poacc/billing/3.0/syntax/ubl-invoice/cac-Delivery/cac-DeliveryParty/
This was done for the version with the new helpers (`account_edi_ubl_cii.use_new_dict_to_xml_helpers`)
but not the version without the helpers.
- For UBL 2.0 the `DeliveryParty` tag was added for the version
without the new helpers but not the version with the helpers.
That is fixed in this commit.
#### [FIX] account_edi_ubl_cii: export intrastat commodity code
Currently we do not export the intrastat commodity code of products.
But a field for it is available after installing `account_intrastat`.
After this commit the intrastat code is exported in the tag
`cac:CommodityClassification/cbc:ItemClassificationCode[@listID="HS"]`.
#### [FIX] account_edi_ubl_cii: update AllowanceChargeReasonCode for EPD
Currently we are using the code `66` ("New outlet discount") as
`AllowanceChargeReasonCode` for early payment discounts.
After this commit we use `64` ("Special agreement") since it seems
more fitting / general.
#### [FIX] account_edi_ubl_cii: BEG test cases: minimal invoice
This commit adds a test corresponding to the test case "Testcase01" / "Minimal invoice"
from the business expert group.
https://efacture.belgium.be/fr/article/business-expert-group-ressources
#### [FIX] account_edi_ubl_cii: BEG test cases: multi-currency
This commit adds the following nodes to the BIS 3.0 XML in case
the document currency is different from the company currency.
- `cbc:TaxCurrencyCode`: gives the company currency (it is supposed to
be the currency in which the taxes for the invoice will be paid)
- A second `cac:TaxTotal` node that only contains a `cbc:TaxAmount` node
giving the total tax amount in company currency / the currency specified
by `cbc:TaxCurrencyCode`.
See here:
- https://docs.peppol.eu/poacc/billing/3.0/bis/#_vat_accounting_currency
Some local formats had this information already. The logic was removed
there. The affected modules were:
- `l10n_anz_ubl_pint`
- `l10n_jp_ubl_pint`
- `l10n_my_ubl_pint`
- `l10n_ro_edi`
See also here:
- https://docs.peppol.eu/poac/aunz/pint-aunz/bis/#_tax_in_accounting_currency
- https://docs.peppol.eu/poac/my/pint-my/bis/#_tax_in_accounting_currency
- https://docs.peppol.eu/poac/sg/2024-Q2/pint-sg/bis/#_invoice_totals_in_gst_accounting_currency
This is in line with the following test cases from the business
expert group. They were added as tests in this commit
(https://efacture.belgium.be/fr/article/business-expert-group-ressources)
- "Testcase 10": "Invoice in USD and EUR vat"
- "Testcase 11": "Invoice in USD and EUR vat and 2021"kkjkkj
#### [FIX] account_edi_ubl_cii: PaymentMeansCode from payment method
Currently the `PaymentMeans/PaymentMeansCode` node is filled
w/o considering the "Preferred Payment Method Line" (`preferred_payment_method_line_id`)
set on the move.
We choose
- for invoices: 30 ('credit transfer') or ZZZ ('mutually
defined') depending on whether a bank account is set.
- for bills: 57 ('standing agreement')
After this commit we use the Code of the Payment Method of the
"Preferred Payment Method Line" to determine the the PaymentMeansCode
We also add the following Payment Methods so that the user has more choices.
- Credit Card
- Debit Card
- Bankgiro
- Standing Agreement
- SEPA Credit Transfer
#### [FIX] account_edi_ubl_cii: BEG test cases: cash discount
Consier a paid invoice for which we granted an early payment discount.
in case the XML is generated after the invoice is paid (discounted amount)
we do not account for that fact in the XML generation.
The total amounts in the `cac:LegalMonetaryTotal` node are not adjusted
- The `cbc:TaxExclusiveAmount` and `cbc:TaxInclusiveAmount` and
`cbc:PrepaidAmount` should reflect the reduced amounts
- This is i.e. problmeatic for the `cbc:PrepaidAmount`. It would show
the total (unreduced) amount of the invoice; more than was actually paid.
In the XML for an unpaid invoice there are
The `cac:AllowanceCharge` node(s) representing the potential early payment discount and
`cac:AllowanceCharge` node(s) raising the total back to the unreduced amount.
In case the early payment discount was applied the latter node(s) can
/ should be removed.
This is in line with "Testcase06" from the business expert group.
(https://efacture.belgium.be/fr/article/business-expert-group-ressources)
The following examples were added as tests in this commit
- "Testcase05": "Cash Discount" (not paid yet)
- "Testcase06": "Discount with cash payment" (XML generated after paid
and epd applied)
#### [FIX] account_edi_ubl_cii: sale order discount as AllowanceCharge
Global discounts from sales orders are just displayed as invoice
lines on the inovice.
Currently they are treated the same as any other invoice lines for
the XML generation.
But they should be displayed as an `AllowanceCharge` instead.
After this commit that is the case.
The `AllowanceCharge` node has
- `AllowanceChargeReasonCode`: `95`
- `AllowanceChargeReason`: `Global discount`
To add a global discount follow theses steps
1. Ensure `sales` is installed
2. Go to Settings -> Sales -> Pricing section and enable "Discounts"
3. On a Quotation / Sale Order there should now be a "Discount"
right above the widget displaying the total amounts.
Click it.
4. Select "Global Discount" and a percentage.
5. A line using a special discount product is added.
6. Click "Create Invoice"
7. The same line is now on the invoice
#### references
task-4885680This update fixes a bug where the VAT (Tax ID) was not correctly displayed in document previews and generated invoices. The issue stemmed from a missing rendering logic in the document layout template. Now, VAT information is accurately reflected in all document layouts.
Original PR description
Steps to reproduce 1. Install `account`. 2. Go to Settings → Configure Document Layout. 3. Enter a value in the Tax ID field. 4. Generate a document (invoice / preview document). Issue Unlike other fields in the document layout, the `Tax ID` value is not updated and does not appear in the document preview. Cause The VAT (Tax ID) rendering logic was missing from the document layout template XML. Solution Add proper logic to display the Tax ID using the company VAT Before: <img width="1089" height="750" alt="image" src="https://github.com/user-attachments/assets/8d27808f-d605-447c-807a-d5f3450eef36" /> After: <img width="1080" height="722" alt="image" src="https://github.com/user-attachments/assets/0af04d77-a318-4e39-9a4b-0911f2446e60" /> opw-5373374
This update fixes an error in the Point of Sale session reports where discount amounts were calculated incorrectly. The fix ensures that discounts are accurately applied based on the correct fiscal position, leading to more reliable financial reporting. This improves the accuracy of sales data.
Original PR description
Steps: ---- - Create a fiscal position with 2 different taxes - Add a line in POS - Apply fiscal position and add line discount - Finish the order cycle - Download the session report Issue: ---- - The discount amount was calculated incorrectly in the session report Cause: ---- - The discount amount calculation used taxes before applying the fiscal position Fix: ---- - Used `tax_ids_after_fiscal_position` for tax calculation while computing the discount amount task-5421215 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug that occurred when generating invoices with multiple tax lines, specifically within the Belgian localization and Peppol integration. The issue stemmed from incorrect aggregation of tax amounts, leading to a division-by-zero error. The fix ensures accurate tax calculations during invoice creation.
Original PR description
Steps: - Belgian localisation - Activate peppol - Have two fixed sales taxes (T1 3.5 and T2 4.5) - Have 4 product: - P1: Any sale price, taxes 21% and T1 - P2: Any sale price, taxes 21% and T2 - P3: sale price 0, taxes 0% and T1 - Create an invoice, with following invoice lines: - P1, quantity 2 - P2, quantity 2 - P3, quantity -4 - Confirm and send it to peppol -> Traceback (ZeroDivisionError) The reason is that we try to extract emptying taxes like "Vidanges" and aggregate them into new base lines, but we treat all these taxes as they are the same but they are not always the same. Therefore we aggregate both price unit and quantity and we try to divide the aggregated price by the aggregated quantity. In our case we end up with a price unit of 2 (9 + 7 - 14) and a quantity of 0 (2 + 2 + -4) which leads to a zero division error. The fix adds a grouping function in order to group the extra lines by taxes before aggregating them. opw-5384928
This update fixes an issue where the description field in the calendar popover was not wrapping text correctly, leading to truncated or overflowing content. The team added the 'text-wrap' class to the calendar view, ensuring descriptions display properly and are fully visible. This enhances the user experience when viewing calendar events.
Original PR description
Changes done: - [x] `calendar`: Add `class="text-wrap"` in the description field of the calendar view to use it in the popover - [x] `web`: Define the appropriate class in the calendar popover field **Before** <img width="548" height="428" alt="antes" src="https://github.com/user-attachments/assets/77060ee6-30a1-47ed-8ba4-d5c2baa33fe3" /> **After** <img width="559" height="627" alt="despues" src="https://github.com/user-attachments/assets/cc9dfb47-3f98-4b5b-80c2-c3e5c15df0b0" /> @Tecnativa TT60670 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
7 changes
Resolved issues and error corrections
This update resolves an issue where salary attachments would display an empty employee field after an employee was archived. The fix ensures that salary attachments accurately reflect employee status, even after archiving, improving data consistency and reporting accuracy. This prevents confusion and ensures correct payroll processing.
Original PR description
Steps To Reproduce: Create a salary attachment for an employee. Archive that employee. The corresponding salary attachment has an empty `Employee`. Issue: `employee_ids` many2many field doesn't take archived records into consideration, So when an employee is archived, it leads to emptying the record. Fix: Add active_test context to field definition and domain to form view of salary attachment so the employee remains on salary attachment and for new record creation, so it doesn't take archived employees. task-5438657
This update fixes an issue where WhatsApp messages to blacklisted numbers wouldn't be blocked if the recipient's country differed from the sender's company country. The fix ensures that all international phone numbers are correctly processed as international (E.164) during blacklist checks, preventing messages from being sent to blocked numbers regardless of location.
Original PR description
Sending a WhatsApp message to a blacklisted number fails to be blocked if the recipient's phone number country differs from the sender company's country. ### Steps to reproduce 1. Configure a…
Sending a WhatsApp message to a blacklisted number fails to be blocked if the recipient's phone number country differs from the sender company's country.
### Steps to reproduce
1. Configure a WhatsApp account.
2. Set the Company's country to Germany (+49).
3. Create a Contact with a Belgian phone number (e.g. +32456001122).
4. Send a template message to this contact.
5. Have the contact reply with "STOP" to opt-out (this correctly adds +32456001122 to the blacklist).
6. Send another message to the contact.
- Expected: The message is blocked.
- Actual: The message is sent successfully.
### Root cause
The blacklist search logic relies on implicit phone number sanitization which behaves incorrectly for international numbers without a `+` prefix.
1. `whatsapp.message` stores numbers as `CountryCode + NationalNumber` without a `+` (e.g. "32456001122").
2. `phone.blacklist` stores numbers in E.164 format with a `+` (e.g. "+32456001122").
3. When searching `phone.blacklist` with "32456001122", the system interprets it as a local number for the Company's country (Germany) because of the missing `+`.
4. It reformats the search term to German E.164 ("+4932456001122").
5. The query fails to match the actual blacklisted number ("+32456001122"), allowing the message to pass.
### Fix
Explicitly prepend a `+` to the recipient's number before searching the blacklist. This forces the validation logic to parse the number as international (E.164), bypassing the company-country bias and ensuring the search term matches the stored blacklisted number.
opw-5401789This update resolves an issue where emails couldn't be sent to applicants who had been archived in the recruitment system. The fix ensures that archived applicants are included in email sending processes, preventing missed communication. This improves the efficiency of the recruitment workflow.
Original PR description
Version: - 17.0 Steps to reproduce: - Create an applicant. - Archive the applicant. - Select the archived applicant. - Click the Send Email action. Issue: - Unable to Send Emails to Refused Applicants Cause: - The applicant_ids many2many field does not include archived applicants. Because of this, when an applicant is archived, the field becomes empty. Solution: - Add active_test to the field context. Task - 5786195
This update ensures Odoo utilizes the latest version (v1.3.3) of the SFU (Server-Side User Interface) bundle. This improves the performance and reliability of key Odoo features related to email and communication, ensuring smoother operation.
Original PR description
https://github.com/odoo/sfu/releases/tag/v1.3.3
This update resolves an issue where enabling tracking on custom HTML fields within invoices caused update failures. The change hides the 'Enable Ordered Tracking' option for these fields, preventing the errors and ensuring data updates function correctly. This improves invoice management stability.
Original PR description
From https://github.com/odoo/odoo/pull/241367#issuecomment-3711040501 Nothing prevent tracking from being enabled on HTML fields, but if it is enabled, updates of the field systematically fail. This commit avoids this error by hiding the "Enable Ordered Tracking" for HTML fields. Steps to reproduce: - Install sale and web_studio - Activate debug mode - Add a custom HTML field inside the invoice form view - Open the "More..." of the field (or go to Settings/Technical/Field) and go to the new field - Set "Enable Ordered Tracking" to 1 - Save - Go to an invoice and modify the new field - Save => An error was displayed task-5236436
This update optimizes how new messages are processed within the Odoo platform. Previously, each tab repeatedly sent channel updates, leading to performance issues and errors. Now, only one tab sends these updates, significantly reducing load and improving overall system performance.
Original PR description
Before this commit, each tab was sending a channel_fetched when receiving a new message. This would result in serialization error on the backend as well as performance reduction in case of high load of messages. After this PR, only one tab will send the `channel_fetched` using the `multi_tab` service. task-5180400 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the web editor would sometimes fail to save changes after applying history. The fix ensures a smoother and more reliable saving process for users editing HTML content within Odoo. This improves the overall user experience and prevents data loss.
Original PR description
backport of https://github.com/odoo/odoo/pull/216370 __ opw-5405048