Daily updates from Odoo
Thursday, July 24, 2025
19 changes · saas-18.3
Resolved issues and error corrections
Fixed an issue where confirming an upsell with a non-recurring product could incorrectly increase the quantity on the original subscription. This helps keep subscription records accurate and prevents unintended billing or contract changes.
Original PR description
**Steps to reproduce:** - Install `sale_subscription` - Create a recurring product (P1) and a non-recurring product (P2) - Create a Sale Order (S1) with P1 (quantity > 0) and confirm it - Create an…
**Steps to reproduce:** - Install `sale_subscription` - Create a recurring product (P1) and a non-recurring product (P2) - Create a Sale Order (S1) with P1 (quantity > 0) and confirm it - Create an upsell of S1 (new child order S2) - In S2, edit the P1 line, and select P2 - Set quantity > 0 for P2 - Confirm S2 **Issue:** After confirming the upsell order (S2), the quantity of P1 on the original subscription (S1) is incorrectly increased by the quantity of P2 from S2. The _compute_parent_line_id method did not reset the parent_line_id when the product was not a subscription Product, which caused it to incorrectly update the subscription This issue is present in all three versions: **16.0, 17.0, and 18.0**. **Solution:** Reset parent_line_id to False if the product is not a subscription product to prevent incorrect subscription updates. [opw-4638955](https://www.odoo.com/odoo/project.task/project.task/4638955) Forward-Port-Of: odoo/enterprise#90848 Forward-Port-Of: odoo/enterprise#88282
Brazilian point-of-sale orders with a total cost of zero now include the required payment information when sent to Avalara. This prevents invoice submission failures caused by missing payment details, improving reliability for free or fully discounted sales.
Original PR description
Right now, for 0 cost POS orders no `paymentMode` section is sent to Avalara, which leads to an error from them when trying to submit the invoice: Code 899: incorrectly entered payment method field The proper fix is to always send `paymentMode` with a value of 0.00 and mode of `Other`. (Note that there is a payment mode that corresponds to no payment, 90, but it only available for NF-e not NFC-e so we use 99) opw-4874094 Forward-Port-Of: odoo/enterprise#90724
Odoo now handles attendance records that cross midnight by splitting them into separate daily work entries. This prevents false conflicts when later attendance is recorded on the following day, improving payroll and attendance accuracy.
Original PR description
Steps to reproduce the issue: 0. Set work_entry_source to "attendance" on the running contract of the employee. 1. Create an attendance for yesterday 23:00:00 UTC to today 06:00:00 UTC. 2. Create an…
Steps to reproduce the issue: 0. Set work_entry_source to "attendance" on the running contract of the employee. 1. Create an attendance for yesterday 23:00:00 UTC to today 06:00:00 UTC. 2. Create an attendance today from 08:00:00 UTC to 16:00:00 UTC. Current behavior before PR: Odoo will create a conflicting work entry with the one created in step 1, because the logic recreates all work entries in a timeframe between the start date at 00:00:00 and end date at 23:59:59. The first entry started before this timeframe, so the recreated work entry does not align with the existing one, causing a conflict. Desired behavior after PR is merged: The work entries now span a single day at a time. If an attendance starts at night and ends the next morning, two entries will be created: one from the start time to end of day, and another from the start of the next day to the end time. opw-4869604 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#90588
Ecuador electronic invoice processing now handles empty or incomplete responses from the tax authority instead of crashing. This improves reliability when users process invoices and the external service returns unexpected data.
Original PR description
The system will crash when we receive nothing in `response` and also tryig to retrieve values from response. **Error:-** `TypeError: 'NoneType' object is not subscriptable` **Root Cause:-** - While…
The system will crash when we receive nothing in `response` and also tryig to retrieve values from response. **Error:-** `TypeError: 'NoneType' object is not subscriptable` **Root Cause:-** - While we are in `EC Company`. - When we click `Process Now` on the invoice. It will call `button_process_edi_web_services` method. And while in execution when at [1], `move.company_id._l10n_ec_is_demo_environment()` is `False`, then it calls `_l10n_ec_send_document` method. - While submitting electronic invoices to SRI, the method `_l10n_ec_get_client_service_response_new()` sometimes returns `None` . - It may also lack expected keys like 'estado' or 'comprobantes', depending on SRI’s behavior. [1] https://github.com/odoo/enterprise/blob/ce9eed675db4de3bcd1b283688c5c44d2e1ecf12/l10n_ec_edi/models/account_edi_format.py#L425-L428 **Solution:-** - Wrapped the access to response and its keys inside a `try...except` block that catches:- - `TypeError`: for cases where the response is `None`. **Sentry - 6708486009, 6728767866** Forward-Port-Of: odoo/enterprise#88611
This fix ensures Chilean electronic factoring documents always show the total amount in Chilean pesos, even when the original invoice uses another currency. This prevents incorrect AEC files from being generated and helps businesses submit compliant documents to the Chilean tax authority.
Original PR description
In this bug, when a currency other than CLP is selected in invoicing, the generated aec has MntTotal tag with the rate of selected currency, while it must always be in CLP. To reproduce the bug: 1- Create a database with invoice app and a Chilean company 2- Create an invoice with document type of 34 3- Choose a different currency than CLP 3- Click on Send Now to SII and Create AEC 4- Click on Yield Entry smart button 5- Download generated AEC xml file 6- You can see the value of MntTotal is in selected currency which is wrong related: https://github.com/odoo/enterprise/commit/4e97c5d008c2879c5d014203fafc2c125d6c5ae7 opw-4830957 Forward-Port-Of: odoo/enterprise#90232
This fixes an error that could appear when users or integrations viewed signature requests that were not in the shared state. Those requests now safely show no share link instead of causing a traceback, improving reliability for document-signing workflows and API access.
Original PR description
### Issue Commit [58425a0](https://github.com/odoo/enterprise/commit/58425a0022c79f2c45f23fdd5a5476d8c20a887e) introduced a new field `share_link` in `sign.request` that gets computed for requests…
### Issue Commit [58425a0](https://github.com/odoo/enterprise/commit/58425a0022c79f2c45f23fdd5a5476d8c20a887e) introduced a new field `share_link` in `sign.request` that gets computed for requests that are in the 'shared' state. However this compute method fails for requests not in the 'shared' state leading to a traceback error. This commit fixes it by setting the default as False for the sign.request records that do not have state='shared' so the traceback error is handled. This can be reproduced in v17 and above by: 1. Open any sign.request record that isn't in the shared state 2. Enable Developer Mode 3. Using the debug icon, click on view record data The traceback will be visible here which mentions that the compute method failed to assign It can also be re-produced by using an xml-rpc / json-rpc ORM call to search_read the sign.request records that does not have state = 'shared' ### Before https://github.com/user-attachments/assets/24c07f2a-2398-44b4-8969-30abb576876a ### After https://github.com/user-attachments/assets/e92b1212-5405-4b98-ba41-c81b2ac547d7 [opw-4864159](https://www.odoo.com/odoo/project/49/tasks/4864159) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#90576
The AI feature now correctly shows the resources banner when no supporting documents are provided. This prevents unnecessary processing and gives users clearer feedback sooner.
Original PR description
Fixed displaying resources banner if no docs provided to stop before running the computation query.
Self-service orders now reach the preparation display only after payment succeeds when a payment method is configured. Mobile self-ordering still allows unpaid orders to be prepared when no online payment method is available, keeping that workflow usable.
Original PR description
pos_self_order*: pos_online_payment_self_order_preparation_display, pos_self_order_preparation_display Ensure self-orders are sent to the preparation display only after a successful payment, when a valid payment method is configured. **Issue 1: Orders sent for preparation before successful payment** **Steps:** - Configure the kiosk with an online or terminal payment method. - Open the kiosk, add products, and proceed to payment. **Issue:** - Preparation orders were being sent even if the payment was not completed. **Fix:** - Restrict preparation flow to only orders with a successful payment when a valid payment method is configured. --- **Issue 2: Orders not sent for preparation in mobile mode without the online method** - Allow unpaid orders to be sent for preparation only in mobile mode when no online payment method is configured. Task-4845410 Related: https://github.com/odoo/odoo/pull/213493
Customers who receive a shared helpdesk ticket or a ticket message are now automatically added as followers. This ensures they can view the relevant ticket in the customer portal without extra manual steps.
Original PR description
Before this commit, when a ticket was shared through the share wizard or when a message was sent to a customer via the chatter, the recipients were not added as followers of the ticket. As a result, they couldn't see the ticket in the portal. This commit ensures: - Recipients are now added as followers of the ticket when it is shared with them through the wizard. - A message to a customer in the chatter also adds them as a follower of the ticket. task-4781259 Forward-Port-Of: odoo/enterprise#86169
This fixes formatting issues when fields or records are inserted into AI prompts, making them easier to delete and edit around. It also reduces unnecessary background updates by only saving prompt changes when the content actually changes.
Original PR description
Purpose: -------- Currently records and fields inserted in AI prompts are badly formatted, making it sometimes impossible to delete an inserted field or to place the cursor after a field or a record. This commit fixes their format: For standalone fields, we do not insert divs inside a span anymore For grouped fields, the container is now a div instead of a t (which was set as inlined by the qweb plugin while the group shouldn't) For records, the container is now a span instead of a div, since we want the records to be inlined. Also, ai prompt widget now only calls onChange when the prompt content changed (to not make useless calls to it) Task-4780975
This update moves Point of Sale configuration tests into the Enterprise POS module where the related functionality belongs. It helps keep automated checks aligned with the correct product area, reducing build issues without changing user-facing behavior.
Original PR description
move tests for POS configuration settings from point_of_sale to pos_enterprise refer to this commit :https://github.com/odoo/odoo/pull/215611/commits/0074d743451834424706608fc76f32b0df9c5f1c build_error-227602 Forward-Port-Of: odoo/enterprise#88742
The point of sale now shows clearer messages when the Belgian Blackbox cable is faulty or the device does not return a valid response. This helps staff understand connection problems faster and gives support teams better logs for troubleshooting.
Original PR description
This PR adds some explicit messages to invalid responsed from the Blackbox. We will now log and inform the user when the cable is malfunctioning or the blackbox isn't responding with a valid message Forward-Port-Of: odoo/enterprise#90465 Forward-Port-Of: odoo/enterprise#90436
Oman companies can now access the Returns option from the Tax Report. This enables users to generate the tax closing form that was previously unavailable because required localization data was missing.
Original PR description
#### Issue: This commit adds a missing account.return.type data in the Oman localization. This is related to the new Accounting Returns #81569 The l10n_om module did not include an…
#### Issue: This commit adds a missing account.return.type data in the Oman localization. This is related to the new Accounting Returns #81569 The l10n_om module did not include an account.return.type record, which prevents the "Returns" button (linked to the action_open_returns) from appearing in the Tax Report. As a result, users in Oman are unable to access the Tax Closing form. Also the l10n_om is a community module, because of that, we need to add a new enterprise module to add the related data for the tax returns. The visibility of the button is controlled by the following condition: [Code](https://github.com/odoo/enterprise/blob/f924f120cbd04002e21c78b081e1c8006b56a4b6/account_reports/models/account_report.py#L1776) #### Affected Versions: 18.3 and later #### Steps to reproduce: 1.Install the l10n_om module 2.Switch to the Oman company 3.Go to Accounting > Reporting > Tax Report 4.The "Returns" button is not visible #### Expected behavior The "Returns" button should be visible, allowing the user to generate the closing tax form. #### Current behavior The button is hidden due to missing account.return.type data in the Oman localization. OPW-4943024
Fixed an issue where employees without expense management rights could upload an expense PDF through OCR but then be blocked by an access rights error when submitting it. The change ensures OCR-related status updates happen in a way that respects expense permissions, making expense submission smoother for affected users.
Original PR description
How to reproduce the issue: - Upload a pdf via the OCR with a user without expense right. On submitting the expense, an access rights error on the write is thrown. When the expense is created by OCR, on submit, we pass through the action_submit method in hr_expense_extract, which performs validate_ocr, and writes on the expense's extract_state field after the super().action_submit call, which changes the state of the expense from draft to submitted. However, the rule ir_rule_hr_expense_employee_not_draft forbids modifying the expense if it is not in draft state. opw-4855000 Forward-Port-Of: odoo/enterprise#90616
This update fixes an automated test for Mexican point-of-sale invoicing so it no longer fails because of an irrelevant generated identifier. It helps keep validation reliable without changing how users create or process invoices.
Original PR description
Fix the test file for pos order then invoice request to match the expected XML structure, by ignoring the `UUID` attribute in the `TimbreFiscalDigital` element because it is not relevant for the test and can cause issues with the test validation. build_error https://runbot.odoo.com/runbot/build/83409879 Forward-Port-Of: odoo/enterprise#88756
Batch payments in foreign currencies now use the correct exchange rate date during bank reconciliation. This prevents false unbalanced-entry errors when exchange rates change between the payment and reconciliation dates.
Original PR description
Steps to reproduce: - Have the main company in USD - Have 3 different currency rates in date 1, 2 and today - Create a Vendor Bill in EUR in date 1 - Make Payment (EUR) in date 1, it should not have…
Steps to reproduce: - Have the main company in USD - Have 3 different currency rates in date 1, 2 and today - Create a Vendor Bill in EUR in date 1 - Make Payment (EUR) in date 1, it should not have an associated move - Create a Bank transaction, at date 2, matching the payment amount in EUR Bank Journal - Make a batch payment including the created payment - Open bank reconciliation of EUR Bank journal - Select the transaction and the batch payment - Validate Issue: User Error will raise ``` The move (OTR/2017/00001) is not balanced. The total of debits equals $ aaa and the total of credits equals $ bbb You might want to specify a default account on journal "Bank other currency" to automatically balance each move. ``` This occurs because when retrieving the exchange rate values, amounts are converted using the payment values, computed at payment date. Later on, when we aggregate payment amounts, we convert manually the result without specifying a date, creating an issue in case the reconciliation date occurs after a rate change Forward-Port-Of: odoo/enterprise#88299
This fix prevents regular internal users from seeing an access denied message when entering a Colombian company tax ID on a contact. It allows the tax ID check to read the needed DIAN certificate information in the background, improving the contact creation flow without changing user permissions.
Original PR description
When entering a Colombian Tax ID (NIT), the onchange checks `company.l10n_co_dian_certificate_ids`, which reads `certificate.certificate` records , resulting in an “Access Denied” popup. This changes Wrap the certificate lookup in `company.sudo()` so that the NIT VAT‐onchange can fetch the DIAN certificate records. Steps to Reproduce: 1. Install the l10n_co_dian module and switch to CO company 2. Create a user with only the “Internal User” (base.group_user) group—do not grant Administration/Settings. 3. Log in as that non-admin user. 4. Go to Contacts -> Create. 5. Set Country = Colombia and Identification Type = NIT. 6. Enter any VAT (NIT) number and leave the field. 7. “Access Denied” error for certificate.certificate. opw-4936604 Forward-Port-Of: odoo/enterprise#90176
The Swedish SIE4 import now reads files using UTF-8, improving support for Swedish characters that were previously decoded incorrectly. This helps customers import accounting data more reliably without character display issues.
Original PR description
The aim of this commit is using UTF8 instead of ISO-8859-1 for the file decoding. We received feedback from customers that the previous decoding wasn't handle correctly swedish characters. The documentation tends to say that we should follow CP437. As UTF8 is a superset of CP437, we are now using it. opw-4868415 Forward-Port-Of: odoo/enterprise#90498
The Czech VAT Control Statement XML export now uses the official field name for the B2 date value. This prevents the Czech tax portal from leaving that date blank during import, reducing filing errors for affected businesses.
Original PR description
**Steps to reproduce**: 1. Install `l10n_cz` and `l10n_cz_reports_2025`. 2. Create a vendor bill with a vendor whose place of supply is in-country, set the bill amount to more than 10,000, and…
**Steps to reproduce**: 1. Install `l10n_cz` and `l10n_cz_reports_2025`. 2. Create a vendor bill with a vendor whose place of supply is in-country, set the bill amount to more than 10,000, and confirm the bill. 3. Go to Reporting → Tax Return → VAT Control Statement (CZ). 4. You will see the bill listed under section B2. Now export the XML. 5. In the exported XML, the field `dan_dppd` is present. **Observations**: When exporting XML from the VAT Control Statement report, the date field in the B2 section is incorrectly named `dan_dppd`. According to the official CZ VAT Control Report documentation ([link](https://adisspr.mfcr.cz/dpr/adis/idpr_pub/epo2_info/popis_struktury_detail.faces?zkratka=DPHKH1#110009830_dppd)), As a result, when importing the generated XML into the CZ portal, the field appears blank because it is not recognized. **Issue**: The export template uses the incorrect tag `dan_dppd` instead of the correct `dppd` for the B2 section. **Solution**: The export template was updated to use `dppd` instead of `dan_dppd` in the B2 section, as per the official documentation. opw-4868515 Forward-Port-Of: odoo/enterprise#90394