Thursday, April 16, 2026
20 changes · master
New functionality added to Odoo
This update adds integration with the ZKTeco BioTime attendance system, automatically syncing employee attendance records. The system prioritizes matching new check-ins with existing attendance data and flags any unmatched transactions for HR review. Old attendance records are automatically deleted after 30 days.
Original PR description
Add integration with ZKTeco BioTime attendance system. Introduce two new models: - zkteco.terminal: represents physical attendance devices synced from the BioTime server - zkteco.transactions: stores raw punch records fetched via the BioTime API and processes them into hr.attendance records Check-out transactions are matched in priority order: 1. Existing open attendance (no check-out) within a configurable lookback period (default 2 days) 2. A check-in from the current processing batch (FIFO) 3. If no match is found, the transaction is left unprocessed and an activity is created for the HR manager to review Processed transaction records are automatically cleaned up after 30 days. Task-4521436
Enhancements to existing features
This update improves the Gantt view by displaying progress bars for all employees, regardless of whether they have scheduled leave. Previously, the Gantt only showed progress for employees with leaves. This enhancement provides a more complete and accurate view of employee work hours.
Original PR description
…hose without leaves Previously, the gantt view only showed the progress bars (the number of worked hours) for employees who had leaves. Now, this PR shows the progress bars for all employees, even those without leaves. Task-5999717
Resolved issues and error corrections
This pull request corrects a minor typo in the Odoo Enterprise settings related to company information for several payroll localizations (BE, IN, LT, LU, MA). The change ensures consistent and accurate wording within the application, improving the user experience. This fix addresses a visual inconsistency that could have caused confusion.
Original PR description
To reproduce the issue: 1. Install either BE,IN,LT,LU,MA payroll localization 2. Open settings view 3. "Offical Company Information" Should be "Official Company Information"
Code cleanup and technical improvements
This update standardizes how date ranges are handled in Odoo's Enterprise module's user interfaces. Previously, relative filters (like 'last week' or 'last month') were implemented inconsistently, leading to errors. This change ensures correct date filtering when users select date ranges, resolving a previous 'Invalid Daterange' issue and improving the overall user experience.
Original PR description
Currently, preset relative filter in view architectures (last week, last month ...) are all written differently. Sometimes they include today, sometimes not, some used 7d + 1d ... We rewrite them to be compatible with the smart dates. WHY: When oponing these arch filter in the filter dialog, we now have the correct smart date instead of `Invalid Daterange` Community PR: odoo/odoo#252484 task#5959944
This update enhances the self-order point-of-sale system by adding a country prefix selector for phone numbers. This simplifies the process for customers entering their contact information, improving the user experience and reducing potential errors. The change aligns with recent community updates for a consistent user flow.
Original PR description
In this commit we adapt a tour such that it follows the changes done in the corresponding community commit. Task: 5913205
This update simplifies the holiday scheduling view within the Enterprise module. The outdated custom popover has been replaced with the standard dialog used in other views, creating a more consistent and user-friendly experience. This change improves usability for HR staff managing employee time off.
Original PR description
- removed the custom popover for the timeoff gantt view and replaced it with the same dialog that appears in other views task-id: 5473334
This update enhances the reliability of tests within Odoo's enterprise modules by ensuring consistent handling of company environments. The changes address a limitation where simply specifying the company wasn't enough to filter tests correctly, leading to inconsistent results. This improves the overall stability and accuracy of the testing process.
Original PR description
More information on the related community commits.
This update clarifies the capacity settings within the appointment scheduling feature. The changes involve updating labels for both users and resources, making the system easier to understand and use. Additionally, a minor simplification was made to the timezone settings, improving code efficiency.
Original PR description
This commit improves and clarifies the capacity feature on the form view of the appointment type model by changing some labels for both users and resources. Also takes the opportunity to simplify the syntax of the timezone setting in the controller by removing unnecessary code. task-5173341
This update ensures the 'Load Order' button remains hidden across all screen sizes for Grab/GoFood orders. Previously, resizing the window would briefly show this button, which was replaced with 'Set Food Ready' to prevent manual order changes. This change improves the user experience and data integrity for these orders.
Original PR description
For Grab/GoFood orders, the "Load Order" button is replaced by "Set Food Ready" to prevent manual edits. Previously, resizing or minimizing the window caused the hidden "Load Order" button to reappear due to responsive layout overrides (e.g., mobile view CSS classes). This commit updates the visibility logic to ensure the button remains strictly hidden across all screen sizes for external delivery orders. opw-6044176 Forward-Port-Of: odoo/enterprise#111222
This update fixes an issue where appointment bookings were incorrectly reserving full party sizes for resources. The change ensures that resources are accurately allocated, preventing overbooking and improving the scheduling process. A new test has been added to verify the fix.
Original PR description
The current logic inside the appointment google reserve controller to compute reserved and used capacity per resource was incorrect. It was reserving the full party size for each resource instead of properly computing how much spots we are reserving for each. The code was fixed and a test was adapted for proper coverage. Task-6120016 Forward-Port-Of: odoo/enterprise#113908 Forward-Port-Of: odoo/enterprise#113805
This update resolves an issue where the 'Time Off Type' dropdown was empty when creating time off entries via the Gantt view. The fix ensures the dropdown correctly displays available time off types by properly filtering the database search. This improves the usability of the time off management feature.
Original PR description
**Steps to Reproduce:**
1. Open Time Off App->Management->Time Off->Gantt View
2. Highlight multiple dates/cells to trigger the multi-create popover, then click "Set".
3. Open the "Time Off Type" dropdown.
Result: The dropdown is completely empty.
**Bug Cause:**
The Gantt multi-create popover skips `_loadNewRecord`, meaning `work_entry_type_filter_domain` never computes and evaluates to an empty list. This hardcodes `('id', 'in', [])` into the search, forcing the database to return 0 records.
**Solution:**
Remove the broken computed `('id', 'in', [])` domain from the `work_entry_type_id` field in `hr_leave_gantt_multi_create_view`. Add the `context="{'gantt_multi_create_company_filter': True}"` flag to the field to trigger the country-filtering logic implemented in the `_search` method.
**Task:** 6109569This update corrects a technical issue impacting Envia delivery in Colombia. Previously, the system incorrectly formatted zip codes, leading to inaccurate data sent to Envia. Now, the system uses Envia's geocoding to ensure correct data formatting, improving delivery reliability and reducing potential delays.
Original PR description
For Colombia, Envia expects the municipality/DANE-style code in the address payload, not the raw postal code. When `l10n_co_edi` was not installed, the Envia integration fell back to the partner zip code and padded it locally before sending it as both `postalCode` and `city`. This produced incorrect values such as turning the Ibagué zip code `730001` into `73000100`, while Envia geocodes resolves that zip code to `73001000`. Use Envia geocodes to resolve the Colombia zip fallback and retrieve the `stat_8digit` code expected by Envia instead of deriving it locally. opw-6083181 Forward-Port-Of: odoo/enterprise#112838
This update resolves an issue preventing the generation of the session report in the CO company setting. The fix addresses a technical problem with accessing sale details, ensuring users can now successfully generate and utilize this important report. This improves the functionality of the point-of-sale system.
Original PR description
Currently when trying to generate the session report a traceback appears. Steps to reproduce: ------------------- * Install l10n_co_edi_pos * Switch to CO company * Open pos session * Make a sale * Close register * Generate session report > Traceback Why the fix: ------------ We get the sale details with: https://github.com/odoo/odoo/blob/0ce5baf2918960591284eb494d82dfef07043af0/addons/point_of_sale/models/report_sale_details.py#L429-L430 Where the config ids given to `get_sale_details` are given here https://github.com/odoo/odoo/blob/0ce5baf2918960591284eb494d82dfef07043af0/addons/point_of_sale/models/report_sale_details.py#L413-L414 From there we can't access any field from a list of number. opw-6049484 Forward-Port-Of: odoo/enterprise#111627
This update resolves a test failure in the WhatsApp module related to how archived user IM statuses are handled. The test case was incorrectly designed, failing because the partner wasn't linked to a user. The fix ensures the test accurately reflects the system's behavior by properly linking the partner to a user.
Original PR description
Purpose of this PR: compute_im_status returns false when main_user_id is not set. The testcase was failing because the partner was not linked to a user. Updated the testcase by linking the partner to a user to match the expected behavior. task-4797343
This update ensures that waiting payslips (draft payslips with calculated amounts) are automatically recalculated whenever employee information or payroll settings are modified. This guarantees that the payslip data remains accurate and reflects the latest changes, improving payroll reporting reliability. This change addresses a potential discrepancy between the payslip and the underlying data.
Original PR description
This commit makes waiting payslips recomputes whenever inputs are changed to make sure the sheet is up to date with inputs -waiting payslip: a payslip in draft with computed lines Task#5439146
This update resolves a potential issue where timesheet rules could cause access errors due to mismatched company restrictions on linked projects. By adding a company ID to the timesheet rule, we ensure that projects linked to the rule adhere to the same company, preventing these access problems and improving user experience.
Original PR description
This commit's purpose is to prevent potential access rigths error with aw.rule. Currently it is possible to set a project/task that is restricted to a specific company to an aw.rule. This can lead to a user using that aw.rule having access rights error because he does not have access to that project. To fix this issue, we add a company_id to the aw.rule model and ensure that the project/task linked to it follow the same company as the aw.rule it is set on task-6116548
This update fixes a bug where changes to embedding settings caused sources to incorrectly show as 'processing'. The fix ensures that updates are properly processed and sources are updated correctly, preventing delays and inaccurate status displays. This improves the reliability of the AI embedding feature.
Original PR description
### Issue: In ai.agent, any update to any field causes the sources to be shown as processing. ### Fix In `ai.agent.write()`, the provider change detection was comparing the provider object directly against the stored provider name string. Also, `_cron_generate_embedding` returned early when no missing embeddings were found, skipping the `_update_sources_status` call and leaving sources stuck in processing status. task-id-6121579
This update corrects a technical issue that was preventing users from properly accessing returns reports. The change ensures that the reporting module functions correctly after a recent update to the main account kanban view. This resolves a traceback error and maintains the reliability of the returns reporting process.
Original PR description
After a recent IMP in account return kanban view in #113292 , the overall styling of kanban view was improved, but the inherited view in this module was unchanged which caused traceback. This commit fixes that issue.
This update addresses a crash that occurred when users cleared the 'Today' date filter or selected 'All time' in the global filters. The fix ensures the system remains stable and prevents unexpected errors, improving the user experience. This resolves a technical issue impacting spreadsheet edition functionality.
Original PR description
traceback when deleting the current value of a date filter Task: [6019061](https://www.odoo.com/odoo/2328/tasks/6019061)
This update streamlines how work entries are tracked by removing a redundant selection field. It replaces it with a simple boolean flag, making the system more efficient and easier to manage. This change improves the accuracy of time-based calculations related to attendance and schedules.
Original PR description
As of now, the work_entry_source field is a Selection field that is defined in hr_work_entry with only 1 option (Time Off) and then overridden in hr_work_entry_attendance to add another option…
As of now, the work_entry_source field is a Selection field that is defined in hr_work_entry with only 1 option (Time Off) and then overridden in hr_work_entry_attendance to add another option (Attendance). This doesn't make sense anymore, because: 1) Time Off is always considered, that option makes it so that the time is based on the working schedule. 2) There are at most 2 options, so it doesn't need to be a selection. For these reasons we remove the field and substitute it with a Boolean field attendance_based. This field will be defined in hr_work_entry_attendance and, since in the code work_entry_source was sometimes referenced even without the attendance module installed, we change those references to instead use a function result. In other words, anything in hr_work_entry_attendance or that depends on it can directly use the attendance_based field, while if we need to use code that is not dependant on it, we instead call a new _get_work_entry_source function that by defualt returns 'calendar' (the name of the Time Off option in the selection, but is then overridden in hr_work_entry_attendance to return 'attendance' if the attendance_based field is checked. Task: 6050497 Community PR: https://github.com/odoo/odoo/pull/254900