Daily updates from Odoo
Tuesday, August 11, 2026
40 changes
9 changes
Enhancements to existing features
The spreadsheet date picker now inserts actual date values instead of number values. This makes spreadsheet entries clearer and helps avoid confusion or incorrect formatting when users choose dates.
Original PR description
Task: 6353692
Payroll no longer automatically changes the current driver of company cars when benefits are updated. Employees selecting or receiving a company car are instead marked as the future driver, keeping fleet assignments clearer and avoiding unnecessary follow-up tasks.
Original PR description
. Remove the auto-assignment of the Driver based on the payroll benefits. . If an employee signs a contract and selects the car or the car gets added to the employee's benefits, he should become the car's future driver. . Don't offer in the salary configurator cars for which the future driver is filled. . Don't generate a task every time the payroll officer assigns a new driver to the car . Add the corresponding tests task-6425360 Forward-Port-Of: odoo/enterprise#126016
The Call Debrief view now makes better use of larger screens by showing video and transcription side by side when both are available. It also adapts more smoothly in full-screen mode, making review sessions easier to follow across different screen sizes.
Original PR description
This PR improves the Call Debrief experience across screen sizes and adapts the UI by: - Use a two-column layout on larger screens when both video and transcription are available. - Make the layout adapt correctly in full-screen mode. task-6328684 Requires: - https://github.com/odoo/odoo/pull/272719
All signers can now choose whether to add a frame when adopting their signature, not just internal Odoo users. The public signing page also has clearer visible borders on signature-related fields and buttons, making the signing flow easier to use.
Original PR description
Version: 19.0 Before this PR: The 'Frame' checkbox in the 'Adopt Your Signature' dialog was only shown to internal Odoo users (users with the `base.group_user` group).Also, on the public signing page, the Full Name input, the Frame checkbox and the Auto/Draw/Load buttons had no visible border After this PR: The 'Frame' checkbox is now rendered for every signer in the 'Adopt Your Signature' dialog. The Full Name input, Frame checkbox and Auto/Draw/Load buttons now have a visible border. Taskid-4610728 Forward-Port-Of: odoo/enterprise#127439 Forward-Port-Of: odoo/enterprise#126789
The timesheet timer menu now loads with fewer server requests and reuses already available information where possible. This should make the systray experience feel faster and more responsive for users tracking time, especially when opening or switching contexts.
Original PR description
This PR removes some blocking RPC calls and caches information to make the loading of the systray as lightweight as possible. Changes include: - Move `field_get` to the lazy session info, so the field metadata is available client-side without a dedicated round-trip. - Cache the pre-filled form: it does not change as long as the task / project context stays the same, so it is computed once and reused. - Drop the `get_server_time` RPC and rely on the client-side clock. - Add a client-side systray cache service to avoid redundant requests. Task-6131386 Forward-Port-Of: odoo/enterprise#124549 Forward-Port-Of: odoo/enterprise#120429
The checks the Tax Agency performs are always based on the latest version of their XSD (no API versioning), but the XSD URI changes with each new version of the checks. Since it's not functionally used, it's not so important to keep it always updated and yet now: - we now update the export templates to have the latest `schemalocation` URI for once. - we start ignoring namespaces in l10n_it_* XML tests - we start ignoring the root FatturaElettronica tag's namespace attributes so there
Original PR description
The checks the Tax Agency performs are always based on the latest version of their XSD (no API versioning), but the XSD URI changes with each new version of the checks. Since it's not functionally used, it's not so important to keep it always updated and yet now: - we now update the export templates to have the latest `schemalocation` URI for once. - we start ignoring namespaces in l10n_it_* XML tests - we start ignoring the root FatturaElettronica tag's namespace attributes so there won't be a problem in case we change the `schemalocation` again. Forward-Port-Of: odoo/odoo#281509 Forward-Port-Of: odoo/odoo#275345
Don't generate a task every time the payroll officer assigns a new driver to the car. task-6425360 Forward-Port-Of: odoo/odoo#279103
Original PR description
Don't generate a task every time the payroll officer assigns a new driver to the car. task-6425360 Forward-Port-Of: odoo/odoo#279103
This PR improves the Call Debrief experience across screen sizes and adapts the UI by: - Use a two-column layout on larger screens when both video and transcription are available. - Make the layout adapt correctly in full-screen mode. - Refines the style of silent sections. - Enable full-screen mode on all devices above the mobile breakpoint by using `env.isSmall` instead of `isMobileOS`. task-6328684 Requires: - https://github.com/odoo/enterprise/pull/122029 --- I confirm
Original PR description
This PR improves the Call Debrief experience across screen sizes and adapts the UI by: - Use a two-column layout on larger screens when both video and transcription are available. - Make the layout adapt correctly in full-screen mode. - Refines the style of silent sections. - Enable full-screen mode on all devices above the mobile breakpoint by using `env.isSmall` instead of `isMobileOS`. task-6328684 Requires: - https://github.com/odoo/enterprise/pull/122029 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This avoids a useless blocking rpc call when opening the systray. Task-6131386 Forward-Port-Of: odoo/odoo#276709 Forward-Port-Of: odoo/odoo#269797
Original PR description
This avoids a useless blocking rpc call when opening the systray. Task-6131386 Forward-Port-Of: odoo/odoo#276709 Forward-Port-Of: odoo/odoo#269797
4 changes
Enhancements to existing features
All signers can now choose whether to add a frame when adopting their signature, not just internal Odoo users. The signing dialog also has clearer borders around key inputs and buttons, making the public signing experience easier to use.
Original PR description
Version: 19.0 Before this PR: The 'Frame' checkbox in the 'Adopt Your Signature' dialog was only shown to internal Odoo users (users with the `base.group_user` group).Also, on the public signing page, the Full Name input, the Frame checkbox and the Auto/Draw/Load buttons had no visible border After this PR: The 'Frame' checkbox is now rendered for every signer in the 'Adopt Your Signature' dialog. The Full Name input, Frame checkbox and Auto/Draw/Load buttons now have a visible border. Taskid-4610728 Forward-Port-Of: odoo/enterprise#127280 Forward-Port-Of: odoo/enterprise#126789
Spreadsheet date selection now writes a real date value instead of a numeric representation. This makes spreadsheet data clearer and reduces confusion when users select dates through the date picker.
Original PR description
Task: 6353692
Document links are now calculated more efficiently by narrowing the search work and avoiding an expensive filter. This should improve performance when working with documents and attachments without changing user-facing behavior.
Original PR description
* Prefetching attachment_ids in sudo allows to limit the scope of the documents search * Removing the location filter on the document, not worth the performance hit. Follow-up of Task-5882406
…h lookup _search_phone_mobile_search previously searched only raw number fields returned by _phone_get_number_fields (e.g. mobile, phone). E164-normalized phone_sanitized was ignored, so searching by a sanitized value could miss records that had no match on the raw fields. This commit: - Extracts _phone_get_searchable_fields() so that both init() and _search_phone_mobile_search build the same searchable field list, appending phone_sanitized alongside mobile/phone when available. - Add
Original PR description
…h lookup _search_phone_mobile_search previously searched only raw number fields returned by _phone_get_number_fields (e.g. mobile, phone). E164-normalized phone_sanitized was ignored, so searching by a sanitized value could miss records that had no match on the raw fields. This commit: - Extracts _phone_get_searchable_fields() so that both init() and _search_phone_mobile_search build the same searchable field list, appending phone_sanitized alongside mobile/phone when available. - Adds expression indexes for phone_sanitized in init() so the REGEXP_REPLACE-based queries hit indexes instead of scanning tables. - Guards init() with self._auto to prevent index creation on AbstractModel subclasses that lack a physical table. Task-6395518 ENTPR: odoo/enterprise#124797 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281533 Forward-Port-Of: odoo/odoo#278018
2 changes
Enhancements to existing features
The spreadsheet date picker now writes an actual date value instead of a numeric representation. This makes spreadsheet entries clearer and reduces confusion for users working with date fields.
Original PR description
Task: 6353692
The timesheet assistant now shows the specific Odoo record name when ActivityWatch sees a recognizable record URL that does not otherwise match a known page. This makes suggested work descriptions more precise and easier for users to understand, instead of falling back to a broad application name.
Original PR description
Before this commit, when the ActivityWatch integration encountered unmatched Odoo URLs, it would fallback to displaying the general application name (e.g., "Working on Sales"). With this commit, if the URL path ends with a valid record ID (e.g., /odoo/departments/1) and the corresponding model can be identified, the assistant will attempt to fetch and display the actual record name (e.g., "Working on Research & Development"). task: 6365568
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#12416123 changes
Enhancements to existing features
Colombian electronic invoice reports now place the DIAN authorization information correctly when using the new compact layout. Odoo Studio also recognizes this layout, helping businesses use the new report style without losing required compliance details.
Original PR description
Adds the xpath for the DIAN authorization block to accommodate the new report layout: compact. Add the view for studio. task-6294364 Community PR: https://github.com/odoo/odoo/pull/279698
Restaurant appointment table timers now use the same timing display and behavior as the core restaurant point-of-sale experience. This gives staff a more consistent, easier-to-read view of how long tables have been active, improving day-to-day floor management.
Original PR description
In this commit - -------------------------- - Match base timer formatting and behavior - Improve overall UX for table time tracking - Remove basic timer functionality from appointment and move it to restaurant Task-6152646 Related PR - https://github.com/odoo/odoo/pull/262756
Payroll warning checks now focus only on the relevant employee or payslip records instead of scanning broader sets of data. This reduces unnecessary processing and helps make some payroll warnings easier to maintain and translate, including for Belgian payroll workflows.
Original PR description
To reduce the amount of records fetched by domain warnings, active_ids will only fetch the ones we care about. This also makes it possible to translate some python warnings into domain now. task-6448866
Belgian payroll users now see XML generation errors as a warning at the top of the 274.xx report screen. The related XLSX fields automatically realign when the error message is removed, keeping the form easier to read and use.
Original PR description
[IMP] l10n_be_hr_payroll: 274.xx xml report generation display error . If XML generation error is there, we show in the top as a warning . XLSX Field and file is realigned automatically when the error field is removed task-6422011
Payroll accounting payments have been reorganized to make payment handling more consistent across payslips, employees, salary rules, and country-specific payroll flows. This should help payroll teams process and track salary payments more reliably, including payment registration and bank file workflows.
Original PR description
task-4592721
The Belgian payroll rules for double holiday pay have been corrected and improved. This helps payroll teams calculate and validate holiday-related payslips more reliably, reducing the risk of payroll errors.
Original PR description
task-5068001
This update reorganizes how payroll wage pay periods are managed across contracts, salary configuration, and payslip batches. It should make payroll setup and processing more consistent for HR teams, reducing confusion when employees are paid on different schedules.
Original PR description
task-5043999
Belgian payroll now better handles complementary salary payments made outside the normal monthly payroll cycle. The update adds regularization for social security contributions and withholding tax, helping corrections be taxed as if they were part of the regular salary calculation.
Original PR description
Sometimes a complementary salary need to be paid outside of the monthly pay (especially in case of corrections). The difference between a complementary salary and a bonus is the type of withholding tax that must be paid, complementary salary are those for which a standard withholding tax has to be paid. When some complementary salary are paid outside of the monthly pay, the withholding tax amount may be "wrong" and should be regularized. Example: a bonus of 250€ alone on a payslips will lead to a withholding tax of 0€ but if you consider it with the monthly pay it should be have been taxed. This commit introduces two new rules to regularize the ONSS and withholding tax amount. task-6001677
Payroll no longer uses a separate work entry type for periods outside an employee contract. This simplifies payslip calculations and reporting across payroll localizations by avoiding special handling for out-of-contract days.
Original PR description
task-6205747
Calendar events linked to a specific project or task are now matched using that direct link before relying on partner history. This helps employees create more accurate timesheets from calendar events and reduces manual corrections.
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
This update aligns several Odoo Enterprise apps with a newer internal way of building database queries. It should improve long-term reliability and maintainability without changing day-to-day user workflows.
Original PR description
https://github.com/odoo/odoo/pull/281422
The spreadsheet date picker now enters dates as actual dates rather than plain numbers. This makes spreadsheet data clearer and helps avoid confusion or incorrect calculations when users work with dates.
Original PR description
Task: 6353692
Payroll now uses one clear rule to identify unpaid time: work entry types with a zero pay rate. This reduces configuration complexity across payroll localizations and helps prevent duplicate deductions, while extra hours are now identified through a dedicated payroll category.
Original PR description
The `unpaid_structure_ids` field was removed from work entry types to simplify the configuration. Previously, a work entry type could be marked as unpaid either by adding payroll structures to…
The `unpaid_structure_ids` field was removed from work entry types to simplify the configuration. Previously, a work entry type could be marked as unpaid either by adding payroll structures to `unpaid_structure_ids` or by setting `amount_rate` to 0. From now on, `amount_rate = 0` is the single source of truth for unpaid work entries. As part of this change: * Set `amount_rate` to 0 for out of contract entries, unpaid leaves, and all work entry types that were previously unpaid in monthly structures across localizations. * Kept `l10n_be_work_entry_type_notice` with `amount_rate = 1`. Although it was marked as unpaid for the 13th month structure, it remains paid in the monthly structure. Since work day lines are not used in the 13th month computation, keeping its rate would have no functional impact on the 13th month payroll calculation. * Removed unpaid work entry types from the Belgian `REMUNERATION_BASE`, `ONSS_BASE`, and `WITHHOLDING_BASE` categories, as they now have `amount_rate = 0` and therefore no impact on these bases. * Removed Egyptian salary rules that deducted unpaid leaves and out of contract periods. Since these work entries now contribute 0 to the base salary, keeping the deduction rules would result in double deductions. --- Introduce the `EXTRA_HOURS` category on work entry types as the source of truth for identifying extra hours. The `is_extra_hours` field is moved from `hr_work_entry` to `hr_payroll` and turned into a stored computed field based on the work entry type categories. This preserves its usage in payroll computations while making the category the source of truth. Task: 6292486
Belgian payroll setup guidance now shows the correct 9-digit ONSS registration number format. Demo company and ONSS numbers were also corrected, reducing confusion during configuration, testing, or demonstrations.
Original PR description
The placeholder for the ONSS registration number was misleading as it had 10 digits instead of 9. This updates the placeholder to 083012308 and corrects the ONSS and company numbers in the Belgian demo data. Task-6421257
Belgian payroll now supports creating customized premium pay child categories and related rules. This gives payroll teams more flexibility to model company-specific premium pay needs while keeping calculations organized and test-covered.
Original PR description
Allow to create customized premium pay children task-6394804
Payslip salary rule lines are now shown in either the main payslip body or the extra information section, not both. This makes payslips clearer and ensures correction payslips show only the relevant difference in the extra information section too.
Original PR description
For salary rules, the "Visibility" (`appears_on_payslip`) and the "Show in extra info section" (`display_in_pdf_extra_info`) fields were unrelated. That means that a payslip line could be shown twice if (for e.g.) a salary rule with ```python appears_on_payslip = 'always' display_in_pdf_extra_info = True ``` would be shown twice in the payslip (once in the body and once in the extra info section) This PR fixes that to make it intuitive, now `appears_on_payslip` only affects the visibility, and `display_in_pdf_extra_info` only affects the placement of the line. So that it is never shown twice. The PR also makes it so that the "delta" logic (i.e.: showing only the difference in correction payslips) is also done in that section (it wasn't the case previously) task-6376147
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
Helpdesk customer rating settings are now managed per ticket stage instead of per team. This makes rating visibility and rating request emails more reliable, so businesses can control exactly when customer feedback is requested.
Original PR description
- Before this commit, the customer rating configuration was managed on `helpdesk.team`, which led to inconsistent behavior: - ratings could still appear even when disabled on the team - rating request emails could still be sent after disabling the feature - After this commit, the rating configuration is moved to `helpdesk.stage`, aligning the behavior with the Project and ensuring that ratings and rating request emails are controlled reliably through stage configuration. - The `Customer Ratings` option is removed from the helpdesk team form view. task-5119003
The Time Off planning calendar has been improved to make leave scheduling easier to review and manage. This should help HR teams work more efficiently when viewing and selecting multiple time off entries in the Gantt view.
Original PR description
task-6449840
US payroll configuration is improved with clearer field labels and updated default accounting mappings for salary rules and payroll tax categories. This helps payroll teams produce more consistent accounting entries while removing an obsolete California ETT tax field.
Original PR description
. Change fields labels . Remove CA ETT Tax field . Add default debit account Employee Payroll Taxes to Taxes rules category . Add default debit account Payroll Taxes and default credit account Employee Payroll Taxes to Employer Deductions rules category . Add default debit account Salaries and Wages to Basic salary rule . Remove default debit account and default credit account to Gross salary rule task-6374068
Belgian payroll users can now generate meal voucher reports from branch companies, not only the main company. This helps meet Partena requirements and makes payroll reporting more flexible for businesses with branch structures.
Original PR description
Currently, It's not possible to compute a meal voucher report from branch company. This PR introduces support for generating meal voucher reports from a branch company to meet Partena's requirements. Removing this constraint allows meal voucher reports to be generated from branch companies. task-6428777
The customer view no longer shows a redundant subscription statistic. This reduces visual clutter and makes partner records easier to scan without removing core subscription functionality.
Original PR description
Remove the sale_subscription statistic hook from res.partner to reduce the space taken by application statistics in partner views. task-6385576
All people signing a document can now choose whether their signature includes a frame, not just internal Odoo users. The signing dialog also has clearer borders around the name field and signature options, making the public signing experience easier to understand and use.
Original PR description
Version: 19.0 Before this PR: The 'Frame' checkbox in the 'Adopt Your Signature' dialog was only shown to internal Odoo users (users with the `base.group_user` group).Also, on the public signing page, the Full Name input, the Frame checkbox and the Auto/Draw/Load buttons had no visible border After this PR: The 'Frame' checkbox is now rendered for every signer in the 'Adopt Your Signature' dialog. The Full Name input, Frame checkbox and Auto/Draw/Load buttons now have a visible border. Taskid-4610728 Forward-Port-Of: odoo/enterprise#127439 Forward-Port-Of: odoo/enterprise#126789
1 change
Enhancements to existing features
The signing app now limits changes to a signer's email address so only the person who created the signing request can make them. This helps prevent unintended or unauthorized changes to who receives or signs a document, improving trust in the signing process.