Daily updates from Odoo
Saturday, August 8, 2026
10 changes
1 change
Enhancements to existing features
Calendar events are now matched to the right project or task using the event's linked record before falling back to partner history. This makes suggested timesheets more accurate and reduces manual corrections for users who track time from calendar entries.
Original PR description
…the 'linked to' field Before this commit: - Calendar events are matched based on the most timesheet project of the partners. After this commit: - Calendar events are matched to projects/tasks via the "linked to field" before looking to partners projects. task-6238332 Forward-Port-Of: odoo/enterprise#123158
1 change
Enhancements to existing features
Calendar events are now matched to the right project or task using the event's linked record before falling back to partner history. This makes suggested timesheets more accurate and reduces manual corrections for users tracking time from calendar events.
Original PR description
…the 'linked to' field Before this commit: - Calendar events are matched based on the most timesheet project of the partners. After this commit: - Calendar events are matched to projects/tasks via the "linked to field" before looking to partners projects. task-6238332
2 changes
Enhancements to existing features
Receipt printer selection now uses the same broader matching rules as preparation printers. This helps point-of-sale setups find compatible IoT printers more consistently and reduces configuration friction.
Original PR description
In odoo/enterprise#124306, we removed the subtype from the printer domain, but only for preparation printers. We also update it for receipt printers. Forward-Port-Of: odoo/enterprise#127142 Forward-Port-Of: odoo/enterprise#125648
Timesheet users can now select multiple assistant suggestions by holding the mouse button and moving across them, making batch creation or removal faster. The change also prevents Ctrl-clicking a suggestion from accidentally opening a new Odoo page, reducing disruption during timesheet entry.
Original PR description
Currently when the user uses ctrl + click on a suggestion, a new odoo page is opened. This is an undesirable side effect and it is removed in this commit. Also, users have to manually click on each suggestion when they want to remove them in batch, or create one timesheet for a bunch of suggestion. This commit lets user hover over suggestion with the mouse button pressed to select them. task-6385047
5 changes
Enhancements to existing features
The recurring donation product now includes a default placeholder image in the website shop. This gives donation pages a more complete and consistent appearance when no custom product image is set.
Original PR description
Added placeholder image for the recurring donation product. task-6361612 Forward-Port-Of: odoo/enterprise#126209
The timesheet assistant now includes additional built-in rules based on beta tester feedback, making it more useful out of the box. The beta warning has also been removed, reflecting that the feature is now considered ready for regular use.
Original PR description
This commit's purpose is to add a few built in aw rules, as that was a demand from the odoo expert who beta tested the assistant. It also removes the 'beta' warning, as the feature is reaching a useable state. task-6385660
Spreadsheet list headers can now be translated, making dashboards easier to understand for users working in different languages. The change also ensures these header terms are detected for translation when spreadsheet data is processed.
Original PR description
This commit adds the support to translate list headers in the spreadsheet, as well as the term extraction from the json. Task: 6452895
Hong Kong payroll users can now attach multiple rental payment proofs through a clearer button-based flow instead of a single confusing field. The rental similarity check was also refined to avoid false matches, especially after migrations or for non-overlapping rentals from the same employee.
Original PR description
As the system now starts to be used by real users, we noticed a few points of improvement that can easily be done in stable and will provide a better UX when interacting with the system. The payment…
As the system now starts to be used by real users, we noticed a few points of improvement that can easily be done in stable and will provide a better UX when interacting with the system. The payment proof as a field was a consequence of multiple iterations of the system; but it ended up only as a way to input the proof and nothing else. It is confusing, only allows one proof at a time, and is overall not nice to use. To improve that, we will remove the field and replace it with an 'Attach Payment Proof' button similar to the expense app, allowing for a better experience. The similar rental check was checking even if all the related fields were empty. On a database migrating from a previous version, this leads to ALL the rentals to be marked as similar, which isn't ideal. The same check was also comparing multiple rentals from the same employee as long as they are active. As rentals for an employee cannot overlap, it makes no sense to check this case and cause false positives. task-6448054 Forward-Port-Of: odoo/enterprise#126764
German POS certification now handles retail and restaurant transaction synchronization separately, matching Fiskaly’s expected workflows. This improves compliance reliability by starting transactions earlier, reducing unnecessary updates for retail sales, and ensuring restaurant kitchen changes are synchronized accurately without duplicating already sent items.
Original PR description
In this commit: ------------------ - Maintain separate Fiskaly transaction flows for retail (short tx) and restaurant (long tx) orders as discussed with the Fiskaly team. - `Initialize order…
In this commit: ------------------ - Maintain separate Fiskaly transaction flows for retail (short tx) and restaurant (long tx) orders as discussed with the Fiskaly team. - `Initialize order transactions` with an empty payload when the `first product` is added. - Start `receipt transactions` with an empty payload when the `first payment line` is added. - For retail flows, no intermediate order updates are sent to Fiskaly before finalization. - For restaurant flows, create additional transaction updates during kitchen synchronization. Ensure already synchronized products are not resent, and only newly added or updated quantities are included in the payload. - `Finalize order and receipt transactions` with complete order lines and payment details when we validate the order. task: 6208963 Reference: <img width="1863" height="1285" alt="de_tss_flow" src="https://github.com/user-attachments/assets/9140788e-7948-4a08-9f11-27197b22ca8b" /> Forward-Port-Of: odoo/enterprise#120529 Forward-Port-Of: odoo/enterprise#117526
1 change
Enhancements to existing features
Budget report loading has been optimized by changing how budget lines are matched to related accounting data. This reduces very slow report loads on larger databases, improving usability for teams working with many budget and analytic records.
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