You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
7.7 KiB
172 lines
7.7 KiB
# -*- coding: utf-8 -*-
|
|
###############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: Gayathri V(odoo@cybrosys.com)
|
|
#
|
|
# You can modify it under the terms of the GNU AFFERO
|
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
# (AGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
###############################################################################
|
|
import pytz
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class HrLeave(models.Model):
|
|
"""Inherit the model hr.leave to introduce supplementary functionality
|
|
aimed at incorporating specific employee details."""
|
|
_inherit = 'hr.leave'
|
|
|
|
def _prepare_employee_data(self, employee):
|
|
"""Function to prepare employee data for the dashboard"""
|
|
return {
|
|
'id': employee.id,
|
|
'name': employee.name,
|
|
'job_id': employee.job_id.name,
|
|
'approval_status_count': self.get_approval_status_count(employee.id)
|
|
}
|
|
|
|
@api.model
|
|
def get_current_employee(self):
|
|
"""This function fetches current employee details in a dictionary"""
|
|
current_employee = self.env.user.employee_ids
|
|
return {
|
|
'id': current_employee.id,
|
|
'name': current_employee.name,
|
|
'job_id': current_employee.job_id.id,
|
|
'image_1920': current_employee.image_1920,
|
|
'work_email': current_employee.work_email,
|
|
'work_phone': current_employee.work_phone,
|
|
'resource_calendar_id': current_employee.resource_calendar_id.name,
|
|
'link': '/mail/view?model=%s&res_id=%s' % (
|
|
'hr.employee.public', current_employee.id,),
|
|
'department_id': current_employee.department_id.name,
|
|
'company': current_employee.company_id.name,
|
|
'job_position': current_employee.job_id.name,
|
|
'parent_id': current_employee.parent_id.ids,
|
|
'child_ids': current_employee.child_ids.ids,
|
|
'child_all_count': current_employee.child_all_count,
|
|
'manager': self._prepare_employee_data(
|
|
current_employee.parent_id) if (
|
|
current_employee.parent_id) else {},
|
|
'manager_all_count': len(current_employee.parent_id.ids),
|
|
'children': [self._prepare_employee_data(child) for child in
|
|
current_employee.child_ids if
|
|
child != current_employee],
|
|
}
|
|
|
|
@api.model
|
|
def get_absentees(self):
|
|
"""The function retrieves a list of employees who are absent on the
|
|
current date by querying the hr_leave table and comparing the
|
|
date_from and date_to fields of validated leave requests. It returns
|
|
a list of dictionaries containing the employee's name, employee_id,
|
|
date_from, and date_to"""
|
|
current_employee = self.env.user.employee_ids
|
|
children = [self._prepare_employee_data(child) for child in
|
|
current_employee.child_ids if
|
|
child != current_employee]
|
|
child_list = [child.get('id') for child in children]
|
|
if len(child_list) > 1:
|
|
query = "SELECT employee_id,name,date_from,date_to FROM hr_leave " \
|
|
"INNER JOIN hr_employee ON hr_leave.employee_id = " \
|
|
"hr_employee.id WHERE state = 'validate' AND " \
|
|
"employee_id in %s" % str(tuple(child_list))
|
|
self._cr.execute(query)
|
|
elif len(child_list) == 1:
|
|
query = "SELECT employee_id,name,date_from,date_to FROM hr_leave " \
|
|
"INNER JOIN hr_employee ON hr_leave.employee_id = " \
|
|
"hr_employee.id WHERE state = 'validate' AND " \
|
|
"employee_id = %s" % child_list[0]
|
|
self._cr.execute(query)
|
|
leave = self._cr.dictfetchall()
|
|
absentees = [
|
|
leave[leave_date] for leave_date in range(len(leave))
|
|
if leave[leave_date].get('date_from') <= fields.datetime.now() <= leave[
|
|
leave_date].get('date_to')
|
|
]
|
|
return absentees
|
|
|
|
@api.model
|
|
def get_current_shift(self):
|
|
""" This function fetches current employee's current shift"""
|
|
current_employee = self.env.user.employee_ids
|
|
employee_tz = current_employee.tz or self.env.context.get('tz')
|
|
employee_pytz = pytz.timezone(employee_tz) if employee_tz else pytz.utc
|
|
employee_datetime = fields.datetime.now().astimezone(employee_pytz)
|
|
hour = employee_datetime.strftime("%H")
|
|
minute = employee_datetime.strftime("%M")
|
|
day = employee_datetime.strftime("%A")
|
|
time = hour + '.' + minute
|
|
day_num = '0' if day == 'Monday' else '1' if day == 'Tuesday' \
|
|
else '2' if day == 'Wednesday' else '3' if day == 'Thursday' \
|
|
else '4' if day == 'Friday' else '5' if day == 'Saturday' else '6'
|
|
for shift in current_employee.resource_calendar_id.attendance_ids:
|
|
if shift.dayofweek == day_num and shift.hour_from <= float(
|
|
time) <= shift.hour_to:
|
|
return shift.name
|
|
return False
|
|
|
|
@api.model
|
|
def get_upcoming_holidays(self):
|
|
""" This function fetches upcoming holidays"""
|
|
current_employee = self.env.user.employee_ids
|
|
employee_tz = current_employee.tz or self.env.context.get('tz')
|
|
employee_pytz = pytz.timezone(employee_tz) if employee_tz else pytz.utc
|
|
employee_datetime = fields.datetime.now().astimezone(employee_pytz)
|
|
query = "SELECT * FROM public.resource_calendar_leaves WHERE " \
|
|
"resource_id is null"
|
|
self._cr.execute(query)
|
|
holidays = self._cr.dictfetchall()
|
|
upcoming_holidays = [holiday for holiday in holidays if
|
|
employee_datetime.date() < holiday.get(
|
|
'date_to').date()]
|
|
return upcoming_holidays
|
|
|
|
@api.model
|
|
def get_approval_status_count(self, current_employee):
|
|
""" This function fetches approval status count"""
|
|
return {
|
|
'validate_count': self.env['hr.leave'].search_count([
|
|
('employee_id', '=', current_employee),
|
|
('state', '=', 'validate')
|
|
]),
|
|
'confirm_count': self.env['hr.leave'].search_count([
|
|
('employee_id', '=', current_employee),
|
|
('state', '=', 'confirm')
|
|
]),
|
|
'refuse_count': self.env['hr.leave'].search_count([
|
|
('employee_id', '=', current_employee),
|
|
('state', '=', 'refuse')
|
|
])
|
|
}
|
|
|
|
@api.model
|
|
def get_all_validated_leaves(self):
|
|
""" This function fetches all validated leaves"""
|
|
leaves = self.env['hr.leave'].search([('state', '=', 'validate')])
|
|
all_validated_leaves = [
|
|
{
|
|
'id': leave.id,
|
|
'employee_id': leave.employee_id.id,
|
|
'employee_name': leave.employee_id.name,
|
|
'request_date_from': leave.request_date_from,
|
|
'request_date_to': leave.request_date_to,
|
|
'leave_type_id': leave.holiday_status_id.id,
|
|
'leave_type': leave.holiday_status_id.name,
|
|
'number_of_days': leave.number_of_days
|
|
}
|
|
for leave in leaves
|
|
]
|
|
return all_validated_leaves
|
|
|