Daily updates from Odoo
Tuesday, March 3, 2026
26 changes · master
Resolved issues and error corrections
This update corrects a misleading warning displayed in the payroll system when a payslip had a zero or negative net wage. The fix ensures the warning only appears for individual payslips with negative wages, preventing confusion for users. A new test has been added to verify this behavior.
Original PR description
Steps to Reproduce: 1. Generate payslips for a batch of employees (e.g., Employee A and Employee B). 2. Ensure the last processed payslip (Employee B) has a negative net wage or is uncomputed (net…
Steps to Reproduce: 1. Generate payslips for a batch of employees (e.g., Employee A and Employee B). 2. Ensure the last processed payslip (Employee B) has a negative net wage or is uncomputed (net wage 0.0). 3. Ensure Employee A has a valid, positive net wage. 4. Open the payslip for Employee A. Issue: Employee A displays the warning "The net pay for this payslip is zero or negative," even though their net wage is positive. This occurred because the lambda filter used the `slip` variable from the outer loop scope instead of the iterator, causing the last record's net wage to determine the warning for the entire batch. Additionally, uncomputed payslips (which have no lines) default to a net wage of 0.0, which triggered the warning condition prematurely. Expected Behavior: The warning should only appear if the specific payslip being checked has a negative or zero net wage. Furthermore, the warning should be suppressed if the payslip lines have not yet been computed. Additionally, added a test to check the message is not displayed if we don't have net salary, and appears if the net is indeed negative. task-5484107 Forward-Port-Of: odoo/enterprise#108601 Forward-Port-Of: odoo/enterprise#103918
This update resolves an issue where the Colombian electronic invoicing system (l10n_co_dian) didn't properly handle mismatched DIAN operation modes. When the selected mode doesn't align with the system's expectations, a warning is now triggered to prevent incorrect invoice generation. This ensures compliance and accurate electronic invoicing.
Original PR description
Steps to reproduce: - Install `l10n_co_dian` module(demo data) > Switch to `CO Company` - Settings > Colombian Electronic Invoicing > Change the Operation Mode: `DIAN 2.1: Support Documents`(eg:…
Steps to reproduce:
- Install `l10n_co_dian` module(demo data) > Switch to `CO Company`
- Settings > Colombian Electronic Invoicing > Change the Operation Mode: `DIAN 2.1: Support Documents`(eg: [Image](https://www.awesomescreenshot.com/image/58874464?key=0cb74e446dcdb0f087df6ed619f785c2))
- Vendors > Create a Bill > Confirm > `Acknowledge Reception`
Traceback:
```py
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_move.py", line 293, in l10n_co_dian_send_event_update_status_received
self._l10n_co_dian_send_event_update_status('received')
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_move.py", line 313, in _l10n_co_dian_send_event_update_status
document = self.env['l10n_co_dian.document']._send_commercial_event(self, commercial_state_next)
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/l10n_co_dian_document.py", line 593, in _send_commercial_event
xml, errors = self.env['account.edi.xml.ubl_dian']._export_co_send_event_update_status_invoice(locked_move, commercial_state_next)
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_edi_xml_ubl_dian.py", line 1208, in _export_co_send_event_update_status_invoice
return self.with_context(l10n_co_next_commercial_state=next_commercial_state)._dian_sign_xml(xml, invoice)
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_edi_xml_ubl_dian.py", line 1524, in _dian_sign_xml
'software_security_code': self._dian_get_security_code(operation_mode, document_number),
File "/home/odoo/src/enterprise/saas-19.1/l10n_co_dian/models/account_edi_xml_ubl_dian.py", line 1443, in _dian_get_security_code
operation_mode.dian_software_id
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```
We are getting this error because `_dian_get_operation_mode` [returns] an empty `l10n_co_dian.operation_mode()` record. This happens when the `Operation modes` do not match. As a result, [operation_mode] also contains an empty record.
[operation_mode]: https://github.com/odoo/enterprise/blob/84022deef3414096fcaf61f8d45c08393431e0ab/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L1432
[returns]: https://github.com/odoo/enterprise/blob/84022deef3414096fcaf61f8d45c08393431e0ab/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L1394-L1400
sentry-7273771732
Forward-Port-Of: odoo/enterprise#107885A technical issue preventing payrun creation for Hong Kong employees has been fixed. The problem stemmed from a missing function name during the implementation of eMPF support. This update ensures payruns can be successfully generated for Hong Kong employees, resolving a previous error.
Original PR description
In the big commit adding eMPF to the hk localization, a function was miss named and was causing an error when trying to create a payrun. Steps to reproduce: - Install belgian localization - Install HK localization - Select the belgian company - Create a payslip for a belgian employee (works fine) - Create a payrun and select the same employee from the list - Get an error In this commit we fix the naming of the function and everything goes back to working. Task: 5960503 Forward-Port-Of: odoo/enterprise#109196
This update resolves an issue where the date input field in the HR payroll form would become uneditable after editing. The change ensures the popover is opened first, guaranteeing the input remains editable. This improves the user experience for HR staff.
Original PR description
With this additionnal step in tour, we ensure the popover is opened before clear the input. If we not wait for this, the input can be no longer editable.
This update makes two key payroll fields accessible across all Odoo companies, regardless of their location. Previously, these fields were tied to the Belgian localization, limiting functionality for non-BE users. This change simplifies deployment and ensures consistent access to essential payroll data.
Original PR description
This change relocates two generic payroll fields (can_be_requested and default_car_value) into the base hr_payroll_fleet module so any deployment using payroll+fleet (including non‑BE companies) can access them without requiring the Belgian localization. The Belgian module keeps all its fiscal computations and (previously absent) visibility checks task-5906656
This update fixes a JavaScript error that occurred when users closed the certificate signing wizard without saving. The fix ensures the system correctly handles wizard dismissals, preventing a crash caused by incorrect data type validation. This improves stability and user experience.
Original PR description
**Issue:**
Closing the signing certificate wizard without saving triggers a client-side traceback (`UncaughtPromiseError: Invalid ids list: [object Object]`).
**Cause:**
When the wizard dialog is discarded, Odoo's dialog manager passes a dismissal object (`{dismiss: true}`) to the `onClose` callback. The existing code only checked if the payload was truthy (`if (cert_id)`), causing it to attempt to update the `signing_certificate_id` Many2one field with the event object. The framework's validation (`validatePrimitiveList`) expects an integer or array of integers, resulting in a crash when it tries to parse the object.
**Fix:**
Updated the `onClose` callback to strictly verify the type of the payload (`typeof cert_id === 'number'`). The record is now only updated when the wizard successfully returns a valid primitive integer ID.
task: 5975643
Forward-Port-Of: odoo/enterprise#108864This update fixes a mobile map issue where the pin list was too small, making it unusable. The team replaced the permanent list with a toggle button for on-demand access, and added styling improvements for a better mobile experience. This ensures maps are easily viewable and functional on mobile devices.
Original PR description
**Problem:** Recent changes (https://github.com/odoo/enterprise/pull/104618) broke the mobile map layout, causing the pin list to shrink to an unusable 46px height on top of the map. **Solution:** Replaced the permanent list section with a toggle button to access the pin list on demand. Added polishing CSS to improve the general mobile aesthetic and usability of the map view. task-5126312 Forward-Port-Of: odoo/enterprise#108345
This update corrects a display issue where EG-specific payroll fields were incorrectly shown in employee forms for companies outside of the EG locale. The fix ensures these fields are hidden when a different country is selected, maintaining data accuracy and preventing confusion. This improves the user experience for international users.
Original PR description
[FIX] some EG l18n fields are visible in other country's employee forms Bug reproduction: Go to >= saas~19.2 version, install EG and select company other than EG -> payroll -> personal -> there are EG: Social Sec. Number and NOSI Registration strings that belongs to EG. Bug cause: In EG view, they did not make the additional fields invisible if they belong to other company. Bug solution: Make the appended fields invisible when company country code is not EG. task - 5975886 Forward-Port-Of: odoo/enterprise#108896
This update resolves an issue where the arrow button within the Urban Piper settings was not functioning correctly. The fix involved ensuring the arrow was properly enclosed within a button tag, allowing users to navigate to the correct settings. This ensures a smooth and functional experience for users managing Urban Piper configurations.
Original PR description
In the settings, under the Urban Piper section, the arrow was not clickable. This is because the arrow was not inside a button tag. task: 5972833
This update resolves an issue where users were encountering errors when processing after-departure payments. Now, a clear and informative message is displayed if a previous payslip isn't linked, guiding the user to correctly set up the payment. This improves the user experience and prevents data inconsistencies.
Original PR description
For after departure payment to work, a previous payslip is required in the system. So, instead of having a traceback, display an informative message to the user. task-5933607 Forward-Port-Of: odoo/enterprise#108980 Forward-Port-Of: odoo/enterprise#107386
This update resolves an issue where the scheduling dialog was incorrectly filtering out unscheduled shifts for resources. The fix removes a default filter, ensuring planners can now see and assign all available shifts, improving scheduling efficiency. This change corrects a previous bug that prevented accurate shift assignment.
Original PR description
Steps to Reproduce ------------------ 1. Open the Planning Gantt view. 2. Click a cell that belongs to a resource with **no** scheduled shifts. 3. The Plan dialog opens with an empty list. Issue…
Steps to Reproduce ------------------ 1. Open the Planning Gantt view. 2. Click a cell that belongs to a resource with **no** scheduled shifts. 3. The Plan dialog opens with an empty list. Issue ----- A previous change keeps the clicked resource in the dialog context; the Gantt model turns it into a default search filter, so only shifts already linked to that resource are shown. Unassigned shifts are therefore hidden, preventing planners from assigning them by role or availability. Current Behaviour ----------------- The Plan dialog is always filtered by `resource_id`, which returns no results for unscheduled resources, even when they have the right roles. Expected Behaviour ------------------ The dialog should list all unscheduled shifts that match the resource’s roles, or every unscheduled shift if the resource has no roles, while still preserving full context for scheduling once a shift is selected. Fix --- Remove the automatic resource filter from the dialog context in `getSelectCreateDialogProps()`. This prevents the unwanted search restriction; role defaults remain, so the dialog now displays the correct shifts. Task-4922525 Issue – https://github.com/odoo/enterprise/pull/87424/commits/a218a7cedce61f992fbe76284c273be8f937d28d Forward-Port-Of: odoo/enterprise#92100
This update fixes a minor discrepancy in the Gantt chart's progress display for flexible employees. The issue stemmed from an incorrect timezone setting in the test environment, leading to an inaccurate progress percentage. The fix ensures the chart accurately reflects employee attendance by standardizing the timezone to UTC.
Original PR description
[FIX] hr_attendance_gantt: fix gantt progress with flex emp test
Bug reproduction:
1 - Install and update hr_payroll,hr_contract_salary,l10n_us_hr_payroll,hr_attendance_gantt modules in localhost (version >= saas-19.2)
2 - Run test_gantt_progress_with_flexible_employees test and the expected result is 8 but it gives 9.
Bug cause:
Timezone of the test employees was UTC+1 and they should be UTC to match the range parameter of _gantt_progress_bar
Bug solution:
Change the timezone of the test employees to UTC.
task - 5865307
Forward-Port-Of: odoo/enterprise#109201This update fixes an error in how holiday pay recovery is calculated for employees in Belgium with non-standard working schedules. Previously, the system used a default 38-hour week, leading to inaccurate deductions. Now, the system correctly uses the employee's actual weekly hours (40) to ensure accurate holiday pay recovery amounts.
Original PR description
**Steps to Reproduce:** 1 - create an employee in Belgium company with hourly rate 20.62 and 40h/week working schedule 2 - Set 10 paid time off to this employee 3 - Set 2000 euros in recovery amount…
**Steps to Reproduce:** 1 - create an employee in Belgium company with hourly rate 20.62 and 40h/week working schedule 2 - Set 10 paid time off to this employee 3 - Set 2000 euros in recovery amount holiday n-1 4 - Set 10 days in recovery day holiday n-1 5 - Employee takes 5 paid time off in February and 5 in December 6 - Do one payslip for this employee for February and validate it 7 - Do one payslip for this employee for December Current behaviour : - the holiday n-1 amount for February = 824.80 - the holiday n-1 amount for December = 742.32 Expected behaviour : - the holiday n-1 amount for December should be 20.62 (hourly_rate) * 5 (days) * 8 (hours) = 824.80 **Reason** - The daily recovery amount was calculated using hardcoded standard working hours (38h/week) instead of the employee's actual schedule (40h/week), causing an incorrect deduction rate for non-standard schedules. **Solution** - Replace the hardcoded reference with the actual hours per week from the employee's resource calendar to ensure the correct hourly rate is applied. Forward-Port-Of: odoo/enterprise#109069 Forward-Port-Of: odoo/enterprise#106205
This update fixes an issue where salary rules were incorrectly reducing both employee and employer costs. A new ‘Net Cost’ salary rule has been added to accurately reflect employer contributions, ensuring correct cost calculations for payroll reporting.
Original PR description
## Before: - Setting appears_on_employee_cost_dashboard to True on a salary rule uses the rule’s sign to compute employee cost. - For rules like Social Insurance Employee Contribution and DEWS Employee Contribution, the sign must be negative to deduct the amount from the employee, which incorrectly reduces the employer cost as well. ## After: - Introduced a new salary rule “Net Cost” to correctly reflect employer cost. - This allows employee contribution rules to keep a negative sign for deductions while still increasing the employer contribution amount. Task-5912761 Forward-Port-Of: odoo/enterprise#107090
This update corrects a bug that prevented payslip PDFs from being created correctly during pay run validation. The change ensures PDFs are generated for pay runs with 5 or fewer payslips, addressing a previous limitation that only triggered PDF creation for single payslips. This improves the reliability of payslip document generation.
Original PR description
Due to a missplaced argument in the js definition of the Validate button of the Pay Run view, context indicating the need for the creation of the pdfs of the payslips was not passed correctly, resulting in their missed creation, both immediately and later by the cron. Also, previously the pdfs were only computed right away if the pay run included only 1 payslip, which almost never happens. Here we change that condition to computing the pdfs if there are <= 5 payslips. Task: 5498819
This update corrects a technical issue where the new booking view for POS appointments was inadvertently replacing standard calendar event views, causing compatibility problems with other modules. By restricting the new view to use 'primary' mode within the POS, this fix ensures proper functionality and avoids disruption to other parts of the system.
Original PR description
The list view in pos appointment would replace the original list view on calendar event and break other modules. This PR will add the `primary` mode for the new view so it is only used inside the POS Runbot Error: [234914](https://runbot.odoo.com/odoo/runbot.build.error/234914) Forward-Port-Of: odoo/enterprise#107132
This update fixes a problem where archived employees caused errors when managing appraisal plans. The change ensures that archived employees are no longer considered for appraisal dates, preventing date conflicts and improving the accuracy of appraisal settings. This ensures a smoother experience for users managing employee appraisals.
Original PR description
**Steps to reproduce:** Based on this feedback https://www.odoo.com/odoo/project.task/5270281 companies with archived employees face an issue when they try to toggle Appraisals Plans from Appraisls -> Configuration -> Settings -> Appraisals Plans **Issue:** The propblem is that when employees with next appraisal date are archived, their next appraisal date is not cleared which leads to past date conflicts upon trying to set the next appraisals dates for all the employees (which is done through toggling the Appraisals Plans checkbox) **Solution:** - Unset the next appraisal date upon archiving an employee - exclude archived employees from _compute_next_appraisal_date method Task: 5354002 Forward-Port-Of: odoo/enterprise#109115 Forward-Port-Of: odoo/enterprise#100437
This update prevents users from canceling subscriptions if they don't have access to the associated invoices. Previously, a sales representative could cancel a subscription even without seeing the invoices. Now, the system ensures cancellation is only possible when the representative has full visibility of the invoices, improving subscription management reliability.
Original PR description
Before this commit, when a user had access to an invoiced subscription but not to the invoiced, he could cancel the subscription. Step to reproduce: - create a subscription in company A, with a pricelist available in company B. Sales person A belong to company A. - invoice the subscription and confirm the invoice - update the company (company B) and sales person of the subscription (B). The new salesperon don't see the invoice in the stat button. After this commit salesperson B can't cancel the subscription. task-5907345 Forward-Port-Of: odoo/enterprise#108550 Forward-Port-Of: odoo/enterprise#106441
This update addresses a potential issue in the payroll transmission process for Switzerland. Specifically, it now displays a warning instead of an error when the AVS (Automatic Valuation System) value is negative, providing clearer guidance to users. This improves the reliability of the reporting and reduces the risk of misinterpretation.
Original PR description
Forward-Port-Of: odoo/enterprise#109046
This update fixes an issue where newly hired employees' work email addresses were incorrectly populated with their private email from the salary configuration. The fix ensures that the employee's work email field is properly cleared during the onboarding process, aligning with standard data practices. This prevents data inconsistencies and improves the accuracy of employee records.
Original PR description
**Steps to Reproduce:** 1. Send an offer to an applicant. 2. The applicant submits their details via the salary configurator and enters their private email in the Email field. 3. Once the offer and contract are signed, an employee record is created in Odoo. 4. In the created employee record, the `work_email` field is populated with the email entered in the salary configurator. This same value is also present in `private_email`, which is correct. **Reason:** - The email entered in the salary configurator is stored on the partner and represents the applicant's private email. - The employee's `work_email` field is linked to the partner's email via compute and inverse methods, causing it to inherit the private email value when the employee record is created. **Solution:** - Explicitly clear the employee's work_email field when the applicant sign. task: 5502797 Forward-Port-Of: odoo/enterprise#109074 Forward-Port-Of: odoo/enterprise#106974
This update streamlines the configuration for automatic extra time off allocation in Odoo Enterprise. The previous redundant toggle has been removed, and the feature is now controlled by a selection field, improving the user experience and simplifying management. This change focuses on internal efficiency and ease of use.
Original PR description
Streamline the configuration by removing the redundant boolean toggle 'hr_contract_timeoff_auto_allocation'. The feature is now driven directly by the 'hr_contract_timeoff_auto_allocation_type_id' field. Remove boolean field from res.company and res.config.settings. Update settings view to remove checkbox and improve explanation text. Adjust _update_version_on_signature to trigger based on the Many2one value. Add placeholder to the Many2one field for better UX. Task: 5445784
This update fixes an issue where the salary calculator incorrectly used a default full-time calendar, leading to inaccurate calculations when simulating employees with different work schedules (e.g., 40h/week vs. 20h/week). The fix ensures the calculator now correctly applies the selected resource calendar for simulation offers, providing accurate salary projections.
Original PR description
Steps to reproduce: 1- Go to Payroll > Employees > Salary calculator 2- Put a yearly cost of 10000 3- Select the "40h/week calendar" 4- Check the yearly cost 5- Change to "20h/week calendar" Cause of the bug: _get_version inside ContractSalaryOffer would take the default calendar from the version if it exists (in our case it will always be the full time for the simulation employee) Fix done: Keep the condition as it is for normal offers, and for simulation offers change the default to the selected resource calendar task-5431216 Forward-Port-Of: odoo/enterprise#108949 Forward-Port-Of: odoo/enterprise#103159
This update fixes an issue on mobile devices where the 'Share' button was incorrectly displayed on top of the calendar sidepanel. The change ensures the button is hidden when the sidepanel is open, resulting in a cleaner and more intuitive user experience. This improves usability for mobile users.
Original PR description
Purpose ======= On mobile, prevent displaying the appointment Share button on top of the calendar sidepanel. Specification ============= On mobile, when opening the calendar sidepanel, the panel covers the entire calendar. However the appointment Share button has a z-index set to the modal level ($zindex-modal) which makes it so that the button is always displayed on top of the calendar sidepanel. Fixing that by making sure the appointment Share button is hidden when the calendar sidepanel is opened on mobile. Task-5717052
This update resolves an issue where payslips wouldn't generate correctly when an employee changed contracts within a pay period. The fix ensures the system uses the employee's initial contract start date for accurate calculations, preventing errors related to holiday entitlements and year-of-service calculations. This improves payroll accuracy for employees with multiple contracts.
Original PR description
An error is thrown when we try to generate a payslip for an employee that changed contract on a period before the contract change Steps to reproduce: 1. Install l10n_mx and l10n_mx_hr_payroll modules…
An error is thrown when we try to generate a payslip for an employee that changed contract on a period before the contract change
Steps to reproduce:
1. Install l10n_mx and l10n_mx_hr_payroll modules
2. Switch to INNOVACION VALOR... company
3. Go to Employees and open Cecilia Miranda Sanchez
4. Go to Payroll tab, set the end of the contract to Jan 31 and save
5. Create a new contract from Feb 1
6. Go to Payroll > Payslips > Payslips and create a new pay run
7. Select Salary Structure 'Mexico: Regular Pay', Pay Schedule 'Bi-weekly' and Period 'Jan 1 -> Jan 15'
8. Click on Continue, select Cecilia and click on Select
9. An error is thrown
Problem:
In `_compute_integration_factor` we try to compute the number of years the employee has worked by accessing the start date on the employee but this date might be earlier than the start date of the employee's current contract if the employee has changed contract. This will throw an error when we try to access the holidays count for 0 year because `payslip._rule_parameter('l10n_mx_holiday_tables')` doesn't have an entry for 0
Solution:
Use the start date of the first contract of the employee, take gaps in between the employee's contracts into consideration to correctly compute the number of years worked
opw-5931355
Forward-Port-Of: odoo/enterprise#108495This update makes the Gantt chart's date selection more responsive, updating the displayed date range immediately as the user adjusts the picker. Previously, the date range only updated after clicking 'Apply'. This change provides a smoother and more intuitive user experience when working with Gantt charts.
Original PR description
- Previously, the Gantt scale selector only updated the displayed date range after the "Apply" button was clicked. This was because the template was bound to the component props rather than the local state. - This commit binds the date picker display to the local pickerValues state. Now, when a user selects a date in the picker, the UI updates immediately, while the actual data fetch remains deferred until "Apply" is clicked. Task: 5932671 Forward-Port-Of: odoo/enterprise#107380
This update simplifies the process of adding employees to work orders. Previously, the automatic creation of employee profiles was removed, causing issues. Now, a popup allows quick creation of employee profiles with the current user's ID pre-filled, and automatically creates employees with HR access for shopfloor operators.
Original PR description
In 19.1, the automatic creation of an employee profile for the admin user has been removed. This causes issues when the admin wants to start a workorder or mark it as done, so we added a popup to create a new employee profile with the user_id already filled with the id of the current user. Also, if no employee exist when editing operators in the shopfloor, the popup proposes to directly create a new employee linked to the current user if they have HR access. This new employee will be directly logged in the shopfloor operators. see https://github.com/odoo/odoo/pull/250607 to make `action_create_employee` return an employee record. task 5932500 Forward-Port-Of: odoo/enterprise#107439