# pyrefly: ignore [missing-import] from odoo import api, fields, models # pyrefly: ignore [missing-import] from odoo.exceptions import ValidationError class EducationTransportTrip(models.Model): _name = 'education.transport.trip' _description = 'Transport Trip' _inherit = ['mail.thread', 'mail.activity.mixin'] name = fields.Char(string='Reference', required=True, copy=False, readonly=True, default=lambda self: self.env['ir.sequence'].next_by_code('education.transport.trip') or '/') route_id = fields.Many2one('education.transport.route', string='Route', required=True, tracking=True) vehicle_id = fields.Many2one('education.transport.vehicle', string='Vehicle', required=True, tracking=True) driver_id = fields.Many2one('education.transport.driver', string='Driver', required=True, tracking=True) trip_date = fields.Date(string='Trip Date', required=True, default=fields.Date.context_today, tracking=True) trip_type = fields.Selection([ ('pickup', 'Pickup'), ('drop', 'Drop') ], string='Trip Type', required=True, tracking=True) start_time = fields.Datetime(string='Start Time', tracking=True) end_time = fields.Datetime(string='End Time', tracking=True) state = fields.Selection([ ('scheduled', 'Scheduled'), ('started', 'Started'), ('completed', 'Completed'), ('cancelled', 'Cancelled') ], string='Status', default='scheduled', required=True, tracking=True) company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.company) @api.constrains('vehicle_id', 'trip_date', 'trip_type', 'state') def _check_overlapping_trips(self): for rec in self: if rec.state in ['scheduled', 'started']: overlapping = self.env['education.transport.trip'].search([ ('vehicle_id', '=', rec.vehicle_id.id), ('trip_date', '=', rec.trip_date), ('trip_type', '=', rec.trip_type), ('state', 'in', ['scheduled', 'started']), ('id', '!=', rec.id) ]) if overlapping: raise ValidationError('Vehicle is already assigned to a trip of this type on this date!') @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.transport.trip') or '/' return super().create(vals_list) def action_start(self): for rec in self: rec.state = 'started' rec.start_time = fields.Datetime.now() def action_complete(self): for rec in self: rec.state = 'completed' rec.end_time = fields.Datetime.now() def action_cancel(self): for rec in self: rec.state = 'cancelled'