# pyrefly: ignore [missing-import] from odoo import api, fields, models # pyrefly: ignore [missing-import] from odoo.exceptions import ValidationError class EducationHostelVisitor(models.Model): _name = 'education.hostel.visitor' _description = 'Hostel Visitor Log' _inherit = ['mail.thread', 'mail.activity.mixin'] _order = 'visit_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.visitor'), index=True, ) student_id = fields.Many2one( 'education.student', string='Student (Host)', required=True, ondelete='restrict', index=True, tracking=True, ) hostel_id = fields.Many2one( 'education.hostel', string='Hostel', required=True, ondelete='restrict', index=True, ) visitor_name = fields.Char(string='Visitor Name', required=True) relationship = fields.Char(string='Relationship') phone = fields.Char(string='Visitor Phone') purpose = fields.Text(string='Purpose of Visit') visit_date = fields.Date(string='Visit Date', required=True, default=fields.Date.context_today) check_in = fields.Datetime(string='Check In', tracking=True) check_out = fields.Datetime(string='Check Out', tracking=True) approved_by = fields.Many2one( 'res.users', string='Approved By', tracking=True, domain=[('share', '=', False)], ) state = fields.Selection([ ('pending', 'Pending'), ('approved', 'Approved'), ('checked_in', 'Checked In'), ('checked_out', 'Checked Out'), ('rejected', 'Rejected'), ], string='Status', default='pending', required=True, tracking=True, index=True) company_id = fields.Many2one( 'res.company', string='Company', required=True, default=lambda self: self.env.company, index=True, ) # ── Workflow ────────────────────────────────────────────────────────────── def action_approve(self): for rec in self: rec.state = 'approved' rec.approved_by = self.env.user def action_reject(self): self.write({'state': 'rejected'}) def action_check_in(self): for rec in self: if rec.state != 'approved': raise ValidationError("Visitor must be approved before check-in.") rec.check_in = fields.Datetime.now() rec.state = 'checked_in' def action_check_out(self): for rec in self: if rec.state != 'checked_in': raise ValidationError("Visitor must be checked in before check-out.") rec.check_out = fields.Datetime.now() rec.state = 'checked_out' @api.constrains('check_in', 'check_out') def _check_times(self): for rec in self: if rec.check_in and rec.check_out and rec.check_out < rec.check_in: raise ValidationError('Check-out time cannot be before check-in time.') @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.visitor') or '/' ) return super().create(vals_list)