from odoo import api, fields, models class McFeeStructure(models.Model): _name = "mc.fee.structure" _inherit = ["mail.thread"] _description = "Fee Structure" _order = "year_id desc, program_id" _rec_name = "display_name" program_id = fields.Many2one("mc.program", string="Program", required=True, ondelete="restrict") year_id = fields.Many2one("mc.academic.year", string="Academic Year", required=True, ondelete="restrict") company_id = fields.Many2one( "res.company", string="Company", required=True, default=lambda self: self.env.company, ) currency_id = fields.Many2one(related="company_id.currency_id", string="Currency", store=True, readonly=True) line_ids = fields.One2many("mc.fee.structure.line", "structure_id", string="Fee Lines") total_amount = fields.Monetary( string="Total", compute="_compute_total_amount", store=True, currency_field="currency_id", ) schedule_ids = fields.One2many("mc.fee.schedule", "structure_id", string="Installment Schedules") _program_year_company_uniq = models.Constraint( "unique(program_id, year_id, company_id)", "A fee structure already exists for this program and academic year.", ) @api.depends("line_ids.amount") def _compute_total_amount(self): for structure in self: structure.total_amount = sum(structure.line_ids.mapped("amount")) @api.depends("program_id.display_label", "year_id.name") def _compute_display_name(self): for structure in self: structure.display_name = "%s - %s" % ( structure.program_id.display_label or "?", structure.year_id.name or "?", ) class McFeeStructureLine(models.Model): _name = "mc.fee.structure.line" _description = "Fee Structure Line" _order = "category_id" structure_id = fields.Many2one( "mc.fee.structure", string="Fee Structure", required=True, ondelete="cascade", ) category_id = fields.Many2one("mc.fee.category", string="Category", required=True, ondelete="restrict") amount = fields.Monetary(string="Amount", required=True, currency_field="currency_id") currency_id = fields.Many2one( related="structure_id.currency_id", string="Currency", readonly=True, ) _structure_category_uniq = models.Constraint( "unique(structure_id, category_id)", "This fee structure already has a line for this category.", )