Daily updates from Odoo
Tuesday, August 11, 2026
3 changes
1 change
Enhancements to existing features
Budget report loading has been optimized to avoid extremely slow searches when many analytic lines and budget lines are present. This should make large budget reports usable again, reducing load times dramatically in affected databases.
Original PR description
**Description:** While loading the budget report, the bad queries are created by ```def _get_aal_query()``` and ```def _get_pol_query()``` function, makes the budget report unusable. **Root cause:**…
**Description:**
While loading the budget report, the bad queries are created by
```def _get_aal_query()``` and ```def _get_pol_query()``` function, makes
the budget report unusable.
**Root cause:**
Instead of doing a hash join while searching the record,
the OR statement in the Left Join in the condition
```(%(bl)s IS NULL OR %(a)s = %(bl)s)```
creates a nested for loop that compares everything single aal to bl,
this causes a significant performance issue as the number of the
number of check will be the the number aal * bl,
if a database has a 70k aal and 20k bl, both numbers are not large
but it will cause a 70k * 20k search which is more than a billion.
**Fix**:
There are some refactors made in this PR.
_First_, separate out the Q1.
In order to find the aal that has no bl connects to it.
Doing a search to find the aals that have bl and then subtract them from all aals.
_Second_, Instead of doing a nested loop for by using
```(%(bl)s IS NULL OR %(a)s = %(bl)s)```,
originally we will have do something like
```
JOIN budget_line bl
ON (bl.x_plan2_id IS NULL OR aal.x_plan2_id = bl.x_plan2_id)
AND (bl.x_plan3_id IS NULL OR aal.x_plan3_id = bl.x_plan3_id)
AND (bl.x_plan4_id IS NULL OR aal.x_plan4_id = bl.x_plan4_id)
```
Assuming each bl has three plans ```x_plan2_id```, ```x_plan3_id```, ```x_plan4_id```
Grouping the bl base on whether a specific plan is set, (i.e. shapes)
we can skip the ```IS NULL OR``` because we already know which plan
is null and do the hash join directly.
For example, the shapes will be a dictionary with a key of a tuple of booleans
based on whether a plan is set or not and the value is a list of bl_id.
```
{
(True, False, False): [1, 2],
(False, True, True): [3, 4],
(False, False, False): [5],
}
```
we can end up doing something like
```
JOIN budget_line bl
ON bl.id = ANY(ARRAY[3,4])
AND aal.x_plan3_id = bl.x_plan3_id AND aal.x_plan4_id = bl.x_plan4_id
```
which is way more faster.
---
The benchmark is made locally from this client's database which contains
69k aal, 23k bl, 6829 pol and 3 plans for aal and bl.
|Record count |Time before|Time after|
|--------------------------------------------------|-----------------|---------------|
|69k aal, 23k bl, 6829 pol, 3 plans |70.04s |4.6s |
Dalibo:
Before:
Month-over-month grand total by company:
https://explain.dalibo.com/plan/8h3d4e89aaf9f3d4
Overall grand total by company:
https://explain.dalibo.com/plan/445g1f9caf4923e2
Month-over-month grand total by plan:
https://explain.dalibo.com/plan/53a138ca50b2a7c4
Overall grand total by plan:
https://explain.dalibo.com/plan/hdbe169ddc7g5785
After:
Month-over-month grand total by company:
https://explain.dalibo.com/plan/hcc86c801e6872bf
Overall grand total by company:
https://explain.dalibo.com/plan/69b2421a3581f98h
Month-over-month grand total by plan:
https://explain.dalibo.com/plan/a88f398bbbch3148
Overall grand total by plan:
https://explain.dalibo.com/plan/1gg749ae7ab1553c
opw-6345552
Forward-Port-Of: odoo/enterprise#127321
Forward-Port-Of: odoo/enterprise#1241612 changes
New functionality added to Odoo
Belgian payroll now supports sending required Flexi@Work salary declarations to the NSSO whenever validated flexi-worker payslips are created. Users get actions and warnings to help ensure these declarations are submitted, changed, or cancelled on time, reducing compliance risk for employers.
Original PR description
Belgian companies hiring flexi-workers must transmit the salary data of each validated flexi payslip to the NSSO via the Flexi@Work eGov service (flexi-counter on mycareer.be). A declaration must be…
Belgian companies hiring flexi-workers must transmit the salary data of each validated flexi payslip to the NSSO via the Flexi@Work eGov service (flexi-counter on mycareer.be). A declaration must be sent every time a flexi payslip is created. New `l10n.be.flexi.at.work` model handles the full FLXWAGE flow: XML generation from payslip data, XSD validation against the quarterly ONSS schema, and batch submission. Supports submission, modification, and cancellation operations. The ONSS batch submission infrastructure (XML generation, schema caching, signature/go file handling, state machine) has been extracted into a new abstract `l10n.be.onss.batch.declaration` model that both DMFA and Flexi@Work now share — DMFA previously owned all of this inline. `_get_flxwage_amounts()` on the payslip splits the flexi gross into the two eGov financial-element buckets (remuneration 0001001000 / bonus 0002001000), pro-rating the flexi holiday pay (FLEXI_PECULE) across both in proportion to their respective bases. An action on validated flexi payslips triggers declaration creation, and a warning in the payslip list alerts users when flexi payslips still need to be declared. task-6180365
Enhancements to existing features
AI assistants can now pause a conversation to ask for confirmation or clarification directly in Discuss, including single-choice and multi-choice answers. This makes AI-driven actions safer and more flexible, while reducing interruptions by allowing users to approve similar actions for the rest of the chat.
Original PR description
Previously, tool execution could only pause for a binary confirmation through a dedicated message action. Generalize this flow into user input requests stored in the AI session. Tool calls can now pause and whether resume after receiving a confirmation or an answer to a question, while preserving buffered and remaining calls or completely aborted. Add an AI tool for asking clarification questions and display its choices directly in Discuss, with single- and multi-select support. Reuse the same interface for tool confirmations, including automatic approval for the rest of the chat, and remove the legacy confirmation action and shortcut. task-id-6140319