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