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