Tuesday, May 26, 2026
6 changes · 17.0
Resolved issues and error corrections
This update resolves an issue where upsell quantities were incorrectly added to the original subscription order line. The fix utilizes a 'sequence' field to ensure accurate matching between parent and upsell lines, guaranteeing correct quantity updates and preventing incorrect order calculations. This improves the reliability of subscription order management.
Original PR description
Steps to reproduce: ----------------------------------- 1. Install Subscription module 2. Create and Confirm Subscription Order as follows: * Create 2 SOL with the same product with different…
Steps to reproduce: ----------------------------------- 1. Install Subscription module 2. Create and Confirm Subscription Order as follows: * Create 2 SOL with the same product with different quantities 3. Create and Confirm the Invoice of the Sale Order 4. Create an Upsell of the SO 5. Change the First line's quantity to any value (e.g, 3) 6. Confirm the Upsell Order 7. Go back to the original order Observation: ----------------------------------- The quantity added in Upsell is added to the quantity of the Second line of the Original Order. Issue: ----------------------------------- The `_compute_parent_line_id` method matches upsell lines to their parent lines based on product attributes (product_id, price_unit, product_uom_id, currency_id, plan_id). When multiple parent lines have identical attributes, the matching becomes ambiguous. The algorithm processes upsell lines sequentially and removes each matched parent from the pool. https://github.com/odoo/enterprise/blob/4c9682e9cf84a0e4e69b5b650833cbccc77b063e/sale_subscription/models/sale_order_line.py#L336-L337 Without a stable identifier like a sequence, the algorithm takes the LAST matching line arbitrarily, causing incorrect parent-child mappings. Solution: ----------------------------------- Using 'sequence' as the matching criteria in `_compute_parent_line_id`, Sequence provides a stable, predictable identifier that preserves line order. Lines with the same product attributes but different sequences will now match correctly based on their position in the order. Added 'sequence' to line_values in `_get_renew_upsell_values` because the `parent_line_id` field is a COMPUTED field (with `store=True`). When creating upsell lines, even though we set `'parent_line_id': line.id` in the values, Odoo will recompute it using `_compute_parent_line_id`. If we don't preserve the sequence from the parent line, the newly created upsell line will get a default/auto-incremented sequence that doesn't match its parent's sequence. This breaks the sequence-based matching we just added. opw-6083153
This update resolves an issue where '&' characters in partner names and addresses were incorrectly replaced, leading to bank rejections of SEPA payment files. The fix ensures '&' is preserved in human-readable fields as required by SEPA standards, guaranteeing accurate export of payment data.
Original PR description
Problem: The previous fix (replacing '&' with '+' in _replace_characters_SEPA) was applied globally, affecting both reference/identifier fields and human-readable fields such as <Nm> (partner name)…
Problem:
The previous fix (replacing '&' with '+' in _replace_characters_SEPA) was applied globally, affecting both reference/identifier fields and human-readable fields such as <Nm> (partner name) and address lines.
As a result, a partner named "test & test GMBH" was exported as:
<Nm>test + test GMBH</Nm>
instead of the expected:
<Nm>test & test GMBH</Nm>
This caused bank file rejections because '&' is the correct XML encoding of '&' and is accepted by banks in human-readable fields.
Root cause:
ISO 20022 / EPC217-08 distinguishes two categories of data elements:
- Reference/identifier fields (InstrId, Ustrd, etc.): must use the restricted basic Latin character set — '&' is not allowed and must be replaced with '+'.
- Human-readable fields (Nm, AdrLine, etc.): may contain the extended Latin character set — '&' is valid and must be preserved so lxml can XML-escape it to '&' in the output.
Fix:
Revert the global '&' → '+' replacement in _replace_characters_SEPA so that '&' is preserved for name/address fields. The replacement of '&' with '+' for reference/identifier fields is already handled explicitly at the call sites in _get_CdtTrfTxInf (InstrId, Ustrd) via .replace('&', '+') before sanitize_communication is called.
ref commit : https://github.com/odoo/enterprise/pull/110809/changes/9e698e4ac9fdf66189ff6712f90a144560a1b484
documentation https://www.europeanpaymentscouncil.eu/sites/default/files/KB/files/EPC217-08%20Draft%20Best%20Practices%20SEPA%20Requirements%20for%20Character%20Set%20v1.1.pdf:This update resolves an issue where delivery orders for serial-tracked products could be completed without recording the necessary serial numbers. The change ensures that when a quantity is specified without associated serial numbers, the delivery order is correctly validated and reflects the accurate stock levels. This prevents discrepancies and maintains data integrity.
Original PR description
Writing both `quantity` and `lot_ids` on a tracked move in the same form save leaves `move.quantity` stored at the user value while `_set_lot_ids` unlinks the remaining move line; the picking can then be validated to 'done' with no serial recorded. Force `_compute_quantity` at the end of `_set_lot_ids` so the stored value stays in sync with the move lines. Steps to reproduce: - Serial-tracked product, 6 in stock - Create a delivery order for 6 units of that product - In the delivery form, on the move row: type "1" in Quantity and remove all 6 lots from the Serial Numbers widget. - Save, Validate Before: picking goes to Done with quantity=1 and no serial. After: clear UserError, quantity stays in sync with mls. opw-6192841
This update resolves a problem where Xrechnung invoices generated in Odoo were failing validation checks used by some German clients. The issue stemmed from incorrect PDF formatting, preventing compliance with industry standards. This fix ensures invoices meet the necessary requirements for seamless processing by our German customers.
Original PR description
**PROBLEM** xrechnung pdf invoices are not compliant with some validators used german clients. **STEP TO REPRODUCE** 1. Create an invoice for a german customer. 2. Set the edi format on the customer as Xrechnung. 3. Download the invoice pdf, and verify it on https://www.portinvoice.com/ 4. Notice the pdf is not valid. To verify my fix works, you need to have the fontTools python package installed (for pdfa conversion). opw-6030481
This update fixes a bug where a backorder MO incorrectly received the same serial as a recorded MO, causing an error. The fix prevents the system from assigning a new serial to backorder MOs during partial receipts, ensuring accurate serial tracking in subcontracting processes. This improves order fulfillment reliability.
Original PR description
Steps to reproduce 1. Create a serial-tracked product with a subcontract BoM. 2. Create a receipt from the subcontractor for e.g. 5 units and confirm it. 3. Change the quantity to 3 and validate the…
Steps to reproduce 1. Create a serial-tracked product with a subcontract BoM. 2. Create a receipt from the subcontractor for e.g. 5 units and confirm it. 3. Change the quantity to 3 and validate the receipt and click "Create Backorder" in the wizard. Issue Clicking "Create Backorder" raises "The serial number has already been assigned" because the remainder backorder MO was silently assigned the same serial as one of the recorded MOs, causing a quant uniqueness violation. When validating a serial-tracked subcontract receipt, `_auto_record_components` splits the original MO into one MO per unit plus a remainder backorder MO, and assigns a fresh serial to each recorded MO. It then calls `subcontracting_record_component` which writes `lot_id` on reserved `stock.move.line` records via `_update_finished_move`. The write override in `stock.move.line` is meant to sync the matching MO's `lot_producing_id` when a user changes a serial from A to B on a move line. Its filter at https://github.com/odoo/odoo/blob/f251139ab668651cbd359fdae73befaf1683085b/addons/mrp_subcontracting/models/stock_move_line.py#L26 p.lot_producing_id == move_line.lot_id degenerates when the move line's previous `lot_id` is `False` (a freshly reserved line with no prior lot) into "any open MO with no lot yet", which matches the untouched remainder backorder MO and writes the just-assigned serial onto it. All recorded MOs end up sharing the same serial number from the contaminated backorder, triggering the duplicate quant error. Solution Guard the sync with `move_line.lot_id` at https://github.com/odoo/odoo/blob/f251139ab668651cbd359fdae73befaf1683085b/addons/mrp_subcontracting/models/stock_move_line.py#L24 so it only runs when the move line already had a lot — i.e. the user is replacing an existing serial — and not when one is being assigned for the first time. opw-6018243
This update resolves an issue where incorrect tax reason codes were being generated when using specific co-contractant fiscal positions. This fix prevents validation errors related to PEPPOL standards, ensuring accurate export of invoices and compliance with tax regulations. The change impacts the account_edi_ubl_cii module.
Original PR description
When a co-contractant fisacl position is selected and the user chooses a tax that does not belong to that fiscal position, a tax exemption reason code is added, which breaks the schematron validation on peppol. related-task-id-5905176