from odoo import models, fields, api class KpiKpi(models.Model): _name = 'kpi.kpi' _description = 'Employee KPI' _inherit = ['portal.mixin', 'mail.thread', 'mail.activity.mixin'] name = fields.Char(string='Reference', required=True, copy=False, readonly=True, default='New') employee_id = fields.Many2one('hr.employee', string='Employee', required=True, tracking=True) manager_id = fields.Many2one('hr.employee', string='Manager', tracking=True) job_id = fields.Many2one('hr.job', string='Job Position', related='employee_id.job_id', store=True, readonly=True) department_id = fields.Many2one('hr.department', string='Department', related='employee_id.department_id', store=True, readonly=True) period = fields.Selection([ ('2024', '2024'), ('2025', '2025'), ('2026', '2026'), ('2027', '2027'), ], string='Period (Year)', required=True, default=lambda self: str(fields.Date.today().year), tracking=True) state = fields.Selection([ ('draft', 'Draft'), ('confirmed', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled'), ], string='Status', default='draft', tracking=True) line_ids = fields.One2many('kpi.kpi.line', 'kpi_id', string='KPI Lines') total_score = fields.Float(string='Total Score', compute='_compute_total_score', store=True) @api.model_create_multi def create(self, vals_list): for vals in vals_list: if vals.get('name', 'New') == 'New': employee = self.env['hr.employee'].browse(vals.get('employee_id')) year = vals.get('period') vals['name'] = f"KPI - {employee.name} - {year}" return super(KpiKpi, self).create(vals_list) @api.depends('line_ids.final_score') def _compute_total_score(self): for record in self: record.total_score = sum(line.final_score for line in record.line_ids) def action_confirm(self): self.write({'state': 'confirmed'}) def action_done(self): self.write({'state': 'done'}) def action_draft(self): self.write({'state': 'draft'})