open-synergy/opnsynid-hr

View on GitHub
hr_job_family_modelling/models/hr_job_family_level.py

Summary

Maintainability
D
3 days
Test Coverage
# -*- coding: utf-8 -*-
# © 2016 OpenSynergy Indonesia
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from openerp import _, api, fields, models
from openerp.exceptions import Warning as UserError


class HrJobFamilyLevel(models.Model):
    _name = "hr.job_family_level"
    _description = "Job Family Level"

    @api.multi
    @api.depends(
        "job_family_id",
    )
    def _compute_job_grade(self):
        for jfl in self:
            jfl.allowed_job_grade_ids = jfl.job_family_id.job_grade_ids.ids

    @api.multi
    @api.depends(
        "min_job_grade_id",
        "max_job_grade_id",
        "max_job_grade_id.sequence",
        "min_job_grade_id.sequence",
    )
    def _compute_job_grade_ids(self):
        obj_jg = self.env["hr.job_grade"]
        job_grade_ids = obj_jg.search([]).ids
        for jf in self:
            result = []
            if jf.min_job_grade_id and jf.max_job_grade_id:
                min_job_grade_id = jf.min_job_grade_id.id
                max_job_grade_id = jf.max_job_grade_id.id
                min_index = job_grade_ids.index(min_job_grade_id)
                max_index = job_grade_ids.index(max_job_grade_id)
                result = job_grade_ids[min_index : max_index + 1]
            jf.job_grade_ids = result

    code = fields.Char(
        string="Code",
        required=True,
    )
    job_family_id = fields.Many2one(
        string="Job Family",
        comodel_name="hr.job_family",
        required=True,
    )
    job_family_grade_id = fields.Many2one(
        string="Job Family Grade",
        comodel_name="hr.job_family_grade",
        required=True,
    )
    allowed_job_grade_ids = fields.Many2many(
        string="Job Grades",
        comodel_name="hr.job_grade",
        compute="_compute_job_grade",
        store=False,
    )
    job_grade_ids = fields.Many2many(
        string="Job Grades",
        comodel_name="hr.job_grade",
        relation="rel_job_family_level_2_grade",
        column1="job_family_level_id",
        column2="job_grade_id",
        compute="_compute_job_grade_ids",
        store=True,
    )
    min_job_grade_id = fields.Many2one(
        string="Min. Grade",
        comodel_name="hr.job_grade",
        required=True,
    )
    max_job_grade_id = fields.Many2one(
        string="Max. Grade",
        comodel_name="hr.job_grade",
        required=True,
    )
    active = fields.Boolean(
        string="Active",
        default=True,
    )
    note = fields.Text(
        string="Note",
    )

    @api.multi
    def name_get(self):
        result = []
        for jfl in self:
            grade_count = len(jfl.job_grade_ids)
            if grade_count == 0:
                min_grade = "-"
                max_grade = "-"
            else:
                min_grade = jfl.job_grade_ids[0].name
                max_grade = jfl.job_grade_ids[grade_count - 1].name

            name = "{} {} ({} - {})".format(
                jfl.job_family_grade_id.name,
                jfl.job_family_id.name,
                min_grade,
                max_grade,
            )
            result.append([jfl.id, name])
        return result

    @api.multi
    def onchange_job_family_id(self, job_family_id):
        value = self._get_value_before_onchange_job_family_id()
        domain = self._get_domain_before_onchange_job_family_id()

        if job_family_id:
            obj_job_family = self.env["hr.job_family"]
            job_family = obj_job_family.browse([job_family_id])[0]
            value = self._get_value_after_onchange_job_family_id(job_family)
            domain = self._get_domain_after_onchange_job_family_id(job_family)
        return {"value": value, "domain": domain}

    @api.multi
    def _get_value_before_onchange_job_family_id(self):
        return {
            "job_grade_ids": [],
        }

    @api.multi
    def _get_domain_before_onchange_job_family_id(self):
        return {}

    @api.multi
    def _get_value_after_onchange_job_family_id(self, job_family):
        return {
            "job_grade_ids": [],
        }

    @api.multi
    def _get_domain_after_onchange_job_family_id(self, job_family):
        return {}

    @api.constrains(
        "min_job_grade_id",
        "max_job_grade_id",
    )
    def _check_min_max_grade(self):
        obj_jg = self.env["hr.job_grade"]
        job_grade_ids = obj_jg.search([]).ids
        msg = _("Wrong Max Min Grade")
        for jf in self:
            if jf.min_job_grade_id and jf.max_job_grade_id:
                min_job_grade_id = jf.min_job_grade_id.id
                max_job_grade_id = jf.max_job_grade_id.id
                min_index = job_grade_ids.index(min_job_grade_id)
                max_index = job_grade_ids.index(max_job_grade_id)
                if min_index > max_index:
                    raise UserError(msg)