Daily updates from Odoo
Wednesday, May 13, 2026
31 changes · master
New functionality added to Odoo
This update allows users to easily download all attachments associated with bank statements and statement lines in a single zip file. This simplifies the process of accessing and reviewing supporting documentation, improving efficiency and record-keeping.
Original PR description
This commit will add a new server action to download in a zip the attachments of the statement line and also of the bank statement link to it. task-6045430
This update introduces a new widget within Odoo's reporting tools that allows users to group and analyze financial reports by user. This provides greater insight into who is responsible for specific transactions and improves reporting accuracy and accountability.
Original PR description
task-4572646
Enhancements to existing features
This update simplifies filtering of bank reconciliation reports by introducing a new message type for transaction details. This change enhances the user experience by allowing for more precise and efficient filtering of bank statement data within the bank rec widget. It's an improvement to the existing bank reconciliation process.
Original PR description
Following this commit: This commit will introduce a new message type for the transaction details used in the bank rec widget to ease the filtering of those message. task-5932620
This update enhances the sorting of contacts within the VoIP module to address inconsistencies in how names and numbers are displayed. Specifically, it now correctly handles umlauts in German names and sorts numbers in a more user-friendly, lexicographical order, ensuring contacts appear in the expected sequence.
Original PR description
### German Phonebook In German phonebook sorting, umlauts are expanded to their two-letter equivalents before sorting: - ä becomes ae - ö becomes oe - ü becomes ue - ß becomes ss ### Numbers Sorting numbers in lexicographical order leads to "10" coming before "9", but when browsing a list of contacts, you'd expect "Guest 2" to show up before "Guest 10000". This commit adapts VoIP's contact tab to account for these two aspects.
This update adds a client ID field to the list view for account online links, providing the support team with crucial information. This optional field is hidden by default for customers who don't require it, ensuring a streamlined experience. It improves support efficiency and data accessibility.
Original PR description
The aim of this commit is adding the client id of an account online link into the list view to help the support. The field is added in optional hide for the customers who don't need this information. no task id
Resolved issues and error corrections
This update resolves a technical error that prevented users from generating balance sheet comparisons correctly. The fix ensures that date types are consistently handled, allowing the comparison feature to function as intended. This improves the reliability of balance sheet reporting.
Original PR description
Step to reproduce - Install the accountant module. - create a fiscal year (for 01/01/26 to 30/06/26) from setting and enable it - Navigate to Accounting > Report > Balance Sheet - Click the…
Step to reproduce
- Install the accountant module.
- create a fiscal year (for 01/01/26 to 30/06/26) from setting and enable it
- Navigate to Accounting > Report > Balance Sheet
- Click the `Comparison` smart button and set `Previous Period` to `2 periods`.
Observation:
- we face a traceback
``` File "/home/odoo/odoo/codebase/enterprise/saas-19.2/account_reports/models/account_report.py", line 5739, in _get_annotations
period_date_from = self._adjust_date_for_joined_comparison(options, period_date_from)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/codebase/enterprise/saas-19.2/account_reports/models/account_report.py", line 5695, in _adjust_date_for_joined_comparison
return min(period_date_from, comparison_date_from)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: '<' not supported between instances of 'datetime.date' and 'str'
```
Cause:
- `_get_period_dates` return string in case we have date which falls in
`custom_range_match`, when `get_report_information` is called, while
`period_date_from` is of type date
- hence there is mismatch between types
Fix:
- `_get_period_dates` is supposed to return date object always, hence fixed the
return type in case we have match for custom range
opw-6185629
Forward-Port-Of: odoo/enterprise#116350This update corrects a technical issue that was causing errors in the MRP Work Order Kanban module. The fix ensures that JavaScript classes are correctly defined within the core MRP module, resolving a runbot error. This improves the stability and reliability of the work order Kanban interface.
Original PR description
js_class defined in mrp_workorder should have been defined in mrp. This solves runbot error 242288 Forward-Port-Of: odoo/enterprise#117036
This update fixes an issue where newly created stock batches were incorrectly named 'New' instead of following the standard BATCH/<TYPE>/000NN naming convention. The fix ensures batches are automatically named correctly, improving data consistency and reporting accuracy. This resolves a minor operational inefficiency.
Original PR description
Steps to reproduce 1. Open the Barcode app > Operations > Delivery Orders. 2. Switch to the "Batches" tab. 3. Create a new one. Issue The created batch keeps the placeholder name "New" instead of…
Steps to reproduce
1. Open the Barcode app > Operations > Delivery Orders.
2. Switch to the "Batches" tab.
3. Create a new one.
Issue
The created batch keeps the placeholder name "New" instead of being
renamed to `BATCH/<TYPE>/000NN`.
The barcode kanban "New" button calls `open_new_batch_picking`, which
runs `Batch.create({})` while the action context carries
`default_picking_type_id` set by `stock.picking.type._get_action` at
https://github.com/odoo/odoo/blob/f768f276171b079a76324d40307db385f558dda6/addons/stock/models/stock_picking.py#L432.
Since `vals` itself doesn't carry `picking_type_id`, the lookup in
`stock.picking.batch.create()` at
https://github.com/odoo/odoo/blob/f768f276171b079a76324d40307db385f558dda6/addons/stock_picking_batch/models/stock_picking_batch.py#L181
returns an empty recordset, so the sequence-based rename branch is
skipped and the name stays at the field default `'New'`. The
subsequent `super().create` then applies the context default, so the
batch is correctly linked to a picking type but with the wrong name.
opw-6168320
Forward-Port-Of: odoo/enterprise#115809This update corrects a display issue where the 'Reconnect Bank' button appeared incorrectly when account online consent hadn't expired. The fix ensures the button only shows when a consent expiration date is present, preventing confusion and unnecessary actions. This improves the user experience and data accuracy.
Original PR description
Since this commit 375516ccfd20d3a969c532376d0ba9db195b35fd, the reconnect bank button is displayed when the account online link doesn't have consent expiration date, which is wrong, if the consent doesn't expire, we shouldn't display the button. Why this happens? Because we don't check if expiring_synchronization_date is falsy, we only check if expiring_synchronization_due_day <= 0, which is always true in this case, has the compute set 0 as a fallback value. no-task Forward-Port-Of: odoo/enterprise#117101
This update resolves a technical issue preventing proper display of the employee form within the South Africa (SA) localization. The fix ensures that the employee record view functions correctly for users in the SA region, improving data accuracy and usability. This resolves a previously reported problem impacting SA-based users.
Original PR description
this commit fixes the broken view of employee form in SA localization. task-6205661 Forward-Port-Of: odoo/enterprise#117027
This update optimizes the Odoo interface for smaller screens by removing the VoIP icon from the systray when it's not in use. This improves the overall user experience and reduces visual clutter, particularly on devices with limited screen space.
Original PR description
task-5079952
This update resolves a technical error that prevented the system from correctly identifying project documents when the designated folder was not specified. The fix ensures the system functions smoothly regardless of whether a folder is associated with a project, improving document retrieval reliability.
Original PR description
The `_compute_documents()` method was expecting that the `documents_folder_id` field was always set.
However, the field is not required and can be empty.
This is not an issue if the compute is called on a single record, but when called on a recordset with :
- A project with related folder with at least one document
- A project with `documents_folder_id` empty The compute will fail because it calls `startswith()` with a parameter that is `False`.
```python
File "/home/odoo/src/enterprise/19.0/documents_project/models/project_project.py", line 50, in <lambda>
document_ids = documents.filtered(lambda doc: doc.parent_path.startswith(project.documents_folder_id.parent_path))
TypeError: startswith first arg must be str or a tuple of str, not bool
```
Solution:
Check for project-related documents only if the dedicated folder is set.
Forward-Port-Of: odoo/enterprise#117066This update fixes an issue preventing accurate translation exports from the web studio's interactive editor. The problem stemmed from a formatting error in template strings that caused incorrect code extraction. By removing problematic formatting, the system now correctly exports and applies translation messages, improving the overall translation workflow.
Original PR description
It seems that the Babel Javascript tokenizer is not able to correctly parse a template string starting with a backslash and a newline. This caused it to extract pieces of code coming after it. The code excerpts would be exported in the POT file, but not applied to the JS code of course. The original message was not exported though, so it was not possible to translate it. This commit rewrites the template string to not use a backslash and a newline. This way the string is properly extracted and the code after it is not. Change was introduced by this commit[^1]. [^1]: https://github.com/odoo/enterprise/commit/56a2d9c4c2cc655af0469038d4c483581ac78864 Forward-Port-Of: odoo/enterprise#116927
This update resolves a visual flicker issue in the timesheet timer display, particularly when saving data. By validating record data before saving, the system avoids rounding errors that caused brief, distracting flashes. Additionally, the commit adjusts the visibility of the delete button to prevent a related flicker.
Original PR description
before: The timer value is rounded to the record, then the saving attempt is made. This makes the timer flicker to the rounded value for a split second if the saving operation failed (ex. missing data) after: The record is updated with the rounded value if the saving operation is valid. We check the record validity before saving or updating the record. --- task-6120567 Forward-Port-Of: odoo/enterprise#114502
This update fixes a potential issue where users could create multiple checks for the same tax return due to a delay in the system's data refresh process. The change implements a database constraint to ensure only one check is created per return, regardless of multiple clicks or delays, improving data accuracy and reliability.
Original PR description
It is possible to have duplicate checks in a return. To reproduce: delay the function refresh_checks by adding for example import time; time.sleep(5) in a fresh database, create the tax returns. while it's still loading (due to the delay), click on a tax return -> This will trigger refresh_checks again for that return and you end up with duplicate checks (see video attached) Obviously, this shouldn't happen The change replaces the python constraint with sql constraint disallowing the user from creating multiple checks for same return even when the user clicks multiple time in the case of a delay. task: 5951345
This update fixes issues with the Sign template list by preventing one-shot requests and obsolete versions from appearing. It ensures the list remains clean and accurate, improving the usability of reusable templates for users.
Original PR description
Fix multiple issues affecting the Sign templates list: - Hide one-shot sign request templates from the archived templates list. - Treat PDFs uploaded from external records as one-shot sign requests, instead of adding them to the active templates. - Exclude obsolete template versions from the templates view by archiving and hiding them when a template document is updated. This keeps the templates list clean and avoids mixing one-shot requests and outdated versions with reusable templates. task-5493551
This update fixes a minor issue where the 'Plan' button appeared in the Gantt view even when no Sales Order Lines were available to plan. The change ensures the button only appears when there's a valid Sales Order Line to work with, streamlining the planning process and preventing unnecessary dialogs.
Original PR description
Steps to reproduce: === - Go to Planning → Gantt view. - Click on an empty cell where no Sale Order Line (SOL) exists. - Observe that the Plan button appears in the multi-selection toolbar. Issue: === The Plan button is shown even when there are no SOL to plan, and clicking it opens the planning form dialogue, which should not happen in this scenario. Cause: === The visibility of the Plan button relies solely on whether `onPlan` is defined. There is no built-in validation to check whether any SOL actually exists for the selected cell before exposing the 'onPlan' action. Fix: === Introduce a new reactive prop `hasAvailableSOL` and compute it before `onPlan` is used. The Plan button is now shown only when an SOL actually exists. task- 5163638 Forward-Port-Of: odoo/enterprise#99517
This update fixes an issue where the timesheet reporting incorrectly included public holidays from other companies, leading to inaccurate planned hour calculations. The fix ensures that only public holidays related to the employee's company are considered, improving the accuracy of the planning analysis report.
Original PR description
## Steps to reproduce: - Install project_timesheet_forecast module - Create a public holiday in one company - In another company create a planning slot for an employee that overlaps with the holiday - Go to Timesheets/Planning analysis report - Notice the report is not showing planned hours for the employee on the day of the public holiday ## Cause: When filtering the resource_calendar_leaves we don't check for the company so any public holiday in any company will be taken into account even if it doesn't affect the employee ## Fix: Exclude holidays that has different company than the planning slot opw-5027070 Forward-Port-Of: odoo/enterprise#117015 Forward-Port-Of: odoo/enterprise#116263
This update resolves a bug that prevented regular users from accessing sales order details, regardless of whether they were inter-company transactions. Previously, users would encounter access errors when validating sales orders, disrupting the sales process. This fix ensures all sales order information is accessible.
Original PR description
When running `button_validate`, a regular stock user won't be able to access the related SO to check whether the partner is another company or not. This will raise access errors for all regular SO deliveries, regardless of being inter-company or not. Forward-Port-Of: odoo/enterprise#117047
This update prevents the VoIP icon from appearing in the system tray on small screens when the user's VoIP configuration is incomplete. Previously, users without a valid configuration would see an error icon. Now, the icon is hidden, improving the user experience and preventing confusing error messages.
Original PR description
Avoid displaying the VoIP icon in the systray on small screens. There isn't much space in the systray, so we decided to hide the VoIP icon when it's not configured. Before this commit, if the user did not have a correct VoIP configuration (the user could not place or receive a call), the icon was still shown and clicking it produced an error message: "Oops! Something went wrong... with a blabla about the error." Now on small screens like a smartphone, we simply avoid displaying the icon if the user's configuration cannot handle calls. task-5079952
This update resolves a technical error in the core payroll accounting tests. Removing a specific salary rule reference prevented test failures across multiple internationalizations. The change ensures consistent test execution and stability for all supported localizations.
Original PR description
`hr_payroll_account` common file test is used in several tests in several localizations. Adding a reference to a `l10n_be` salary rule is not valid and would trigger an error when running the tests in other localizations since no fallback is used. This commit removes the reference to the salary rule in the common file test and does not move it to `l10n_be` modules that depend on `hr_payroll_account` since the safeguard is not valid in the first case (the salary rule is only applied for `l10n_be_joint_committee_302`)
This pull request addresses a technical issue within the Odoo Enterprise payroll module. Specifically, a misconfigured reference has been removed, ensuring accurate accounting and reporting. This resolves a previously identified problem impacting payroll calculations.
Original PR description
follow-up task-6036647
This update ensures that all order lines, including those with zero quantity, are retained when an order is validated. Previously, zero-quantity lines were removed, potentially leading to incomplete order records. Now, managers have a complete view of the order history and can accurately track all items sold.
Original PR description
When validating an order, orderlines with a zero quantity were being removed. This could result in creating an order without any lines. By keeping zero-quantity lines, an order always retains its context and managers can see exactly what happened. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6185664
This update corrects a visual issue in the Project Gantt view where flexible employees were incorrectly marked as unavailable during weekends and off-hours. The fix ensures that flexible employees only appear grayed out for their approved leaves and public holidays, providing a more accurate representation of their working times.
Original PR description
Steps to Reproduce --- - Assign a flexible working schedule to an employee (no leaves) - Open Project > Tasks > Gantt view grouped by Assignee - The employee's weekends and off-hours are grayed out…
Steps to Reproduce --- - Assign a flexible working schedule to an employee (no leaves) - Open Project > Tasks > Gantt view grouped by Assignee - The employee's weekends and off-hours are grayed out Current Behavior --- Flex employees with no approved leaves in the viewed date range have incorrect grayed-out days in the Project Gantt view. Expected Behavior --- Flex employees should have no grayed-out days except approved leaves and public holidays. Issue --- When a flex employee has no leaves in the viewed period, `_get_unavailable_intervals()` returns an empty dict for that resource. `_gantt_unavailability()` then falls back to `company_leaves`, producing incorrect gray intervals. The same case is already handled in `planning` (ref PR), but `project_enterprise` was not covered. Fix --- Add a guard in `_gantt_unavailability()` to return no unavailabilities for flexible resources absent from `leaves_mapping`. Related : https://github.com/odoo/odoo/commit/5f1cd39944134ffa2c30c331f8a5daca56446d78 task - 5063071 Forward-Port-Of: odoo/enterprise#117100 Forward-Port-Of: odoo/enterprise#113247
This update fixes an issue where secondary colors weren't being applied to labels on Mexican pro-forma invoices. The change ensures that all labels, including 'Usage:', consistently use the configured secondary color, improving invoice presentation and compliance. This resolves a visual inconsistency impacting the user experience.
Original PR description
Issue: When configuring a secondary color in the document layout, labels of Mexican-specific fields in the pro-forma report remain black instead of using the configured color Cause: In the view…
Issue:
When configuring a secondary color in the document layout, labels of Mexican-specific fields in the pro-forma report remain black instead of using the configured color
Cause:
In the view `report_saleorder_document_proforma`,
the labels in the information block are defined using `<span>` elements, which do not inherit the styling applied to labeled fields
As a result, the `secondary_color` is not applied
One option is to use strong:
The file `asset_styles_company_report.scss` specify that secondary color should be used for a specific company
when it's a strong inside an informations block
```scss
.o_company_4_layout #informations strong {
color: #ff0000;
}
```
But to be more stable, we can just specify the color style
Steps to reproduce:
- Install `l10n_mx_edi_sale` and `sale_management` with demo data
- Switch to company ZAPATERIA
- In Settings > Sales, enable `Pro-Forma Invoice`
- Go to Settings > Configure Document Layout
- Change the secondary Color (e.g., to red) and save
- Create a new Sale Order (Customer: INMOBILIARIA CVA)
- Click on `Send PRO-FORMA Invoice`
- Open the generated invoice and check `Usage:` label's color The label should use the `secondary_color`, consistent with other fields (e.g., `Issued Date`)
opw-6145489This update fixes a frustrating issue where clicking 'Discard' in the Sign Template would cause the page to reload and flicker. Now, the discard process happens directly within the existing sign template, providing a smoother and more reliable user experience. This eliminates unnecessary page reloads and improves efficiency.
Original PR description
Before this commit, clicking Discard in Sign Template reloaded the action/PDF iframe, which caused flicker. The discard flow was also more complex than needed and field normalization was noisy. After this commit, discard now happens in place: we fetch fresh sign items/radio sets, reset fields inside the existing iframe, and keep the page mounted with no reload. task-6121560 Forward-Port-Of: odoo/enterprise#116766 Forward-Port-Of: odoo/enterprise#113853
This update addresses a persistent issue with the General Ledger report, ensuring it consistently displays accurate cumulated balances. Improved testing procedures have been implemented to prevent future disruptions. This enhancement focuses on reliability and data accuracy for financial reporting.
Original PR description
I hate this feature, it's always broken. Now it's tested so it shouldn't break as easily.
This update resolves a visual bug where the timesheet dropdown menu was hidden behind the sticky 'Total' footer. The fix adjusts the layout to ensure the dropdown is always visible when editing timesheets, improving user experience. This change prioritizes correct display of critical timesheet data.
Original PR description
**Steps to reproduce:** - Open Timesheets > Assistant menu. - Click a row near the bottom of the "My Timesheets" section to open the edit form. - Open the Project or Task dropdown menu. **Issue:** The dropdown menu is hidden underneath the sticky "Total" footer. This happens because both the edit form and the footer share the same stacking context priority. **Fix:** Update .o_activitywatch_sync_timesheet_edition_form to manage its own stacking context. It now defaults to z-index: 1 to ensure standard scrolling behavior, but jumps to z-index: 3 on hover or focus-within. This ensures that when a user interacts with the form, its dropdowns correctly float above the sticky footer. task-6105369 Forward-Port-Of: odoo/enterprise#113377
This update ensures that accountants are only notified about account tax changes within the correct company. Previously, the system incorrectly alerted all accountants, leading to unnecessary notifications and potential confusion. This change improves efficiency and reduces noise for accounting teams.
Original PR description
The original improvement could notify every accountant in the database. opw-6192702
Features or functions removed from Odoo
This update removes alarms from all-day calendar events by default. Previously, these events displayed reminders in the system tray, which wasn't the intended behavior. Now, alarms are only added if explicitly set, streamlining the calendar experience for users.
Original PR description
Removing alarms from all day events by default as they're not supposed to be present in the systray meetings reminders for the day by default, but only if explicitly set. Task-6067427
Code cleanup and technical improvements
This update simplifies how the Documents module interacts with related records. The previous custom widget is no longer needed due to recent changes allowing direct configuration of default views for Many2One fields. This streamlines the system and reduces potential complexity.
Original PR description
Historically, standard Many2One fields defaulted to opening the form view. To bypass this and open a folder's Kanban or List view, the Documents module relied on a custom documents_folder_many2one widget. A recent refactoring addressed this limitation, allowing the default target view to be configured directly on standard Many2One fields. Changes: - Rename get_formview_action to get_record_default_action: Updated the method name in ir_ui_view.py to accurately reflect that M2O fields frequently open views other than just form views. - Remove documents_folder_many2one: Deleted the now-redundant custom widget and replaced it with the standard Many2One widget across the Documents module and its bridges. - Clean up _get_access_action: Removed the override in Documents to eliminate redundancy, leveraging the newly renamed get_record_default_action instead. Task-6068437