# pyrefly: ignore [missing-import] from odoo import api, fields, models # pyrefly: ignore [missing-import] from odoo.exceptions import ValidationError class EducationHostelComplaint(models.Model): _name = 'education.hostel.complaint' _description = 'Hostel Complaint' _inherit = ['mail.thread', 'mail.activity.mixin'] _order = 'submitted_date desc, id desc' name = fields.Char( string='Reference', required=True, copy=False, readonly=True, default=lambda self: self.env['ir.sequence'].next_by_code('education.hostel.complaint'), index=True, ) student_id = fields.Many2one( 'education.student', string='Student', required=True, ondelete='restrict', index=True, tracking=True, ) hostel_id = fields.Many2one( 'education.hostel', string='Hostel', required=True, ondelete='restrict', index=True, ) room_id = fields.Many2one( 'education.hostel.room', string='Room', ondelete='set null', index=True, ) category = fields.Selection([ ('maintenance', 'Maintenance'), ('cleanliness', 'Cleanliness'), ('food', 'Food'), ('security', 'Security'), ('roommate', 'Roommate Issue'), ('other', 'Other'), ], string='Category', required=True, default='maintenance', tracking=True) title = fields.Char(string='Title', required=True) description = fields.Text(string='Description') priority = fields.Selection([ ('0', 'Normal'), ('1', 'Low'), ('2', 'High'), ('3', 'Urgent'), ], string='Priority', default='0') state = fields.Selection([ ('draft', 'Draft'), ('submitted', 'Submitted'), ('in_progress', 'In Progress'), ('resolved', 'Resolved'), ('closed', 'Closed'), ], string='Status', default='draft', required=True, tracking=True, index=True) assigned_to = fields.Many2one( 'res.users', string='Assigned To', tracking=True, domain=[('share', '=', False)], ) resolution = fields.Text(string='Resolution') submitted_date = fields.Date(string='Submitted Date', tracking=True) resolved_date = fields.Date(string='Resolved Date', tracking=True) company_id = fields.Many2one( 'res.company', string='Company', required=True, default=lambda self: self.env.company, index=True, ) # ── Workflow ────────────────────────────────────────────────────────────── def action_submit(self): for rec in self: rec.state = 'submitted' rec.submitted_date = fields.Date.today() rec.message_post(body="Complaint submitted.") def action_start_progress(self): for rec in self: if not rec.assigned_to: raise ValidationError("Please assign the complaint to a staff member before starting.") rec.state = 'in_progress' def action_resolve(self): for rec in self: if not rec.resolution: raise ValidationError("Please provide a resolution note before marking as resolved.") rec.state = 'resolved' rec.resolved_date = fields.Date.today() def action_close(self): self.write({'state': 'closed'}) def action_reopen(self): for rec in self: if rec.state == 'closed': rec.state = 'resolved' @api.model_create_multi def create(self, vals_list): for vals in vals_list: if not vals.get('name') or vals.get('name') == '/': vals['name'] = ( self.env['ir.sequence'].next_by_code('education.hostel.complaint') or '/' ) return super().create(vals_list)