Friday, February 13, 2026
19 changes · saas-19.1
Resolved issues and error corrections
This update resolves a bug where users could create duplicate account codes, even for accounts that were previously archived. The fix now ensures that account codes are unique across both active and archived accounts, preventing data inconsistencies and improving data integrity. This ensures accurate financial reporting and reduces the risk of errors.
Original PR description
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 Forward-Port-Of: odoo/odoo#248439
This update fixes an issue where anonymous users could bypass the address form during event ticket purchases, leading to incorrect tax calculations. The team adjusted a payment flow refactoring to ensure all users, including those registering for events without a billing address, are prompted for address details before proceeding to payment. This ensures accurate tax application and a smoother checkout experience.
Original PR description
**Steps to reproduce:** - Install Website/Event/Sales apps - Create a new event and set a ticket price - Create a fiscal position (with specific tax) for a country with `auto_apply` enabled - Publish…
**Steps to reproduce:** - Install Website/Event/Sales apps - Create a new event and set a ticket price - Create a fiscal position (with specific tax) for a country with `auto_apply` enabled - Publish the event - Register to the event as a anonymous user - The process bypasses the address form and goes directly to payment - The resulting sale order will have no fiscal position - Prices won't be impacted by taxes related to the user billing address **Issue:** Address form is skipped before payment for event registration of a public user as `_needs_customer_address` is not overwritten properly in some module. This is probably due to a refactoring that changed how the required information is evaluated in the payment flow (see related commit). **Fix:** Set `_needs_customer_address` to `True` by default to avoid such issues in dependant modules. Might need to remove this feature in master as the workarounds are not that clean (geo_ip, check on fiscal position enabled, overwrite everywhere, others ?). Similar fix is done for appointments with payment enabled. related: https://github.com/odoo/odoo/commit/d43f0423667835512e16c3fd3474328da63a948d original-task: https://www.odoo.com/odoo/project/49/tasks/4307281 opw-5143124 Forward-Port-Of: odoo/odoo#248291 Forward-Port-Of: odoo/odoo#247054
This update resolves an issue where comments within XML invoices, specifically added to the TaxExclusiveAmount field, were causing the system to fail to recognize and process the invoices. The fix removes these comments during the XML parsing process, ensuring invoices are correctly uploaded and processed. This prevents empty invoices from being created.
Original PR description
Issue: Comments in node with data as text may cause issue while reading data Step to reproduce: - In European company create an invoice to a company in the same country - Send it with peppol - Download the XML of the invoice - Add a comment right before the value in TaxExclusiveAmount like this <cbc:TaxExclusiveAmount><!-- -->0.00</cbc:TaxExclusiveAmount> - Go to accounting Dashboard - Click on "Upload" in the vendor dashboard - Select the previously modified XML Current behavior: - an empty invoice is created as the invoice builder failed Expected behavior: - Invoice should be recognized Cause: lxml treat data like this: <parentNode>parent_text<childNode>child_text</childNode>child_tail</parentNode>parent_tail So `tax_exclusive_amount_node.text` return '' instead of `0.00` opw-5462664 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247549
This update fixes a problem where the self-order page would freeze if local data was corrupted. Now, users receive an error message with the option to clear their data and refresh, particularly helpful on mobile devices. This enhances usability and prevents frustrating user experiences.
Original PR description
Inconsistent data in the localDB or local storage can cause the pos_self_rder to fail before it can get initialized. When this happens the page just stays white. Now when an error happens while initializing an error message will show up and give the user the option to clear all local data and refresh the page. This should be especially useful for users on mobile where it's a pain to refresh the local data manually. Task-[5420544](https://www.odoo.com/odoo/project/1737/tasks/5420544) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247167 Forward-Port-Of: odoo/odoo#246925
This update resolves an issue where course sections were incorrectly being converted to document slides. The fix addresses a removal of a field used by the website_slides widget, and ensures sections are created as intended. This improves the user experience when creating and managing course content.
Original PR description
Steps: - Install `website_slides` - Edit a course - Add a section in the slides - Save - Section is automatically changed into document slide The problem stems from the fact that the widget that…
Steps:
- Install `website_slides`
- Edit a course
- Add a section in the slides
- Save
- Section is automatically changed into document slide
The problem stems from the fact that the widget that manages sections in website_slides uses the `is_category` field to function (display certain fields in the list view).
However, this `is_category` field has been removed since saas-19.1 in the following [diff](https://github.com/odoo/odoo/pull/230098/changes#diff-87985c6cb54c5ab6dd4b71da844d0478e70c3c8247d54c943113ba75a4af0188L85 )
with a view to getting rid of invisible fields in views and adding them automatically in `ir_ui_view`.
But in `IrUiView::_add_missing_fields`, this field is added as read-only.
https://github.com/odoo/odoo/blob/02af5899563ddc362d04522339a5bdb793e01b52/odoo/addons/base/models/ir_ui_view.py#L1530-L1545
On the client side, when saving a `web_save` is performed by omitting `is_category`, because we are not supposed to save/write read-only fields.
Since the field has a default value of false, we end up with a slide that is not a section
```py
is_category = fields.Boolean(`Is a category`, default=False)
```
To fix this problem, we directly correct `slide_category_one2many` which uses is_category without ever checking that the field is available by adding a relatedFields that specifies that we need is_category and not readonly.
Note: we have exactly the same problem with section_and_note in the `account` module, which uses the `display_type` field, but here it works because in its view we kept the field when deleting all invisible fields.
https://github.com/odoo/odoo/blob/8128a1bfbdd7b2f7cdc8ccbf1ddf78219a809e38/addons/sale/views/sale_order_views.xml#L568-L569
opw-5898399This update fixes a potential issue in the Point of Sale (POS) system where rounding calculations weren't always accurate with cash payments. This meant orders could sometimes be incorrectly validated, leading to discrepancies between the amount paid and the rounded total. This change ensures more reliable and accurate order processing within the POS.
Original PR description
When using rounding methods in POS with cash payments, the applied rounding was not being calculated correctly in some edge cases, leading to situations where the order could be validated even when the amount paid did not match the rounded total. opw-5460460 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242068
This update corrects a bug in the Point of Sale system where orders weren't properly validated when payments were incomplete. Previously, the system would continue processing orders even without full payment, leading to potential double-entry errors and data inconsistencies. This fix ensures that orders remain in the correct 'draft' state until fully paid, maintaining data accuracy.
Original PR description
After commit https://github.com/odoo/odoo/commit/dde26e5372b8328bbc9e050f0fdedadd1de649fd, when trying to validate a POS order that was not fully paid, the order state would remain in 'draft' state but the picking and other related operations would be done. This could lead to double entries and inconsistencies. opw-5447749 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244542
This update resolves a problem where invoices created after reversing a Point of Sale (PoS) order wouldn't properly reconcile, leading to incorrect credit balances. The fix automatically links the reversal entry to the original customer account payment, ensuring only the invoice remains open and accurate. This improves financial reporting and reduces potential discrepancies.
Original PR description
If you made a PoS order paid with the customer account payment method, then close the session. Then invoice the order, a reversal entry would be created but it would not be reconciled at all. As no payment was made a this point it should be reconciled with the original Customer Account entry from the pos session, this way only the invoice remains open. Steps to reproduce: ------------------- * Create a PoS order and pay with the customer account payment method * Close the session * Go on the order and create the invoice > Observation: The reversal move is not reconciled and the customer has two outstanding credits. Why the fix: ------------ When creating the invoice we reconcile the reversal entry with the original customer account entry from the pos session. This way only the invoice remains open. opw-5268042 Forward-Port-Of: odoo/odoo#245941
This update resolves an issue where the 'Group by category' option in Point of Sale was not displaying all products correctly. The change utilizes a more reliable method to group products by category, ensuring a complete and accurate product list is presented to users. This improves the user experience and accuracy of sales transactions.
Original PR description
Before this commit when activating the "Group by category" option in the POS, some products were missing from the product list. Now we use the `getAllBy` generic model method to group products by category, which ensures that all products are correctly grouped and displayed in the POS. Forward-Port-Of: odoo/odoo#247782
This update ensures that all attachments – like invoices and PDFs – are now included in the email notifications sent when importing invoices or vendor bills. Previously, only the first attachment was displayed, leading to missed documents. Additionally, users will now manually specify recipients for copy emails, simplifying the process.
Original PR description
Before this PR, when importing an invoice or vendor bill, the email notification only included the first imported attachment. As a result, embedded files (e.g. a PDF inside an XML) were missing from the email. This commit ensures that all imported attachments are included in the notification email, improving document visibility for users. Additionally, the field "Send Copy To" will no longer be computed, It'll be manually filled by the user. task-5895328 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246936
This update resolves an issue where creating a new warehouse would fail if the required 'Inventory Loss' stock location wasn't present. The fix now displays a user-friendly error message, guiding users to add the necessary location before proceeding with warehouse creation. This prevents data inconsistencies and ensures smooth warehouse setup.
Original PR description
Currently, an error occurs when user tries to create a new warehouse when Inventory loss stock location is not present. Steps to replicate: - Install repairs and enable Storage Locations in settings.…
Currently, an error occurs when user tries to create a new warehouse when Inventory loss stock location is not present.
Steps to replicate:
- Install repairs and enable Storage Locations in settings.
- Go to `Inventory > Configuration > Locations`, open `Inventory Adjustment`.
- Change the `Location Type` to `Internal` (anything other than `Inventory Loss`).
- Navigate to Warehouses and try to create a new one.
Error:
```
File /home/odoo/src/odoo/19.0/addons/stock/models/stock_warehouse.py, line 142, in create
new_vals = warehouse._create_or_update_sequences_and_picking_types()
File /home/odoo/src/odoo/19.0/addons/stock/models/stock_warehouse.py, line 373, in _create_or_update_sequences_and_picking_types
create_data, max_sequence = self._get_picking_type_create_values(max_sequence)
File /home/odoo/src/odoo/19.0/addons/repair/models/stock_warehouse.py, line 30, in _get_picking_type_create_values
scrap_location_id = self.env['stock.location'].search_read([('usage', '=', 'inventory'), ('company_id', 'in', [self.company_id.id, False])], fields=['id'], limit=1)[0].get('id')
IndexError: list index out of range
```
Cause:
- Since the user changed the location type of `Inventory adjustment`, the `search_read()` [1] returned no results and attempting to access its first element causes the error.
Solution:
- Raised a UserError when no Inventory Loss location is found while warehouse creation.
[1]: https://github.com/odoo/odoo/blob/62b9f7a81e8d742508d6c80434bb4caf78f9dc65/addons/repair/models/stock_warehouse.py#L30
sentry-7169389190
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#242535This update resolves a bug where serial numbers weren't correctly generated when creating multiple serials in subcontracted manufacturing orders. Specifically, interpolated prefixes weren't being applied, leading to duplicate serial numbers. The fix ensures that serial numbers use the correct, interpolated values, preventing this issue and ensuring accurate tracking of products.
Original PR description
## Issue When generating multiple serial numbers in a single manufacturing order, interpolations are not replaced. For example, if the sequence prefix is `%(month)s`, the placeholder is not be…
## Issue
When generating multiple serial numbers in a single manufacturing order, interpolations are not replaced. For example, if the sequence prefix is `%(month)s`, the placeholder is not be replaced by the current month, and the generated serial numbers contain `%(month)s` literally.
This issue also impacts the `mrp_subcontracting` serial numbers generation by causing a similar issue as the second bug described by https://github.com/odoo/odoo/commit/20158a1. When creating a duplicate of a subcontracted manufacturing order, the *First SN* field (`lot_name`) is initiated to `1` again, instead of starting from the last SN of the previous MO. This issue was supposedly fixed by https://github.com/odoo/odoo/commit/9cd0c4a, but the issue still occurs when using interpolated prefix.
## Steps to reproduce
1. Install *Manufacturing* (`mrp`)
2. In Settings, enable *Lots & Serial Numbers*
3. In Settings > Technical > Sequences, give a prefix using interpolation to the `stock.lot.serial` sequence. An example of such prefix could be `%(year)s-%(month)s-%(day)s-`
3. Create a product P
- Tracked *By Unique Serial Number*
- Create a BoM for the product P
4. Create and confirm a Manufacturing Order for product P
- Quantity >= 2
5. Click *Generate Serial*
6. **The _First SN_ field uses the interpolation without replacing the placeholders. When clicking _Generate_, more serials are generated where the placeholders are not replaced. If we proceed, the produced serial numbers still contain the placeholders.**
If we generate a MO with a quantity of one, the serial number is correctly generated (the placeholders are replaced as expected).
## Cause
The method responsible for replacing the interpolation placeholder is `IrSequence._get_prefix_suffix` which is called by `IrSequence.get_next_char`:
https://github.com/odoo/odoo/blob/bf7dee8069f203095c44381708153865d3e8f19e/odoo/addons/base/models/ir_sequence.py#L240-L242
Generating a single serial numbers work as expected because it calls `MrpProduction.action_generate_serial`, which uses `IrSequence.get_next_char` further down the call stack.
When generating **multiple** serial numbers in a single MO, the [`mrp.production.serials` wizard](https://github.com/odoo/odoo/blob/19.0/addons/mrp/wizard/mrp_production_serial_numbers.py) is used. In this flow, `get_next_char` is never called, because the serial number logic is reimplemented using fields (`serial_prefix_format` and `next_serial`) from the `product.product` model.
## Fix
Serial numbers are generated from the *First SN* (`lot_name`) field. Correctly applying the interpolation to that field ensures that all subsequently generated serial numbers also use the interpolated values. Because `mrp_subcontracting` inherits the behavior from `mrp` to generate the lot_name, fixing this issue in `mrp` also solves it in `mrp_subcontracting`.
When initiating the `lot_name` field, we need to take in account cases where the product does not have a `lot_sequence_id`. This can happen if the sequence of the product was deleted. The same check is not required when updating the `number_next_actual`, as if there's no `lot_sequence_id`, there's no `number_next_actual` to update.
The logic updating the `number_next_actual` has also been adjusted to ensure the field is incremented correctly. This was an issue corrected by https://github.com/odoo/odoo/commit/20158a115ef3dfb9fe2dd5103d3bed7e87e37940 and https://github.com/odoo/odoo/commit/3ff0f2e3ef4fbcbf0b0b0ae6db8ff6f52bfdf67a, but without taking interpolated prefixes into account.
opw-5882578
Forward-Port-Of: odoo/odoo#246762This update prevents users from creating new lot/serial numbers directly from the Contacts app. Previously, this unintended feature led to inconsistent data. This fix hides the 'New' button, ensuring data integrity until a proper creation flow is implemented.
Original PR description
Currently, users can `create` new `Lots/Serial Numbers` directly from the Contacts app via the `Lots/Serial Numbers` smart button. **Steps to reproduce:** - Install the `stock` and `contacts`…
Currently, users can `create` new `Lots/Serial Numbers` directly from the Contacts app via the `Lots/Serial Numbers` smart button. **Steps to reproduce:** - Install the `stock` and `contacts` modules. - Enable `Lots & Serial Numbers` from the inventory settings. - Open the `Contacts` app and open any contact record. - Click the `Lots/Serial Numbers` smart button. **Observation:** The user can `create` a new lot/serial number from the Contacts, even though this flow is not supported and results in inconsistent data. **Root cause:** After PR [1], `lot/serial number` creation was accidentally enabled from the Contact. The intended behavior is that Contacts should only be able to view related lots/serial numbers, not create them. (Confirm with PO `crl`) **Fix:** This commit disables the creation of Lot/Serial Numbers from the contact by `hiding` the New button. This prevents users from creating inconsistent records until a complete and correct flow is implemented in a future improvement as mentioned at [2]. [1]: https://github.com/odoo/odoo/pull/184242 [2]: https://www.odoo.com/mail/message/978482657 opw-5504073 Forward-Port-Of: odoo/odoo#245426
This update resolves two errors in the Hong Kong payroll calculations. Specifically, it corrects a mistake where rental allowances were incorrectly included in IRD reports and removes an incorrect deduction of ERMPF from taxable salaries. These changes ensure accurate reporting and compliance with Hong Kong tax regulations.
Original PR description
Fixes two issues related to computations; The taxable salary wrongly deduce the ERMPF which it should not. in the IRD reports, the total income includes the rental allowances, which is wrong according to their specs. task-5353781 Forward-Port-Of: odoo/enterprise#107219 Forward-Port-Of: odoo/enterprise#100842
This update corrects a reporting issue where assets marked as disposed still appeared in depreciation schedules. The fix ensures that disposal dates are correctly calculated, preventing inaccurate reporting after an asset has been written off. This improves the reliability of financial reporting.
Original PR description
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Audit Trail" - Go to "Accounting / Accounting / Management / Assets" - Create an asset: * Original Value: [any] *…
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Audit Trail" - Go to "Accounting / Accounting / Management / Assets" - Create an asset: * Original Value: [any] * Acquisition Date: [in the past] (e.g. 01/01/2025) * Duration: [at least until today] (e.g. 36 Months) * Depreciation Account: [any] * Expense Account: [any] - Confirm the asset - Modify Depreciation: * Action: Dispose * Date: [in the past] (e.g. 30/10/2025) * Loss Account: [any] - Dispose - Go to "Accounting / Reporting / Management / Depreciation Schedule" - Filter on a period after the disposal date **Issue:** The asset appears in the selected period even if it has already been disposed. **Cause:** There are posted depreciation moves that have a date after the disposal date. These moves should be deleted but the Audit Trail feature prevents it. These moves are cancelled instead. However, the disposal date computed on the asset is taking the max date from all the depreciation moves. Even the cancelled ones ; leading to a disposal date different than the one entered. opw-5225749 Forward-Port-Of: odoo/enterprise#107028
This update corrects a previous issue where importing journal items onto archived accounts would inadvertently create duplicate accounts. Now, the import process correctly links to the existing archived account, and an error is triggered during confirmation to maintain data accuracy. This ensures data integrity and avoids potential accounting discrepancies.
Original PR description
Allow importing journal items on archived accounts without silently creating duplicate accounts. Odoo previously bypassed the uniqueness constraint on account codes when the target account was archived. Now, the import process links to the existing archived account instead of creating a new one. An error will still be raised during the confirmation of the journal entries to ensure data integrity task-5417765 Forward-Port-Of: odoo/enterprise#106962
This update corrects a calculation error in how mobility budgets are determined for employees in Belgium. The change implements an iterative method to ensure budgets align with legal limits and are appropriately scaled based on employee wages, leading to more accurate payroll processing.
Original PR description
We implement in this PR the iterative computation method of mobility budget. Given an employer cost, we find the wage and mobility budget such that mobility budget amount respect legal constraints of minimum and maximum and rate with respect to wage
This update fixes an issue where invoices sent to DIAN were incorrectly flagged with a warning if the invoice date was within a specific range. The change aligns the invoice date validation with Colombian regulations, allowing for a 6-day window around the current date for invoice creation, ensuring compliance with DIAN requirements.
Original PR description
Currently, an `incorrect warning` message is shown when sending an invoice to `DIAN`, if the invoice date is 6 days before today, even though this date should be considered valid. **Steps to…
Currently, an `incorrect warning` message is shown when sending an invoice to `DIAN`, if the invoice date is 6 days before today, even though this date should be considered valid. **Steps to reproduce:** - Install the `l10n_co_dian` module and switch to the `CO company`. - Go to `Invoicing` and create a new invoice with `taxes`. - Set the `Invoice Date` to 6 days before today. - Click `Confirm` > `Send`, ensure `DIAN` is selected, and `send` the invoice. - Observe the warning message. **Observation:** `The issue date can not be older than 5 days or more than 5 days in the future.` **Root cause:** At [1], the allowed invoice date range is incorrectly computed, using `5 days in the past` and `10 days in the future`. This does not match the Colombian regulations and triggers incorrect validation errors for valid invoice dates. **Fix:** This commit updates the date constraint logic to allow invoices dated up to `6 days before and 6 days after` the current date, in accordance with the DIAN specification described in Anexo Técnico – Documento Soporte No Obligados, page 59, at [3]. <img width="1089" height="120" alt="DIAN" src="https://github.com/user-attachments/assets/408c5ccc-5fed-4585-a81e-dce4ccb98b40" /> [1]: https://github.com/odoo/enterprise/blob/62f59f87a513a86a61f871ca743e7f7b04926a82/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L1086-L1093 [3]: https://www.dian.gov.co/impuestos/factura-electronica/Documents/Anexo-Tecnico-Documento-Soporte-No-Obligados.pdf opw-5482555 Forward-Port-Of: odoo/enterprise#107372 Forward-Port-Of: odoo/enterprise#105763
This update resolves a bug that was preventing users from correctly applying amounts to bank reconciliation lines. The fix ensures that amounts are calculated using the correct currency (amount currency) instead of the balance, improving the accuracy of reconciliation processes. This change impacts the way users can adjust amounts when reconciling transactions.
Original PR description
In this commit: We broke the way the apply amount work, this commit will solve that. For the apply full amount, we modified the field fetch by fetchReconciledLines and also the substraction of the amount currency to use the amount currency and not the balance For the partial, keep it like before we actually take the value of the suspense so it's ok. opw-5925046 Forward-Port-Of: odoo/enterprise#107377