170 lines
7.3 KiB
Python
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 |