HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ip-172-26-0-120 6.17.0-1009-aws #9~24.04.2-Ubuntu SMP Fri Mar 6 23:50:29 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
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';
    }
}