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/DataTables/Admin/BookingDataTable.php
<?php

namespace App\DataTables\Admin;

use App\Models\Booking;
use App\Models\Trip;
use Illuminate\Database\Eloquent\Builder as QueryBuilder;
use Yajra\DataTables\EloquentDataTable;
use Yajra\DataTables\Html\Builder as HtmlBuilder;
use Yajra\DataTables\Html\Button;
use Yajra\DataTables\Html\Column;
use Yajra\DataTables\Html\Editor\Editor;
use Yajra\DataTables\Html\Editor\Fields;
use Yajra\DataTables\Services\DataTable;

class BookingDataTable extends DataTable
{
    /**
     * Build the DataTable class.
     *
     * @param QueryBuilder<Booking> $query Results from query() method.
     */
    public function dataTable(QueryBuilder $query): EloquentDataTable
    {
        return (new EloquentDataTable($query))
            ->addIndexColumn()
            ->addColumn('booking_code', function ($row) {
                $url = route('admin.booking.view', encrypt($row->id));
                return '<a href="' . $url . '">' . e($row->booking_code) . '</a>';
            })
            ->addColumn('transporters', function ($row) {
                $names = $row->trips
                    ->filter(fn($t) => $t->transporter_id)
                    ->pluck('transporter.company_name')
                    ->unique()
                    ->implode(', ');

                return $names ?: '-';
            })
            ->addColumn('ride_type', function ($row) {
                return $row->ride_type_name; // single ride type
            })
            ->addColumn('booking_type', function ($row) {
                return $row->booking_type ? 'One Way' : 'Two Way';
            })



            ->addColumn('total_trips', function ($row) {
                return $row->trips_count;
            })
            ->addColumn('status', function ($row) {
                return match ($row->booking_status) {
                    'pending'    => '<span class="badge badge-warning text-white">Pending</span>',
                    'assigned'   => '<span class="badge badge-dark text-white">Assigned</span>',
                    'ongoing'    => '<span class="badge badge-info text-white">Ongoing</span>',
                    'completed'  => '<span class="badge badge-success text-white">Completed</span>',
                    'cancelled'  => '<span class="badge badge-danger text-white">Cancelled</span>',
                    'in_progress' => '<span class="badge badge-primary text-white">In Progress</span>',
                    default      => '<span class="badge badge-secondary text-white">Unknown</span>',
                };
            })

            ->addColumn('action', function ($row) {
                $assignBtn = '';

                if ($row->trips->count() > 0 && $row->trips->whereNull('transporter_id')->count() === $row->trips->count()) {
                    $assignBtn = '
                    <a href="javascript:void(0)" 
                        class="btn btn-success btn-sm assign-transporter" 
                        data-booking-id="' . $row->id . '" 
                        title="Assign Transporter">
                        <i class="fa fa-truck"></i>
                    </a>';
                }

                return '
            <div class="table-actions d-flex">
                <a href="' . route('admin.booking.view', encrypt($row->id)) . '" 
                    class="btn btn-primary btn-sm" title="View">
                    <i class="fa fa-eye"></i>
                </a>
                <a href="' . route('admin.booking.edit', $row->id) . '" 
                    class="btn btn-primary btn-sm" title="Edit">
                    <i class="fa fa-edit"></i>
                </a>
                ' . $assignBtn . '
            </div>';
            })
            ->rawColumns(['booking_code', 'transporters', 'status', 'action'])
            ->orderColumns(['booking_code', 'ride_type', 'booking_type', 'total_trips', 'status'], false);
    }


    /**
     * Get query source of dataTable.
     *
     * @return QueryBuilder<Trip>
     */
    public function query(\App\Models\Booking $model): QueryBuilder
    {
        return $model->newQuery()
            ->with(['trips.transporter'])
            ->withCount('trips')
            ->select('bookings.*');


        if (request()->filled('status')) {
            $query->where('status', request('status'));
        }
        if (request()->filled('booking_type')) {
            $query->where('booking_type', request('booking_type'));
        }
        if (request()->filled('ride_type')) {
            $query->whereHas('trips', function ($q) {
                $q->where('ride_type', request('ride_type'));
            });
        }

        if (request()->filled('from_date') && request()->filled('to_date')) {
            $query->where(function ($q) {
                $q->whereBetween('dates->from_date', [request('from_date'), request('to_date')])
                    ->orWhereBetween('dates->to_date', [request('from_date'), request('to_date')]);
            });
        }

        return $query;
    }



    /**
     * Optional method if you want to use the html builder.
     */
    public function html(): HtmlBuilder
    {
        return $this->builder()
            ->setTableId('booking-table')
            ->setTableAttribute('data-namespace', 'booking-table')
            ->setTableAttribute('class', 'table table-striped table-bordered dt-responsive nowrap jambo_table bulk_action')
            ->columns($this->getColumns())
            // ->minifiedAjax(route('admin.booking.index', [], true))
            ->ajax([
                'url' => route('admin.booking.index'),
                'data' => 'function(d) {
                d.status = $("#status").val();
                d.booking_type = $("#booking_type").val();
                d.ride_type = $("#ride_type_filter").val();
                d.from_date = $("#from_date").val();
                d.to_date = $("#to_date").val();
            }',
            ])
            ->orderBy(1)
            ->selectStyleSingle()
            ->responsive(true)
            ->autoWidth(false)
            ->buttons([
                // Button::make('excel'),
                // Button::make('csv'),
                // Button::make('pdf'),
                // Button::make('print'),
                // Button::make('reset'),
                // Button::make('reload')
            ]);
    }

    /**
     * Get the dataTable columns definition.
     */
    public function getColumns(): array
    {
        return [
            Column::computed('control')
                ->title('')
                ->exportable(false)
                ->printable(false)
                ->width(30)
                ->addClass('control')
                ->orderable(false)
                ->searchable(false)
                ->data('control')
                ->defaultContent(''),
            Column::make('transporters')->title('Transporter')->orderable(false)->addClass('none'),
            Column::make('booking_code')->title('Booking Code')->addClass('all'),
            Column::make('ride_type')->title('Ride Type')->addClass('all'),
            Column::make('booking_type')->title('Booking Type'),
            // Column::make('total_trips')->title('Total Trips')->addClass('none'),
            // Column::make('no_of_passengers')->title('Passenger')->addClass('none'),
            Column::make('status')->title('Status')->addClass('all'),
            Column::computed('action')
                ->exportable(false)
                ->printable(false)
                ->width(120)
                ->addClass('text-center all'),
        ];
    }

    /**
     * Get the filename for export.
     */
    protected function filename(): string
    {
        return 'Booking_' . date('YmdHis');
    }
}