[WIP]hr_employee_stats_sheet
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import logging
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo import api, fields, models
|
||||
from datetime import timedelta
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
@@ -130,10 +130,10 @@ class HrEmployeeStats(models.Model):
|
||||
return total_recovery_hours
|
||||
|
||||
def _get_total_leave_hours(self):
|
||||
leave = self.env["hr.leave"]
|
||||
total_leave_hours = 0
|
||||
for stat in self:
|
||||
if stat.date and stat.employee_id:
|
||||
leave_ids = leave.search(
|
||||
leave_ids = self.env["hr.leave"].search(
|
||||
[
|
||||
("employee_id", "=", stat.employee_id.id),
|
||||
("holiday_status_id", "!=", stat._get_holiday_status_id()),
|
||||
@@ -141,20 +141,7 @@ class HrEmployeeStats(models.Model):
|
||||
("request_date_to", "<=", stat.date),
|
||||
]
|
||||
)
|
||||
# retire des congés les jours où j'ai travaillé (car présence dans l'app présence) alors que j'étais noté en congé
|
||||
# TODO faire pareil avec les feuilles de temps?
|
||||
intersect_hours = sum(leave_ids.mapped("number_of_hours_display"))
|
||||
# for leave_id in leave_ids:
|
||||
# for attendance_id in stat.attendance_ids:
|
||||
# intersect_hours -= stat._get_intersects(
|
||||
# leave_id.date_from,
|
||||
# leave_id.date_to,
|
||||
# attendance_id.check_in,
|
||||
# attendance_id.check_out,
|
||||
# )
|
||||
total_leave_hours = intersect_hours
|
||||
else:
|
||||
total_leave_hours = 0
|
||||
total_leave_hours = sum(leave_ids.mapped("number_of_hours_display"))
|
||||
return total_leave_hours
|
||||
|
||||
@api.depends("employee_id", "date")
|
||||
@@ -195,15 +182,8 @@ class HrEmployeeStats(models.Model):
|
||||
total_recovery_hours = stat._get_total_recovery_hours()
|
||||
total_planned_hours = stat._get_total_planned_hours()
|
||||
total_leave_hours = stat._get_total_leave_hours()
|
||||
# balance = (
|
||||
# total_hours
|
||||
# + total_recovery_hours
|
||||
# + total_leave_hours
|
||||
# - total_planned_hours
|
||||
# )
|
||||
stat.total_hours = total_hours
|
||||
stat.total_planned_hours = total_planned_hours
|
||||
#stat.gap_hours = balance
|
||||
stat.gap_hours = stat._get_gap_hours(total_hours, total_recovery_hours, total_leave_hours, total_planned_hours)
|
||||
stat.total_recovery_hours = total_recovery_hours
|
||||
stat.total_leave_hours = total_leave_hours
|
||||
|
@@ -100,56 +100,36 @@ class HrTimesheetSheet(models.Model):
|
||||
sheet.recovery_allocation_ids.write({"state": "refuse"})
|
||||
return res
|
||||
|
||||
def _get_contract_in_progress_during_timesheet_sheet_time_period(self):
|
||||
def _get_contracts_in_progress_during_timesheet_sheet_time_period(self):
|
||||
"""
|
||||
get the contract which was in progress during the timesheet sheet range time :
|
||||
- the contrat start date must be before the timesheet sheet start date
|
||||
- the contrat end date can be not defined or must be after the timesheet sheet end date
|
||||
- the state can be closed today or still open
|
||||
get the contracts which was in progress during the timesheet sheet range time
|
||||
"""
|
||||
contract_in_progress_during_timesheet = self.env["hr.contract"].search(
|
||||
contracts = self.env["hr.contract"].search(
|
||||
[
|
||||
("employee_id", "=", self.employee_id.id),
|
||||
("state", "in", ("open","close")),
|
||||
("date_start", "<=", self.date_start),
|
||||
("date_end", ">=", self.date_end or None),
|
||||
],
|
||||
order="date_start desc",
|
||||
limit=1,
|
||||
)
|
||||
return contract_in_progress_during_timesheet
|
||||
|
||||
def _check_new_contract_starting_during_timesheet(self):
|
||||
"""
|
||||
check if there was a contract starting during the timesheet sheet range time
|
||||
:return: raise error if there is a contract starting during the timesheet sheet range time
|
||||
"""
|
||||
contract_starting_during_timesheet_ids = self.env["hr.contract"].search(
|
||||
[
|
||||
("employee_id", "=", self.employee_id.id),
|
||||
("state", "in", ("open","close")),
|
||||
("date_start", ">", self.date_start),
|
||||
("date_start", "<=", self.date_end),
|
||||
("employee_id", "=", self.employee_id.id),
|
||||
("state", "in", ("open", "close")),
|
||||
("date_start", "<=", self.date_end),
|
||||
"|",
|
||||
("date_end", "=", False), # pas de date de fin OU
|
||||
("date_end", ">=", self.date_start), # date de fin après le début
|
||||
],
|
||||
)
|
||||
if contract_starting_during_timesheet_ids:
|
||||
raise UserError(
|
||||
_("There is a contract starting during the timesheet sheet time period for the employee %s"
|
||||
"Please create a new timesheet sheet starting from the new contract start date")
|
||||
% self.employee_id.display_name
|
||||
)
|
||||
return contracts
|
||||
|
||||
def _get_calendar_in_progress_during_timesheet_time_period(self):
|
||||
"""
|
||||
get the ressource calendar which was used during the timesheet sheet time period
|
||||
"""
|
||||
# get work contrat in progress for the employe during the timesheet sheet time period
|
||||
contract_during_timesheet_sheet = self._get_contract_in_progress_during_timesheet_sheet_time_period()
|
||||
if contract_during_timesheet_sheet:
|
||||
#checks if only one contract runs over the duration of the timesheet
|
||||
contracts = self._get_contracts_in_progress_during_timesheet_sheet_time_period()
|
||||
if len(contracts) > 1:
|
||||
# check if a new contract start during timesheet sheet time period. If yes, raise an error
|
||||
self._check_new_contract_starting_during_timesheet()
|
||||
raise UserError(
|
||||
_("There is a contract starting during the timesheet sheet time period for the employee %s"
|
||||
"Please create a new timesheet sheet starting from the new contract start date")
|
||||
% self.employee_id.display_name
|
||||
)
|
||||
# get the ressource calendar id according to the work contract
|
||||
return contract_during_timesheet_sheet.resource_calendar_id
|
||||
elif self.employee_id.resource_calendar_id:
|
||||
return self.employee_id.resource_calendar_id
|
||||
elif self.env.company.resource_calendar_id:
|
||||
|
Reference in New Issue
Block a user