*/ use HasFactory, LogsActivity, SoftDeletes; /** * Audit trail on status transitions and driver/vehicle assignment only — * not every column (domain.md §6, §5a; T6.2). */ public function getActivitylogOptions(): LogOptions { return LogOptions::defaults() ->logOnly(['status', 'driver_name', 'driver_phone', 'car_plate_number', 'car_model']) ->logOnlyDirty() ->dontLogEmptyChanges() ->useLogName('booking'); } /** * @var list */ protected $fillable = [ 'booking_ref', 'user_id', 'openid', 'ev_route_id', 'departure_time_slot_id', 'travel_date', 'passenger_name', 'passenger_phone', 'pickup_address', 'pickup_lat', 'pickup_lng', 'dropoff_address', 'dropoff_lat', 'dropoff_lng', 'price', 'status', 'is_round_trip', 'return_travel_date', 'created_by_channel', 'driver_name', 'driver_phone', 'car_plate_number', 'car_model', ]; /** * @return array */ protected function casts(): array { return [ 'travel_date' => 'date', 'pickup_lat' => 'decimal:7', 'pickup_lng' => 'decimal:7', 'dropoff_lat' => 'decimal:7', 'dropoff_lng' => 'decimal:7', 'price' => 'decimal:2', 'status' => BookingStatus::class, 'is_round_trip' => 'boolean', 'return_travel_date' => 'date', 'created_by_channel' => BookingChannel::class, ]; } public function user(): BelongsTo { return $this->belongsTo(User::class); } public function route(): BelongsTo { return $this->belongsTo(EvRoute::class, 'ev_route_id'); } public function timeSlot(): BelongsTo { return $this->belongsTo(DepartureTimeSlot::class, 'departure_time_slot_id'); } public function vehicleOptions(): HasMany { return $this->hasMany(BookingVehicleOption::class); } public function payments(): HasMany { return $this->hasMany(Payment::class); } }