Daily updates from Odoo
Navigate
Branch
Wednesday, December 10, 2025
217 changes
14 changes
Resolved issues and error corrections
This update fixes a visual bug where clicking the shape selector caused unwanted scrolling in smaller browser windows. The fix prevents the entire viewport from scrolling, resulting in a cleaner user experience. The change ensures consistent appearance across different screen sizes.
Original PR description
**Description of the problem** If the browser window has a limited height, clicking on a shape category in the shape selector scrolls both the shape selector pager (wanted) and the full viewport (not…
**Description of the problem** If the browser window has a limited height, clicking on a shape category in the shape selector scrolls both the shape selector pager (wanted) and the full viewport (not wanted), leading to white bands appearing at the bottom of the viewport. **How to reproduce** 1. Drop `s_picture` snippet 2. Open the background shape selector 3. Reduce the window height until only ~4 rows of shapes are visible 4. Click on "Linear" or "Creative" category 5. BUG: the viewport scrolled **Why the problem happens** When a shape category in the shape selector is clicked, the function `scrollIntoView` is used to bring the first shape of that category into view. By default, `scrollIntoView` scrolls all ancestor scroll-containers (and possibly the viewport) until the desired element is visible. This means that in specific situations the viewport could scroll too. **Fix** The function `scrollIntoView` should support the option `container: "nearest"`, which would force only the first scroll-container to scroll, avoiding scrolling the viewport. However, at the moment this option is not widely supported across browsers [1]. Thus `scrollIntoView` has been removed and its behaviour has been replicated by changing the `scrollTop` property of the `ShapeSelector` scroll-container. [1]: https://caniuse.com/mdn-api_element_scrollintoview_options_parameter_container_option task-5262945
This update fixes a bug where customers could select past time slots when ordering through the self-order system. Now, the system only displays available time slots for the current day, ensuring accurate order scheduling and preventing confusion for customers. This improves the overall ordering experience.
Original PR description
Task: [#5365003](https://www.odoo.com/odoo/project/1737/tasks/5365003) --- before this commit selecting a time slot in self-order, the customer can still pick time slots that are already in the past. For example, if the current time is 14:05, the system still allows selecting 12:00, 12:20, 13:00, etc. This should not be possible. When choosing a pickup time for today, all time slots earlier than the current time should not be generated Forward-Port-Of: odoo/odoo#238416 Forward-Port-Of: odoo/odoo#237923
This update resolves an issue where freezing a spreadsheet with empty lists didn't accurately represent the data. Specifically, the system incorrectly reported empty lists as containing text. This change ensures that frozen spreadsheets accurately reflect the absence of data, improving spreadsheet reliability and data consistency.
Original PR description
Steps to reproduce: - insert a list - expand the list beyond the number of records in order to have ODOO.LIST with no result - add =ISTEXT( <a reference to an empty ODOO.LIST> ) -> the result is TRUE - Freeze and share the spreadsheet => the result of ISTEXT is FALSE in the frozen version task-5360561 opw-5359100 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#237970 Forward-Port-Of: odoo/odoo#237511
This update resolves an issue where the system incorrectly processed invoice sequences without spaces, leading to errors. The change uses a more flexible method to extract the invoice number, ensuring compatibility with various sequence formats (including those without spaces). This prevents errors and improves the reliability of the CL-EDI functionality.
Original PR description
Before this commit, the method `_get_last_sequence` assumed that the document sequence always contained a space separator (e.g., "INV 12345") It attempted to extract the folio number using `res.split(" ")[-1]`.
If the sequence format did not contain a space, such as the standard Odoo format `INV/2025/01234`, the split would return the entire string. This caused a `ValueError` when trying to cast the non-numeric string to an integer:
ValueError: invalid literal for int() with base 10: 'INV/2025/01234'
This commit fixes the issue by using a regular expression to extract the last group of digits from the sequence string. This ensures the folio number is correctly retrieved regardless of the separator used (slash, space, or hyphen).
opw-5401509
Forward-Port-Of: odoo/enterprise#101665This update fixes an issue where invoice totals weren't updating correctly after changing the product or unit price. The original system had a logic error that prevented the totals from recalculating properly. The fix reorders the calculation process to ensure the product's price is used, leading to accurate totals displayed on invoices.
Original PR description
**Steps to reproduce:** - Install Accounting - Create an invoice with an invoice line - Save the invoice - Change the unit price => The totals should change - Change the product => The unit price and…
**Steps to reproduce:** - Install Accounting - Create an invoice with an invoice line - Save the invoice - Change the unit price => The totals should change - Change the product => The unit price and the totals should change - Change the unit price again **Issue:** After this point, the totals don't change anymore, even if the unit price is changed several times. Only saving the form will adapt the totals correctly. **Cause:** When changing the unit price the first time, a "price_unit "key is added in the onchange values. When changing the product, a "product_id" key is added after the price key. Changing the product triggers an onchange of the price with the price of the new product. However, when the price is changed again, as the "price_unit" key already exists, it's reused and its position is still before "product_id" key even if it should be computed after. This order results in the use of the price of the second product instead of the one entered manually when computing the "tax_totals". **Solution:** If "product_id" and "price_unit" are the values of the onchange method, the list of values is reordered to make sure that "product_id" is computed first. opw-5012125 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239110 Forward-Port-Of: odoo/odoo#232684
This update corrects a display issue on the Odoo portal where users were seeing outdated document counts. Now, users only see documents that are currently in their signing sequence, ensuring a more accurate and user-friendly experience. This improves clarity and prevents confusion for users managing sequential documents.
Original PR description
Version: - 18.0 Steps to reproduce: - Install sign - Upload document. - Add multiple signers - Set a sequential signing order Issue: - When documents require sequential signing, portal users see a banner saying there’s a new document to sign, even if it’s not yet their turn. Solution: - Update the counter to show only the documents that the user can currently sign. Impact: - Portal users now only see documents when it’s their turn to sign. Task-5226240 Forward-Port-Of: odoo/enterprise#98671
This update resolves an issue where AvaTax processes would fail if orders were created without any associated lines. This prevented correct tax calculations and reporting, often requiring manual intervention. The fix ensures that AvaTax only processes orders with at least one line item.
Original PR description
Calling Avatax without lines results in an error and blocks flows: ``` Odoo could not fetch the taxes related to MXXX - SOXXX/XXX. Please check the status of `Sales Order XXX` in the AvaTax portal.…
Calling Avatax without lines results in an error and blocks flows: ``` Odoo could not fetch the taxes related to MXXX - SOXXX/XXX. Please check the status of `Sales Order XXX` in the AvaTax portal. Transactions must have at least one line. ``` There are various cases this can happen: 1/ if `industry_fsm_stock` is installed, empty orders are confirmed [1], 2/ if you put the `end_date` of a subscription before the `next_invoice_date`, then none of the lines are considered invoiceable [2] and you get the error when viewing the subscription in the portal This commit filters out orders without lines. It's also possible to filter this on the level of the models by doing it in `_get_and_set_external_taxes_on_eligible_records()`. However, this means doing it separately for each model, and requires every implementer do it manually. [1] https://github.com/odoo/enterprise/blob/703e7fd413e93a8287da98286aa93b9699ae3e96/industry_fsm_stock/models/project_task.py#L159 [2] https://github.com/odoo/enterprise/blob/c7bf4367a9bf6757a36a9f34a872a6e35a19a3a5/sale_subscription/models/sale_order_line.py#L475 opw-5214609 opw-5247727 opw-5311132 opw-5385960
A technical issue in the Accounting module prevented users from opening a specific Studio menu item, resulting in a confusing traceback. This fix replaces the error with a clear message, guiding users to properly filter their views and ensuring a smoother user experience. This improves usability and prevents data access problems.
Original PR description
**Steps to reproduce:** * Install **Accounting** and ensure Studio is available. * Using **Studio**, create a new menu item pointing to the model *account.code.mapping*. * Save the menu and click it to open the corresponding view. **Observed behavior:** * Opening the Studio-created menu triggers a full traceback. **Cause:** * The model *account.code.mapping* overrides `_search()` and raises `NotImplementedError` when no `account_ids` can be extracted from the domain, which is the case when opening the view without filters. * The missing `_search` logic for empty domains was never implemented, and the resulting exception propagates to the UI as a traceback. **Fix:** * Replace the `NotImplementedError` with a user-friendly `UserError` explaining that the view cannot be opened without specifying relevant filters, preventing the traceback and improving clarity. opw-5183909 Forward-Port-Of: odoo/odoo#239076 Forward-Port-Of: odoo/odoo#236665
This update resolves an issue where the Envia Shipping module would fail to calculate shipping rates if a customer's address information (country, state, city) was incomplete. The fix ensures that the system handles missing address data gracefully, preventing errors and allowing users to accurately obtain shipping quotes.
Original PR description
Currently, an error is raised when trying to fetch the shipping rate if the partner does not have the required geolocation fields (country, state, and city). **Steps to Reproduce:** 1. Install and…
Currently, an error is raised when trying to fetch the shipping rate if the partner does not have the required geolocation fields (country, state, and city). **Steps to Reproduce:** 1. Install and configure the **Envia Shipping** module. 2. Create a partner without an address (only name + phone). 3. Create quotation for that partner with a deliverable product (e.g; Conference Chair). 4. Click "**Add Shipping**", choose _Envia Shipping_ Method, and then click "**Get Rate**". **Error:** `TypeError - quote_from_bytes() expected bytes` **Cause:** At [1], the system tries to compute Envia shipping rates based on the partner’s country, state, and city. If any of these fields are not set, an error is raised. **Fix:** This commit adds a check for the required fields (country, state, and city). If any are missing, `_geolocate_zip` returns False, leading to a proper validation error instead of a traceback. - [2] [1] - https://github.com/odoo/enterprise/blob/f1a02626a1fbe76add104832e151c647307f3ae7/delivery_envia/models/envia_request.py#L591-L593 [2] - https://github.com/odoo/enterprise/blob/f1a02626a1fbe76add104832e151c647307f3ae7/delivery_envia/models/envia_request.py#L617-L624 sentry-7063870478 Forward-Port-Of: odoo/enterprise#100734
This update adds a new account for 'Salaries & Wages Payable' within the Hong Kong localization (l10n_hk) for Odoo. This resolves a previous accounting error and ensures accurate payroll reporting under Hong Kong's NET rules, improving financial accuracy.
Original PR description
Adds a new Salaries & Wages Payable account of type current liabilities in order to use it in payroll for the NET rules and solve a misconfiguration in the default data. task-5042786 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237884
This update resolves an issue in the Hong Kong payroll module by changing the default account used for net salary payments. The change ensures accurate payslip generation and payment processing, addressing a previous error that caused payment problems. The new 'Salaries & Wages Payable' account is now used across most payroll structures.
Original PR description
Fixes the default account for NET salary rules in the Hong Kong payroll, which is using the wrong account type and causes issues when trying to pay payslips. It is replaced by a new Salaries & Wages Payable account, and we also set it for the structures other than 'Monthly Pay' task-5042786 Forward-Port-Of: odoo/enterprise#100835
This update corrects a bug in the loyalty program where rewards weren't being applied when using 'not ilike' product domains. The fix ensures that the system correctly interprets and applies reward rules based on product categories, regardless of whether the domain uses 'ilike' or 'not ilike'.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Create a loyalty program; 2. Create a reward; 3. Add a Product domain to the reward containing the `not ilike` operator; 4. Load the POS; 5. Try to trigger…
Versions
--------
- 18.0+
Steps
-----
1. Create a loyalty program;
2. Create a reward;
3. Add a Product domain to the reward containing the `not ilike` operator;
4. Load the POS;
5. Try to trigger the Loyalty program;
6. The Reward is not applied when the domain is satisfied
Issue
-----
Loyalty Program rewards containing `not ilike`-based product domains are not applied when they should.
Cause
-----
The `_replace_ilike_with_in` function in loyalty_reward.py converts the `ilike` and `not ilike` operators by first fetching the records that very the domain with the operator used, and then by replacing the domain by `in` or `not in` with the returned records ids. This is problematic as in the case of `not ilike`, it leads to a double negation.
Example
-----
For `ilike`: `['categ_id', 'ilike', 'service']`
-> Search for all categories that contain "service": `_search([('display_name', 'ilike', 'service')])`
-> Return new domain `['categ_id', 'in', matching_ids]`
Which is correct.
For `not ilike`: `['categ_id', 'not ilike', 'service']`
-> Search for all categories that **do not contain** "service": `_search([('display_name', 'not ilike', 'service')])`
-> Return new domain `['categ_id', 'not in', matching_ids]`
Which is incorrect, as the matching_ids are already the ids that are not like "service". (i.e., *categ_id not in the categories that do not contain "service"* <=> *categ_id in the categories that contain "service"*, opposite of what is expected.)
Solution
--------
1. Perform the initial search with `ilike` for both operators
opw-5182818
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#235656This update clarifies the documentation for the HTML Editor's position plugin, ensuring developers have a better understanding of its functionality. The change improves clarity and reduces potential confusion when using this key component of the HTML Editor. This is a routine documentation update.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239168
This update addresses a change in Facebook's data reporting, specifically the deprecation of the audience trend metric. The team quickly implemented a workaround using total page follows to maintain accurate tracking of page growth. This ensures continued visibility into page performance for our business clients.
Original PR description
Bug === Facebook deprecated some of the endpoints related to statistics https://developers.facebook.com/docs/platforminsights/page/deprecated-metrics We fixed all metric except the audience trend,…
Bug === Facebook deprecated some of the endpoints related to statistics https://developers.facebook.com/docs/platforminsights/page/deprecated-metrics We fixed all metric except the audience trend, because we needed a fix rapidly, and we wasn't sure about unfollow. And indeed, `page_daily_follows` only count for positive value, unlike the old `page_fan_adds` / `page_fan_removes`, and there's no equivalent of `page_fan_removes`... Example of data for a month: ``` page_follows 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 page_daily_follows 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 page_follows 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 page_daily_follows 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ``` So we now use `page_follows`, so the total value at a given time, and we look for the newest and oldest value (note that if we could do the same for `page_post_engagements`, then we could just make 2 APIs calls for the year stat). Task-5353390 Forward-Port-Of: odoo/enterprise#101625 Forward-Port-Of: odoo/enterprise#100275
28 changes
Enhancements to existing features
This update enables users to send multiple attachments when sending invoices through the Peppol network. These attachments are now embedded within the invoice XML file using a standard ‘AdditionalDocumentReference’ tag, streamlining the process for exchanging documents with Peppol partners. This improves efficiency and compliance for international transactions.
Original PR description
[IMP] account: multiple embed files peppol This commit allows user to send multiple attachments through peppol. The attachments will be embedded into the xml under the `AdditionalDocumentReference` tags task-5103539 Forward-Port-Of: odoo/odoo#238662 Forward-Port-Of: odoo/odoo#234339
This update introduces a new process to automatically upload attachment files to cloud storage. It's triggered by a manual cron job, ensuring attachments larger than a specified size and meeting certain criteria are securely stored in the cloud. This improves storage efficiency and backup capabilities.
Original PR description
This commit provides a cron job to migrate attachment binary to the cloud storage. The cron job is designed to be manually triggered from by the "Run Manually" button of the Scheduled Action's form…
This commit provides a cron job to migrate attachment binary to the
cloud storage. The cron job is designed to be manually triggered from
by the "Run Manually" button of the Scheduled Action's form view.
The cron job will try to upload some attachments once
1. size is greater than the minimum upload file size defined by
(ir.config_parameter: cloud_storage_min_file_size)
2. id is greater than the number defined by
(ir.config_parameter: cloud_storage_migration_min_attachment_id)
3. res_model is in a white list
(ir.config_parameter: cloud_storage_migration_message_models)
(ir.config_parameter: cloud_storage_migration_all_models)
4. not used by documents.document
optional configurations to avoid timeout issues
- cloud_storage_migration_max_file_size:
max bytes for each migrated attachment
- cloud_storage_migration_max_batch_file_size:
max total bytes for migrated attachments in one cron job execution
The cloud_storage_migration_min_attachment_id which can be accessed
from the list view can be treated as the progress of the cron job.
Manually setting it to 0 and retriggering the cron job will retry the
upload process for previously failed or ignored attachments.
taskid: 5387110
Steps
1. install a cloud storage module (cloud_storage_google, cloud_storage_azure)
2. install the cloud storage migration module (cloud_storage_migration)
3. Go to Settings for Cloud Storage Settings <img width="505" height="206" alt="image" src="https://github.com/user-attachments/assets/d72d7b52-5ce7-4209-8645-4a8ac35dd049" />
4. [Configure the cloud storage settings](https://www.odoo.com/documentation/19.0/applications/general/integrations/cloud_storage.html)
5. Setting the Minimum File Size. Attachments smaller than the size won't be uploaded to the cloud storage <img width="457" height="96" alt="image" src="https://github.com/user-attachments/assets/8dc4e6fe-9c84-44f5-a83a-28c7b2fad30a" />
6. After 4, configure settings for the cloud storage migration
a. <img width="464" height="209" alt="image" src="https://github.com/user-attachments/assets/37352453-ff0e-4e03-a4d5-7fdb8168dee1" />
b. Cron Job:
i. the link to the cloud storage migration cron job
ii. the cron job is designed to be a job only triggered by clicking "Run Manually".
iii. It will re-trigger itself until all relevant attachments are migrated.
c. Parameters:
<img width="882" height="571" alt="image" src="https://github.com/user-attachments/assets/9926ed9f-81ac-4917-b759-872ed2584217" />
d. Progress Bar:
i.progress of the migration job
ii. calculated by `cloud_storage_migration_min_attachment_id / cloud_storage_migration_max_attachment_id`
e. Attachment Report:
i. <img width="1907" height="298" alt="image" src="https://github.com/user-attachments/assets/33a77835-c6b6-4bc4-b20a-4ec68acba783" />
ii. a view to help administrator analyze which model's attachments should be migrated
iii. help to configure step 6.c.i.4 and step 6.c.i.5
f. Message Attachments
i. help to configure step 6.c.i.4
g.All attachments
i. help to configure step 6.c.i.5
7. Click Cron Job and then Click Run Manually
<img width="409" height="123" alt="image" src="https://github.com/user-attachments/assets/f60cdfcf-e6a6-4503-87fc-0be7f14ceede" />
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#238928
Forward-Port-Of: odoo/odoo#235745Resolved issues and error corrections
This update corrects an issue where the payment term line name wasn't updated when changing the 'Customer Reference' on an invoice. The fix addresses a technical detail within the invoicing system, ensuring consistent and accurate naming of payment terms across invoices. This improves data clarity and reduces potential errors.
Original PR description
### Issue: When changing the "Customer Reference" on an invoice, the name of the payment term line is not updated. ### Steps to reproduce: - Create an invoice with payment terms, confirm it - Modify…
### Issue:
When changing the "Customer Reference" on an invoice, the name of the payment term line is not updated.
### Steps to reproduce:
- Create an invoice with payment terms, confirm it
- Modify its "Customer Reference" to 'test' for example
- In the page "Journal Items" the name of the terms line has been recomputed to "test - INV/2025/XXXXX"
- Modify again its "Customer Reference" to 'abcdef' for example
- In the page "Journal Items" the name of the terms line was not recomputed
### Cause:
In `_compute_name()` we only write the name if this condition is `True`:
```py
if n_terms > 1 or not line.name or line._origin.name == line._origin.move_id.payment_reference or (
line._origin.move_id.payment_reference and line._origin.move_id.ref
and line._origin.name == f'{line._origin.move_id.ref} - {line._origin.move_id.payment_reference}'
):
line.name = name
```
The purpose of this line is to keep the name of the line if it was manually inputted. So the logic is: we only write the computed name if the previous name was computed. To check this, we check if `line._origin.name == f'{line._origin.move_id.ref} - {line._origin.move_id.payment_reference}'`.
The issue comes from the use of `_origin` in a compute. `_origin` refers to the record before we make any change. But it is meant to be used for `onchange` methods, in these the values are not yet written so `_origin` refers to the record before saving.
Here, when saving, `line._origin` is the same as `line`, so
- `line._origin.move_id.ref` is the new ref.
- `line._origin.name` uses the old ref (it's currently being recomputed).
### Solution:
Unfortunately, in the compute, there are no trace left of what were the previous values as the write already occurred.
The initial complaint justifying to keep custom line names was that on bills, the line name is empty. So when inputting a custom line name, it was removed by the compute method. The previous fix wanted to be more general by always keeping custom line names.
Considering this, this commit removes part of the previous fix: Now we only keep the custom line name when the compute method wants to remove it. So we keep the previous fix for bills.
### Note
There was a test verifying exactly that when manually deleting the line name, in the end
the line does not have a name. This will no longer be the case but a decision must be made between:
1. updating the line name when changing the ref
2. not recomputing line name when it has been changed manually
3. removing the line name when it's manually deleted
We can have 2 and 3 but not with 1 afaik.
opw-5246917
Forward-Port-Of: odoo/odoo#237710This update addresses a requirement for Swiss payroll reporting (ELM transmission) by adding a specific group to the teleworking field in the HR contract and employee modules. This ensures accurate data is sent to the tax authorities, complying with Swiss regulations and avoiding potential reporting errors. The change was implemented as a fix to a previously identified issue.
Original PR description
Forward-Port-Of: odoo/enterprise#101691
This update resolves an issue where the system incorrectly processed invoice sequences without spaces, leading to errors. The change utilizes a regular expression to reliably extract the folio number regardless of the sequence format (space, slash, or hyphen), ensuring accurate invoice processing. This improves data integrity and prevents potential errors related to invoice generation.
Original PR description
Before this commit, the method `_get_last_sequence` assumed that the document sequence always contained a space separator (e.g., "INV 12345") It attempted to extract the folio number using `res.split(" ")[-1]`.
If the sequence format did not contain a space, such as the standard Odoo format `INV/2025/01234`, the split would return the entire string. This caused a `ValueError` when trying to cast the non-numeric string to an integer:
ValueError: invalid literal for int() with base 10: 'INV/2025/01234'
This commit fixes the issue by using a regular expression to extract the last group of digits from the sequence string. This ensures the folio number is correctly retrieved regardless of the separator used (slash, space, or hyphen).
opw-5401509
Forward-Port-Of: odoo/enterprise#101665This update corrects a technical issue that was preventing the generation of WPS payroll reports. The fix resolves traceback errors caused by an incorrect function usage, ensuring accurate report creation for Saudi Arabia. This improves the reliability of payroll reporting.
Original PR description
this commit addresses traceback errors occured due to incorrect usage of `_` function. task-5310946 Forward-Port-Of: odoo/enterprise#99789
This update resolves a bug where invoice totals weren't correctly updating after changing the unit price or product. The fix reorders the calculation logic to ensure the product's price is used accurately, leading to correct total calculations. This improves invoice accuracy and reliability.
Original PR description
**Steps to reproduce:** - Install Accounting - Create an invoice with an invoice line - Save the invoice - Change the unit price => The totals should change - Change the product => The unit price and…
**Steps to reproduce:** - Install Accounting - Create an invoice with an invoice line - Save the invoice - Change the unit price => The totals should change - Change the product => The unit price and the totals should change - Change the unit price again **Issue:** After this point, the totals don't change anymore, even if the unit price is changed several times. Only saving the form will adapt the totals correctly. **Cause:** When changing the unit price the first time, a "price_unit "key is added in the onchange values. When changing the product, a "product_id" key is added after the price key. Changing the product triggers an onchange of the price with the price of the new product. However, when the price is changed again, as the "price_unit" key already exists, it's reused and its position is still before "product_id" key even if it should be computed after. This order results in the use of the price of the second product instead of the one entered manually when computing the "tax_totals". **Solution:** If "product_id" and "price_unit" are the values of the onchange method, the list of values is reordered to make sure that "product_id" is computed first. opw-5012125 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239110 Forward-Port-Of: odoo/odoo#232684
This update corrects a display issue on the Odoo portal where users were seeing outdated document counts. Now, the portal only shows documents that are currently in the user's signing sequence, ensuring a more accurate and user-friendly experience. This improves clarity and prevents confusion for users managing sequential signatures.
Original PR description
Version: - 18.0 Steps to reproduce: - Install sign - Upload document. - Add multiple signers - Set a sequential signing order Issue: - When documents require sequential signing, portal users see a banner saying there’s a new document to sign, even if it’s not yet their turn. Solution: - Update the counter to show only the documents that the user can currently sign. Impact: - Portal users now only see documents when it’s their turn to sign. Task-5226240 Forward-Port-Of: odoo/enterprise#98671
A technical issue in the Accounting module prevented users from opening a Studio-created menu item linked to the account.code.mapping model, resulting in a confusing traceback. This fix replaces the error with a clear message, improving the user experience and preventing technical issues when accessing this feature.
Original PR description
**Steps to reproduce:** * Install **Accounting** and ensure Studio is available. * Using **Studio**, create a new menu item pointing to the model *account.code.mapping*. * Save the menu and click it to open the corresponding view. **Observed behavior:** * Opening the Studio-created menu triggers a full traceback. **Cause:** * The model *account.code.mapping* overrides `_search()` and raises `NotImplementedError` when no `account_ids` can be extracted from the domain, which is the case when opening the view without filters. * The missing `_search` logic for empty domains was never implemented, and the resulting exception propagates to the UI as a traceback. **Fix:** * Replace the `NotImplementedError` with a user-friendly `UserError` explaining that the view cannot be opened without specifying relevant filters, preventing the traceback and improving clarity. opw-5183909 Forward-Port-Of: odoo/odoo#239076 Forward-Port-Of: odoo/odoo#236665
This update fixes an error that occurred when calculating shipping rates for partners without complete address information (country, state, and city). The change ensures the system handles missing location data gracefully, preventing errors and allowing users to accurately obtain shipping quotes. This improves the reliability of the Envia Shipping module.
Original PR description
Currently, an error is raised when trying to fetch the shipping rate if the partner does not have the required geolocation fields (country, state, and city). **Steps to Reproduce:** 1. Install and…
Currently, an error is raised when trying to fetch the shipping rate if the partner does not have the required geolocation fields (country, state, and city). **Steps to Reproduce:** 1. Install and configure the **Envia Shipping** module. 2. Create a partner without an address (only name + phone). 3. Create quotation for that partner with a deliverable product (e.g; Conference Chair). 4. Click "**Add Shipping**", choose _Envia Shipping_ Method, and then click "**Get Rate**". **Error:** `TypeError - quote_from_bytes() expected bytes` **Cause:** At [1], the system tries to compute Envia shipping rates based on the partner’s country, state, and city. If any of these fields are not set, an error is raised. **Fix:** This commit adds a check for the required fields (country, state, and city). If any are missing, `_geolocate_zip` returns False, leading to a proper validation error instead of a traceback. - [2] [1] - https://github.com/odoo/enterprise/blob/f1a02626a1fbe76add104832e151c647307f3ae7/delivery_envia/models/envia_request.py#L591-L593 [2] - https://github.com/odoo/enterprise/blob/f1a02626a1fbe76add104832e151c647307f3ae7/delivery_envia/models/envia_request.py#L617-L624 sentry-7063870478 Forward-Port-Of: odoo/enterprise#100734
This update clarifies the documentation for the HTML Editor's position plugin, ensuring developers understand how to use and configure it correctly. The change improves clarity and reduces potential confusion, leading to smoother development and integration of the HTML Editor feature. This is a minor documentation update.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239168
This update adds a new account for 'Salaries & Wages Payable' within the Odoo accounting system for Hong Kong (l10n_hk). This resolves a previous misconfiguration and ensures accurate tracking of payroll liabilities under Hong Kong's NET tax rules. It improves the reliability of payroll reporting and compliance.
Original PR description
Adds a new Salaries & Wages Payable account of type current liabilities in order to use it in payroll for the NET rules and solve a misconfiguration in the default data. task-5042786 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237884
This update resolves an issue in the Hong Kong payroll module by changing the default account used for NET salary payments. The change ensures accurate payslip generation and avoids payment problems. A new 'Salaries & Wages Payable' account has been implemented for broader compatibility.
Original PR description
Fixes the default account for NET salary rules in the Hong Kong payroll, which is using the wrong account type and causes issues when trying to pay payslips. It is replaced by a new Salaries & Wages Payable account, and we also set it for the structures other than 'Monthly Pay' task-5042786 Forward-Port-Of: odoo/enterprise#100835
This update corrects a bug in the loyalty program's reward system. Previously, rewards weren't triggered when using 'not ilike' product domains, due to a double negation issue. This change ensures that rewards are correctly applied based on product exclusions, improving the functionality of the loyalty program.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Create a loyalty program; 2. Create a reward; 3. Add a Product domain to the reward containing the `not ilike` operator; 4. Load the POS; 5. Try to trigger…
Versions
--------
- 18.0+
Steps
-----
1. Create a loyalty program;
2. Create a reward;
3. Add a Product domain to the reward containing the `not ilike` operator;
4. Load the POS;
5. Try to trigger the Loyalty program;
6. The Reward is not applied when the domain is satisfied
Issue
-----
Loyalty Program rewards containing `not ilike`-based product domains are not applied when they should.
Cause
-----
The `_replace_ilike_with_in` function in loyalty_reward.py converts the `ilike` and `not ilike` operators by first fetching the records that very the domain with the operator used, and then by replacing the domain by `in` or `not in` with the returned records ids. This is problematic as in the case of `not ilike`, it leads to a double negation.
Example
-----
For `ilike`: `['categ_id', 'ilike', 'service']`
-> Search for all categories that contain "service": `_search([('display_name', 'ilike', 'service')])`
-> Return new domain `['categ_id', 'in', matching_ids]`
Which is correct.
For `not ilike`: `['categ_id', 'not ilike', 'service']`
-> Search for all categories that **do not contain** "service": `_search([('display_name', 'not ilike', 'service')])`
-> Return new domain `['categ_id', 'not in', matching_ids]`
Which is incorrect, as the matching_ids are already the ids that are not like "service". (i.e., *categ_id not in the categories that do not contain "service"* <=> *categ_id in the categories that contain "service"*, opposite of what is expected.)
Solution
--------
1. Perform the initial search with `ilike` for both operators
opw-5182818
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#235656This update fixes issues related to generating and resending snailmail reports, specifically for follow-up letters. It extracts key functions to ensure consistent PDF formatting and allows for targeted adjustments to the resending process, improving report accuracy and reliability.
Original PR description
#### [FIX] snailmail: extract report PDF generation function We extract a function `_generate_report_pdf` from `_fetch_attachment` to create the report PDF (and its filename). The resulting PDF's…
#### [FIX] snailmail: extract report PDF generation function We extract a function `_generate_report_pdf` from `_fetch_attachment` to create the report PDF (and its filename). The resulting PDF's margins are fixed and a cover page is added to it after the function is called in `_fetch_attachment`. The new function is extended in the related enterprise commit to generate the followup report inside `_fetch_attachment` (when sent via snailmail). This way it will respect the cover page option and page layout / size requirements. (See the related enterprise PR for more details.) #### [FIX] snailmail: extract letter resending function We extract a function `_resend_letters` from the `update_resend_action`. It handles the regeneration of letters after the cover option has been updated. This way the resending logic can easily extended to adjust the logic depending on attributes of the letter. The new function is extended in the related enterprise commit to disable the resending for followup report letters. This is necessary because the followup report requires special options to be generated that are not available at the point of the regeneration. #### references opw-5160121 opw-5209504 opw-5226366 Forward-Port-Of: odoo/odoo#238905 Forward-Port-Of: odoo/odoo#235699
This update resolves issues with generating snailmail follow-up reports, specifically addressing address validation problems, cover page functionality, and PDF layout inconsistencies. The fix ensures the report is correctly formatted for Pingen, provides feedback if addresses are invalid, and allows users to easily resend reports with or without a cover page.
Original PR description
#### [FIX] snailmail_account_followup: fix address, cover page and layout Currently there is the following potential problem when sending the followup report via snailmail. 1. The address generation…
#### [FIX] snailmail_account_followup: fix address, cover page and layout
Currently there is the following potential problem when sending
the followup report via snailmail.
1. The address generation is not adjusted for snailmail. That can
lead to problems with the service we use to send the actual letter.
They validate the address rather strictly.
2. The cover page option does not work; it does not add a cover page.
So we can not work around problems with the address generation
by adding a cover page.
3. The layout / dimensions / margins of the generated document / PDF may not work
with our current snailmail provider (Pingen). But there is no error
message about it. (Although we do have something in the usual
snailmail flow)
4. In case the address is invalid we do not try to "print" / send the letter,
so the user does not receive any feedback.
This could be an issue in case multiple follow-up reports are sent
at the same time.
This commit fixes these issues. (See below for details.)
(1)
The logic for this already exists but it is only activated when
a context key is set. This is not the case currently.
After this commit we do set the key.
(2) & (3)
The issue is that we generate the PDF attachment before creating the
'snailmail.letter' record.
In the usual snailmail flow the PDF attachment generation is handled during the sending and
printing (in function `_fetch_attachment` on model 'snailmail.letter').
There is some special logic to
- add a cover page to the report PDF (if the option is selected)
- make sure the page dimensions of the PDF are okay
- overwrite the margins of the PDF with white to make sure the PDF is
not rejected by Pingen because of this
But all this only happens if we do not have an attachment already.
(So it does not happen currently with the followup report)
For this a function called `_generate_report_pdf` was extracted from `_fetch_attachment`
in the related community commit to generate the report PDF (and its
filename). The function is extended here to be able to generate the
followup report.
(4)
We try to print / send the letter even if the address is invalid
Reproduce (i.e. for the cover page issue; but it explains how to get
the PDF that will be sent in general)
1. Install `snailmail_account_followup`
2. Create an overdue invoice
3. Set the "Add a Cover Page" option
(Settings -> Accounting -> section "Customer Invoices")
- enabled to test for the cover page
- disabled to test that the address generation is adjusted
4. Send a follow-up report:
- On 17.0: Accounting -> menu: "Customers" / "Follow-up Reports"
-> click on a line / partner -> button "Follow up"
- On 18.0+: partner form view -> tab "Accounting"
-> section "invoice follow-ups" -> button "Send"
5. Go to the snailmail letter:
In debug mode: Settings -> menu: "Technical" -> section: "Email" -> "Snailmail Letters"
(or just search for "snailmail" in the main screen)
And select the letter
6. Download the PDF document
#### [FIX] snailmail_account_followup: forbid regenerating failed letters
The wizard to resend failed letters which allows to change the
cover page option is broken: The follow-up report can not be regenerated
correctly because it requires special follow-up specific `options` that are
lost after the initial pdf generation for the letter.
Currently it can happen that the follow-up PDF is regenerated but
without (actual) content (table listing the overdue amounts).
After this commit we cancel the snailmail letters and show an
error notification indicating that the followup needs to be done again to
create a new letter.
Reproduce
(needs credit on IAP or locally edit this function https://github.com/odoo/odoo/blob/3ffd51f1cb18e3f4fb0367c4a498d7438e0c0357/addons/snailmail/static/src/core_ui/message_patch.js#L11
to open the resend wizard `this.openFormatLetterAction()` for `sn_credit` error or always)
1. Install `snailmail_account_followup`
2. Create an overdue invoice
3. Ensure the address of the partner causes issues with Pingen
4. Ensure the cover page option is disabled:
Settings -> Accounting -> section "Customer Invoices"
5. Send a follow-up report:
- On 17.0: Accounting -> menu: "Customers" / "Follow-up Reports"
-> click on a line / partner -> button "Follow up"
- On 18.0+: partner form view -> tab "Accounting"
-> section "invoice follow-ups" -> button "Send"
6. Make some modifications like editing the follow-up message or a custom attachment
7. Download the snailmail letter PDF (see previous commit for details)
8. In the chatter go to the message saying "Letter sent by post with Snailmai"
9. Click on the red symbol (paper plane) next to the name
10. A "Format Error" wizard should show up
11. Select "Add a Cover Page"
12. Click the button "Update Config and Re-Send"
13. Download the snailmail letter PDF (see previous commit for details)
14. Compare PDFs from 7 and 13; they are different (not just the cover page)
#### references
opw-5160121
opw-5209504
opw-5226366
Forward-Port-Of: odoo/enterprise#101596
Forward-Port-Of: odoo/enterprise#99491This update resolves a technical issue that caused a traceback when reloading the WorkEntries page in Studio. The fix ensures Studio correctly loads the page action, preventing errors and improving stability for users. This change enhances the overall Studio experience.
Original PR description
**Verison:** - saas-18.2 **Steps to reproduce:** - Go to an employee form view. - Click on the WorkEntries smart button. - Open Studio. - Reload page. **Issue:** - A traceback appears after reloading the page in Studio. **Cause:** - The smart button URL uses the model name hr.work.entry, but Studio’s service_action expects a path without dots. Because the action cannot be loaded correctly, the view breaks and triggers the traceback. **Solution:** - Return the proper path instead of the model name so that the action loads correctly. This prevents the error when reloading the page. task-5236317 Forward-Port-Of: odoo/odoo#235662
This update addresses a change in Facebook's data reporting, specifically the deprecation of the audience trend metric. We've temporarily adjusted the calculation to rely on total page follows, ensuring continued reporting accuracy. This change prioritizes immediate reporting functionality while a more comprehensive solution is developed.
Original PR description
Bug === Facebook deprecated some of the endpoints related to statistics https://developers.facebook.com/docs/platforminsights/page/deprecated-metrics We fixed all metric except the audience trend,…
Bug === Facebook deprecated some of the endpoints related to statistics https://developers.facebook.com/docs/platforminsights/page/deprecated-metrics We fixed all metric except the audience trend, because we needed a fix rapidly, and we wasn't sure about unfollow. And indeed, `page_daily_follows` only count for positive value, unlike the old `page_fan_adds` / `page_fan_removes`, and there's no equivalent of `page_fan_removes`... Example of data for a month: ``` page_follows 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 page_daily_follows 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 page_follows 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 page_daily_follows 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ``` So we now use `page_follows`, so the total value at a given time, and we look for the newest and oldest value (note that if we could do the same for `page_post_engagements`, then we could just make 2 APIs calls for the year stat). Task-5353390 Forward-Port-Of: odoo/enterprise#101625 Forward-Port-Of: odoo/enterprise#100275
This update addresses a requirement from the Belgian Peppol Authority. Users can still register with 9925, but a warning has been added to guide them towards the preferred 0208 (BCE/KBO) registration method. This ensures compliance and provides clearer guidance for our Belgian users.
Original PR description
The Belgian Peppol Authority wants us to register belgian users with 0208 (BCE/KBO) and not 9925 (BE VAT). It should still be possible to register with 9925 for some edge case, but let's make it clear to our users that this is not the regular path. task-none (feedback from support + TSB) Forward-Port-Of: odoo/odoo#239208 Forward-Port-Of: odoo/odoo#238737
This update resolves an issue where internal URLs (like 'blob:') in tests previously required a mock 'fetch' to function correctly. This change ensures internal URLs work seamlessly without the need for mocking, improving the reliability and consistency of our test environment. It also addresses a previous issue where test mocks were being used outside of tests, now with stricter enforcement.
Original PR description
Before this commit, internal URLs (i.e. "blob:" and "data:") required 'fetch' to be mocked to work. This is wierd because these requests are handled directly by the browser and shouldn't require any…
Before this commit, internal URLs (i.e. "blob:" and "data:") required
'fetch' to be mocked to work. This is wierd because these requests are
handled directly by the browser and shouldn't require any particular
manipulation from the (mocked) server.
This commit ensures that internal URLs still work without fetch being
mocked.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
- Enterprise: https://github.com/odoo/enterprise/pull/101780
Forward-Port-Of: odoo/odoo#239011This update resolves a technical issue that was causing test failures. The change prevents the use of internal testing tools outside of the testing environment, ensuring the stability and reliability of our tests. This improves the overall quality and consistency of the Odoo Enterprise software.
Original PR description
This commit adapts tests failing due to a recent fix preventing the use of 'mock...' helpers outside of tests. - Community: https://github.com/odoo/odoo/pull/239237
This update fixes a problem where blog post publication times were inconsistent during performance tests. The change ensures that test results are always reliable by freezing time during key operations, preventing variations in how blog posts are processed. This improves the accuracy of our performance metrics.
Original PR description
Some blog post are published with a post_date matching the time the test is run meaning that they are not considered published. We have multiple possibilities when _get_url_hot_query is called: - all call to /blog are executed before the publication date: 9 - some call to /blog are executed after the publication date: 11 - only the last call is executed after the publication date: ~40-50 Using freezetime after the publication date ensures a consistent result This can be easily reproduced by freezing the time on the first calls in _get_url_hot_query and not on the last one. Runbot error [55754](https://runbot.odoo.com/odoo/error/55754) Forward-Port-Of: odoo/odoo#239236
This update fixes a potential issue where the system was incorrectly removing outdated sub-channels. The change adds a crucial check to ensure the cleanup process only affects actual sub-channels, preventing unnecessary actions and maintaining data integrity. This ensures a smoother and more reliable experience for users managing their channels.
Original PR description
In [1], the `_gc_unpin_outdated_sub_channels` method was updated to avoid unpinning sub-channels multiple times. However, a condition is missing on `parent_channel_id` to restrict this gc to actual sub- channels. [1]: https://github.com/odoo/odoo/pull/238493 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#239248
This update fixes a flaw in a stock test that could lead to inaccurate results. The test was failing due to slight timing differences in how moves were created, causing assertions to be incorrect. To ensure consistent and reliable test outcomes, the test now freezes time, guaranteeing the test always behaves as intended.
Original PR description
In a previous fix in #174442, we ensured that the order of moves when freeing reservation would remain deterministic, even if move dates were the same. In the test however, we didn't make sure that both moves were created at the exact same time, meaning that in some case, a millisecond could pass between the two moves creation, making the later assert checking if both dates are the same wrong, and making the test irrelevant. Now freeze the time at an irrelevant date just to make sure the test always does what it was intended to do. runbot-233470 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239229
This update resolves an issue where users with access to multiple companies but only one employee were unable to schedule planning slots for those companies. The fix restores the previous behavior, allowing users to assign themselves to planning slots across all companies they have access to, regardless of the number of employees they have within those companies. This ensures consistent planning functionality.
Original PR description
Since #91616, if a user has access to multiple companies but only has an employee in one, they are unable to assign themselves to a planning slot from a company other than that of their employee. This was not the case in previous versions and is causing issues in our internal db. To restore the previous behavior, any user with access to a company but only 1 employee will be able to assign themselves to slots of said company. opw-5163200
This update fixes an issue where subscription details weren't being displayed correctly within the dashboard. Specifically, it addressed a problem with how subscription data was filtered and presented, ensuring subscription titles are now shown accurately and preventing related sale order items from appearing in the wrong section. This improves the user experience for managing subscriptions.
Original PR description
Before this commit, when subscriptions were linked to the analytic account of a project, the sale order items appears in an unwanted section when the section is unfolded. Meanwhile, when the subscription section is unfolded the title of the subscriptions items are not correctly displayed. The first issue is due to the fact that we did not correctly exclude the subscriptions items from the domain. The second issue is due to the fact that we fetch the field 'name' from the subscription search instead of the field 'display_name' task-5159781 Forward-Port-Of: odoo/enterprise#97238
This update fixes an issue where multiple quality checks were being created for the same picking when adding additional products. The change ensures that only one quality check is generated per operation, streamlining the picking process and preventing unnecessary quality control tasks. This improves efficiency and reduces potential errors.
Original PR description
Steps to reproduce: -------------------------- 1. Install the Quality module. 2. Create a Quality Control Point with: * Control per: Control on Operation. * Operation: Receipts (set in the Operations…
Steps to reproduce: -------------------------- 1. Install the Quality module. 2. Create a Quality Control Point with: * Control per: Control on Operation. * Operation: Receipts (set in the Operations field). 3. Create a Receipt containing one product. 4. Click the Mark as To Do button. 5. Add another product to the same Receipt and save it. Observation: -------------------------- Two quality checks are generated for the same picking, despite the tooltip indicating that only one check should be created per operation. Issue: -------------------------- No validation existed to verify whether an operation-based quality check had already been created for the picking when adding additional stock moves after confirmation. Solution: -------------------------- Add a check ensuring that if a quality check already exists for the same picking type and operation (with no product or category criteria), no additional operation-based quality checks are created. opw-5249233 Forward-Port-Of: odoo/enterprise#100118
This update resolves an issue where the Czech VAT control statement incorrectly calculated amounts for invoices in foreign currencies (specifically EUR). The fix ensures accurate reporting by correctly handling currency conversions and using the absolute value of the signed total when foreign currency amounts are involved.
Original PR description
With l10n_cz_reports: - Create a currency exchange between CZK and EUR where the EUR is valued at least at twice the amount of CZK. - Create an invoice in EUR, with a line with price_unit 5000 and a tax. - In the CZ Tax Report, in the VAT control statement, the converted amount is found in section B.3, which contains received taxable supplies and provided payments up to CZK 10,000. However, the converted amount of the invoice in CZK is higher than 10,000. In `_report_custom_engine_control_statement`, the amount used to check whether the move should be included in this section uses `amount_total`, which in the case of foreign currency gives the wrong result. If the move is in a foreign currency the total is not in CZK so we have to use the absolute value of the signed total. opw-5080339 Forward-Port-Of: odoo/enterprise#100456
7 changes
Resolved issues and error corrections
This update corrects a display issue on the Odoo portal where users were seeing outdated document counts. Now, the portal only shows users documents that are currently in their signing sequence, improving the user experience and preventing confusion. This ensures users are only notified of new documents when it's their turn to sign.
Original PR description
Version: - 18.0 Steps to reproduce: - Install sign - Upload document. - Add multiple signers - Set a sequential signing order Issue: - When documents require sequential signing, portal users see a banner saying there’s a new document to sign, even if it’s not yet their turn. Solution: - Update the counter to show only the documents that the user can currently sign. Impact: - Portal users now only see documents when it’s their turn to sign. Task-5226240 Forward-Port-Of: odoo/enterprise#98671
This update fixes an issue where multiple quality checks were being created for the same picking when adding additional products. The change ensures that only one quality check is generated per operation type (Receipts), streamlining the process and preventing data inconsistencies. This improves efficiency and accuracy in stock management.
Original PR description
Steps to reproduce: -------------------------- 1. Install the Quality module. 2. Create a Quality Control Point with: * Control per: Control on Operation. * Operation: Receipts (set in the Operations…
Steps to reproduce: -------------------------- 1. Install the Quality module. 2. Create a Quality Control Point with: * Control per: Control on Operation. * Operation: Receipts (set in the Operations field). 3. Create a Receipt containing one product. 4. Click the Mark as To Do button. 5. Add another product to the same Receipt and save it. Observation: -------------------------- Two quality checks are generated for the same picking, despite the tooltip indicating that only one check should be created per operation. Issue: -------------------------- No validation existed to verify whether an operation-based quality check had already been created for the picking when adding additional stock moves after confirmation. Solution: -------------------------- Add a check ensuring that if a quality check already exists for the same picking type and operation (with no product or category criteria), no additional operation-based quality checks are created. opw-5249233 Forward-Port-Of: odoo/enterprise#100118
This update fixes an error that prevented shipping rate calculations when a customer partner lacked address information (country, state, and city). The change ensures that the system handles missing location data gracefully, preventing errors and allowing shipping rate calculations to proceed correctly. This improves the reliability of the Envia Shipping module.
Original PR description
Currently, an error is raised when trying to fetch the shipping rate if the partner does not have the required geolocation fields (country, state, and city). **Steps to Reproduce:** 1. Install and…
Currently, an error is raised when trying to fetch the shipping rate if the partner does not have the required geolocation fields (country, state, and city). **Steps to Reproduce:** 1. Install and configure the **Envia Shipping** module. 2. Create a partner without an address (only name + phone). 3. Create quotation for that partner with a deliverable product (e.g; Conference Chair). 4. Click "**Add Shipping**", choose _Envia Shipping_ Method, and then click "**Get Rate**". **Error:** `TypeError - quote_from_bytes() expected bytes` **Cause:** At [1], the system tries to compute Envia shipping rates based on the partner’s country, state, and city. If any of these fields are not set, an error is raised. **Fix:** This commit adds a check for the required fields (country, state, and city). If any are missing, `_geolocate_zip` returns False, leading to a proper validation error instead of a traceback. - [2] [1] - https://github.com/odoo/enterprise/blob/f1a02626a1fbe76add104832e151c647307f3ae7/delivery_envia/models/envia_request.py#L591-L593 [2] - https://github.com/odoo/enterprise/blob/f1a02626a1fbe76add104832e151c647307f3ae7/delivery_envia/models/envia_request.py#L617-L624 sentry-7063870478 Forward-Port-Of: odoo/enterprise#100734
This update resolves an issue in the Hong Kong payroll system where the default account for net salary payments was incorrectly configured. The change replaces the problematic account with a new 'Salaries & Wages Payable' account, ensuring accurate payslip payments across all payroll structures. This improves payroll processing reliability.
Original PR description
Fixes the default account for NET salary rules in the Hong Kong payroll, which is using the wrong account type and causes issues when trying to pay payslips. It is replaced by a new Salaries & Wages Payable account, and we also set it for the structures other than 'Monthly Pay' task-5042786 Forward-Port-Of: odoo/enterprise#100835
This update addresses a change in Facebook's data reporting, specifically the deprecation of the audience trend metric. We've temporarily adjusted the calculation to rely on total page follows, ensuring continued accurate reporting while a more comprehensive solution is developed. This change primarily impacts how we track page engagement and growth.
Original PR description
Bug === Facebook deprecated some of the endpoints related to statistics https://developers.facebook.com/docs/platforminsights/page/deprecated-metrics We fixed all metric except the audience trend,…
Bug === Facebook deprecated some of the endpoints related to statistics https://developers.facebook.com/docs/platforminsights/page/deprecated-metrics We fixed all metric except the audience trend, because we needed a fix rapidly, and we wasn't sure about unfollow. And indeed, `page_daily_follows` only count for positive value, unlike the old `page_fan_adds` / `page_fan_removes`, and there's no equivalent of `page_fan_removes`... Example of data for a month: ``` page_follows 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 page_daily_follows 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 page_follows 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 page_daily_follows 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ``` So we now use `page_follows`, so the total value at a given time, and we look for the newest and oldest value (note that if we could do the same for `page_post_engagements`, then we could just make 2 APIs calls for the year stat). Task-5353390 Forward-Port-Of: odoo/enterprise#101625 Forward-Port-Of: odoo/enterprise#100275
This update corrects a translation issue within the Odoo Enterprise reports for Marathi-speaking users. The translations were previously stored in separate files, leading to inconsistencies. This change consolidates all necessary translations within the report XML files, ensuring accurate reporting in Marathi.
This update fixes a security vulnerability where Portal and Internal users could create private knowledge articles without the necessary permissions. The change restricts article creation to users with 'create' access, improves the user interface by hiding creation buttons for unauthorized users, and adds new tests to ensure proper access control.
Original PR description
How to Reproduce : 1. Remove 'Create' access on the 'Knowledge Article' model for Portal and Internal users. 2. Now log in as a Portal. 3. Try to create a new private article. 4. Log in as an…
How to Reproduce : 1. Remove 'Create' access on the 'Knowledge Article' model for Portal and Internal users. 2. Now log in as a Portal. 3. Try to create a new private article. 4. Log in as an Internal user. 5. Try to create a new private article. Both Internal and Portal users can still create private articles even after 'Create access' is removed. Article creation logic in `knowledge.article` was bypassing the usual access rights because of `sudo` (mainly to add the creator as a member, since creation rights on the member model are not granted). This allowed users to create private articles even without create access. This commit introduces: 1. Model-level access check in `create`. Sudo the creation of articles only when the user has create rights. 2. UI imp to hide the '+' button in the sidebar and the `New` button in the topbar when the user doesn't have create access. 3. New test cases to verify that model-level access rights are respected when creating an article. task-4916280 Forward-Port-Of: odoo/enterprise#98910 Forward-Port-Of: odoo/enterprise#93034
21 changes
New functionality added to Odoo
This update adds a report to provide Mexican customers with proof of cancellation requests for their CFDI documents. Currently, the CFDI system doesn't reliably track cancellations, so this report fulfills a customer request for documentation and ensures compliance. It improves transparency and customer satisfaction related to Mexican tax regulations.
Original PR description
The CFDI system does not give you an up-to-date status of cancellations, so the end customer usually requests this document as proof that the cancellation was requested. So we create a new report to show this data. Task Id: 4557272 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Enhancements to existing features
This update enhances the demo contract template used for HR payroll in India. The default settings – contract name, job title, department, and professional tax – have been updated to reflect more accurate and relevant information for Software Developers in the Research & Development IN department, specifically using Gujarat's professional tax rates. This ensures a more realistic and useful demo for users.
Original PR description
This commit ensures the demo contract template contains accurate and relevant default values. - Updated default contract name from "Default Contract" to "Software Developer" - Set default job name to "Experienced Developer" - Set default department to "Research & Development IN" - Set default Professional Tax to "Gujarat: Professional Tax" Task-5358391
This update enhances the yearly salary report's user experience by aligning the report layout and adjusting formatting to handle larger salary figures (up to 10 digits). Previously, the report had alignment issues and would hide columns with large numbers. Now, the report starts on a new page for each employee's salary structure, ensuring clarity and readability.
Original PR description
Before this commit: Report The header and body are not aligned. The report hides column when digits exceed 8 digits The new salary structure of the same employee starts from the same page. After this commit: Align header and body layout. Adjust padding, DPI, and font size to adapt to up to 10 digits. The new salary structure starts on a new page. task-5363813
This update enhances the Odoo VoIP system by providing clearer names for the arguments passed to its data retrieval methods. This improves code readability and maintainability, ensuring smoother operation and reducing potential errors within the VoIP features. It's a follow-up to a previous improvement.
Original PR description
Follow-up of #97788
This update enhances the usability of Odoo's payroll reports by adding the ability to group data by key categories like employee, department, and pay run. This allows for more detailed and targeted reporting, simplifying payroll analysis and improving business insights.
Original PR description
This PR adds filters to reports to group them by (Employee, Department, Job Position, Payslip, Pay Run) which eases the usage of payroll reports. Task: 5367806
This update improves the Odoo Enterprise system by adding a validation check for the 'Series' field in the Point of Sale (POS) settings. Previously, users could enter more than 3 digits, which could cause errors. Now, the system will prevent saving the configuration if the Series field exceeds this limit, ensuring data accuracy and preventing potential issues with the BR-EDI reports.
Original PR description
This commit adds an error on the Series field in the POS configuration. If the user enters more than 3 digits, a validation error message will appear and saving the configuration will be blocked until the value is corrected. task-5112103
This update allows users to generate partner ledger and aged partner reports showing outstanding balances as of a specified future date (e.g., February 28, 2025). This provides more flexibility in analyzing financial positions and tracking open items, particularly for reporting on historical data.
Original PR description
Determine the outstanding balance at a future date (e.g., Feb 28, 2025) for all items that were open on a specific past date (e.g., Dec 31, 2024). To enable this, we modify the partner ledger reports: - Repurpose the existing unreconciled filter - This option is now activated with an "open on" date When the open on date is enabled, the partner ledger only displays the residual amounts (not debit, credit, balance) as before. Clicking `journal items` will go to a list view that uses the `open on` field and new `residual_at_date` fields (see community) The aged partner reports also have this option enabled, allowing a similar set of capabilities. for example view the aging buckets up to the end of 2024, but of those transactions, we only display what is open today. task-4708558
This update simplifies the process of adding signatures to Knowledge documents by removing a dependency on the 'sign' module. The signature input now utilizes a standard 'web' dialog, reducing the overall size of the installation. Additionally, the signature plugin has been moved to the 'html_editor' module, further improving efficiency and reducing unnecessary dependencies.
Original PR description
To avoid installing `sign` when installing `accountant_knowledge`, the `SignatureInput` bloc will now use the `SignatureDialog` dialog from `web` instead of the `SignNameAndSignatureDialog` dialog from `sign`. Both dialogs let the user enter a signature, but `SignatureDialog` does not introduce any new dependencies in `accountant_knowledge`. Indeed, `accountant_knowledge` already depends on `web`. In addition to that, this PR moves the signature plugin from `sign` to `html_editor`. With this move, the `sign` module will no longer be required to insert signatures in Knowledge and Mass Mailing. COM: odoo/odoo#237131 Task-5347434
This update optimizes how Odoo retrieves spreadsheet data by implementing caching strategies using ETag headers and no-cache directives. This reduces unnecessary data transfers, leading to faster loading times and improved performance for users accessing spreadsheet data. It's a routine improvement to enhance the user experience.
Original PR description
With this commit, we improve the caching strategy for spreadsheet data responses by introducing the use of ETag headers and setting Cache-Control to no-cache. This change aims to optimize client-side fetching behavior, to avoid unnecessary data transfers if there are no changes. Task: 5265743
This update incorporates Finland's recent shift to a 13.5% tax rate for reporting purposes. The change adds a new line to the tax report, displaying both the 13.5% and 14% tax amounts, ensuring accurate financial reporting in line with current regulations.
Original PR description
as findland will replace 14% tax by a 13.5% tax, we had to include this in the finland tax report with a foldable line containing 13.5 and 14 tax tas-5324615
This update simplifies the process of creating and managing digital signatures. Users can now set default settings for sign items at the template level, reducing repetitive work and improving visibility into which roles are applied. The changes also enhance the overall user experience for sign template creation.
Original PR description
Before: - Users had to manually set readonly, mandatory, and alignment for every sign item individually. - There was no way to define these settings at the sign item type level. - On the sign template form, users could not see which sign item roles were added on template. After: - Users can now define readonly, mandatory, and alignment values directly on the sign item type. These values are automatically applied to all sign items created from that type, saving time and avoiding repetitive setup. - The sign template form now shows which sign item roles are used in the current template. - UI improvements for a smoother and more user-friendly experience. Impact: - Less repetitive work: users no longer need to configure the same settings for each sign item. - Better visibility: users can easily see which roles are linked to a template. task-5100986
This update enhances the user experience of appraisal surveys by adding visual icons to the survey type selection. The changes streamline the survey interface and improve clarity for users. Additionally, a redundant custom component within the appointment module has been removed, aligning with a newer, more flexible design.
Original PR description
Icons where added to the UI selection of a survey type. These icons are stored in a computed field which is extended here to add the relevant icon for an appraisal Task-4778050
Resolved issues and error corrections
This update corrects a discrepancy in the tests for Odoo's Hong Kong payroll module. The changes ensure the tests accurately reflect the specific salary property requirements for Hong Kong, leading to more reliable payroll calculations. This improves the overall accuracy and compliance of the system.
Original PR description
task-5380844
This update simplifies the appraisal process by removing a duplicate menu option within the Odoo Enterprise system. Previously, users could initiate an appraisal campaign through two different pathways, leading to unnecessary complexity. This change consolidates the launch process for a more intuitive user experience.
Original PR description
purpose: The way to launch an appraisal campaign is double, you can have it from the secondary button and from the cog wheel. Hence, removing it from the cog wheel as it's not necessary task-id: 5395096
This update fixes an issue where holiday pay recovery was incorrectly applied to employees with older contracts. The change ensures that holiday pay recovery is applied appropriately when contracts are reopened, reflecting the employee's status as a new hire.
Original PR description
Purpose ======= Normally contracts start and end dates should be configured without being closed and reopened at each version date. But, if it is the case, holiday pay recovery could be applied on older employees because it is considered the employee just joined the company, and there is an amount to recover. Forward-Port-Of: odoo/enterprise#101564
This update fixes an issue where scanning a lot twice during the barcode picking process created an unnecessary backorder. The fix ensures that quantity updates are applied correctly to the relevant lines, preventing this error and streamlining the picking workflow. This improves order fulfillment accuracy.
Original PR description
**Steps to reproduce:** - create a product tracked by lot - create a lot with a quantity of 2 - create a new sale order - add two sale order lines, both for a quantity of 1 of the product - confirm -…
**Steps to reproduce:** - create a product tracked by lot - create a lot with a quantity of 2 - create a new sale order - add two sale order lines, both for a quantity of 1 of the product - confirm - open the picking in barcode - scan the stock location - scan the lot - scan the lot another time - validate **Current behavior:** a backorder is created **Expected behavior:** No back order should be created **Cause of the issue:** After scanning the lot for the first time we have the following situation: two lines : - one with a quantity of 1, qty_done of 1 and reserved_uom_qty of 1 - one with a quantity of 1, qty_done of 0 and reserved_uom_qty of 1 both lined grouped in a parent line with quantity of 1 qty_done of 1 and reserved_uom_qty of 2 All of this is correct. when scanning the lot for the second time: _findLine iterates through the lines to select the right line to use. _findLine calls _lineIsNotComplete on the first line to check if it's complete (this first line is complete). https://github.com/odoo/enterprise/blob/58d55868750b827a9d5ebd8b4ab2cc23c4445eca/stock_barcode/static/src/models/barcode_model.js#L1684 But _lineIsNotComplete will actually do the check on the parent line (which is not complete), so the return value will be true. https://github.com/odoo/enterprise/blob/58d55868750b827a9d5ebd8b4ab2cc23c4445eca/stock_barcode/static/src/models/barcode_picking_model.js#L1338 As a consequence, the quantity will be added in the first line and we will have a qty_done of 2 in the first line and a qty_done of 0 in the second line. Which will lead to the creation of a back order opw Forward-Port-Of: odoo/enterprise#101508 Forward-Port-Of: odoo/enterprise#99774
This update resolves an issue where clicking a Field Service record in the kanban view with the middle mouse button opened it in the same tab. The fix ensures that records now open in a new tab, improving user workflow and efficiency. This change was made to address a usability concern.
Original PR description
Steps to reproduce: 1. Install `industry_fsm` 2. Open Field service module 3. In the kanban view, click a record with the middle mouse button Issue: - The record opens in the same tab instead of a new tab. Cause: - `FsmMyTaskKanbanRecord` overrides `onGlobalClick` without propagating the `newWindow` argument, preventing the expected new-tab behavior. Solution: - Forward the `newWindow` parameter to the parent implementation to restore the correct handling of the middle mouse click opw-5351842 Forward-Port-Of: odoo/enterprise#100926
This update fixes an issue where customers subscribing to services could fail to process recurring payments due to missing country information. The change ensures subscriptions, even for services, correctly require a country to be set, preventing payment failures and improving the subscription process. This resolves a previous optimization that bypassed address forms for services.
Original PR description
## Versions 19.0+ ## Issue A customer subscribing to a service can checkout without filling its data (incl. country). This leads to a failure of the next payment and a message in the chatter telling…
## Versions
19.0+
## Issue
A customer subscribing to a service can checkout without filling its data (incl. country). This leads to a failure of the next payment and a message in the chatter telling that "Automatic payment failed. No country specified on payment_token's partner".
## Steps to reproduce
*Ensure Sales app is installed*
- Create a customer account without filling personal data in;
- Navigate to the shop:
- Look for a subscription service (ending with "SUB") and add it to cart;
- Go to the cart and click the checkout button (automatically bypassing the addresses form);
- Pay with Demo.
- Logout and sign in as admin user:
- Go to Sales and open the latest SO (related to the test user):
- Duplicate the SO and activate debug mode;
- Open "Other Info" tab:
- Change the subscription starting date for any date in the past;
- Set the Payment Token selecting the available one; - Confirm the order.
- Navigate to Scheduled Actions:
- Look for "Sale Subscription: generate recurring invoices and payments" action and open it:
- Click "Run Manually".
- Come back to the duplicated subscription SO and look at the chatter's last message:
- OdooBot's message tells that "Automatic payment failed. No country specified on payment_token's partner".
## Cause
Task 4307281 introduced address info bypass to fasten checkout for services but subscriptions, even for services, require the country to be set for recurring payments as per https://github.com/odoo/enterprise/blob/f40e24e67a1664a13acdd01578d8269d084ee421/sale_subscription/models/sale_order.py#L1751-L1757
opw-5268156
Forward-Port-Of: odoo/enterprise#101372This update resolves a misleading warning banner that appeared when processing SEPA batch payments for partners without addresses. The system now correctly uses the linked employee's address, ensuring accurate report generation without unnecessary alerts. This improves the user experience and avoids confusion.
Original PR description
…oyee has an address Doing batch payment for sepa payment would generate a warning banner if the partner has no address ( city and country ) However in reality ( already working ) the xml report will be generated with the linked employee address in the case of absence of the partner address thus it should not show a warning. The change removes the warning in this case. task: 5266346 Forward-Port-Of: odoo/enterprise#99928
Features or functions removed from Odoo
This update removes outdated RPC services that were phased out in Odoo 19.0. This change improves system stability and prepares for future updates, aligning with the transition to newer, more efficient communication methods. The removal supports ongoing efforts to simplify Odoo's architecture.
Original PR description
The RPC services are all deprecated in 19.0. This work unexpose the `db` service from XMLRPC, it is still accessible from the /web/database/manager page. It also prepares the actual removal of xmlrpc by moving all the utilities we wanna keep outside of the `odoo.services` module. Documentation: https://www.odoo.com/documentation/19.0/developer/reference/external_api.html#migrating-from-xml-rpc-json-rpc Presentation at OXP-2025: https://youtu.be/Fe6Noh_G8KA
This update removes the 'activity_name' field from VoIP call records. This simplifies the data structure and reduces potential confusion for users. The change improves data consistency and streamlines reporting related to VoIP calls.
Original PR description
Remove activity_name field on voip.call Task-5349683
17 changes
New functionality added to Odoo
This update implements new rules for Mexican export invoices (COMEX) where services are involved. Specifically, when the ‘Servicios’ unit code (99) or ‘E48’ is used, certain fields like value and currency must be set to zero. New tests have been added to ensure compliance with SAT guidelines.
Original PR description
According to the official SAT guidelines and the c_ClaveUnidadAduana catalog, if UnidadAduana unit code is "99" (which corresponds to "Servicios") or ClaveUnidad has the value "E48", the following rules apply: - ValorUnitarioAduana must be 0. - ValorDolares must be 0. - FraccionArancelaria should not exist. Add test for COMEX invoices with service target: 19.0 task-5257001
This update introduces a new setting to allow businesses to exclude product references from PEPPOL invoices. This change enhances PEPPOL invoice compliance and flexibility, addressing potential data requirements for specific trading partners. The update includes necessary code changes, tests, and XML adjustments to implement this functionality.
Original PR description
Introduced a new boolean field to control the inclusion of product references in PEPPOL invoices. Added corresponding logic, tests, and XML changes to support this feature. Task-5401660 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This update fixes an issue where invoice totals didn't update correctly when changing the product or unit price. The fix ensures that the totals recalculate accurately after these changes, resolving a problem that prevented dynamic updates. This improves the accuracy of invoice calculations.
Original PR description
**Steps to reproduce:** - Install Accounting - Create an invoice with an invoice line - Save the invoice - Change the unit price => The totals should change - Change the product => The unit price and…
**Steps to reproduce:** - Install Accounting - Create an invoice with an invoice line - Save the invoice - Change the unit price => The totals should change - Change the product => The unit price and the totals should change - Change the unit price again **Issue:** After this point, the totals don't change anymore, even if the unit price is changed several times. Only saving the form will adapt the totals correctly. **Cause:** When changing the unit price the first time, a "price_unit "key is added in the onchange values. When changing the product, a "product_id" key is added after the price key. Changing the product triggers an onchange of the price with the price of the new product. However, when the price is changed again, as the "price_unit" key already exists, it's reused and its position is still before "product_id" key even if it should be computed after. This order results in the use of the price of the second product instead of the one entered manually when computing the "tax_totals". **Solution:** If "product_id" and "price_unit" are the values of the onchange method, the list of values is reordered to make sure that "product_id" is computed first. opw-5012125 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239110 Forward-Port-Of: odoo/odoo#232684
This update corrects a display issue on the Odoo portal where users were seeing outdated document counts. Now, the portal only shows users documents that are currently in their signing sequence, improving the user experience and ensuring accurate document tracking. This prevents confusion and streamlines the signing process.
Original PR description
Version: - 18.0 Steps to reproduce: - Install sign - Upload document. - Add multiple signers - Set a sequential signing order Issue: - When documents require sequential signing, portal users see a banner saying there’s a new document to sign, even if it’s not yet their turn. Solution: - Update the counter to show only the documents that the user can currently sign. Impact: - Portal users now only see documents when it’s their turn to sign. Task-5226240 Forward-Port-Of: odoo/enterprise#98671
This update prevents a confusing traceback error when using Studio to create a menu item for the account.code.mapping model. The fix replaces a technical error with a user-friendly message, ensuring a smoother experience for users creating and accessing this feature.
Original PR description
**Steps to reproduce:** * Install **Accounting** and ensure Studio is available. * Using **Studio**, create a new menu item pointing to the model *account.code.mapping*. * Save the menu and click it to open the corresponding view. **Observed behavior:** * Opening the Studio-created menu triggers a full traceback. **Cause:** * The model *account.code.mapping* overrides `_search()` and raises `NotImplementedError` when no `account_ids` can be extracted from the domain, which is the case when opening the view without filters. * The missing `_search` logic for empty domains was never implemented, and the resulting exception propagates to the UI as a traceback. **Fix:** * Replace the `NotImplementedError` with a user-friendly `UserError` explaining that the view cannot be opened without specifying relevant filters, preventing the traceback and improving clarity. opw-5183909 Forward-Port-Of: odoo/odoo#239076 Forward-Port-Of: odoo/odoo#236665
This update fixes a previous error that prevented shipping rate calculations when a customer partner lacked address information (country, state, and city). The change ensures that the system handles missing location data gracefully, preventing errors and allowing shipping rates to be accurately calculated for all customers.
Original PR description
Currently, an error is raised when trying to fetch the shipping rate if the partner does not have the required geolocation fields (country, state, and city). **Steps to Reproduce:** 1. Install and…
Currently, an error is raised when trying to fetch the shipping rate if the partner does not have the required geolocation fields (country, state, and city). **Steps to Reproduce:** 1. Install and configure the **Envia Shipping** module. 2. Create a partner without an address (only name + phone). 3. Create quotation for that partner with a deliverable product (e.g; Conference Chair). 4. Click "**Add Shipping**", choose _Envia Shipping_ Method, and then click "**Get Rate**". **Error:** `TypeError - quote_from_bytes() expected bytes` **Cause:** At [1], the system tries to compute Envia shipping rates based on the partner’s country, state, and city. If any of these fields are not set, an error is raised. **Fix:** This commit adds a check for the required fields (country, state, and city). If any are missing, `_geolocate_zip` returns False, leading to a proper validation error instead of a traceback. - [2] [1] - https://github.com/odoo/enterprise/blob/f1a02626a1fbe76add104832e151c647307f3ae7/delivery_envia/models/envia_request.py#L591-L593 [2] - https://github.com/odoo/enterprise/blob/f1a02626a1fbe76add104832e151c647307f3ae7/delivery_envia/models/envia_request.py#L617-L624 sentry-7063870478 Forward-Port-Of: odoo/enterprise#100734
This update ensures that older IoT boxes running Odoo 19.1 or later will always be upgraded to Odoo 19.0. This prevents issues caused by a change in Python version requirements, safeguarding the IoT boxes from potential malfunctions.
Original PR description
The IoT boxes using image 25.07 or less are running Python 3.11. In Odoo 19.1 the minimum Python version will change to 3.12. In order to prevent IoT boxes from being bricked after checking out, we add a check to make sure that 19.0 will be checked out if the database is using a version of 19.1 or higher. task-5380815 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a potential issue where the system was incorrectly removing outdated sub-channels. The change adds a crucial check to ensure the cleanup process only affects actual sub-channels, preventing unintended consequences and maintaining data integrity. This ensures our email system operates more reliably.
Original PR description
In [1], the `_gc_unpin_outdated_sub_channels` method was updated to avoid unpinning sub-channels multiple times. However, a condition is missing on `parent_channel_id` to restrict this gc to actual sub- channels. [1]: https://github.com/odoo/odoo/pull/238493 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#239248
This update resolves an issue where freezing a spreadsheet containing empty data rows incorrectly reported the data as text. The fix ensures that empty strings are handled correctly when freezing, preventing false positive results in data analysis. This improves the reliability of spreadsheet reports.
Original PR description
Steps to reproduce: - insert a list - expand the list beyond the number of records in order to have ODOO.LIST with no result - add =ISTEXT( <a reference to an empty ODOO.LIST> ) -> the result is TRUE - Freeze and share the spreadsheet => the result of ISTEXT is FALSE in the frozen version task-5360561 opw-5359100 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#239107 Forward-Port-Of: odoo/odoo#237511
This update resolves an issue in the Hong Kong payroll system where the default account for net salary payments was incorrectly configured. The change replaces the problematic account with a new 'Salaries & Wages Payable' account, ensuring accurate payslip generation and payment processing. This improves payroll accuracy and avoids potential payment problems.
Original PR description
Fixes the default account for NET salary rules in the Hong Kong payroll, which is using the wrong account type and causes issues when trying to pay payslips. It is replaced by a new Salaries & Wages Payable account, and we also set it for the structures other than 'Monthly Pay' task-5042786 Forward-Port-Of: odoo/enterprise#100835
This update corrects a bug in the loyalty program's reward system. Previously, rewards weren't triggered when using 'not ilike' product domains. This change ensures that rewards are correctly applied based on product exclusions, improving the accuracy of loyalty program targeting.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Create a loyalty program; 2. Create a reward; 3. Add a Product domain to the reward containing the `not ilike` operator; 4. Load the POS; 5. Try to trigger…
Versions
--------
- 18.0+
Steps
-----
1. Create a loyalty program;
2. Create a reward;
3. Add a Product domain to the reward containing the `not ilike` operator;
4. Load the POS;
5. Try to trigger the Loyalty program;
6. The Reward is not applied when the domain is satisfied
Issue
-----
Loyalty Program rewards containing `not ilike`-based product domains are not applied when they should.
Cause
-----
The `_replace_ilike_with_in` function in loyalty_reward.py converts the `ilike` and `not ilike` operators by first fetching the records that very the domain with the operator used, and then by replacing the domain by `in` or `not in` with the returned records ids. This is problematic as in the case of `not ilike`, it leads to a double negation.
Example
-----
For `ilike`: `['categ_id', 'ilike', 'service']`
-> Search for all categories that contain "service": `_search([('display_name', 'ilike', 'service')])`
-> Return new domain `['categ_id', 'in', matching_ids]`
Which is correct.
For `not ilike`: `['categ_id', 'not ilike', 'service']`
-> Search for all categories that **do not contain** "service": `_search([('display_name', 'not ilike', 'service')])`
-> Return new domain `['categ_id', 'not in', matching_ids]`
Which is incorrect, as the matching_ids are already the ids that are not like "service". (i.e., *categ_id not in the categories that do not contain "service"* <=> *categ_id in the categories that contain "service"*, opposite of what is expected.)
Solution
--------
1. Perform the initial search with `ilike` for both operators
opw-5182818
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#235656This update adds a new account for 'Salaries & Wages Payable' within the Odoo Hong Kong localization. This change is necessary to correctly account for payroll liabilities under Hong Kong's NET rules and resolves an existing issue with default data configuration. It ensures accurate financial reporting related to employee compensation.
Original PR description
Adds a new Salaries & Wages Payable account of type current liabilities in order to use it in payroll for the NET rules and solve a misconfiguration in the default data. task-5042786 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237884
This update corrects a display issue where product specifications with single values were appearing twice when shown in an accordion format on the website. The fix ensures that specifications are shown only once, improving the clarity and accuracy of product information for customers. This change enhances the user experience and prevents confusion.
Original PR description
Currently, when the product specification is shown in an accordion, single-value attributes are displayed twice, causing duplicate information to appear. **Steps to replicate:** * Install…
Currently, when the product specification is shown in an accordion, single-value attributes are displayed twice, causing duplicate information to appear. **Steps to replicate:** * Install `website_sale` with demo data. * Open Products, pick any product, and add an attribute with a single value. * Edit that product’s website page and set Specification → In accordion. **Observed Behavior:** * Specifications for single valued attributes are shown twice. **Root cause:** * This happens because [1] always shows single attribute values, regardless of the specification display style. **Solution:** * Hide the extra table when accordion is active. **Before:** <img width="1851" height="928" alt="image" src="https://github.com/user-attachments/assets/dbaccc28-dbbb-41df-9a04-b0330479e480" /> **After:** <img width="1858" height="927" alt="image" src="https://github.com/user-attachments/assets/09317662-3d40-4128-a6d3-9f9c0af618c4" /> [1]: https://github.com/odoo/odoo/blob/ac6960dc553088894e688bcc0f4a49245aa02d6c/addons/website_sale/views/templates.xml#L2175-L2195 opw-5382484
This update addresses a requirement from the Belgian Peppol Authority. The system now provides a warning to users attempting to register with the 9925 (BE VAT) method, as this is no longer the standard approach. This ensures users are guided toward the correct 0208 (BCE/KBO) registration for optimal compliance.
Original PR description
The Belgian Peppol Authority wants us to register belgian users with 0208 (BCE/KBO) and not 9925 (BE VAT). It should still be possible to register with 9925 for some edge case, but let's make it clear to our users that this is not the regular path. task-none (feedback from support + TSB) Forward-Port-Of: odoo/odoo#239208 Forward-Port-Of: odoo/odoo#238737
This update fixes an issue where repair order moves weren't properly linked in the inventory reporting system. The change was necessary due to a previous update that removed a key field. The fix ensures that repair order moves are accurately reflected in move history reports, improving data accuracy.
Original PR description
### Steps to reproduce: - Create and confirm a repair order for a storable product - Go to Inventory > Reporting > Moves History #### > The related move line appears without reference ### Issue: The…
### Steps to reproduce: - Create and confirm a repair order for a storable product - Go to Inventory > Reporting > Moves History #### > The related move line appears without reference ### Issue: The issue has been introduced with facf4eba6cd0504aae949c23454c6ffa9eaa9c3f which purpose is was to remove the `name` field of the `stock.move` model. However, prior to saas-18.4, the reference of the move relied on its name: https://github.com/odoo/odoo/blob/404cb10283cbc706eae67dd793ced363273f3602/addons/stock/models/stock_move.py#L325-L328 To not lose this reference an override of the `_compute_reference` compute method was introduced for repair orders. But it is currently ineffective since `moves_with_reference` is a set of records and not a set of ides which makes it the method call its super method on every records including the repair orders. opw-5385004 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239215
This update addresses a change in Facebook's data reporting, specifically the deprecation of the audience trend metric. We've temporarily adjusted the calculation to rely on total page follows, ensuring continued accurate reporting while a more comprehensive solution is developed. This change ensures the continued tracking of page follower trends.
Original PR description
Bug === Facebook deprecated some of the endpoints related to statistics https://developers.facebook.com/docs/platforminsights/page/deprecated-metrics We fixed all metric except the audience trend,…
Bug === Facebook deprecated some of the endpoints related to statistics https://developers.facebook.com/docs/platforminsights/page/deprecated-metrics We fixed all metric except the audience trend, because we needed a fix rapidly, and we wasn't sure about unfollow. And indeed, `page_daily_follows` only count for positive value, unlike the old `page_fan_adds` / `page_fan_removes`, and there's no equivalent of `page_fan_removes`... Example of data for a month: ``` page_follows 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 page_daily_follows 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 page_follows 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 page_daily_follows 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ``` So we now use `page_follows`, so the total value at a given time, and we look for the newest and oldest value (note that if we could do the same for `page_post_engagements`, then we could just make 2 APIs calls for the year stat). Task-5353390 Forward-Port-Of: odoo/enterprise#101625 Forward-Port-Of: odoo/enterprise#100275
This update fixes a flaw in a stock test that caused inconsistent results due to timing differences. The test now freezes time to ensure consistent execution, guaranteeing the test accurately reflects the intended functionality. This improves the reliability of our stock management testing.
Original PR description
In a previous fix in #174442, we ensured that the order of moves when freeing reservation would remain deterministic, even if move dates were the same. In the test however, we didn't make sure that both moves were created at the exact same time, meaning that in some case, a millisecond could pass between the two moves creation, making the later assert checking if both dates are the same wrong, and making the test irrelevant. Now freeze the time at an irrelevant date just to make sure the test always does what it was intended to do. runbot-233470 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239229
11 changes
Resolved issues and error corrections
This update fixes an issue where multiple quality checks were being created for the same receiving operation, leading to inefficiencies. The change adds a validation step to ensure only one quality check is generated per operation, streamlining the receiving process and reducing potential errors. This improves data accuracy and operational efficiency.
Original PR description
Steps to reproduce: -------------------------- 1. Install the Quality module. 2. Create a Quality Control Point with: * Control per: Control on Operation. * Operation: Receipts (set in the Operations…
Steps to reproduce: -------------------------- 1. Install the Quality module. 2. Create a Quality Control Point with: * Control per: Control on Operation. * Operation: Receipts (set in the Operations field). 3. Create a Receipt containing one product. 4. Click the Mark as To Do button. 5. Add another product to the same Receipt and save it. Observation: -------------------------- Two quality checks are generated for the same picking, despite the tooltip indicating that only one check should be created per operation. Issue: -------------------------- No validation existed to verify whether an operation-based quality check had already been created for the picking when adding additional stock moves after confirmation. Solution: -------------------------- Add a check ensuring that if a quality check already exists for the same picking type and operation (with no product or category criteria), no additional operation-based quality checks are created. opw-5249233 Forward-Port-Of: odoo/enterprise#100118
This update enhances the stability of the Account EDI client by preventing automatic deletion of connections when the IAP API returns an error indicating a user no longer exists. This resolves past incidents caused by IAP issues, ensuring smoother operation and reducing potential disruptions to account processing.
Original PR description
We already have had multiple IAP-side incidents leading to IAP API returning `no_such_user`. This error code should not lead to user deletion client-side. Thus this commit addresses this by avoiding to archive long-standing IAP connections even when `no_such_user` error is received. Forward-Port-Of: odoo/odoo#234073
This update fixes an issue where invoice reports in the KE (Kenya) localization module were not correctly formatting the total and taxable amounts with commas. The fix removes a duplicate XPath and applies proper formatting options, ensuring invoices display prices accurately for KE customers. This improves clarity and compliance for financial reporting.
Original PR description
Steps to reproduce: 1. install `l10n_ke` 2. Switch to KE Company 3. Create a product with all KRA eTIMS details set on the Accounting page. 4. Create an invoice to KE Company with that product and set unitprice > 10000 5. Confirm the invoice and send it. Now, see the invoice report Issue: 1. xpath for `td_subtotal` was duplicated 2. The total amount and taxable amount were not formatted as prices (no commas). Before: <img width="771" height="397" alt="image" src="https://github.com/user-attachments/assets/492fe911-18d6-4e01-a16d-d7450c17373f" /> After: <img width="766" height="389" alt="image" src="https://github.com/user-attachments/assets/bbe5d4e2-b337-445c-833a-06492a8c827d" /> Solution: Updated the invoice report to: - Remove the duplicated `td_subtotal` xpath. - Properly format the total and taxable amounts with `t-options`. opw-5341578 Forward-Port-Of: odoo/enterprise#100279
This update fixes an issue where the order partner wasn't being correctly updated in the backend after scanning the online payment QR code. Previously, changes to the partner were not reflected in the order details. Now, the system accurately records the updated partner, ensuring accurate transaction tracking.
Original PR description
# Steps to Reproduce 1. Configure a payment method as **Online Payment**. 2. Select a customer and proceed to pay the order. 3. The QR code for online payment is generated. 4. Note: the partner is correctly loaded in the backend. 5. Close the QR popup and change the partner. 6. Scan the QR again and proceed to pay. # Expected Behavior - The transaction should reflect the updated partner, not the previous one. # Actual Behavior - The transaction is recorded under the previous partner. - The partner is not updated in the order. # Issue - Updating the partner does not immediately update the order in the backend from the POS UI. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where the QR code popup for online payments was displaying an incorrect order reference (showing a forward slash instead of the actual order name). This change ensures that customers receive accurate order information when making payments via QR code, improving the payment process. The fix was implemented as part of the Odoo 18.0 release.
Original PR description
When using the `POS Online Payment` method, the QR popup was displaying an incorrect order reference (e.g., `/`) instead of the actual order name. Steps to reproduce: 1. Activate a payment method for a `Point of Sale` and set it as `POS Online Payment`. 2. Create an order in the POS and select the configured payment method. 3. When the QR popup appears, the amount is correct but the order name shows `/` instead of the real reference. This fix ensures the correct order name is displayed in the QR popup. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where downpayment invoices weren't correctly reflected in the 'Un-invoiced Balance' calculation within the sales quotation. The fix ensures that downpayments are now accurately considered when determining the amount still outstanding, improving invoice accuracy and reporting. This impacts how sales balances are tracked.
Original PR description
#### Versions: 18.0+ ### Issue: Sales' uninvoiced balance (`amount_to_invoice`) is not updated with downpayments. #### Steps to reproduce: Requires Studio - Enter the Sales app: - Change the list view with Studio: - Add the field `Un-invoiced Balance` (amount_to_invoice) as a new column. - Create a new quotation with a product having the `Ordered quantities` invoicing policy; - Confirm the quote; - Create and confirm a downpayment invoice based on fixed amount; - Go back to the quotation list view: - The "Un-invoiced Balance" field is not updated and still shows the total amount of the quotation. ### Cause: Downpayments have no quantity, so they are not considered in the computation of the uninvoiced balance as they are set to 0 in the method `_compute_amount_to_invoice`: https://github.com/odoo/odoo/blob/70d16283b58ab8f379279de54de81bdb680e0887/addons/sale/models/sale_order_line.py#L1146 opw-5274918
This update fixes an issue where the number of reconciliation entries displayed on the dashboard was incorrect. The system was filtering out draft journal entries, which could be reconciled. Now, all entries, including draft ones, are accurately counted, ensuring users see the correct number of reconciliations available.
Original PR description
Steps to reproduce: - go to daschboard > N to reconcile - validate the first entry - back to dashboard you will N-1 to reconcile - Reset to to draft the journal entry associated with the reconciliation - Reset the bank reconciliation Issue Back to the dashboard you will see N-1 to reconcile but when clicking on it you will have 8 entries to reconcile Cause: We filter out non posted entries. In Odoo, draft entrie can be reconciled. opw-5102016
A minor bug in the HTML editor's testing process was causing intermittent test failures. This update refined the test's targeting to avoid false positives related to the toolbar, ensuring consistent and reliable test results. This improves the overall stability of the HTML editor module.
Original PR description
Because of the toolbar being sometimes opened, the test added in odoo#238735 would sometimes failed. This was due to the selector "span" also targetting the elements in the toolbar. To prevent this test from failing, the selector "span" was updated to be more specific.
This update fixes a problem where blog post publication times were inconsistent during performance tests. The change ensures that tests always produce the same results by freezing time during initial data retrieval, preventing variations in post publication timing. This improves the reliability of our blog performance metrics.
Original PR description
Some blog post are published with a post_date matching the time the test is run meaning that they are not considered published. We have multiple possibilities when _get_url_hot_query is called: - all call to /blog are executed before the publication date: 9 - some call to /blog are executed after the publication date: 11 - only the last call is executed after the publication date: ~40-50 Using freezetime after the publication date ensures a consistent result This can be easily reproduced by freezing the time on the first calls in _get_url_hot_query and not on the last one. Runbot error [55754](https://runbot.odoo.com/odoo/error/55754) Forward-Port-Of: odoo/odoo#239236
This update ensures that users' presence status is accurately reflected after returning from periods of inactivity. Previously, updates were missed if the user hadn't been away during the last status check. This fix guarantees consistent and reliable presence information for users.
Original PR description
Before this commit, the user's presence might not be updated after returning from inactivity. This occurs because the status service only sends an update if the user was away during the previous update. However, this condition doesn't account for cases where the update was never sent. Forward-Port-Of: odoo/odoo#239202
This update corrects a technical issue related to the transmission of Swiss payroll data (ELM). Specifically, it adds a necessary group to the teleworking field in the HR contract and employee models. This ensures accurate reporting to Swiss tax authorities, complying with local regulations.
Original PR description
Forward-Port-Of: odoo/enterprise#101691
2 changes
Resolved issues and error corrections
This update resolves an issue where users utilizing the Swedish POS blackbox couldn't adjust prices within the system. The change allows price control functionality, aligning with requirements for the Swedish blackbox, which differs from the Belgian version. This ensures accurate pricing for Swedish customers using the POS.
Original PR description
Before this commit, user couldn't control the price in the POS if using the swedish blackbox. After this commit, user can control the price. It's not clear why the behavior at integration was set to this but it appears that it's not mandatory for swedish blackbox unlike the belgian one. opw-5253401
This update resolves an issue where portal users couldn't update lead data after a recent security change. The team implemented a temporary workaround using 'sudo()' to grant necessary write access, ensuring portal users can now modify lead information as intended. This ensures seamless opportunity management through the portal.
Original PR description
## Steps to reproduce: - Install 'website_crm_partner_assign' module. - Create a partner X with a partner level. - Save and go to "Opportunities". - Create an new opportunity. - Edit it and set the…
## Steps to reproduce: - Install 'website_crm_partner_assign' module. - Create a partner X with a partner level. - Save and go to "Opportunities". - Create an new opportunity. - Edit it and set the partner X as the assigned partner - Grant the partner x portal access and change his password. - Logout then login with the partner X credentials. - Go to "My account" page and click on "Opportunities" - Select the opportunity Y and edit the revenue or another field. - Traceback on save. (Or no reaction, popup traceback from notification) ### Issue: Since the commit ed94e84, we've removed the write access for portal partner users to the leads to avoid unexpected behaviors. However, this is provoking `update_lead_portal` to not be able to update the lead anymore, since we will not have direct access to modify the lead. ### Solution: To fix this, we will follow same approach as in `update_contact_details_from_portal` and use `sudo()` to update the lead from the portal. We are already checking the portal access at the beginning of the method as `self._assert_portal_write_access()`, so we are sure that only authorized users will be able to update the lead. opw-2764563 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr