odoo18/addons_extensions/probation_management/models/hr_employee_inherit.py

159 lines
4.5 KiB
Python

from odoo import api, fields, models
from datetime import datetime, time
from dateutil.relativedelta import relativedelta
class HrEmployee(models.Model):
_inherit = 'hr.employee'
emp_type_id = fields.Many2one('hr.contract.type')
probation_state = fields.Selection([
('not_applicable', 'Not Applicable'),
('probation', 'On Probation'),
('confirmed', 'Confirmed'),
('extended', 'Extended'),
('terminated', 'Terminated'),
], default='not_applicable')
probation_start_date = fields.Date()
probation_end_date = fields.Date(
compute='_compute_probation_end_date',
store=True
)
@api.depends('probation_start_date', 'milestone_days')
def _compute_probation_end_date(self):
for rec in self:
if rec.probation_start_date and rec.milestone_days:
rec.probation_end_date = (
rec.probation_start_date +
relativedelta(days=rec.milestone_days)
)
else:
rec.probation_end_date = False
milestone_days = fields.Integer(
string='Milestone Days',
required=True
)
probation_review_ids = fields.One2many(
'hr.employee.probation.review',
'employee_id'
)
def write(self, vals):
res = super().write(vals)
for emp in self:
if (
emp.emp_type_id
and emp.probation_start_date
and emp.milestone_days
and not emp.probation_review_ids
):
self.env['hr.employee.probation.review'].create({
'employee_id': emp.id,
'review_date': (
emp.probation_start_date +
relativedelta(days=emp.milestone_days)
),
'milestone_days': emp.milestone_days,
})
return res
def cron_probation_completion(self):
today = fields.Date.today()
employees = self.search([
('probation_state', '=', 'probation'),
('probation_end_date', '<=', today)
])
for emp in employees:
last_review = self.env[
'hr.employee.probation.review'
].search([
('employee_id', '=', emp.id)
], limit=1, order='review_date desc')
if last_review.outcome == 'confirmed':
emp.probation_state = 'confirmed'
elif last_review.outcome == 'extended':
emp.probation_state = 'probation'
emp.probation_end_date = (
emp.probation_end_date
+ relativedelta(months=1)
)
elif last_review.outcome == 'terminated':
emp.probation_state = 'terminated'
else:
pass
class HrEmployeeProbationReview(models.Model):
_name = 'hr.employee.probation.review'
_description = 'Employee Probation Review'
_rec_name = 'employee_id'
employee_id = fields.Many2one(
'hr.employee',
required=True
)
review_date = fields.Date(required=True)
milestone_days = fields.Integer(
string='Milestone Days'
)
manager_feedback = fields.Text()
outcome = fields.Selection([
('pending', 'Pending'),
('confirmed', 'Confirmed'),
('extended', 'Extended'),
('terminated', 'Terminated')
], default='pending')
extension_days = fields.Integer()
def write(self, vals):
result = super().write(vals)
for review in self:
if vals.get('outcome') == 'confirmed':
review.employee_id.probation_state = 'confirmed'
elif vals.get('outcome') == 'terminated':
review.employee_id.probation_state = 'terminated'
elif (
vals.get('outcome') == 'extended'
and review.extension_days
):
review.employee_id.probation_state = 'probation'
next_review_date = (
review.review_date +
relativedelta(days=review.extension_days)
)
self.create({
'employee_id': review.employee_id.id,
'review_date': next_review_date,
'milestone_days': review.extension_days,
})
review.employee_id.probation_end_date = next_review_date
return result