diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 388e0fc..98bae95 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -63,12 +63,24 @@ class ReportsController extends Controller // $to_date = $req->input('to_date'); $from_date = $req->input('from_date') - Helper::TIMEFIX; $to_date = $req->input('to_date') - Helper::TIMEFIX; - $vid = $req->input('vid'); + + // vid sekarang bisa berupa multiple value (dari select2 multiple di FE) + // bisa datang sebagai array (vid[]=1&vid[]=2) atau string comma-separated ("1,2,3") + $vidInput = $req->input('vid'); $vt = $req->input('vt'); $poolcode = $req->input('poolcode'); // $from_date = 1756054800; // $to_date = 1756745940; + // Normalisasi $vid jadi array of int, buang value kosong (mis. opsi "-- All --") + $vidArr = []; + if (is_array($vidInput)) { + $vidArr = array_filter($vidInput, fn($v) => $v !== null && $v !== ''); + } elseif (!empty($vidInput)) { + $vidArr = array_filter(explode(',', $vidInput), fn($v) => $v !== ''); + } + $vidArr = array_values($vidArr); + // get month year $date = Carbon::createFromTimestamp($from_date); $yymm = $date->format('ym'); @@ -166,52 +178,70 @@ class ReportsController extends Controller // and if(? , vt.id = ? , 1=1) // and if(? , t.pool_code = ? , 1=1) // ", [$from_date, $to_date, $from_date, $to_date, $vid, $vid, $vt, $vt, $poolcode, $poolcode]); + + // Bangun klausa IN untuk vid secara dinamis (jumlah placeholder = jumlah item terpilih) + // kalau kosong -> tidak difilter (1=1) + if (count($vidArr) > 0) { + $vidPlaceholders = implode(',', array_fill(0, count($vidArr), '?')); + $vidCondition = "t.id IN ($vidPlaceholders)"; + } else { + $vidCondition = "1=1"; + } + $sql = "WITH TotalMileage AS ( - SELECT - id, - SUM(mileage) AS total_mileage, - COUNT(*) AS total_trip - FROM trips - WHERE start BETWEEN ? AND ? - GROUP BY id - ) SELECT - t.*, - tm.total_mileage, - tm.total_trip, - vt.name AS type_name, - ROW_NUMBER() OVER ( - PARTITION BY t.id - ORDER BY t.start - ) AS trip_id - FROM trips t - JOIN TotalMileage tm ON t.id = tm.id - LEFT JOIN t_vehicles tvt ON tvt.id = t.vhc_id - LEFT JOIN t_vehicles_cats vt ON vt.id = tvt.cat_id - WHERE - t.start BETWEEN ? AND ? - AND (? IS NULL OR t.id = ?) - AND (? IS NULL OR vt.id = ?) - AND (? IS NULL OR t.pool_code = ?); - "; + id, + SUM(mileage) AS total_mileage, + COUNT(*) AS total_trip + FROM trips + WHERE start BETWEEN ? AND ? + GROUP BY id + ) + SELECT + t.*, + tm.total_mileage, + tm.total_trip, + vt.name AS type_name, + ROW_NUMBER() OVER ( + PARTITION BY t.id + ORDER BY t.start + ) AS trip_id + FROM trips t + JOIN TotalMileage tm ON t.id = tm.id + LEFT JOIN t_vehicles tvt ON tvt.id = t.vhc_id + LEFT JOIN t_vehicles_cats vt ON vt.id = tvt.cat_id + WHERE + t.start BETWEEN ? AND ? + AND {$vidCondition} + AND (? IS NULL OR vt.id = ?) + AND (? IS NULL OR t.pool_code = ?); + "; - $vid = $vid ?: null; $vt = $vt ?: null; $poolcode = $poolcode ?: null; - $list = DB::select($sql, [ + $bindings = [ $from_date, $to_date, $from_date, $to_date, - $vid, - $vid, + ]; + + // masukkan binding untuk IN(...) hanya kalau ada isinya + if (count($vidArr) > 0) { + $bindings = array_merge($bindings, $vidArr); + } + + $bindings = array_merge($bindings, [ $vt, $vt, $poolcode, $poolcode, ]); + + $list = DB::select($sql, $bindings); + // // RETURN 1 - LIST // if($req->type != 'report'){ $apiResp = Responses::success("success list vehicles report"); diff --git a/resources/views/menu_v1/reports/vehicle_trips.blade.php b/resources/views/menu_v1/reports/vehicle_trips.blade.php index 5e64c4a..3011ca2 100644 --- a/resources/views/menu_v1/reports/vehicle_trips.blade.php +++ b/resources/views/menu_v1/reports/vehicle_trips.blade.php @@ -25,8 +25,8 @@ @if ($user_role == \App\Models\Users::ROLE_VENDOR || $user_role == \App\Models\Users::ROLE_ADMIN) @can('vehicle.create') + + --> @endcan {{--