Daily updates from Odoo
Saturday, November 22, 2025
17 changes · 19.0
Enhancements to existing features
This change fills in missing inventory-related accounts and ensures every localization has the right default stock valuation setup. It helps companies avoid setup gaps when installing accounting or inventory features in different countries, so stock accounting works more reliably out of the box.
Original PR description
This PR 1. adds missing inventory management accounts in CoA 2. fills the default sotck valuation accounts in all l10n modules task-5176658 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change reduces unnecessary live chat updates for people who are not actively viewing the relevant help section. As a result, Odoo sends fewer background messages, which improves performance and lowers noise without changing the user experience for those who open the live chat area.
Original PR description
Before this commit, every live chat user would receive looking for help update. This commit reduces the dispatching of message by targeting users interessted in the looking for help update. The looking for help category is folded by default, in which case the user doesn't receive anything related to live chats looking for help. Once the user accesses discuss, and once the category is opened, updates will be received. 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
This update makes sure a buyer record is created on ECPay before sending a B2B invoice, reducing the chance of invoice submission failures when the buyer is not yet known to the service. It also adds VAT validation support earlier in the process, helping catch invalid VAT data before it is sent.
Original PR description
This commit aims to address an edge case where the buyer identifier might not exist on ECPay before issuing a B2B invoice. A call to "Add" a customer is made. RtnCode 1 indicates successful creation, 6160052 - indicates buyer already exists, others are failure. Additionally, add "base_vat" as dependency to enable client-sided validation for VAT before sending to ECPay. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236826
Resolved issues and error corrections
This update adds the missing date filters to certain Balance Sheet lines so they behave correctly when users compare or analyze different reporting periods. It helps ensure the report shows the right figures for the selected dates and avoids confusing results.
Original PR description
Forward-Port-Of: odoo/enterprise#99889
This update corrects the vendor on-time rate shown in Purchase reporting so it matches the graph and the actual purchase order quantity. It prevents duplicate or adjusted receipts from artificially lowering the rate, giving businesses a more accurate view of supplier performance.
Original PR description
**Steps to reproduce:** 1- Install the purchase_stock module. 2- Create a new PO with a new vendor. 3- Add new one product in the purchase order line with quantity > 1. 4- Confirm the PO and go to…
**Steps to reproduce:** 1- Install the purchase_stock module. 2- Create a new PO with a new vendor. 3- Add new one product in the purchase order line with quantity > 1. 4- Confirm the PO and go to the generated receipt. 5- Validate the receipt with less than the ordered quantity, by choosing no backorder. 6- Duplicate the receipt for the remaining quantity and validate it. 7- In vendor form view, the On-time Rate value shown in the smart button differs from the value in the graph. **Issue:** https://github.com/odoo/odoo/blob/e7da32fe67cfe78bc6da8bf5d36a7c584763e3bb/addons/purchase_stock/report/vendor_delay_report.py#L26-L42 - The On-time Rate shown in the smart button does not match the graph. **Example:** - PO Line ordered qty: 10 - First receipt validated: 6 (no backorder) - Duplicated receipt validated: 4 - In vendor form view inside On-time Rate Smart button - Total quantity coming: 14 (incorrect) - Expected total qty for calculation: 10 (from PO line) - On-time delivery rate calculated: **71.43%** - Expected On-time delivery rate: **100%** **Cause:** - The report uses `product_qty` from the stock move. - When a receipt is duplicated and the demand quantity is manually set, `product_qty` is recomputed from this demand value. This leads to a mismatch between the PO line quantity and the aggregated stock move quantities. **NOTE:** In `test_02_vendor_delay_report_partially_cancelled_purchase_order`, added the line:: `purchase_order.order_line.flush_recordset()` - Because we were taking the `partner_id` from the `Purchase Order line` is a stored related field. - The computed value first lives in Odoo’s cache. - It is not written to the database until a flush occurs. - If we immediately call something like _read_group() (which queries the database directly), it won’t see the cached value — only what is persisted in the DB. **Solution:** - Use the purchase order line quantity instead of the stock move’s `product_qty` to ensure consistent and accurate On-time Rate calculation. opw-4991367 Forward-Port-Of: odoo/odoo#236779 Forward-Port-Of: odoo/odoo#225529
This fix updates partner records when certain e-invoicing modules are removed, so the system no longer crashes when opening a partner that was using one of those formats. It improves stability during module uninstall and avoids unexpected tracebacks for users.
Original PR description
Before this fix, if you uninstalled this module and navigated to any partner that had a e-invoice format defined by this module, you'd have a traceback. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr @moduon MT-12168 OPW-5172861 Forward-Port-Of: odoo/odoo#235301 Forward-Port-Of: odoo/odoo#232297
This update fixes how default due dates are set for several local report templates. It ensures the system uses the correct company-specific default values, reducing the risk of inconsistent reporting settings across countries.
Original PR description
The fields default_deadline_periodicity and default_deadline_days_delay have been added on the return type model because they handle the company dependant property of their associated field, and they are the ones that should be used in the xml.
This fix prevents website pages from breaking when a dynamic snippet still points to a deleted filter after an app is removed and reinstalled. It restores the previous behavior by checking that the filter exists before trying to render it, which keeps the editor and homepage working normally.
Original PR description
**Patch description:** - Following commit: odoo/odoo@e3b062e5d3820ddfcee2eb669f21edc0c53c3330 the behavior of dynamic snippet rendering changed. - Previously (up to v18.4), the system first checked…
**Patch description:**
- Following commit: odoo/odoo@e3b062e5d3820ddfcee2eb669f21edc0c53c3330 the behavior of dynamic snippet rendering changed.
- Previously (up to v18.4), the system first checked whether the dynamic filter existed before calling `_render` on it. After the referenced commit, `get_dynamic_filter` attempts to find the filter and immediately calls `_render`, even if the filter record is missing. diff: https://github.com/odoo/odoo/commit/e3b062e5d3820ddfcee2eb669f21edc0c53c3330#diff-d41b2dc5ff6fd6a303373f86e1af97d055db315ccc431749b4ffac1488dea119R416-R423
**Steps to reproduce:**
- Create a v19 db and install `website_sale`
- Add a dynamic snippet (e.g., Product Catalog) to the website homepage.
- Uninstall `website_sale`
- Install `website_sale` again
- Open the website homepage and then editor
- Traceback:
```py
File "/home/odoo/odoo/odoo/addons/website/controllers/main.py", line 424, in get_dynamic_filter
return dynamic_filter_sudo._render(**kwargs) or []
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/odoo/addons/website/models/website_snippet_filter.py", line 78, in _render
records = self._prepare_sample(limit, res_model=res_model)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/odoo/addons/website/models/website_snippet_filter.py", line 183, in _prepare_sample
records = self._prepare_sample_records(length, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/odoo/addons/website/models/website_snippet_filter.py", line 201, in _prepare_sample_records
model = self.env[(self.model_name or options.get('res_model'))]
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/odoo/odoo/orm/environments.py", line 107, in __getitem__
return self.registry[model_name](self, (), ())
~~~~~~~~~~~~~^^^^^^^^^^^^
File "/home/odoo/odoo/odoo/odoo/orm/registry.py", line 322, in __getitem__
return self.models[model_name]
~~~~~~~~~~~^^^^^^^^^^^^
KeyError: None
```
The issue occurs because the snippet’s `data-filter-id` refers to a filter record that gets deleted when `website_sale` is uninstalled. Upon reinstalling, new filter records are created with new IDs. The old snippet still references the deleted ID,
so in `get_dynamic_filter` when searching with `filter_id` returns no record.
Despite `_render` having an `self.ensure_one()` check, the mentioned commit changed it to `self and self.ensure_one()`, allowing a null/empty recordset to pass through and causing rendering issues.
This fix restores the proper behavior by verifying the filter’s existence before rendering.
opw - 5163214, 5248474
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update prevents checkout from crashing when Authorize.net returns an unexpected error. Instead of a technical failure, the payment is now marked as failed and the customer sees the error message, making the issue easier to understand and handle.
Original PR description
Currently an error occurs when a user tries to pay using Authorize.net, and Authorize.net returns an error in the response. **Steps to replicate:** * Install `website_sale` and `payment_authorize`…
Currently an error occurs when a user tries to pay using Authorize.net, and Authorize.net returns an error in the response. **Steps to replicate:** * Install `website_sale` and `payment_authorize` with demo. * Setup the payment provider Authorize.net with valid credentials. * Add the product to your cart, proceed to checkout, then use and save the payment details from [1] and complete the purchase. * Repeat the checkout process after replacing the `API Login ID` with an invalid value, and then pay using the saved payment details. **Error:** `TypeError: float() argument must be a string or a real number, not 'NoneType'` **Root cause:** * The error happens because after the API request at [2], an error response causes `tx_details` to have no `transaction` key, as shown in [3]. This makes the amount at [4] become `None`, which then triggers an error at [5] when Python tries to convert `None` to `float`. * As noted in the Authorize.net forums (see [6], [7], [8], [9]), the `E00040 'record not found'` error can appear when Authorize.net has synchronization issues on their end. **Solution:** * Show the error, change the transaction’s status to ‘error’, and save the error message on the transaction. [1]: https://developer.mastercard.com/unified-checkout-solutions/documentation/testing/test_data/ [2]: https://github.com/odoo/odoo/blob/f272eb19813be4254fd461ec21f1cc47e8834559/addons/payment_authorize/models/payment_transaction.py#L160 [3]: https://drive.google.com/file/d/1JrXkKzRRTbpjZ8l0kJsX5SIg-kS-P5tv/view?usp=sharing [4]: https://github.com/odoo/odoo/blob/f272eb19813be4254fd461ec21f1cc47e8834559/addons/payment_authorize/models/payment_transaction.py#L163 [5]: https://github.com/odoo/odoo/blob/f272eb19813be4254fd461ec21f1cc47e8834559/addons/payment_authorize/models/payment_transaction.py#L167 [6]: https://community.developer.cybersource.com/t5/Integration-and-Testing/E00040-The-record-cannot-be-found-right-after-profile-create/m-p/55106#M30039 [7]: https://community.developer.cybersource.com/t5/Integration-and-Testing/E00040-when-Creating-Subscription-from-Customer-Profile/m-p/59597#M34176 [8]: https://stackoverflow.com/questions/67506179/authorize-net-shows-e00040-when-creating-subscription-from-customer-profile [9]: https://community.developer.cybersource.com/t5/Integration-and-Testing/quot-E00040-The-record-cannot-be-found-quot-when-creating/td-p/62409 sentry-7021997195
This fix ensures any extra fields added to payroll run forms by local customizations are kept when the record is saved. It prevents users from losing entered information in localized setups, improving reliability for payroll processing.
Original PR description
In some localizations, extra fields are added in the form view of payruns, these field values are lost due to the way we buildRawRecord Forward-Port-Of: odoo/enterprise#100129
The website event editor now correctly reads the event ID from event page URLs, even when the event title contains characters that are encoded in the web address. This prevents the wrong event from being selected during editing for internationalized event titles.
Original PR description
The website event page extracts the event id from urls that are formatted like "/event/[title]-[id]/" by matching the first number not followed by a word character. Languages like Korean however will have their title percent-encoded like "%EC%82%AC%EC", causing the regex to miss the true ID and return the wrong one. Steps to Reproduce: 1. Create an event with a Korean title eg "모든 행사". 2. Go to the website view and click on edit. 3. You'll see that the regex grabs a wrong id. This fix is for adapting this commit https://github.com/odoo/odoo/commit/d16b0a8e303047997a0d4764f55bb7f1c214d47b to the use of plugins over snippets in 18.4 and onwards. opw-5095411 Forward-Port-Of: odoo/odoo#232781
When an invoice is duplicated, it will no longer keep the original sales order as its source document. This prevents misleading information on copied invoices and avoids incorrect data being sent to external e-invoicing systems.
Original PR description
Currently we copy the `invoice_origin` field on moves (when copying / duplicating moves). I.e. when copying a move that was created from a SO we end up with the `invoice_origin` filled on the copied move (but the SO is not linked and does not really have anything to do with the move anymore) This can i.e. lead to issues in EDIs (`l10n_es_edi_verifactu` like in the ticket) that send the `invoice_origin` as part of the data about the move. Reproduce 1. Create a sales order (SO). 2. Create an invoice from the SO (and confirm). You can see that the SO is linked at the top (smart button). 3. Copy the invoice (and confirm). You can see that the SO is not linked. 4. Go to the invoices list view and make the "Source Document" visible. 5. Both the invoices have the same SO as their "Source Document". opw-5115495 Forward-Port-Of: odoo/odoo#236656
This update fixes how Facebook statistics are calculated for connected accounts and posts after Facebook changed some of its metrics. It helps keep social performance numbers accurate by switching to supported data sources and temporarily neutralizing one trend measure until a fuller fix is available.
Original PR description
Bug === Facebook deprecated some of the endpoints related to statistics https://developers.facebook.com/docs/platforminsights/page/deprecated-metrics For the accounts, `page_fan_adds` and `page_fan_removes`, we are still unsure about unfollow, and so to get a fix quickly, we set the audience trend to zero, and we will fix it later. For live post, we used `post_impressions` in the API call, but that metric was not used, so we just remove it. For stream post, `post_impressions` has been replaced by `post_media_view`, as suggested in the migration note from Facebook. Task-5346965 Forward-Port-Of: odoo/enterprise#100119
This update fixes the German DATEV export so it reflects manual changes made to a bill’s tax amount. This ensures the exported accounting file matches what users see in the ledger and avoids reporting discrepancies.
Original PR description
- Install Accounting and `l10n_de_reports` - Switch to a German company - Create a bill: * Price: `100.00` * Taxes: `19%` - Edit the tax total with the pencil button - Go to "Accounting / Reporting /…
- Install Accounting and `l10n_de_reports` - Switch to a German company - Create a bill: * Price: `100.00` * Taxes: `19%` - Edit the tax total with the pencil button - Go to "Accounting / Reporting / Audit Reports / General Ledger" => The tax amount is the one that has been edited manually - Download `Datev DATA (zip)` - Open `EXTF_accounting_entries.csv` file The total amount in the file is the one before the edition of the tax amount. The Datev data depends on `price_total` field of the invoice lines, but this field is not updated when the tax amount is edited manually. We now check the total by adding `price_total` of each invoice line and the total amount defined in `tax_totals` field. If there is a difference, compute the delta for each tax group and split it between all the lines where a tax of that group is used. Ticket [link](https://www.odoo.com/odoo/project.task/4951488) opw-4951488 Forward-Port-Of: odoo/enterprise#100086 Forward-Port-Of: odoo/enterprise#98684
Importing CSV files encoded in UTF-16 now fails with a clear warning instead of a low-level error. This makes bank transaction imports easier to diagnose and helps users correct file encoding issues faster.
Original PR description
Currently, an error occurs when importing CSV files encoded in utf-16. **Steps to reproduce:** - Install the `account_bank_statement_import_csv` module. - Open invoicing and upload file [1] in Bank transactions. - Change the encoding to `utf-16` and click `test`. **Error:** `UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x0a in position 376: truncated data` **Root Cause:** At [2], the CSV data is decoded strictly with the specified encoding. When decoding detects incomplete or unexpected byte sequences, Python raises an `error`. **Fix:** This commit ensures raising a `warning`, improving the `error message clarity`. [1]: https://drive.google.com/file/d/14thHRN210aeY8fcUBAb01PniVrd7QHer/view?usp=sharing [2]: https://github.com/odoo/odoo/blob/67503c0ce7ede8373800caa0a12203d271b7f1ae/addons/base_import/models/base_import.py#L544 sentry-6864546266 Forward-Port-Of: odoo/odoo#226023
This change prevents access errors when users with invoicing-only permissions create or open invoices linked to TDS/TCS settings. It ensures the warning shown for Indian withholding rules is available without requiring full Accounting access, so day-to-day invoicing continues smoothly.
Original PR description
Invoicing users were unable to create or open invoices because the `l10n_in.section.alert` model (used for TDS/TCS warning on the chart of account) was restricted only to Accounting groups (Administrator and Read-only). **Steps to Reproduce** 1. Install l10n_in,account_accountant 2. Create two users: - Admin user - Invoicing user (only invoicing rights) 3. As Admin: - Enable TDS/TCS module - Open any Chart of Account - Select a TDS/TCS Section - Save 4. As Invoicing user: - Try to create an Invoice/Bill with that Chart of Account → Access Error occurs Fix Result Invoicing-only users can now create and access invoices without access errors. Task-5346551 Forward-Port-Of: odoo/odoo#236965 Forward-Port-Of: odoo/odoo#236896
This update prevents the word “undefined” from appearing when parts of a form are hidden during page rendering. It improves the display of full-size forms, especially where action buttons are prepared separately, so users see a clean empty area instead of confusing text.
Original PR description
Currently if the root node of a template is invisible at compile time the "new root" will contain the word "undefined" in plain text. Instead if we skip rendering the root for whatever reason, the new root should simply be an empty t node. This lead to issues in full-size forms specifically as the controller compiles the buttons separately. Meaning if the buttons div was evaluated to be invisible for whatever reason you would get "undefined" where stats buttons normally go. task-5322823 Forward-Port-Of: odoo/odoo#236724 Forward-Port-Of: odoo/odoo#236461