# pyrefly: ignore [missing-import] from odoo import api, fields, models # pyrefly: ignore [missing-import] from odoo.exceptions import ValidationError class EducationFeeStructure(models.Model): _name = 'education.fee.structure' _description = 'Fee Structure' _order = 'name' name = fields.Char(required=True, string='Structure Name') academic_year_id = fields.Many2one('education.academic.year', string='Academic Year', required=True, index=True) level_id = fields.Many2one('education.academic.level', string='Academic Level', required=True, index=True) program_id = fields.Many2one('education.program', string='Program', index=True) department_id = fields.Many2one('education.department', string='Department', index=True) semester_id = fields.Many2one('education.semester', string='Semester', index=True) academic_term_id = fields.Many2one('education.academic.term', string='Academic Term', index=True) batch_id = fields.Many2one('education.batch', string='Batch', index=True) due_days = fields.Integer(string='Due Days from Assignment', default=30) currency_id = fields.Many2one( 'res.currency', string='Currency', required=True, default=lambda self: self.env.company.currency_id, ) line_ids = fields.One2many('education.fee.structure.line', 'fee_structure_id', string='Fee Lines', copy=True) total_amount = fields.Monetary( string='Total Amount', compute='_compute_total_amount', currency_field='currency_id', store=True, ) active = fields.Boolean(default=True) company_id = fields.Many2one( 'res.company', string='Company', required=True, default=lambda self: self.env.company, index=True, ) @api.depends('line_ids.amount') def _compute_total_amount(self): for rec in self: rec.total_amount = sum(line.amount for line in rec.line_ids) class EducationFeeStructureLine(models.Model): _name = 'education.fee.structure.line' _description = 'Fee Structure Line' _order = 'sequence, id' fee_structure_id = fields.Many2one('education.fee.structure', string='Fee Structure', required=True, ondelete='cascade') fee_type_id = fields.Many2one('education.fee.type', string='Fee Type', required=True) currency_id = fields.Many2one('res.currency', related='fee_structure_id.currency_id', store=True) amount = fields.Monetary(string='Amount', required=True, currency_field='currency_id') mandatory = fields.Boolean(string='Mandatory', default=True) sequence = fields.Integer(string='Sequence', default=10) active = fields.Boolean(default=True) company_id = fields.Many2one( 'res.company', related='fee_structure_id.company_id', store=True, index=True, ) @api.onchange('fee_type_id') def _onchange_fee_type(self): if self.fee_type_id: self.amount = self.fee_type_id.amount self.mandatory = self.fee_type_id.mandatory @api.constrains('amount') def _check_amount(self): for rec in self: if rec.amount < 0: raise ValidationError('Line amount cannot be negative.')