Daily updates from Odoo
Navigate
Branch
Tuesday, February 3, 2026
237 changes
24 changes
New functionality added to Odoo
This update introduces demo data for the Swiss HR Payroll Localization, enabling easier testing and demonstrations of the payroll functionality. The data includes a sample company, employee, and a year's worth of payslips, providing a realistic scenario for understanding the Swiss payroll process. This supports internal testing and showcases the localization's capabilities.
Original PR description
This commit adds demo data for the Swiss HR Payroll Localization to facilitate testing and demonstration of Swiss payroll. The demo data includes the company setup, employee with relevant details, and 1 year of payslip history for that employee. Task: 5870506 Forward-Port-Of: odoo/enterprise#105872
Enhancements to existing features
This update enhances the user experience by adding a cursor pointer to the headers of statement summaries in the accounting module. This allows users to easily navigate and explore their financial data, improving usability and efficiency.
Original PR description
This improves the user experience by indicating that the headers are clickable. No task ID Forward-Port-Of: odoo/enterprise#105078 Forward-Port-Of: odoo/enterprise#105023
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#103686Documentation and clarification updates
This pull request updates Odoo documentation to reflect a change made by Moduon (MT-13567). It’s a legal update related to their integration, ensuring compliance and clarity for our partnership. This change primarily impacts our documentation and legal agreements.
Original PR description
@moduon MT-13567 Forward-Port-Of: odoo/odoo#246701
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
13 changes
New functionality added to Odoo
This update introduces a new field for 'CPV code' on products, addressing a requirement for B2C invoices in Romania. When enabled, the module now populates the RO-CIUS XML generated for invoices with the specified CPV code, ensuring compliance with local regulations.
Original PR description
In This PR: - We add a new module to add a new field 'CPV code' in the product. - Till now, in Odoo, customers can't input that CPV identification number on products, and the field is always left empty. That's an issue with B2C invoices, where the field is mandatory. - If the module is installed and a product with a CPV category is set on an invoice, we add the value of the CPV code in the RO-CIUS XML generated on an invoice. Task [link](https://www.odoo.com/odoo/project.task/5416833) task-5416833 Forward-Port-Of: odoo/odoo#240219
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#102129Documentation and clarification updates
This pull request updates documentation related to Moduon, a key partner of Odoo. The change is a legal compliance update (CLA) to ensure adherence to Moduon's terms and conditions. This update primarily affects legal and compliance processes within Odoo.
Original PR description
@moduon MT-13567 Forward-Port-Of: odoo/odoo#246701
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
28 changes
New functionality added to Odoo
This update adds sample data for the Swiss HR Payroll Localization, enabling easier testing and demonstration of the payroll functionality. The data includes a company setup, employee details, and a year's worth of payslips, providing a realistic scenario for evaluation.
Original PR description
This commit adds demo data for the Swiss HR Payroll Localization to facilitate testing and demonstration of Swiss payroll. The demo data includes the company setup, employee with relevant details, and 1 year of payslip history for that employee. Task: 5870506 Forward-Port-Of: odoo/enterprise#105872
Enhancements to existing features
This update enhances the 'My Tasks' menu by displaying employee availability – including time off and unavailable periods – regardless of how tasks are grouped. This ensures users always have a clear view of their workload and upcoming absences directly within the 'My Tasks' interface, streamlining task management.
Original PR description
Currently, the unavailabilities (non-working days, time off, public holidays, and periods outside of a work contract) are only displayed if the Gantt view is grouped by users. Of course, we expect someone to know when he/she will be off. They can do it via the "All tasks" menu and filter on their own tasks, but that is the purpose of the "My tasks" menu. In this commit, display the unavailabilities of the current user, even in the case the view is not grouped by users, but only in the context of "My tasks" and not elsewhere. task-5184732
This pull request removes unnecessary functionality related to active tab keynav focus within the VoIP module. The change simplifies the user experience and prevents potential conflicts. It's a minor improvement to the VoIP application.
Original PR description
This is not needed.
This update improves the Helpdesk module by adding an offline searchbar. This change, mirroring a previous development, optimizes the user experience by allowing access to search functionality even without an active internet connection. It’s a minor enhancement focused on usability.
Original PR description
This commit is the enterprise counterpart of https://github.com/odoo/odoo/pull/244531, where we slightly change the kanban controller template (add a `t-elif` after the KanbanRenderer node). This change required an adaptation of the custom kanban controller in helpdesk. Task~244531
This update simplifies how Odoo identifies refund transactions within its accounting modules. Previously, checks for refunds were done with multiple, specific conditions. Now, a new method is added to `account.move` to directly determine if a move represents a refund, improving code clarity and maintainability. This change enhances the accuracy of refund processing across various Odoo localization modules.
Original PR description
Before this commit-
We had methods on `account.move` i.e.
`is_sale_document`, `is_invoice` but
at many instance in the code base,
we did do `self.move_type in ('out_refund', 'in_refund')`
After this commit-
We add new methods on `account.move` to
get and check if the move is refund
task-5850565This update adjusts the inheritance of a template used for displaying sales tax calculations on the website. The change reflects a shift in how the 'o_order_total_taxes' component is managed within the Odoo platform. This ensures accurate and consistent tax display for customers.
Original PR description
"o_order_total_taxes" is now in a different template, so inheritance has been adjusted. See also: - https://github.com/odoo/odoo/pull/229912 task-4805599
This update enhances the system's ability to prevent duplicate Vendor Bills in Colombia by specifically checking for unique CUFE (Electronic Invoice Code) identifiers. Previously, standard partner-based duplicate detection wasn't sufficient for CUFE uniqueness. Now, a warning banner will appear if a duplicate CUFE is found, ensuring accurate record-keeping.
Original PR description
When importing or editing Vendor Bills in Colombia, the CUFE (Electronic Invoice Code) serves as a globally unique identifier. The standard duplicate detection, which relies on the partner, is insufficient for ensuring CUFE uniqueness across the system. This commit overrides the duplicate detection hooks to check for existing bills with the same `l10n_co_edi_cufe_cude_ref`. Functionally, if a duplicate CUFE is detected on a Vendor Bill, the system will populate the `duplicated_ref_ids` field, triggering the standard warning banner on the form view to alert the user. Related Community PR: https://github.com/odoo/odoo/pull/240911 Task-5402480
This update adjusts the maximum NSSF (National Social Security Fund) contribution limits to align with the latest regulations under the NSSF Act 2013. Specifically, the lower and upper earnings limits have been revised, impacting the total combined contribution a business can make. This ensures compliance with Kenyan tax laws.
Original PR description
This commit updates the NSSF Lower and Upper Earnings Limits in accordance with the 4th year of implementation of the NSSF Act 2013. - Set Lower Earnings Limit (Tier 1) to 9,000. - Set Upper Earnings Limit (Tier 2) to 108,000. - Resulting max combined contribution is now 6,480. Task: 5485002 Forward-Port-Of: odoo/enterprise#105019
This update clarifies the Professional Tax deduction on employee contracts by updating the tooltip and renaming the field label. This change improves user understanding and reduces potential confusion when configuring payroll settings.
Original PR description
Purpose: - Improve clarity and understanding of the Professional Tax deduction on the employee contract by providing a more descriptive tooltip and a clearer label. This PR includes: - Updated the Professional Tax tooltip to better understanding. - Renamed the field label from 'Professional Tax Slab' to 'Professional Tax'. task-5890446
This update clarifies the naming of a key field in our subscription tracking system. The 'Subscription State' column has been renamed to 'State Before' to provide a more intuitive understanding of the subscription's status at the time of an event. This change improves readability and reduces potential confusion for users.
Original PR description
The sale.order.log model includes a field named subscription state that records the state of the subscription at the moment an event occurs (i.e., the state before the change). To improve clarity for end users, this PR renames the column from Subscription State to State Before. task-5258195
This update enhances the Odoo POS system by allowing automatic SMS and WhatsApp notifications to customers regarding order status updates – from initial placement to completion. This improves customer communication and provides real-time updates, leading to a better customer experience and potentially increased sales.
Original PR description
… to warn the client about order status This task aims to provide a solution for communicating the status of various customer orders. Now, the POS can send an SMS or a WhatsApp message when an order at the self-service is placed, either through WhatsApp, SMS, or both. When the order is completed, the customer can also be notified. task : 5246552 community pr : https://github.com/odoo/odoo/pull/235389 Forward-Port-Of: odoo/enterprise#99318
This update aligns the TDS XLSX report with the official utility format, ensuring accurate tax documentation. By fetching partner information from AML records, the report now correctly handles miscellaneous entries, resolving a previous issue with formatting. This improves the reliability of tax reporting.
Original PR description
This commit aligns the TDS XLSX report with the official TDS utility format. Additionally, We now fetch the partner from AML record, so even miscellaneous entries generate a correctly formatted XLSX sheet. task-5237518 Forward-Port-Of: odoo/enterprise#106016 Forward-Port-Of: odoo/enterprise#104753
This update enables smaller Odoo users to connect to Shopee, a popular e-commerce platform, by utilizing the IAP service. The changes include a simplified user interface replacing the 'Shopee Account' menu with 'Shopee Shop' and supporting the IAP credential requirement for Shopee API access.
Original PR description
This is a new feature of Shopee Connector. Shopee has a minimum order requirement for sellers to apply for an API key, which small sellers cannot apply for an API key. This commit: - Enables using Shopee Connector with Odoo API credential via IAP service. - Shopee Account menu is replaced by Shopee Shop to improve UX. task id - 5022010
This update enhances the user experience by adding a cursor pointer to the headers of statement summaries in the accounting module. This allows users to easily navigate and explore their financial reports, making the system more intuitive and efficient.
Original PR description
This improves the user experience by indicating that the headers are clickable. No task ID Forward-Port-Of: odoo/enterprise#105078 Forward-Port-Of: odoo/enterprise#105023
This update streamlines the display of IM status and thread icons on avatars across Odoo. By introducing a new component, the team has reduced maintenance and improved UI consistency, ensuring a more reliable and visually appealing user experience for all users.
Original PR description
*: planning_holidays, voip, whatsapp Before this commit, IM status and thread icon were used a lot as bottom-right floating icon on a conversation or user avatar. Each context that wanted this visual…
*: planning_holidays, voip, whatsapp Before this commit, IM status and thread icon were used a lot as bottom-right floating icon on a conversation or user avatar. Each context that wanted this visual of avatar + floating icon had to craft by hand the avatar sizing and icon position, which has many drawbacks: - image and icon sizing and positioning needs manual tweak in each context, requiring lots of effort. - very-prone to inconsistencies due to high maintenance to make each context work. Current state had many inconsistencies. - handling of mask of floating icon is poor, with `.bg-inherit` on parented chainng that is hard to enforce and in some cases, just don't work at all This commit improves by introducing a new component `DiscussAvatar`, that accepts `channel`, `thread`, channel's `member` or `persona` to display avatar and conversation / person icon in the bottom-right corner. This new component has the following benefits: - one component to handle all the cases of conversation / person avatar with floating icon / im status, drastically reducing maintenance effort and increasing significantly UI consistency. - new technique to mask image with floating icon that works all the time thanks to the use of `SVG`'s mask. Part of Task-5867464 https://github.com/odoo/odoo/pull/246182
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#103686Code cleanup and technical improvements
This update enhances our stock testing process by introducing a dedicated company within the tests. This ensures more consistent and reliable test results, ultimately improving the stability and accuracy of the Odoo Enterprise stock module.
9 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
13 changes
New functionality added to Odoo
This update introduces a new field for 'CPV code' on products within Odoo, addressing a requirement for B2C invoices in Romania. The module now allows users to input this code, which is then included in the RO-CIUS XML generated for invoices, ensuring compliance with local regulations. This change improves data accuracy for Romanian business transactions.
Original PR description
In This PR: - We add a new module to add a new field 'CPV code' in the product. - Till now, in Odoo, customers can't input that CPV identification number on products, and the field is always left empty. That's an issue with B2C invoices, where the field is mandatory. - If the module is installed and a product with a CPV category is set on an invoice, we add the value of the CPV code in the RO-CIUS XML generated on an invoice. Task [link](https://www.odoo.com/odoo/project.task/5416833) task-5416833 Forward-Port-Of: odoo/odoo#240219
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
Documentation and clarification updates
This pull request updates Odoo to reflect changes made by Moduon (MT-13567). The update primarily involves documentation adjustments to ensure proper integration and compliance with Moduon's requirements. This ensures continued smooth operation of the Moduon-related features within Odoo.
Original PR description
@moduon MT-13567 Forward-Port-Of: odoo/odoo#246701
5 changes
New functionality added to Odoo
This update adds a new field for 'CPV' (Common Procurement Vocabulary) codes to products within the Odoo system. This is required for B2C invoices in Romania, ensuring accurate reporting and compliance with local regulations. The module automatically adds the CPV code to the RO-CIUS XML generated for invoices when the module is active.
Original PR description
In This PR: - We add a new module to add a new field 'CPV code' in the product. - Till now, in Odoo, customers can't input that CPV identification number on products, and the field is always left empty. That's an issue with B2C invoices, where the field is mandatory. - If the module is installed and a product with a CPV category is set on an invoice, we add the value of the CPV code in the RO-CIUS XML generated on an invoice. Task [link](https://www.odoo.com/odoo/project.task/5416833) task-5416833
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