forked from Mapan/odoo17e
93 lines
4.1 KiB
Python
93 lines
4.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import datetime
|
|
from dateutil.relativedelta import relativedelta
|
|
|
|
from odoo import api, fields, models, _
|
|
|
|
|
|
class ResCompany(models.Model):
|
|
_inherit = "res.company"
|
|
|
|
def _get_default_employee_feedback_template(self):
|
|
return self.env['ir.qweb']._render('hr_appraisal.hr_appraisal_employee_feedback')
|
|
|
|
def _get_default_manager_feedback_template(self):
|
|
return self.env['ir.qweb']._render('hr_appraisal.hr_appraisal_manager_feedback')
|
|
|
|
def _get_default_appraisal_confirm_mail_template(self):
|
|
return self.env.ref('hr_appraisal.mail_template_appraisal_confirm', raise_if_not_found=False)
|
|
|
|
appraisal_plan = fields.Boolean(string='Automatically Generate Appraisals', default=True)
|
|
assessment_note_ids = fields.One2many('hr.appraisal.note', 'company_id')
|
|
appraisal_employee_feedback_template = fields.Html(translate=True)
|
|
appraisal_manager_feedback_template = fields.Html(translate=True)
|
|
appraisal_confirm_mail_template = fields.Many2one(
|
|
'mail.template', domain="[('model', '=', 'hr.appraisal')]",
|
|
default=_get_default_appraisal_confirm_mail_template)
|
|
duration_after_recruitment = fields.Integer(string="Create an Appraisal after recruitment", default=6)
|
|
duration_first_appraisal = fields.Integer(string="Create a first Appraisal after", default=6)
|
|
duration_next_appraisal = fields.Integer(string="Create a second Appraisal after", default=12)
|
|
|
|
_sql_constraints = [(
|
|
'positif_number_months',
|
|
'CHECK(duration_after_recruitment > 0 AND duration_first_appraisal > 0 AND duration_next_appraisal > 0)',
|
|
"The duration time must be bigger or equal to 1 month."),
|
|
]
|
|
|
|
@api.model
|
|
def _get_default_assessment_note_ids(self):
|
|
return [
|
|
(0, 0, {'name': _('Needs improvement'), 'sequence': '1'}),
|
|
(0, 0, {'name': _('Meets expectations'), 'sequence': '2'}),
|
|
(0, 0, {'name': _('Exceeds expectations'), 'sequence': '3'}),
|
|
(0, 0, {'name': _('Strongly Exceed Expectations'), 'sequence': '4'}),
|
|
]
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
res = super().create(vals_list)
|
|
default_notes = self._get_default_assessment_note_ids()
|
|
res.sudo().write({
|
|
'assessment_note_ids': default_notes,
|
|
'appraisal_employee_feedback_template': self._get_default_employee_feedback_template(),
|
|
'appraisal_manager_feedback_template': self._get_default_manager_feedback_template(),
|
|
})
|
|
return res
|
|
|
|
def _create_new_appraisal(self, employees):
|
|
days = int(self.env['ir.config_parameter'].sudo().get_param('hr_appraisal.appraisal_create_in_advance_days', 8))
|
|
appraisal_values = [{
|
|
'company_id': employee.company_id.id,
|
|
'employee_id': employee.id,
|
|
'date_close': employee.next_appraisal_date + relativedelta(days=days),
|
|
'manager_ids': employee.parent_id,
|
|
'state': 'pending',
|
|
'employee_feedback_published': False,
|
|
'manager_feedback_published': False,
|
|
} for employee in employees]
|
|
return self.env['hr.appraisal'].create(appraisal_values)
|
|
|
|
@api.model
|
|
def _get_employee_start_date_field(self):
|
|
self.ensure_one()
|
|
return 'create_date'
|
|
|
|
# CRON job
|
|
def _run_employee_appraisal_plans(self):
|
|
companies = self.env['res.company'].search([('appraisal_plan', '=', True)])
|
|
current_date = datetime.date.today()
|
|
all_employees = self.env['hr.employee'].search([('next_appraisal_date', '<=', current_date), ('company_id', 'in', companies.ids)])
|
|
if all_employees:
|
|
appraisals = self._create_new_appraisal(all_employees)
|
|
# The cron creates appraisals in 'pending' state,
|
|
# Thus we need to update last appraisal info on employee
|
|
for appraisal in appraisals:
|
|
appraisal.employee_id.sudo().write({
|
|
'last_appraisal_id': appraisal.id,
|
|
'last_appraisal_date': current_date,
|
|
})
|
|
appraisals._generate_activities()
|
|
|