[FIX] hr_holidays: show correct remaining leaves value

On the employee page, the employe's remaing leaves
were computed using the allocations. Now that leaves
and allocations are not linked directly, the value
needs to be computed differently.

task-2971148

closes odoo/odoo#100458

X-original-commit: adc29a685ed934f45f8c4bbc482866e8a4f49471
Signed-off-by: Kevin Baptiste <kba@odoo.com>
This commit is contained in:
Dossogne Bertrand
2022-09-19 09:33:44 +02:00
parent 7c6cad248f
commit 2a41d237fe
+14 -14
View File
@@ -6,6 +6,7 @@ from dateutil.relativedelta import relativedelta
from odoo import _, api, fields, models
from odoo.tools.float_utils import float_round
from odoo.addons.resource.models.resource import HOURS_PER_DAY
class HrEmployeeBase(models.AbstractModel):
@@ -97,21 +98,20 @@ class HrEmployeeBase(models.AbstractModel):
employee.allocations_count = result['employee_id_count'] if result else 0.0
def _compute_allocation_remaining_display(self):
current_date = datetime.date.today()
data_leave = self.env['hr.leave']._read_group([
('employee_id', 'in', self.ids),
('holiday_status_id.active', '=', True),
('holiday_status_id.requires_allocation', '=', 'yes'),
('state', 'not in', ('cancel', 'refuse')),
'|',
('holiday_allocation_id.date_to', '=', False),
('holiday_allocation_id.date_to', '>=', current_date),
], ['number_of_days:sum', 'employee_id'], ['employee_id'])
results_leave = dict((d['employee_id'][0], {"employee_id_count": d['employee_id_count'], "number_of_days": d['number_of_days']}) for d in data_leave)
allocations = self.env['hr.leave.allocation'].search([('employee_id', 'in', self.ids)])
leaves_taken = allocations.holiday_status_id._get_employees_days_per_allocation(self.ids)
for employee in self:
result = results_leave.get(employee.id)
leaves_taken = float_round(result['number_of_days'], precision_digits=2) if result else 0.0
employee.allocation_remaining_display = "%g" % float_round(employee.allocation_count - leaves_taken, precision_digits=2)
employee_remaining_leaves = 0
for leave_type in leaves_taken[employee.id]:
if leave_type.requires_allocation == 'no':
continue
for allocation in leaves_taken[employee.id][leave_type]:
if allocation:
virtual_remaining_leaves = leaves_taken[employee.id][leave_type][allocation]['virtual_remaining_leaves']
employee_remaining_leaves += virtual_remaining_leaves\
if leave_type.request_unit in ['day', 'half_day']\
else virtual_remaining_leaves / (employee.resource_calendar_id.hours_per_day or HOURS_PER_DAY)
employee.allocation_remaining_display = "%g" % float_round(employee_remaining_leaves, precision_digits=2)
def _compute_presence_state(self):
super()._compute_presence_state()