Friday, July 25, 2025
20 changes · saas-18.3
Resolved issues and error corrections
This fix ensures Spanish TicketBAI credit notes created using the differences method report negative line, tax, and total amounts as required. It helps businesses submit accurate electronic tax documents and avoid reporting inconsistencies.
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#220300 Forward-Port-Of: odoo/odoo#217172
This fix prevents errors when moving floating orders to another order or table in Point of Sale and Restaurant workflows. Staff can now transfer orders consistently regardless of whether they are tied to a table, reducing interruptions during service.
Original PR description
While transferring a floating order to another or a table, a traceback was raised. Is now possible to transfer orders to anything independent of the table or order type. taskId: 4948719 Forward-Port-Of: odoo/odoo#219236
The sales order task counter now excludes tasks that have been converted into templates. This prevents the Sales screen from showing an inflated number of active tasks, giving users a more accurate view of work linked to an order.
Original PR description
…count Before this commit, the tasks stat button displayed in the SO form view takes into account the task templates if the templates are linked to the SO. This commit adds a condition to exclude the task templates in the count displayed in that stat button. Steps to reproduce the issue ---------------------------- 0. Install sale_timesheet module 1. Go to Sales app 2. Create a quotation with a service product in which a task will be created once the quotation will be confirmed. 3. Confirm the SO 4. Click on tasks stat button 5. Click on the task containing in the list view 6. Convert that task into a template 7. Go back to the form view of the SO created. Expected Behavior ----------------- The Tasks stat button count should not take the template into account. Current Behavior ---------------- The Tasks stat button count take the template into account. task-4781135
Fixes an issue in the website editor where pressing backspace after selecting text across paragraphs could delete content outside the selection. This helps prevent accidental loss of nearby content when editing pages or emails.
Original PR description
Problem: Given content like: ``` <p>keep<br>[delete</p> <p>delete<br>delete<br>]</p> <p>keep</p> ``` Pressing backspace removes the last "keep" as well, which is incorrect. Cause: The merge logic uses `range.endContainer` as `joinWith`, but does not account for `range.endOffset`. When `range.endContainer` is a `<p>` with a non-zero offset, the condition `next.previousSibling && next.previousSibling === joinWith` fails. During merging, `next` may go inside `joinWith`, making the logic invalid. Solution: Prevent merging when `next` is positioned exactly at `range.endOffset`, preserving the correct boundary. Steps to reproduce: - Add the sample HTML to the editor - Select from `[delete` to `delete]` - Press backspace -> The final `<p>keep</p>` is deleted incorrectly opw-4905047 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220163 Forward-Port-Of: odoo/odoo#219392
This fixes a display issue in the HTML editor where deleting a checked checklist box could leave the checkmark behind. Users editing checklists will now see the item update cleanly and consistently when they remove a checkbox.
Original PR description
Problem: After commit 02ae5a645a80e6088a596b6273e70b5476e79e88, pressing backspace on a `li` adds the `oe-nested` class. If that `li` is a checked checkbox item, only the checkbox is removed, but the checkmark remains visible. Solution: Always remove the `o_checked` class when converting the list item to `oe-nested`. **After we backspace on checked item:** Before: <img width="975" height="324" alt="image" src="https://github.com/user-attachments/assets/374bf407-25d7-45fa-a84e-0aef72aa3690" /> After: <img width="972" height="366" alt="image" src="https://github.com/user-attachments/assets/33575d7c-ea1c-432c-b4b6-4ce248e2fc78" /> Steps to reproduce: - Add a checklist - Check an item - Press backspace to remove the checkbox -> The checkmark remains visible, even though the box is gone opw-4953981 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219838
To reproduce: ============= -1 Install Peru accounting -2 Change language to Spanish PE -3 Go to add a new Tax form -4 Change code to ISC -5 Debug mode you will see the selections are not well translated Problem: ======== Translation team requested to change selections translations Solution: ========= Update translations opw-4954487 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220353
Original PR description
To reproduce: ============= -1 Install Peru accounting -2 Change language to Spanish PE -3 Go to add a new Tax form -4 Change code to ISC -5 Debug mode you will see the selections are not well translated Problem: ======== Translation team requested to change selections translations Solution: ========= Update translations opw-4954487 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220353
Fixes an issue where the image crop tool could stay visible after an image was deleted, and another issue where reopening crop after using image transform could fail. This makes image editing in Odoo's editor more reliable and prevents confusing on-screen tools from lingering.
Original PR description
### Steps to reproduce: **Issue 1:** - Add an image in the editor. - Apply image transformation (e.g., shrink it). - Open the image cropper tools. - Press the Backspace key. - Observe that cropper…
### Steps to reproduce: **Issue 1:** - Add an image in the editor. - Apply image transformation (e.g., shrink it). - Open the image cropper tools. - Press the Backspace key. - Observe that cropper still visible. **Issue 2:** - Go to To-Do and insert an image. - Click on Image Transform, then on Image Crop — observe that Image Crop opens correctly. - Click the Discard button in the Image Crop UI. - Again select the image, click Image Transform, then Image Crop. - Notice that Image Crop no longer opens. ### Description of the issue/feature this PR addresses: - Pressing Backspace removes the image from the editor. - However, the cropper remains open, and focus returns to editable area, allowing to type with the cropper still visible. - Clicking Image Crop while Image Transform was active could destroy both due to async loadBundle() timing. On subsequent attempts, ImageCrop was added before ImageTransform was removed, causing Owl to destroy both in the same frame. ### Desired behavior after PR is merged: - When the image is removed, the associated cropper is also closed. - Clicking Image Crop button while Image Transform is active now works. task-4859869 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213914
This fixes UBL e-invoice generation so product identification fields are not created when a product has no barcode. It helps avoid malformed or misleading invoice data and adds test coverage for direct invoice export scenarios.
Original PR description
In the refactored UBL (with `account_edi_ubl_cii.use_new_dict_to_xml_helpers`): Currently we may generate the `StandardItemIdentification` node even in case the `barcode` is not set on the product. The issue was introduced as a FW-port issue in commit f46c10f03e59e8aae98079fc57f5295a376f2761 (18.0). The problem is that the `schemeID` attribute is always set. task-None (original fix is task-4941855) Forward-Port-Of: odoo/odoo#219896
Point of Sale category labels now display Chinese text horizontally instead of stacking characters vertically. This makes category names readable for Chinese-speaking users and improves usability at checkout.
Original PR description
**Issue** Using `max-width: min-content `combined with `d-flex` caused Chinese characters to stack vertically, as each character is treated like a word and with a 2-line height, only first two 2 characters were visible **solution:** Switch to grid layout and remove max-width to ensure label width isn't constrained by its content length. opw-4766145 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#210312
The Documents app now shows website and company fields only to the right internal users and only when those fields are relevant. This prevents portal or external users from seeing fields they should not see, while keeping the interface cleaner for internal users in simpler setups.
Original PR description
Fixes the visibility of the `website_id` and `company_id` fields. These fields other than hidden from non internal users, they should be visible to internal users only when multiple websites or multiple companies are available, respectively. Partial revert of: ddf102e5 task-4505668 Forward-Port-Of: odoo/enterprise#90876 Forward-Port-Of: odoo/enterprise#86181
Subscription renewals that move customers between recurring plans now calculate commissions using transfer activity, so sales compensation better reflects the plan change. The update also prevents duplicate achievement lines when no currency is set and improves commission report loading performance.
Original PR description
PURPOSE In order to take into account the achievement rate based on recurring plan for MRR log on a renewal, we need to take into account transfer logs SPECIFICATIONS Take into account transfer logs…
PURPOSE
In order to take into account the achievement rate based on recurring plan for MRR log on a renewal, we need to take into account transfer logs
SPECIFICATIONS
Take into account transfer logs in achievements computation. Source should be clear that it's a transfer log of a renewal
Example:
If you have a Monthly sub to 100$/month but the yearly of 1000/year (MRR = 83.33) With a commission plan rewarding: 80% MRR of Monthly and 100% MRR of yearly
If you renew a montlhy into a yearly --> MRR that was 100 become 83,33 so you have a negative MRR so a negative commission and a negative on yearly so with more weight (100% instead of 80)
Current:
Renew in into yearly: 100% of MRR change -16.67 = -$16.67
New monthly 80% of MRR change $100 = $80
Total = 63.33 (modifié)
New
New monthly 80% of MRR change $100 = $80
Transfer 1 : 80% of MRR change -100 = -$80
Transfer 2 : 100% of MRR change +100 = +$100
Contraction of MRR: 100% of MRR change -16.67 = -$16.67
Total = 83.33
Moreover this PR:
- fix a bug when achievements were duplicated when no currency was set.
- improve performances by creating a temporary table for invoice rules.
taskid-4783929Belgian Intrastat XML exports now respect the option to hide zero-value lines, matching what users see on the report screen. This prevents fully discounted or zero-cost transactions from being included in official XML exports when users choose to exclude them.
Original PR description
_______________________________________ ## Short functional explanation of the error On the export intrastat report page, we can click on the 'Posted Entries' button, which allows us to select 'Hide…
_______________________________________ ## Short functional explanation of the error On the export intrastat report page, we can click on the 'Posted Entries' button, which allows us to select 'Hide lines at 0'. Doing this will prevent 0 cost transactions from appearing in the report. However, when exporting to XML, such transactions are still displayed. Note: this is related to Belgian companies only. ## Reproduction Steps 1. Go to settings and make sure the company you're operating with is Belgian. Then, in accounting, under the Custmer Invoices section, check the 'Intrastat' option. 2. Go to products and create a new product of type 'Goods'. Then, in the 'Accounting' tab, click on a random commodity code. Set the country of origin as a country belonging to the European Union (for example, Austria). Click on save. You should see a field named 'Intrastat Supplementary Unit Amount' appear. 3. Go to accounting. Click on the 'Vendors' tab and 'Bills'. Click on New. Select a random vendor, and add a line containing the product you just created. Add the column 'Intrastat' and set the corresponding field at '11 outright...'. Then, set a price. In the 'Other Info' tab, set the field 'Intrastat Country' as a random country in the European Union (for example, Australia). Set the fiscal position at 'Import/Export' and set the 'Intrastat Transport Mode' field at '1. Sea transport'. Finally, click on confirm. 4. Duplicate the vendor bill you just created. On this new vendor bill, set the Intrastat at '12 Direct trade...'. Display the column 'Disc.%' and set the field at 100. Then click confirm. 5. Click on the 'Reporting' tab, and under 'Audit Reports', click on 'Intrastat Report'. Set the month to the current month, then click on 'Report: Intrastat(Services....)' and select 'Intrastat (Goods)'. You should be able to see the 2 vendor bills you just created. Click on 'Options' then 'Hide lines at 0': you should see the bill having a 0 cost disappear. Finally, click on the cog on the top left next to 'Intrastat Report' and click on 'XML'. 6. Once the XML file has finished downloading, open it. ### Expected behavior The transaction having a 0 cost shouldn't appear. ### Unexpected behavior The transaction having a 0 cost appears. ## Origin of the issue In the code responsible for the display of the XML report, there isn't any condition responsible for checking if the transaction should be displayed or not. _________________________________________ opw-4464123 --- Forward-Port-Of: odoo/enterprise#90193 Forward-Port-Of: odoo/enterprise#89285
This fixes an issue where failing part of a quality check could incorrectly mark related receipt moves as picked. The change keeps stock receipt status accurate after quality failures, reducing confusion and preventing incorrect warehouse processing.
Original PR description
Steps to reproduce the bug:
- Create two storable products: "P1" and "P2"
- create a quality control point:
- operation: receipt
- products: “P1” and “P2”
- Failure location: any one
- Create a receipt for 1 unit of P1 and 2 units of P2
- Pass the quality check for P1
- For P2, pass 1 unit and fail the other
Problem:
A new move for P2 is created to the failure location, but as a result, both moves for P2 are marked as picked, whereas the move for P1 is not. Solution:
We shouldn’t mark any move as picked during the quality check.
Partial backport of: https://github.com/odoo/enterprise/pull/77985/commits/48bfc8a860fa4b5b5e9ea153932f34b47bdcec6c
opw-4902059
Forward-Port-Of: odoo/enterprise#90178
Forward-Port-Of: odoo/enterprise#89634Updates an incorrect validation message in the Belgian certified POS setup so it now tells users to use 0.05 rounding with the nearest method. This helps businesses configure cash rounding correctly and avoids confusion during setup.
Original PR description
The message `'The rounding method must be set to 0.5 and "Nearest"'` was wrong in `pos_blackbox_be/models/pos_config.py`
```py
def _check_cash_rounding(self):
if not self.cash_rounding:
raise ValidationError(_("Cash rounding must be enabled"))
if (
self.rounding_method.rounding != 0.05
or self.rounding_method.rounding_method != "HALF-UP"
):
raise ValidationError(
_('The rounding method must be set to 0.05 and "Nearest"')
)
```
It should be `'The rounding method must be set to 0.05 and "Nearest"'` as indicated in that documentation :
https://www.odoo.com/documentation/17.0/applications/finance/fiscal_localizations/belgium.html?highlight=blackbox#certified-pos-system
It's the same for 18.0
I also added the field for translation into `pos_blackbox_be.pot`
opw-4862967
Forward-Port-Of: odoo/enterprise#90321
Forward-Port-Of: odoo/enterprise#87496Website Helpdesk tickets now avoid showing a duplicate description field when no extra contact form fields are present. When the field is shown, its label uses the user's selected language, improving clarity for multilingual customers and support teams.
Original PR description
## Short functional explanation of the issue When a ticket is created and there are no additional fields, the only field in the ticket is the description field. Moreover, it is not translated. ##…
## Short functional explanation of the issue When a ticket is created and there are no additional fields, the only field in the ticket is the description field. Moreover, it is not translated. ## Reproduction Steps 1. Go to the general settings. Add a language where the term "description" differs from the english word (for example, Spanish). Do the same for the website settings. 2. Go to the website app. Scroll down and change the language. Then, click on the translated "contact us" tab. Fill the form and send the ticket. 3. Go to the helpdesk app and open the ticket you just created. ### Expected behavior The description field shouldn't show, as it appears in the description page. The field should only show if there are additional fields on the "contact us" page. ### Unexpected behavior The description field shows, untranslated. ## Origin of the issue In the ticket code, the field.name is used, instead of the field .field_description, which is translatable. Moreover, there isn't a condition checking if the field should appear or not. -- opw-4876726 Forward-Port-Of: odoo/enterprise#88913
This update makes automated checks for the Studio report editor more dependable by improving how they wait for scrolling to finish. It reduces occasional false test failures, helping teams trust release validation results without changing business functionality.
Original PR description
Linked tests: - `test_add_field_blank_report` - `test_field_placeholder` These tests contained scroll-related indeterminacies that caused them to fail from time to time. This was due to the fact that we were modifying the scroll and we used this code to make sure it was done: ```js await new Promise(requestAnimationFrame); ``` However, sometimes this wasn't enough, so we now use `waitUntil`, which is more robust https://runbot.odoo.com/odoo/runbot.build.error/181989 runbot-181989 Forward-Port-Of: odoo/enterprise#90806
Mexico payroll calculations now handle employees who do not yet have an initial contract start date. This prevents salary configurator and payslip errors during recruitment or offer creation, helping payroll processes continue reliably.
Original PR description
Before this fix, various computations relying on `employee.first_contract_date` fails if the value was missing, notably: - `_compute_integration_factor` in payslips - Python expressions in MX salary rules (holiday bonus, ISR, etc.) Steps to reproduce: Install the following modules: - Recruitments, Payroll, Salary Configurator - Mexico - Payroll, Mexico - Payroll - Localisation, EDI for Mexico Go to Recruitment -> create or click on application in any offer -> click on generate offer(create a contract templates if needed) -> Click on Salary Configurator, notice the Invalid Operation Error After fix: - Default the integration factor to 1 and years worked to 0 when no start date exists - Safely guard salary rule conditions and computations with proper checks This ensures robust payroll calculation even for employees without an initial contract date. opw-4853613 Forward-Port-Of: odoo/enterprise#90648
Referral autocomplete search results now keep spaces in displayed names, making entries easier to read and distinguish. This fixes a display issue in the HR Referral module without changing the underlying referral workflow.
Original PR description
This commit applies the same methodology as in https://github.com/odoo/odoo/pull/218768 to resolve the missing spaces issues in many2x autocomplete search results. task-4898120
Fixed an issue where reloading a Sign request page or opening it in a duplicated browser tab could show an error instead of the request. This makes the signing workflow more reliable for users returning to or sharing active request pages.
Original PR description
**Steps to reproduce:** 1. Install sign 2. Create a sign request and send it to someone 3. Now, either refresh the page or duplicate the page **Issue:** - Traceback Error ```UncaughtPromiseError > OwlError Uncaught Promise > The following error occurred in onMounted: "Cannot read properties of undefined (reading '4')" ``` **Cause:** - requestItemStates is not defined here, which is passed by context https://github.com/odoo/enterprise/blob/ceebc915607b471ffb8e3bbde055c6816cc06b43/sign/static/src/backend_components/sign_request/sign_request_control_panel.js#L34 **Solution:** - Add a safe fallback if requestItemStates is not present backport a5a6718c3a2fba226ecd7ed3efdb32d06777b6ae opw-4949153 Forward-Port-Of: odoo/enterprise#90601
Installing Partner Commission no longer fails when the default Services product category has been removed. This prevents an installation-blocking error and lets businesses enable the module even after customizing product categories.
Original PR description
Currently, a ParseError is arising when the user installs the `partner_commission` module after deleting the `Services` in Product Categories/Configuration. Steps to reproduce: --- - Install…
Currently, a ParseError is arising when the user installs the `partner_commission` module after deleting the `Services` in Product Categories/Configuration.
Steps to reproduce:
---
- Install `Invoicing` application (without demo data).
- Invoicing > Configuration > Product Categories > Delete `Services`
- Now install `partner_commission` module
Traceback:
---
```py
ValueError: External ID not found in the system: product.product_category_services
ParseError: while parsing /home/odoo/src/enterprise/saas-18.4/partner_commission/data/data.xml:3, somewhere inside <record id="product_commission" model="product.product">
<field name="name">Commission</field>
<field name="purchase_ok" eval="True"/>
<field name="categ_id" ref="product.product_category_services"/>
<field name="type">service</field>
</record>
```
The error occurs because the user deleted `Services` in Product Categories, and then tried to install the other module.
This commit resolves the error by providing a False value for the field if the product category is missing.
sentry-6754387015
Forward-Port-Of: odoo/enterprise#90598