2026-09-25 18:00:58 +05:30

69 lines
3.0 KiB
Python

# 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'