odex30_standard/exp_hr_appraisal_kpi/models/employee_apprisal.py

163 lines
8.1 KiB
Python

from odoo import models, fields,_,api,exceptions
class EmployeeApprisal(models.Model):
_inherit = 'hr.group.employee.appraisal'
year_id = fields.Many2one(comodel_name='kpi.period',string='Year',required=True)
appraisal_ids = fields.One2many('hr.employee.appraisal', 'employee_appraisal2')
def gen_appraisal(self):
for item in self:
if item.employee_ids:
appraisal_lines_list = []
# Fill employee appraisal
for element in item.employee_ids:
standard_appraisal_list, manager_appraisal_list = [], []
year_goal_obj = self.env['years.employee.goals'].search([('employee_id','=',element.id),('year_id','=',self.year_id.id)])
print('year = ',year_goal_obj)
goal_ids = year_goal_obj.ids if year_goal_obj else []
appraisal_line = {
'employee_id': element.id,
'manager_id': item.manager_id.id,
'year_id': item.year_id.id,
'department_id': item.department_id.id,
'job_id': element.job_id.id,
'appraisal_date': item.date,
'goal_ids': [(6, 0, goal_ids)],
}
line_id = self.env['hr.employee.appraisal'].create(appraisal_line)
line_id.compute_apprisal()
appraisal_lines_list.append(line_id.id)
item.appraisal_ids = self.env['hr.employee.appraisal'].browse(appraisal_lines_list)
else:
raise exceptions.Warning(_('Please select at least one employee to make appraisal.'))
item.state = 'gen_appraisal'
def draft(self):
print('draft ..............')
# Delete all appraisals when re-draft
if self.appraisal_ids:
print('if appr line.............')
for line in self.appraisal_ids:
print('for..................')
if line.state == 'draft':
print('state...........')
line.unlink()
self.state = 'draft'
elif line.state == 'closed':
line.state = 'state_done'
self.state = 'start_appraisal'
elif line.state == 'state_done':
self.state = 'start_appraisal'
# Call the original draft method using super()
class EmployeeApprisal(models.Model):
_inherit = 'hr.employee.appraisal'
employee_appraisal2 = fields.Many2one('hr.group.employee.appraisal') # Inverse field
employee_id = fields.Many2one('hr.employee', string='Employee',tracking=True,required=True)
manager_id = fields.Many2one('hr.employee', string='Manager',readonly=False,tracking=True,required=True,default=lambda item: item.get_user_id())
year_id = fields.Many2one(comodel_name='kpi.period',string='Year',required=True)
period_goals_id = fields.Many2one('kpi.period.notes',force_save=1,string='Period',tracking=True,)
department_id = fields.Many2one('hr.department',required=True,readonly=False,store=True,compute='compute_depart_job', tracking=True,string='Department')
job_id = fields.Many2one('hr.job',force_save=1,readonly=True,store=True, string='Job Title',related='employee_id.job_id',tracking=True,)
goals_mark = fields.Float(store=True,string='Goals Apprisal Mark',readonly=True,tracking=True)
skill_mark = fields.Float(store=True,string='Skills Apprisal Mark',readonly=True,tracking=True)
total_score = fields.Float(string='Total Mark',store=True,readonly=True,compute='compute_total_score',tracking=True)
apprisal_result = fields.Many2one('appraisal.result',string='Apprisal Result',store=True,tracking=True)
notes= fields.Text(string='Notes',required=False)
goal_ids = fields.One2many('years.employee.goals', 'employee_apprisal_id', string='Goals')
skill_ids = fields.One2many('skill.item.employee.table', 'employee_apprisal_id', string='Skills')
@api.constrains('employee_id', 'year_id')
def check_unique_employee_year_period_goals(self):
for record in self:
if self.search_count([
('employee_id', '=', record.employee_id.id),
('year_id', '=', record.year_id.id),
('id', '!=', record.id),
]) > 0:
raise exceptions.ValidationError(_("Employee Apprisal must be unique per Employee, Year, and Period!"))
@api.depends('skill_mark','goals_mark',)
def compute_total_score(self):
appraisal_result_list = []
for rec in self:
if rec.skill_mark and rec.goals_mark and rec.job_id.appraisal_percentages_id.percentage_kpi>0.0 and rec.job_id.appraisal_percentages_id.percentage_skills>0.0:
skill_mark_precentage = rec.skill_mark*rec.job_id.appraisal_percentages_id.percentage_skills
goal_mark_precentage = rec.goals_mark*rec.job_id.appraisal_percentages_id.percentage_kpi
rec.total_score = (skill_mark_precentage+goal_mark_precentage)
appraisal_result = self.env['appraisal.result'].search([
('result_from', '<', rec.total_score),
('result_to', '>=', rec.total_score)])
if rec.total_score and len(appraisal_result) > 1:
for line in appraisal_result:
appraisal_result_list.append(line.name)
raise exceptions.Warning(
_('Please check appraisal result configuration , there is more than result for '
'percentage %s are %s ') % (
round(rec.total_score, 2), appraisal_result_list))
else:
rec.appraisal_result = appraisal_result.id
def get_user_id(self):
employee_id = self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1)
if employee_id:
return employee_id.id
else:
return False
@api.depends('employee_id')
def compute_depart_job(self):
for rec in self:
if rec.employee_id:
rec.department_id = rec.employee_id.department_id.id
def compute_apprisal(self):
year_goal_obj = self.env['years.employee.goals'].search([('employee_id','=',self.employee_id.id),('year_id','=',self.year_id.id)])
if year_goal_obj:
print('if goal...........')
self.goal_ids = year_goal_obj.ids
#
sum2 = 0
for rec in self.goal_ids:
sum2 = sum2+ ((rec.weight*int(rec.choiec))/100)
self.goals_mark = sum2
#
item_lines=[(5,0,0)]
skill_apprisal = self.env['skill.appraisal'].search([('employee_id','=',self.employee_id.id),('year_id','=',self.year_id.id),('job_id','=',self.job_id.id)])
dic_item = {}
print('s a = ',skill_apprisal)
for obj in skill_apprisal:
for rec in obj.items_ids:
if rec.mark and rec.item_id:
if rec.item_id.name in dic_item:
dic_item[rec.item_id.name].append(rec.mark)
else:
dic_item.update({rec.item_id.name:[rec.mark]})
print('dic_item = ',dic_item)
averages = {}
for key, values in dic_item.items():
# Convert values to integers and calculate sum
total = sum(int(value) for value in values)
# Calculate average
avg = total / len(values)
# Store the average in the dictionary
averages[key] = avg
if self.job_id:
for line in self.job_id.item_job_ids:
line_item = {'item_id':line.item_id.id,'name':line.name,'level':line.level,}
if line.item_id.name in averages:
line_item.update({'mark_avg':averages[line.item_id.name]})
item_lines.append((0,0,line_item))
self.skill_ids = item_lines
# Calculate the average of averages
if len(averages)!=0:
average_of_averages = sum(averages.values()) / len(averages)
self.skill_mark = average_of_averages