odoo18/addons_extensions/hrms_employee_appraisal/models/employee_pip.py

89 lines
2.8 KiB
Python

from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class EmployeePIP(models.Model):
_name = 'employee.pip'
_description = 'Performance Improvement Plan'
_inherit = ['mail.thread', 'mail.activity.mixin']
_rec_name = 'employee_id'
name = fields.Char(string="PIP Reference",default=lambda self: _('New'),readonly=True )
employee_id = fields.Many2one( 'hr.employee',required=True)
manager_id = fields.Many2one('hr.employee',string="Manager")
appraisal_id = fields.Many2one('employee.appraisal.template.config',string="Appraisal")
objective = fields.Text(string="Improvement Objective",required=True)
timeline = fields.Selection([
('30', '30 Days'),
('60', '60 Days'),
('90', '90 Days')
], default='30', required=True)
start_date = fields.Date(default=fields.Date.today)
end_date = fields.Date()
review_date = fields.Date()
employee_acknowledged = fields.Boolean(string="Employee Acknowledged")
state = fields.Selection([
('draft', 'Draft'),
('running', 'In Progress'),
('review', 'Under Review'),
('completed', 'Completed'),
('failed', 'Failed')
], default='draft', tracking=True)
task_ids = fields.One2many('employee.pip.task','pip_id',string='Improvement Tasks')
progress_percentage = fields.Float(compute='_compute_progress',store=True)
remarks = fields.Text()
@api.depends('task_ids.state')
def _compute_progress(self):
for rec in self:
total = len(rec.task_ids)
completed = len(
rec.task_ids.filtered(
lambda l: l.state == 'done'
)
)
rec.progress_percentage = (
(completed / total) * 100
) if total else 0
@api.onchange('timeline', 'start_date')
def _onchange_timeline(self):
for rec in self:
if rec.start_date and rec.timeline:
rec.end_date = fields.Date.add(
rec.start_date,
days=int(rec.timeline)
)
def action_start(self):
self.state = 'running'
def action_review(self):
self.state = 'review'
def action_complete(self):
self.state = 'completed'
def action_fail(self):
self.state = 'failed'
class EmployeePIPTask(models.Model):
_name = 'employee.pip.task'
_description = 'PIP Task'
pip_id = fields.Many2one('employee.pip',ondelete='cascade')
name = fields.Char(required=True)
description = fields.Text()
target_date = fields.Date()
training_course = fields.Char(string="Suggested Training")
state = fields.Selection([
('pending', 'Pending'),
('progress', 'In Progress'),
('done', 'Completed')
], default='pending')