Tuesday, October 7, 2025
10 changes · 17.0
Resolved issues and error corrections
Invoices can no longer be set up with SEPA direct debit payments when the related mandate is closed. This prevents businesses from accidentally collecting payments using inactive customer authorizations.
Original PR description
**The issue:** It's currently possible to create select SEPA payment for an invoice when the mandate is "closed" instead of "revoked". **Cause:** The search for usable mandates, is not taking into consideration the "closed" state and looking for non draft/revoked. **Fix:** Changed the query to look specifically for "active" mandate. opw-5048748
UPS shipping rates can now be checked during express checkout using only the limited address details available at that stage. This prevents shoppers from being blocked by unnecessary street and phone requirements, making checkout smoother.
Original PR description
Express checkout in ecommerce does an initial rate check with shipping connectors that does not require all of the fields normally required by that shipping connector. For UPS, this meant express checkout was failing due to an unnecessary `street` and `phone` field check since the only required delivery fields for express checkout are: (city, zip, country_code, state_code) For more info, see: https://github.com/odoo/odoo/blob/b403d5d74dd545f926a38a6aa6d18118d34e83b7/addons/website_sale/controllers/delivery.py#L181-L188 opw-[4447700](https://www.odoo.com/web#id=4447700&view_type=form&model=project.task)
Public mail-related pages now correctly show translated text instead of falling back to the original source language. This improves the experience for visitors and portal users who use Odoo in languages other than the default.
Original PR description
Human-readable content defined in public page components isn't translated. This is because we forgot to give Owl a translation function, so it falls back to returning the source terms as they are (identity function). This commit resolves the issue by providing the missing translation function. Task-4493082 Task-5140665
Changing the scheduled date for one stock move no longer unintentionally updates other moves on the same receipt. This helps warehouse users keep individual item schedules accurate and avoids accidental rescheduling when saving a receipt.
Original PR description
Issue Before This Commit: ---------------------------------- Updating the scheduled date of a single move would unintentionally update the dates of all other moves, particularly if the new date was…
Issue Before This Commit: ---------------------------------- Updating the scheduled date of a single move would unintentionally update the dates of all other moves, particularly if the new date was earlier than the picking’s scheduled date. Steps to produce: ---------------------------------- - Install the `stock_delivery` module. - Create a receipt with two moves. - Change the scheduled date of one move to a value earlier than the picking date. - Save the receipt, the date of both moves will be updated. Cause of the issue: ---------------------------------- Changing a move’s date also updated the picking’s scheduled date. When the picking was saved, its inverse method propagated the new date to all associated moves. Fix: ---------------------------------- The override of the `onchange` method to prevent the picking’s `scheduled_date` from being updated when a move's date is modified, as it is recomputed when the form view is saved. This ensures only the intended move date is changed, preventing unintended side effects and giving users more precise control over scheduling. Task ID: [4653516](https://www.odoo.com/odoo/project/966/tasks/4653516)
The spreadsheet component has been updated to the latest version for Odoo 17. This fixes an issue that could limit users when adding many headers, making spreadsheet work more reliable for larger or more detailed sheets.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/c8f112036d [REL] 17.0.75 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/22c5e4325f [FIX] headers: can add lots of headers [Task: 5092626](https://www.odoo.com/odoo/2328/tasks/5092626) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
Confirmed sales orders now keep coupon point balances accurate when a customer switches from one reward to another. This prevents customers from being charged the wrong number of loyalty points and keeps loyalty balances reliable.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Have a coupon program; 2. add a 10% discount on order reward for 1 point; 3. add a 50% discount on order reward for 5 points; 4. generate a coupon with 10…
Versions -------- - 17.0+ Steps ----- 1. Have a coupon program; 2. add a 10% discount on order reward for 1 point; 3. add a 50% discount on order reward for 5 points; 4. generate a coupon with 10 points; 5. use coupon code on a confirmed order; 6. select 10% discount reward; 7. change to a 50% discount reward; 8. check coupon point total. Issue ----- Even though the 5 point reward was used, only 4 out of 10 points remain. Cause ----- When updating the reward line of a confirmed order, it keeps track of point cost changes before & after a write. Its purpose is to restore back the point difference on the coupon record. The issue is that while point changes are stored, coupon changes are not. When updating reward lines, `_reset_loyalty` is used, which removes the `coupon_id` from the lines. As a consequence, attempting to restore the point difference on `line.coupon_id` after an update, it writes to an empty record. Solution -------- Store both coupons & their used points before write. After write, restore the previous points to the previous coupon, and subtract the current point cost from the current coupon. This way, any combination of coupon/point changes should have the points updated as expected. opw-4910922
The barcode app no longer crashes when scanning a picking order for a kit product variant that has its own packaging. This keeps warehouse scanning flows working reliably for businesses using product variants and packaging.
Original PR description
In the barcode application, scanning a picking order containing a kit product variant with packaging will raise a Traceback. * Steps to reproduce: 1. Enable packagings on inventory configuration. 2.…
In the barcode application, scanning a picking order containing a kit product variant with packaging will raise a Traceback. * Steps to reproduce: 1. Enable packagings on inventory configuration. 2. Create a product, that as a least 2 variants. 3. Add a packaging to one of the variants. 4. Create a BoM for created product (kit type). 5. Create a picking order for the variant with packaging. 6. Print the picking operation to scan the code through barcode. 7. Go to barcode and try to scan it, this will trigger the traceback. * Cause of the issue: Scaning a barcode will call get_barcode_data during this call it will retrieve the information about the picking order and call _get_stock_barcode_data: https://github.com/odoo/enterprise/blob/f2dd6326c2084ed467c3e4c3e9d931f41309ad79/stock_barcode/controllers/stock_barcode.py#L91 _get_stock_barcode_data will obtain the packaging methode for the products. https://github.com/odoo/enterprise/blob/f2dd6326c2084ed467c3e4c3e9d931f41309ad79/stock_barcode_mrp/models/stock_picking.py#L13-L16 since in our use case the product has variant the packaging information is not inside product_tmpl_id.packaging_ids and thereof it will not retrieve the packaging information. * Fix We don't need to use product_tmpl_id.packaging_ids because of its compute and set methods (and the fact that the product_variant_ids field is required), the product_tmpl_id.packaging_ids will always be included in the product_tmpl_id.product_variant_ids.packaging_ids: https://github.com/odoo/odoo/blob/0f4fc2b1ba65eb9fab3faa24deb2849caf7b9057/addons/product/models/product_template.py#L409-L419 our fix will allow for packaging in the variant to be considered when there is more than only one variant. opw-4852875 opw-4969241 opw-4952818
Point of Sale now reads quantity information included in GS1 barcodes when products are scanned. This helps cashiers add the correct amount automatically, reducing manual adjustments and checkout errors.
Original PR description
Before this commit, the quantity encoded in a GS1 barcode was ignored when scanning. After this commit, the product will be added with the correct quantity extracted from the GS1 barcode. opw-5126522 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes how certain Spanish service sales taxes are classified in VAT reporting so they are treated as not subject to VAT instead of exports. It also corrects the refund sign for the related tax, helping businesses produce more accurate Modelo 303 filings.
Original PR description
The s_iva_e tax (IVA 0% Extracomunitaria (Servicios)) is configured as no_sujeto_loc, but is reported as "Exportacion" in modelo 303. There might have been the idea that we need a tax for services that are just a complement to some goods, but this tax is not used that way in practice. So, it is better to treat it as a duplicate of the s_iva_ns tax (Not Subject To VAT (services)) where we also see that the refund sign was wrong. opw-5079297 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
Emails sent from Odoo could fail when they included attached email files containing accented or other non-English characters. This fix ensures those attachments are handled correctly, improving reliability for users who exchange multilingual email content.
Original PR description
The previous fix for `message/rfc822` attachments forced binary encoding (`cte='binary'`) to comply with RFC 2046. However it also introduced a new issue: emails containing `.eml` attachments with…
The previous fix for `message/rfc822` attachments forced binary encoding (`cte='binary'`) to comply with RFC 2046. However it also introduced a new issue: emails containing `.eml` attachments with non-ASCII characters could not be serialized ### Steps to reproduce 1. Send an email via the chatter with a `.eml` file attached containing non-ASCII characters (e.g., "é") in its body. The sending of that email will fail with a `UnicodeEncodeError` error ### Cause Commit 6197233ef1611ddd974cfdb06ae2568e4af369de attempted to fix an issue where `.eml` (`message/rfc822`) attachments were not RFC-compliant. It did this by forcing the `Content-Transfer-Encoding` to `binary` for the raw byte content of the attachment. While this worked for simple ASCII attachments, it failed for attachments containing non-ASCII characters. When Python's `email` library later tried to serialize the entire message, it treated the attachment's content as an opaque binary blob. It did not understand the character encoding within that blob, leading to a `UnicodeEncodeError` during the final serialization process. ### Fix Instead of attaching the raw bytes, we now: * Parse `.eml` contents using `email.parser.BytesParser`, producing a proper `Message` object. * Attach the parsed message directly, letting the email library handle correct encoding and transfer settings automatically. opw-4655868