employee_kpi/models/kpi_kpi.py
2026-02-05 18:45:49 +07:00

53 lines
2.1 KiB
Python

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