odoo18/addons_extensions/hr_emp_dashboard/models/emp_dashboard.py

170 lines
7.3 KiB
Python

import pandas as pd
from collections import defaultdict
from datetime import timedelta, datetime, date
from dateutil.relativedelta import relativedelta
from odoo import api, fields, models, _
from odoo.http import request
from odoo.tools import float_utils
from odoo.tools import format_duration
from pytz import utc
class HrEmployee(models.Model):
""" Inherit hr_employee to add birthday field and custom methods. """
_inherit = 'hr.employee'
def attendance_manual(self):
"""Create and update an attendance for the user employee"""
employee = request.env['hr.employee'].sudo().browse(
self.env.user.employee_id.id)
employee.sudo()._attendance_action_change({
'city': request.geoip.city.name or _('Unknown'),
'country_name': request.geoip.country.name or
request.geoip.continent.name or _('Unknown'),
'latitude': request.geoip.location.latitude or False,
'longitude': request.geoip.location.longitude or False,
'ip_address': request.geoip.ip,
'browser': request.httprequest.user_agent.browser,
'mode': 'kiosk'
})
return employee
@api.model
def get_user_employee_details(self):
"""To fetch the details of employee"""
uid = request.session.uid
employee = self.env['hr.employee'].sudo().search_read(
[('user_id', '=', uid)], limit=1)
attendance = self.env['hr.attendance'].sudo().search_read(
[('employee_id', '=', employee[0]['id'])],
fields=['id', 'check_in', 'check_out', 'worked_hours'])
attendance_line = []
for line in attendance:
if line['check_in'] and line['check_out']:
val = {
'id':line['id'],
'date': line['check_in'].date(),
'sign_in': line['check_in'].time().strftime('%H:%M'),
'sign_out': line['check_out'].time().strftime('%H:%M'),
'worked_hours': format_duration(line['worked_hours'])
}
attendance_line.append(val)
leaves = self.env['hr.leave'].sudo().search_read(
[('employee_id', '=', employee[0]['id'])],
fields=['request_date_from', 'request_date_to', 'state',
'holiday_status_id'])
for line in leaves:
line['type'] = line.pop('holiday_status_id')[1]
if line['state'] == 'confirm':
line['state'] = 'To Approve'
line['color'] = 'orange'
elif line['state'] == 'validate1':
line['state'] = 'Second Approval'
line['color'] = '#7CFC00'
elif line['state'] == 'validate':
line['state'] = 'Approved'
line['color'] = 'green'
elif line['state'] == 'cancel':
line['state'] = 'Cancelled'
line['color'] = 'red'
else:
line['state'] = 'Refused'
line['color'] = 'red'
expense =[]
# self.env['hr.expense'].sudo().search_read(
# [('employee_id', '=', employee[0]['id'])],
# fields=['name', 'date', 'state', 'total_amount'])
# for line in expense:
# if line['state'] == 'draft':
# line['state'] = 'To Report'
# line['color'] = '#17A2B8'
# elif line['state'] == 'reported':
# line['state'] = 'To Submit'
# line['color'] = '#17A2B8'
# elif line['state'] == 'submitted':
# line['state'] = 'Submitted'
# line['color'] = '#FFAC00'
# elif line['state'] == 'approved':
# line['state'] = 'Approved'
# line['color'] = '#28A745'
# elif line['state'] == 'done':
# line['state'] = 'Done'
# line['color'] = '#28A745'
# else:
# line['state'] = 'Refused'
# line['color'] = 'red'
leaves_to_approve = self.env['hr.leave'].sudo().search_count(
[('state', 'in', ['confirm', 'validate1'])])
today = datetime.strftime(datetime.today(), '%Y-%m-%d')
query = """
select count(id)
from hr_leave
WHERE (hr_leave.date_from::DATE,hr_leave.date_to::DATE)
OVERLAPS ('%s', '%s') and
state='validate'""" % (today, today)
cr = self._cr
cr.execute(query)
leaves_today = cr.fetchall()
first_day = date.today().replace(day=1)
last_day = (date.today() + relativedelta(months=1, day=1)) - timedelta(
1)
query = """
select count(id)
from hr_leave
WHERE (hr_leave.date_from::DATE,hr_leave.date_to::DATE)
OVERLAPS ('%s', '%s')
and state='validate'""" % (first_day, last_day)
cr = self._cr
cr.execute(query)
leaves_this_month = cr.fetchall()
leaves_alloc_req = self.env['hr.leave.allocation'].sudo().search_count(
[('state', 'in', ['confirm', 'validate1'])])
timesheet_count = self.env['account.analytic.line'].sudo().search_count(
[('project_id', '!=', False), ('user_id', '=', uid)])
timesheet_view_id = self.env.ref(
'hr_timesheet.hr_timesheet_line_search')
job_applications = self.env['hr.applicant'].sudo().search_count([])
if employee:
# sql = """select broad_factor from hr_employee_broad_factor
# where id =%s"""
# self.env.cr.execute(sql, (employee[0]['id'],))
# result = self.env.cr.dictfetchall()
# broad_factor = result[0]['broad_factor'] if result[0][
# 'broad_factor'] else False
broad_factor = False
if employee[0]['birthday']:
diff = relativedelta(datetime.today(), employee[0]['birthday'])
age = diff.years
else:
age = False
if employee[0]['joining_date']:
diff = relativedelta(datetime.today(),
employee[0]['joining_date'])
years = diff.years
months = diff.months
days = diff.days
experience = '{} years {} months {} days'.format(years, months,
days)
else:
experience = False
if employee:
data = {
'broad_factor': broad_factor if broad_factor else 0,
'leaves_to_approve': leaves_to_approve,
'leaves_today': leaves_today,
'leaves_this_month': leaves_this_month,
'leaves_alloc_req': leaves_alloc_req,
'emp_timesheets': timesheet_count,
'job_applications': job_applications,
'timesheet_view_id': timesheet_view_id,
'experience': experience,
'age': age,
'attendance_lines': attendance_line,
'leave_lines': leaves,
'expense_lines': expense
}
employee[0].update(data)
return employee
else:
return False