Wednesday, May 21, 2025
8 changes · saas-18.3
Resolved issues and error corrections
Invoice lists now keep draft invoices marked as draft and cancelled invoices marked as cancelled, regardless of payment details. Posted invoices show clearer payment-related statuses such as not paid, overdue, partially paid, in payment, paid, or reversed, making invoice follow-up easier for business users.
Original PR description
Current behavior before PR: After 18.3 and Payment in drafts, we made invoice statuses in list view harder to understand than ever. Desired behavior after PR is merged: If the invoice is in draft regardless of his payment status, it will stay a draft. If it’s cancelled regardless of his payment status, it will be cancelled Otherwise it’s Posted and depending on the payment status and the invoice due date we will have a more detailed status (not paid, overdue, partially paid, in payment, paid, reversed) task-4809515 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix improves how Odoo calculates tax totals when down payments or global discounts are used with line-by-line rounding. It helps invoices, sales orders, and point-of-sale flows match expected totals more closely, reducing rounding discrepancies for customers and accounting teams.
Original PR description
…round_per_line - Fix wrong 'return' instead of 'break' - Fix '_import_base_line_extra_tax_data': >>> float_round(1196.8849999999998, precision_digits=2) 1196.89 >>> currency.compare_amounts(1196.89,…
…round_per_line - Fix wrong 'return' instead of 'break' - Fix '_import_base_line_extra_tax_data': >>> float_round(1196.8849999999998, precision_digits=2) 1196.89 >>> currency.compare_amounts(1196.89, 1196.8849999999998) 0 >>> currency.is_zero(1196.89 - 1196.8849999999998) False We have to use the float comparison instead of subtracting them. - Fix delta distribution for down payment/global discount using round_per_line: Currently, when doing a down payment, we aggregate the base lines first. Then, we fix the tax amounts using manual_tax_amounts and then, we distribute the delta to reach the expected value. That way is too global and becomes an issue when using round_per_line. For example, when performing a down payment of 100%, we could end up with a base and tax amounts that are not the same than the original document. So this commit changes a bit the logic by fixing the tax amounts using manual_tax_amounts first. Then, we aggregate the lines including manual_tax_amounts. Then, we distribute the delta. That way, the results is way closer to a round_per_line computation when choosen. opw-4685953 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes an error that prevented users from deleting projects when the ESG Project module was installed. This ensures project cleanup works as expected without unexpected traceback messages.
Original PR description
Before this commit, when the user tries to delete a project in project app, a traceback is occurred because of recursion loop in the code during the deletion of the record. This commit removes the recursion in the code to correctly delete the project without any issue. Steps to reproduce the issue ---------------------------- 0. Install `esg_project` module 1. Create a project 2. Go to Projects list view 3. Delete the project created in step 1 Expected behavior ----------------- The project should be deleted without any issue Current behavior ---------------- A recursion error is occurred during the deletion of the project task-4788173
This fixes a checkout crash for Chilean customers when required invoicing details were left blank. Shoppers now see the expected checkout navigation instead of an error page, helping prevent abandoned orders.
Original PR description
**Steps to reproduce:** Leave at least one field empty on the invoicing info page of the website checkout flow. For that page to appear, the customer country must be Chile, and the setting "Automatic Invoice" must be checked on the Website settings. **Issue:** Error 500 when rendering the template of the navigation buttons. The button values are not set.  Bug introduced in commit odoo/enterprise@ba260e8 Fixed by calling the method that sets the values before rendering the template.
The IoT device page buttons for downloading logs and restarting Odoo now work again after a previous page change broke them. This restores important support and maintenance actions for connected IoT boxes.
Original PR description
Since odoo/enterprise#81180 removed the `ip_url` field from the IoT box form view, these buttons have not been working since their JS widgets relied on that field. This commit fixes the issue by making them use the new `formatEndpoint` helper instead. task-4813431
This fix prevents an error when users fetch e-invoice IRN details from vendor credit notes created during the GSTR-2B flow. It ensures the Indian GST reporting workflow continues without a traceback caused by a translation handling issue.
Original PR description
**Steps to reproduce:** 1) Open a GST return period. 2) Click Fetch GSTR-2B Summary. 3) Go to Vendor Refunds. 4) Open the vendor credit note created by OdooBot. 5) Click the Fetch button. -> Traceback occurs. **Cause:** The translation function (_()) was incorrectly used with two arguments instead of one in this commit https://github.com/odoo/enterprise/commit/14bfe78b034563637e43fd2795c9498c736d0dbc **Fix:** Change the arguments that are applicable for translation. **Task**-4808874
This fix prevents self-ordering kiosks from failing when they need to communicate with an IoT box without a logged-in user. It adds a secure proxy path that verifies the kiosk session and returns the needed authorization so kiosk ordering can continue reliably.
Original PR description
With the introduction of signing communication between the IoT box and the DB, a `sign_communication` method is called on the `iot.box` model for every IoT request. This works fine when there is a logged in user, however in the case when there is no user it fails. This is due to the `call_kw` route used by ORM calls requiring a user. In the Kiosk environment, there is no logged in user, so the request fails. To fix this, a new route has been added to proxy the request, which verifies the session ID and then returns the authorisation hash as usual. task-4809897
The AI update action now processes each selected record only once instead of repeating work across the full selection for every record. This prevents unnecessary AI service calls, reducing delays and avoidable usage costs when users run the action on multiple records.
Original PR description
Scenario: - create a res.partner server action "Update Record" with "Update with AI" and a prompt like "set phone to <t t-out="object.id">ID</t> times 2" - push on "Create contextual action" button - go to a contact list view, select 4 contacts and run the action Result: there is 16 calls to iap Reason: when running an action, _run_action_object_write is called one time per record, but the ai_server_actions override fill the field of all records at each call. Issue found when investigating unrelated opw-4491099