Daily updates from Odoo
Monday, July 14, 2025
14 changes
Enhancements to existing features
Odoo now supports the updated Finance iframe flow that lets users create a bank account directly when their institution is not found. This makes online bank synchronization smoother, especially in the mobile-first experience, by keeping Odoo aligned with the new embedded workflow.
Original PR description
The aim of this commit is making sure that the odoo database code is handling properly the new feature introduced with the iframe revamp in mobile-first. This feature allows user to create a bank account from the iframe directly if Odoo Finance doesn't have the searched institution. task-4481880 Forward-Port-Of: odoo/enterprise#89932 Forward-Port-Of: odoo/enterprise#81894
AI operations now produce clearer logs showing how long requests take, approximate token usage, and whether tools run one at a time or in batches. This helps teams monitor performance, understand AI-related costs, and troubleshoot slow or complex AI interactions more easily.
Original PR description
Track API usage and performance with detailed logging: - Log each API call with token counts (estimate) and timing - Show batch (⚡) vs single (→) tool execution - Display summary with total metrics…
Track API usage and performance with detailed logging: - Log each API call with token counts (estimate) and timing - Show batch (⚡) vs single (→) tool execution - Display summary with total metrics Example 1: Simple response generation ``` [AI API Call #1] Sending request with 2619 tokens [AI API Call #1] Completed (1.80s, 68 tokens) [AI Summary] Total: 3.86s | API calls: 1 (1.80s) | Tools: 0 (0.00s) | Tokens: 2687 (in: 2619, out: 68) | Batches: 0 ``` Example 2: With single tool call (long args list is in DEBUG log) ``` [AI Response] Starting generation for agent 'Odoo Compliance Assistant' (ID: 2) [AI API Call #1] Sending request with 2687 tokens [AI API Call #1 - →] Received single tool call (1.85s, 49 tokens) [AI Tool →] Starting _create_calendar_event(event_title=..., attendee_names=..., event_datetime=..., event_duration=..., summary=...) DEBUG [AI Tool] _create_calendar_event(event_title='Sales improvement', attendee_names=['Marc Demo'], event_datetime='2025-07-18 00:00', event_duration=3, summary=None) [AI Tool - 0.16s] Completed _create_calendar_event [AI API Call #2] Sending request with 2851 tokens [AI API Call #2] Completed (1.63s, 40 tokens) [AI Summary] Total: 4.34s | API calls: 2 (3.48s) | Tools: 1 (0.16s) | Tokens: 5627 (in: 5538, out: 89) | Batches: 0 ``` Example 3: Complex response generation loop - multi api calls, batched tool calls ``` [AI Response] Starting generation for agent 'Foo Agent' (ID: 123) [AI API Call #1] Sending request with 16170 tokens [AI API Call #1 - ⚡] Received Batch #1, 3 tool calls (2.90s, 17938 tokens) [AI Tool - Batch #1 ⚡] Starting (1/3) _sum_2_numbers(a=10, b=20) [AI Tool - Batch #1 - 0.01s] Completed _sum_2_numbers [AI Tool - Batch #1 ⚡] Starting (2/3) _sum_2_numbers(a=30, b=40) [AI Tool - Batch #1 - 0.01s] Completed _sum_2_numbers [AI Tool - Batch #1 ⚡] Starting (3/3) _sum_2_numbers(a=50, b=60) [AI Tool - Batch #1 - 0.01s] Completed _sum_2_numbers [AI Tool Summary] Batch #1 completed, 3 tool calls [AI API Call #2] Sending request with 22390 tokens [AI API Call #2 - →] Received single tool call (2.45s, 24395 tokens) [AI Tool →] Starting _sum_2_numbers(a=100, b=200) [AI Tool - 0.02s] Completed _sum_2_numbers [AI API Call #3] Sending request with 22417 tokens [AI API Call #3] Completed (1.52s, 24424 tokens) [AI Summary] Total: 7.44s | API calls: 3 (6.88s) | Tools: 4 (0.11s) | Tokens: 66757 (in: 60977, out: 5780) | Batches: 1 ```
The manufacturing planning screen now reloads only the schedules currently visible to the user instead of processing hidden paginated items. This makes quantity adjustments much faster in large production plans, reducing a benchmarked reload from 31.6 seconds to 3.5 seconds.
Original PR description
Description ----------- Only fetch forecasts for MPS schedules visible in the view rather than all impacted schedules. Schedules not visible due to pagination are skipped when reloading the MPS state. Benchmark --------- Adjusting a quantity for a product, which will impact around 1k+ other schedules (hierarchy is deep with boms), `get_production_schedule_view_state` takes: | Before | After | Speed-up | |--------|-------|----------| | 31.6s | 3.5s | 9x | Reference --------- opw-4778588 Forward-Port-Of: odoo/enterprise#87299
NACHA payment files can now correctly identify transactions for savings accounts instead of treating all bank accounts as checking accounts. This helps businesses route payments, including payroll-related payments, with the right banking transaction codes and reduces processing issues with banks.
Original PR description
[IMP] l10n_us_*: adapt nacha file Modules: l10n_us_payment_nacha, l10n_us_hr_payroll_account Adapt NACHA file to process transactions to savings accounts. Currently, NACHA files are only configured to process checking accounts (accounts meant to handle daily transactions). This means that any account added to res.partner.bank and associated with res.partner will be categorized as a checking account. NACHA accepts different transaction codes for checking and savings (long-term transactions) accounts but currently, our file is pre-configured to only process codes for checking accounts. task-4631279 Runbot: https://runbot.odoo.com/runbot/bundle/master-us-nacha-transactions-savings-account-roto-377535
The Carta Porte PDF now includes key transport details such as trailers, intermediaries, locations, and the correct certification date, reducing the risk of customers carrying incomplete legal documentation. The delivery slip is simplified to avoid duplicate information, making the reports clearer and easier to use.
Original PR description
Currently, the information relevant to the carta porte is divided into two reports, the delivery slip and the carta porte. This means that if a customer only carries one report, they could be in…
Currently, the information relevant to the carta porte is divided into two reports, the delivery slip and the carta porte. This means that if a customer only carries one report, they could be in legal breach, in addition to the fact that there is a lot of repeated information in both reports. Current behavior before PR: - The delivery slip report has the CFDI stamp, in addition to the information on trailers and intermediaries. - The carta porte report is missing information on trailers and intermediaries. - Certification Date in QR code uses the scheduled date Desired behavior after this PR: - The carta porte will contain information about trailers and intermediaries. - The structure of the delivery slip has been simplified to contain only the necessary information, without including duplicate data that is already on the carta porte. - The missing location field has been added to the addresses section in the carta porte report. - Certification Date in QR code uses the actual certification date. opw-[4590387](https://www.odoo.com/odoo/my-tasks/4590387) "I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr)"
The missing transactions wizard now highlights cancelled journal entries for the selected journal after a chosen date. This helps accounting teams spot potentially relevant cancelled bank transactions and reset bank statement lines to draft when needed.
Original PR description
This commit will add a new warning in the missing transaction wizard. It will allow to show the cancel entries of the journal you selected and after a certain date. task: 4532485
Vendor bill line labels can now help predict the professional deductible percentage when the user has access to partial purchase deductibility. This reduces manual entry and helps eligible accounting users see more complete predicted bill details.
Original PR description
- On Vendor Bill lines, on change of Label(name) of the line predict Professional%(deductible_amount) only if user have `account.group_partial_purchase_deductibility` group so this field is optional=show and user can see predicted amounts. - This predictions are done using `_predicted_field` method, using which we are already predicting product, taxes, account and now deductible_amount. Community PR: https://github.com/odoo/odoo/pull/205491 task-4661380
The Knowledge editor now uses the richer embedded file experience when embedded components are available, while keeping the standard file option elsewhere. This makes files inserted through the /file command behave more consistently in Knowledge without disrupting other editor uses.
Original PR description
### Current behavior before PR: - The /file command in powerbox used a static file box (FilePlugin) across all editor usages. - EmbeddedFilePlugin was only used in the Knowledge app. ### Desired behavior after PR is merged: - The editor uses EmbeddedFilePlugin when embedded components are enabled. - Other fallback to the standard FilePlugin. **community-https://github.com/odoo/odoo/pull/216572** task-4671755
The Sign app now lets businesses set a default validity period, in days, for new signature requests. This reduces repetitive setup for users and helps ensure requests consistently expire on schedule.
Original PR description
Added a setting in the Sign app to define a default validity period (in days) for sign requests. This improves the user experience by eliminating the need to manually set an expiration date for each new request. task-4942996
Resolved issues and error corrections
Self-order tickets in restaurant POS can now print without showing an unnecessary error after online payment. The change adds safer checks before using session data, preventing a failed print flow when expected records are missing.
Original PR description
Previously, when a self-order ticket was printed in a POS restaurant configuration, an error "list index out of range" occurred because there was an empty pos_session array returned by the method "pos.order.get_order_to_print". Steps to reproduce: 1. Configure and open a POS restaurant session 2. Enable self-ordering and online payment 3. Create and pay an order using the self-service interface 4. The ticket is printed in the restaurant session, but an error is displayed This commit ensures we check for the existence of required records before assigning data to avoid this error Community PR: https://github.com/odoo/odoo/pull/218629
Creating the Anniversary Discount marketing campaign from the eCommerce marketing tab now works reliably. The campaign targeting rules were simplified to avoid an error while preserving the intended customer selection.
Original PR description
We had a traceback when trying to create an Anniversary Discount marketing campaing
due to the domain's construction.
Steps to reproduce:
-------------------
* Go to Marketing Automation app
* Go to eCommerce tab --> anniversary discount
* Click " Create Campaign"
> Observation:
File "/data/build/enterprise/marketing_automation/models/marketing_activity.py", line 142, in _compute_inherited_domain
literal_eval(activity.campaign_id.domain or '[]')])
Why the fix:
------------
The problematic line was introduced in this REV: 1aa05c89f3371981922e3dc52d8334104aa425b9.
The domain was originally built in this IMP: cf2124f4f20a805077502587f9a8be0af0a753c3.
The domain was intended to be used dynamically, but after the revision, that usage changed—so the domain needed to be rebuilt.
We've simplified the domain to eliminate overlapping conditions, ensuring the same logic and result, but with improved readability.
opw-4857722
Forward-Port-Of: odoo/enterprise#89375This update aligns Belgian payroll DmfA reporting with the 2025/2 requirements. It helps ensure payroll declarations remain compliant with the latest Belgian reporting rules.
Original PR description
Forward-Port-Of: odoo/enterprise#90016
Bank reconciliation now correctly coordinates with analytic tracking updates to avoid repeated update loops. This helps users reconcile bank transactions reliably when analytic distributions are involved.
Original PR description
Since a recent fix[^1], the analytic distribution on journal entries is updated with any update made on analytic items. In order to avoid loops and do things in the right order, a context key was added. However, the reconciliation widget was also manipulating analytic items, so it needed to use the context key as well. opw-4936028 opw-4933629 opw-4935236 opw-4933456 opw-4933652 opw-4935789 opw-4938570 opw-4938388 opw-4935709 opw-4940233 opw-4938849 [^1]: https://github.com/odoo/odoo/commit/8194c6e2bfedc9437964090b1a498c3e8cff225c Forward-Port-Of: odoo/enterprise#90175
This fixes a barcode receipt issue where changing the unit of measure updated the completed quantity but left the reserved quantity unchanged. Businesses processing receipts in different units, such as dozens instead of individual units, now get consistent stock quantities and fewer inventory discrepancies.
Original PR description
Steps to reproduce:
- Create a storable product “P1”:
- UoM: Unit
- Create a receipt for 200 units of P1
- Mark it as To Do
- Go to the barcode module and start processing the receipt
- Edit the quantity:
- Set it to 2 and change the UoM to Dozen
- Save
Problem
The quantity done is correctly set to 2 dozens, But the reserved quantity remains 200
Solution:
When the UoM is changed, compute and update the reserved quantity accordingly
OPW-4716104
Forward-Port-Of: odoo/enterprise#89312
Forward-Port-Of: odoo/enterprise#85004