[IMP] hr_holidays: display correct calendar attendances
Before this commit, the attendance and non-working days were always based to the current calendar of the user's employee. This is not accurate since we can see other's calendars and contract changes can lead to calendar changes (from full-time to part-time,...). This commit base that view on the viewed employee contracts so that even a contract change is correctly viewed. task-3060722 closes odoo/odoo#121153 Related: odoo/enterprise#42125 Signed-off-by: Kevin Baptiste <kba@odoo.com>
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from datetime import date
|
||||
from pytz import UTC
|
||||
from datetime import date, datetime, time
|
||||
|
||||
from odoo import api, fields, models
|
||||
from odoo.osv import expression
|
||||
|
||||
@@ -28,6 +30,7 @@ class Employee(models.Model):
|
||||
|
||||
def _get_first_contract_date(self, no_gap=True):
|
||||
self.ensure_one()
|
||||
|
||||
def remove_gap(contracts):
|
||||
# We do not consider a gap of more than 4 days to be a same occupation
|
||||
# contracts are considered to be ordered correctly
|
||||
@@ -94,6 +97,29 @@ class Employee(models.Model):
|
||||
"""
|
||||
return self.search(['|', ('active', '=', True), ('active', '=', False)])._get_contracts(date_from, date_to, states=states)
|
||||
|
||||
def _get_unusual_days(self, date_from, date_to=None):
|
||||
employee_contracts = self.env['hr.contract'].search([
|
||||
('state', '!=', 'cancel'),
|
||||
('employee_id', '=', self.id),
|
||||
('date_start', '<=', date_to),
|
||||
'|',
|
||||
('date_end', '=', False),
|
||||
('date_end', '>=', date_from),
|
||||
])
|
||||
if not employee_contracts:
|
||||
return super()._get_unusual_days(date_from, date_to)
|
||||
unusual_days = {}
|
||||
date_from_date = datetime.strptime(date_from, '%Y-%m-%d %H:%M:%S').date()
|
||||
date_to_date = datetime.strptime(date_to, '%Y-%m-%d %H:%M:%S').date() if date_to else None
|
||||
for contract in employee_contracts:
|
||||
tmp_date_from = max(date_from_date, contract.date_start)
|
||||
tmp_date_to = min(date_to_date, contract.date_end) if contract.date_end else date_to_date
|
||||
unusual_days.update(contract.resource_calendar_id._get_unusual_days(
|
||||
datetime.combine(fields.Date.from_string(tmp_date_from), time.min).replace(tzinfo=UTC),
|
||||
datetime.combine(fields.Date.from_string(tmp_date_to), time.max).replace(tzinfo=UTC)
|
||||
))
|
||||
return unusual_days
|
||||
|
||||
def write(self, vals):
|
||||
res = super().write(vals)
|
||||
if vals.get('contract_id'):
|
||||
|
||||
@@ -1694,7 +1694,9 @@ class HolidaysRequest(models.Model):
|
||||
|
||||
@api.model
|
||||
def get_unusual_days(self, date_from, date_to=None):
|
||||
return self.env.user.employee_id.sudo(False)._get_unusual_days(date_from, date_to)
|
||||
employee_id = self.env.context.get('employee_id', False)
|
||||
employee = self.env['hr.employee'].browse(employee_id) if employee_id else self.env.user.employee_id
|
||||
return employee.sudo(False)._get_unusual_days(date_from, date_to)
|
||||
|
||||
def _get_start_or_end_from_attendance(self, hour, date, employee):
|
||||
hour = float_to_time(float(hour))
|
||||
|
||||
@@ -45,9 +45,25 @@ export class TimeOffCalendarModel extends CalendarModel {
|
||||
|
||||
async updateData(data) {
|
||||
await super.updateData(data);
|
||||
|
||||
data.stressDays = await this.fetchStressDays(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @override
|
||||
*/
|
||||
fetchUnusualDays(data) {
|
||||
return this.orm.call(this.meta.resModel, "get_unusual_days", [
|
||||
serializeDateTime(data.range.start),
|
||||
serializeDateTime(data.range.end),
|
||||
],
|
||||
{
|
||||
context: {
|
||||
'employee_id': this.employeeId,
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async fetchStressDays(data) {
|
||||
return this.orm.call("hr.employee", "get_stress_days", [
|
||||
this.employeeId,
|
||||
|
||||
Reference in New Issue
Block a user