from odoo import api, fields, models from odoo.exceptions import ValidationError class McFeeConcession(models.Model): _name = "mc.fee.concession" _inherit = ["mail.thread"] _description = "Fee Concession" _order = "student_id" _rec_name = "display_name" student_id = fields.Many2one("mc.student", string="Student", required=True, ondelete="cascade") concession_type = fields.Selection( [ ("sibling", "Sibling"), ("merit", "Merit"), ("staff", "Staff"), ("need_based", "Need-based"), ], string="Type", required=True, tracking=True, ) computation = fields.Selection( [("percent", "Percentage"), ("fixed", "Fixed Amount")], string="Computed As", required=True, default="percent", tracking=True, ) value = fields.Float(string="Value", required=True, tracking=True, help="A percentage (0-100) if computed as Percentage, otherwise a fixed amount.") reason = fields.Char(string="Reason", required=True) approver_id = fields.Many2one("res.users", string="Approved By", required=True, tracking=True) active = fields.Boolean(string="Active", default=True) @api.depends("student_id.name", "concession_type", "value", "computation") def _compute_display_name(self): for concession in self: value_label = "%.0f%%" % concession.value if concession.computation == "percent" else str(concession.value) concession.display_name = "%s - %s (%s)" % ( concession.student_id.name or "?", dict(concession._fields["concession_type"].selection).get(concession.concession_type, "?"), value_label, ) @api.constrains("computation", "value") def _check_percent_range(self): for concession in self: if concession.computation == "percent" and not (0 < concession.value <= 100): raise ValidationError( "A percentage concession's value must be between 0 and 100." ) if concession.value <= 0: raise ValidationError("A concession's value must be greater than zero.")