69 lines
3.0 KiB
Python
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'
|