Daily updates from Odoo
Tuesday, May 26, 2026
13 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 a minor typo in the name of the Sendcloud website delivery module. The incorrect display name ('Sendcould') has been corrected to the accurate 'Sendcloud'. This ensures consistent and correct module identification within the Odoo Enterprise system.
Original PR description
The displayed name contained a typo ("Sendcould" instead of "Sendcloud") All other references already use the correct spelling, so no further changes were necessary.
opw-6239003This update fixes a potential issue where users could inadvertently select inactive Intrastat codes when configuring products. Now, a warning message will appear if a user attempts to select an inactive code, ensuring data accuracy and preventing incorrect reporting. This improves data integrity for Intrastat reporting.
Original PR description
Problem: When choosing an intrastat code on a product, all the codes are shown, even the ones that are expired or not yet active. Users can select an intrastat code that is not active. Steps to reproduce: 1. Check the intrastat code list and find a code with a start date in the future or an expiry date in the past 2. Note the code description 3. Open a product form view and try to set/change the intrastat code 4. Search for the code description noted in step 2 5. Note that the code is proposed while it should not be proposed Solution: When an intrastat code is selected, if the code is not active, a warning message is shown to the user. opw-6217915
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 internal transfer transactions weren't being accurately reflected in the matching entries tab. The fix ensures that liquidity lines are correctly displayed after an internal transfer is created, improving the accuracy of bank reconciliation reports. This change was made to address a reported bug and maintain data integrity.
Original PR description
How to reproduce the issue: - Create two journals: bank 1 and bank 2. - In bank 1 create a transaction for -1000 and validate it as an internal transfer. - In bank 2 create a transaction for +1000. In the Match existing entries tab, the liquidity line from the original transfer is not displayed. This is due to the filter added by 3d74f4a2ab212a3546b43c7dfa563360b600d3b6. opw-6226947 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
A test was failing intermittently due to a user account lacking the necessary write permissions on bank statement lines. This change grants the required write access within the test environment, resolving the failure and ensuring the test consistently passes. This improves the reliability of our testing process.
Original PR description
The test `test_branch_user_bank_statement_foreign_currency` is sometimes failling because the user doesn't have write access rights on account.bank.statement.line. When only account app is installed, the user branch_user only has read access. The group added in the test doesn't provide those rights. Runbot errors: 243653, 243655, 243688 opw-6214971 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
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 resolves a discrepancy in HTML parsing behavior caused by recent updates to the underlying libraries (libxml2 and lxml). The fix ensures consistent HTML output across different versions, preventing potential issues with how Odoo renders and processes web content. It also includes improvements to error handling related to these library updates.
Original PR description
## [FIX] core: lxml compatibility v2.14.0+ (HTML parsing) In version 2.14.0, libxml2 fixed a long standing quirk in its HTML handling where it always implies `<p>` start tags [1]. As a result, there…
## [FIX] core: lxml compatibility v2.14.0+ (HTML parsing) In version 2.14.0, libxml2 fixed a long standing quirk in its HTML handling where it always implies `<p>` start tags [1]. As a result, there is a difference in behavior between pre and post 2.14.0 produced HTML when no start tag is provided: - pre: always has a `<p>` tag - post: depending on the case, could have either a `<span>` or `<p>` tag. This commit introduces a monkeypatch of the lxml's HTML parser when built with libxml2 2.14.0+ to maintain a similar behavior with older versions. [1]: https://gitlab.gnome.org/GNOME/libxml2/-/commit/8cf6129bbd836e666e7eda8c9e61c00387ae388b ## [FIX] base,l10n_it_edi: catch TypeError/ValueError for lxml 6+ compat Updates exception handling to account for stricter type checking introduced in lxml 5/6 and libxml2 2.12+. Note: Ubuntu 26.04 (Resolute) provides lxml 6.9.2/libxml2 2.15 while Debian Trixie has lxml 5.4.0/libxml2 2.9.14. Don't be fooled by the version `2.12.7+dfsg+really2.9.14-2.1+deb13u1` which actually means that Debian has reverted/held back the core engine to 2.9.14 while adding commits from 2.12.7.
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
This update fixes an issue where the website editor would become unresponsive and ignore user input after a failed save attempt (like a missing required field). The fix ensures the editor returns to a consistent state, preventing frustrating delays and incorrect behavior for users. This improves the overall user experience and data integrity within the website editor.
Original PR description
When a save fails (for example due to a required field), the editor stays open, but some transient editor classes may already have been removed from the DOM.
This leaves the editor in an inconsistent state and can trigger a weird flow while making changes.
For example, as a result, users may see every second keystroke ignored after a failed save.
Steps to reproduce:
- Open a product page in website editor
- Remove the product name
- Click save
- The expected popover is shown ("Operation cannot be completed")
- Type again in the product name field => Every second keystroke is ignored (rollbacked actually).
task-5190459This update resolves an issue where certain product categories were incorrectly displayed on websites other than the intended one. The fix ensures that categories are only shown to users accessing them through their current website, improving the user experience and preventing broken links. This change enhances website consistency and reduces potential customer frustration.
Original PR description
Steps to produce: --- - Install `website_sale` with demo data. - Go to `website > ecommerce > products > ecommerce categories`. - Open `Desks/Components` category > Set website to `My website 2`. -…
Steps to produce: --- - Install `website_sale` with demo data. - Go to `website > ecommerce > products > ecommerce categories`. - Open `Desks/Components` category > Set website to `My website 2`. - Open the shop page on website > Click on Desks category. Issue: --- - The Components subcategory is still displayed on Website 1. - Clicking on it leads to a Not Found page since the category is not assigned to that website. Root cause: --- - At [1], In the category filmstrip template, subcategories are fetched without filtering based on website access. - As a result, categories restricted to another website are still shown. Solution: --- - Filter categories using the `can_access_from_current_website` method to ensure only categories accessible from the current website are displayed. [1]https://github.com/odoo/odoo/blob/900fc043064216c5943ea07392d8120be7b50b63/addons/website_sale/views/templates.xml#L758-L769 opw-6159549 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr