from odoo import api, fields, models, _ from odoo.exceptions import ValidationError class EducationLibraryFine(models.Model): _name = 'education.library.fine' _description = 'Library Fine' _rec_name = 'name' name = fields.Char(string='Reference', required=True, copy=False, readonly=True, default=lambda self: _('New')) issue_id = fields.Many2one('education.library.issue', string='Issue Record', required=True, ondelete='cascade') member_id = fields.Many2one('education.library.member', string='Member', required=True) student_id = fields.Many2one('education.student', string='Student') days_late = fields.Integer(string='Days Late', required=True) amount = fields.Float(string='Fine Amount', required=True) state = fields.Selection([ ('draft', 'Draft'), ('assessed', 'Assessed'), ('paid', 'Paid'), ('waived', 'Waived'), ('cancelled', 'Cancelled') ], string='Status', default='draft', required=True) payment_reference = fields.Char(string='Payment Reference') paid_date = fields.Date(string='Paid Date') remarks = fields.Text(string='Remarks') @api.model_create_multi def create(self, vals_list): for vals in vals_list: if vals.get('name', _('New')) == _('New'): vals['name'] = self.env['ir.sequence'].next_by_code('education.library.fine') or _('New') return super().create(vals_list) @api.constrains('amount') def _check_amount(self): for record in self: if record.amount < 0: raise ValidationError(_('Negative fines are not permitted.')) def action_assess(self): self.write({'state': 'assessed'}) def action_pay(self): for record in self: record.write({ 'state': 'paid', 'paid_date': fields.Date.today() }) def action_waive(self): self.write({'state': 'waived'}) def action_cancel(self): self.write({'state': 'cancelled'})