1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/hr_appraisal/models/res_company.py
2024-12-10 09:04:09 +07:00

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()