File: /var/www/html/dashboard.orbiwheels.com/app/Models/Booking.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Booking extends Model
{
protected $table = 'bookings';
protected $fillable = [
'customer_id',
'transporter_id',
'ride_type',
'booking_type',
'dates',
'times',
'locations',
'vehicle_preferred',
'no_of_passengers',
'base_rate_per_km',
'commission_per_km',
'gst_on_commission',
'total_customer_amount',
'tds_amount',
'net_payout_to_transporter',
'payment_status',
'status',
'is_draft',
];
protected $appends = ['booking_code'];
protected $casts = [
'dates' => 'array',
'times' => 'array',
'locations' => 'array',
];
public function rides()
{
return $this->hasMany(BookingRide::class, 'booking_id');
}
// public function trips()
// {
// return $this->hasMany(Trip::class, 'booking_id');
// }
public function customer()
{
return $this->belongsTo(Customer::class, 'customer_id');
}
public function transporter()
{
return $this->belongsTo(Transporter::class, 'transporter_id');
}
public function rideRequests()
{
return $this->hasMany(RideRequest::class, 'booking_id');
}
public function rideRequestsForTransporter()
{
return $this->hasMany(RideRequest::class, 'booking_id');
// ->where('transporter_id', auth('trans')->id());
}
public function trips()
{
return $this->hasMany(Trip::class, 'booking_id')->with('transporter');
}
// Booking status
const PENDING = 0;
const REQUESTED = 1;
const ACCEPTED = 2;
const CONFIRMED = 3;
const COMPLETED = 4;
const CANCELLED = 5;
const REJECTED = 6;
public static function statusList()
{
return [
self::PENDING => 'Pending',
self::REQUESTED => 'Requested',
self::ACCEPTED => 'Accepted',
self::CONFIRMED => 'Confirmed',
self::COMPLETED => 'Completed',
self::CANCELLED => 'Cancelled',
self::REJECTED => 'Rejected',
];
}
public function getStatusNameAttribute()
{
return self::statusList()[$this->status] ?? 'Unknown';
}
public function getBookingStatusAttribute()
{
$rides = $this->rides;
if ($rides->isEmpty()) {
return 'pending';
}
$statuses = $rides->pluck('status');
if ($statuses->every(fn($s) => $s == BookingRide::COMPLETED)) {
return 'completed';
}
if ($statuses->every(fn($s) => $s == BookingRide::PENDING)) {
return 'pending';
}
if ($statuses->every(fn($s) => $s == BookingRide::ASSIGNED)) {
return 'assigned';
}
if ($statuses->contains(fn($s) => $s == BookingRide::ONGOING)) {
return 'ongoing';
}
if ($statuses->contains(fn($s) => $s == BookingRide::ASSIGNED) && $statuses->contains(fn($s) => $s == BookingRide::PENDING)) {
return 'pending';
}
if ($statuses->contains(fn($s) => $s == BookingRide::COMPLETED) && !$statuses->every(fn($s) => $s == BookingRide::COMPLETED)) {
return 'in_progress';
}
if ($statuses->every(fn($s) => $s == BookingRide::CANCELLED)) {
return 'cancelled';
}
return 'pending';
}
public function getBookingCodeAttribute()
{
return 'ORBI' . str_pad($this->id, 6, '0', STR_PAD_LEFT);
}
const RIDE_OFFICE = 1;
const RIDE_RAILWAY = 2;
const RIDE_AIRPORT = 3;
const RIDE_BUS = 4;
const RIDE_OUTSTATION = 5;
const RIDE_CITYTOUR = 6;
public static function rideTypes()
{
return [
self::RIDE_OFFICE => 'Office',
self::RIDE_AIRPORT => 'Airport',
self::RIDE_RAILWAY => 'Railway',
self::RIDE_BUS => 'Bus',
self::RIDE_OUTSTATION => 'Outstation',
self::RIDE_CITYTOUR => 'City Tour',
];
}
public function getRideTypeNameAttribute()
{
return self::rideTypes()[$this->ride_type] ?? 'Unknown';
}
}