diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index f5b135d..0a6e52d 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -41,256 +41,515 @@ class ReportsController extends Controller UserLogs::insert(Auth::user()->id, $log); return view('menu_v1.reports.vehicle_trips', $data); } - public function api_report_vehicle_trips_list(Request $req) - { - // $TIMEFIX = Helper::TIMEFIX; - // Validate input - // date in unix datetime format - // dd($req->type); - $rules = [ - // 'from_date' => 'required|date', - // 'to_date' => 'required|date|after_or_equal:from_date', - 'type' => 'nullable|in:report,list', // enum "report", "list". nullable default "list" - ]; + // public function api_report_vehicle_trips_list(Request $req) + // { + // // $TIMEFIX = Helper::TIMEFIX; + // // Validate input + // // date in unix datetime format + // // dd($req->type); + // $rules = [ + // // 'from_date' => 'required|date', + // // 'to_date' => 'required|date|after_or_equal:from_date', + // 'type' => 'nullable|in:report,list', // enum "report", "list". nullable default "list" + // ]; - $isValidInput = Validator::make($req->all(), $rules); - if (!$isValidInput->passes()) { - $apiResp = Responses::bad_input($isValidInput->messages()->first()); - return new Response($apiResp, $apiResp["meta"]["code"]); - } + // $isValidInput = Validator::make($req->all(), $rules); + // if (!$isValidInput->passes()) { + // $apiResp = Responses::bad_input($isValidInput->messages()->first()); + // return new Response($apiResp, $apiResp["meta"]["code"]); + // } - // $from_date = $req->input('from_date'); - // $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'); - $vt = $req->input('vt'); - $poolcode = $req->input('poolcode'); - // $from_date = 1756054800; - // $to_date = 1756745940; + // // $from_date = $req->input('from_date'); + // // $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'); + // $vt = $req->input('vt'); + // $poolcode = $req->input('poolcode'); + // // $from_date = 1756054800; + // // $to_date = 1756745940; - // get month year - $date = Carbon::createFromTimestamp($from_date); - $yymm = $date->format('ym'); + // // get month year + // $date = Carbon::createFromTimestamp($from_date); + // $yymm = $date->format('ym'); - try { - // $list = DB::select("WITH - // gaps AS ( - // SELECT - // -- previous gap since previous row > 1 hour (3600s) - // CASE - // WHEN (crt_d - LAG(crt_d, 1, NULL) OVER (PARTITION BY vhc_id ORDER BY crt_d)) > 3600 - // THEN 1 ELSE 0 - // END AS isStop, - // t.* - // FROM tracks_2509 t - // WHERE - // t.latitude IS NOT NULL - // AND t.longitude IS NOT NULL - // AND t.action = 'location' - // AND t.crt_d BETWEEN ? AND ? - // ) - // , trips AS ( - // SELECT - // -- mark the start of a trip when ignition=4 and previous ignition <> 4 - // CASE - // WHEN ignition = 4 - // AND LAG(ignition, 1, 0) OVER (PARTITION BY vhc_id ORDER BY crt_d) <> 4 - // or LAG(isStop, 1, 0) over (PARTITION BY vhc_id ORDER BY crt_d) = 1 - // THEN 1 ELSE 0 - // END AS trip_start, - // g.* - // FROM gaps g - // ) - // , numbered AS ( - // SELECT - // *, - // -- assign a trip_id by cumulative sum of trip_start - // SUM(trip_start) OVER (PARTITION BY vhc_id ORDER BY crt_d) AS trip_id - // FROM trips - // where - // ignition = 4 - // and isStop = 0 - // ), - // agg AS ( - // SELECT - // COUNT(*) AS row_count, - // v.name, - // v.nopol1, - // vhc_id, - // -- trip_id, - // ROW_NUMBER() OVER (PARTITION BY v.id ORDER BY MIN(a.crt_d)) AS trip_id, - // SUM(pre_milleage) AS mileage, - // MIN(a.crt_d) AS start, - // MAX(a.crt_d) AS finish, - // MIN(a.vhc_milleage) AS startMileage, - // MAX(a.vhc_milleage) AS finishMileage, - // (SELECT fulladdress FROM t_gps_tracks_address WHERE master_id = MIN(a.id) LIMIT 1) AS startLoc, - // (SELECT fulladdress FROM t_gps_tracks_address WHERE master_id = MAX(a.id) LIMIT 1) AS finishLoc - // FROM t_vehicles v - // LEFT JOIN numbered a ON a.vhc_id = v.id - // WHERE - // v.dlt is null and trip_id != 0 - // and if(? , v.id = ? , 1=1) - // GROUP BY v.id, a.trip_id - // HAVING COUNT(*) > 1 - // ) - // SELECT - // *, - // SUM(mileage) OVER (PARTITION BY agg.id) AS total_mileage, - // COUNT(trip_id) OVER (PARTITION BY agg.id) AS total_trip, - // tvd.pool_code, tvd.dc_code - // FROM agg agg - // join t_vehicles_detail tvd on tvd.vid = agg.vhc_id - // ORDER BY agg.id, trip_id - // ", [$from_date, $to_date, $vid, $vid]); + // try { + // // $list = DB::select("WITH + // // gaps AS ( + // // SELECT + // // -- previous gap since previous row > 1 hour (3600s) + // // CASE + // // WHEN (crt_d - LAG(crt_d, 1, NULL) OVER (PARTITION BY vhc_id ORDER BY crt_d)) > 3600 + // // THEN 1 ELSE 0 + // // END AS isStop, + // // t.* + // // FROM tracks_2509 t + // // WHERE + // // t.latitude IS NOT NULL + // // AND t.longitude IS NOT NULL + // // AND t.action = 'location' + // // AND t.crt_d BETWEEN ? AND ? + // // ) + // // , trips AS ( + // // SELECT + // // -- mark the start of a trip when ignition=4 and previous ignition <> 4 + // // CASE + // // WHEN ignition = 4 + // // AND LAG(ignition, 1, 0) OVER (PARTITION BY vhc_id ORDER BY crt_d) <> 4 + // // or LAG(isStop, 1, 0) over (PARTITION BY vhc_id ORDER BY crt_d) = 1 + // // THEN 1 ELSE 0 + // // END AS trip_start, + // // g.* + // // FROM gaps g + // // ) + // // , numbered AS ( + // // SELECT + // // *, + // // -- assign a trip_id by cumulative sum of trip_start + // // SUM(trip_start) OVER (PARTITION BY vhc_id ORDER BY crt_d) AS trip_id + // // FROM trips + // // where + // // ignition = 4 + // // and isStop = 0 + // // ), + // // agg AS ( + // // SELECT + // // COUNT(*) AS row_count, + // // v.name, + // // v.nopol1, + // // vhc_id, + // // -- trip_id, + // // ROW_NUMBER() OVER (PARTITION BY v.id ORDER BY MIN(a.crt_d)) AS trip_id, + // // SUM(pre_milleage) AS mileage, + // // MIN(a.crt_d) AS start, + // // MAX(a.crt_d) AS finish, + // // MIN(a.vhc_milleage) AS startMileage, + // // MAX(a.vhc_milleage) AS finishMileage, + // // (SELECT fulladdress FROM t_gps_tracks_address WHERE master_id = MIN(a.id) LIMIT 1) AS startLoc, + // // (SELECT fulladdress FROM t_gps_tracks_address WHERE master_id = MAX(a.id) LIMIT 1) AS finishLoc + // // FROM t_vehicles v + // // LEFT JOIN numbered a ON a.vhc_id = v.id + // // WHERE + // // v.dlt is null and trip_id != 0 + // // and if(? , v.id = ? , 1=1) + // // GROUP BY v.id, a.trip_id + // // HAVING COUNT(*) > 1 + // // ) + // // SELECT + // // *, + // // SUM(mileage) OVER (PARTITION BY agg.id) AS total_mileage, + // // COUNT(trip_id) OVER (PARTITION BY agg.id) AS total_trip, + // // tvd.pool_code, tvd.dc_code + // // FROM agg agg + // // join t_vehicles_detail tvd on tvd.vid = agg.vhc_id + // // ORDER BY agg.id, trip_id + // // ", [$from_date, $to_date, $vid, $vid]); - // $list = DB::select("WITH TotalMileage AS ( - // SELECT id, SUM(mileage) AS total_mileage, count(*) total_trip - // FROM trips - // WHERE start BETWEEN ? AND ? - // GROUP BY id - // ) - // SELECT - // t.*, - // tm.total_mileage, 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 if(? , t.id = ? , 1=1) - // 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]); - $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 = ?); - "; + // // $list = DB::select("WITH TotalMileage AS ( + // // SELECT id, SUM(mileage) AS total_mileage, count(*) total_trip + // // FROM trips + // // WHERE start BETWEEN ? AND ? + // // GROUP BY id + // // ) + // // SELECT + // // t.*, + // // tm.total_mileage, 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 if(? , t.id = ? , 1=1) + // // 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]); + // $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 = ?); + // "; - $vid = $vid ?: null; - $vt = $vt ?: null; - $poolcode = $poolcode ?: null; + // $vid = $vid ?: null; + // $vt = $vt ?: null; + // $poolcode = $poolcode ?: null; - $list = DB::select($sql, [ - $from_date, - $to_date, - $from_date, - $to_date, - $vid, - $vid, - $vt, - $vt, - $poolcode, - $poolcode, - ]); - // // RETURN 1 - LIST - // if($req->type != 'report'){ - $apiResp = Responses::success("success list vehicles report"); - $apiResp["data"] = $list; - return new Response($apiResp, $apiResp["meta"]["code"]); - // } + // $list = DB::select($sql, [ + // $from_date, + // $to_date, + // $from_date, + // $to_date, + // $vid, + // $vid, + // $vt, + // $vt, + // $poolcode, + // $poolcode, + // ]); + // // // RETURN 1 - LIST + // // if($req->type != 'report'){ + // $apiResp = Responses::success("success list vehicles report"); + // $apiResp["data"] = $list; + // return new Response($apiResp, $apiResp["meta"]["code"]); + // // } - // // RETURN 2 - REPORT - // if($req->type == 'report'){ - // $headings = ['Name', 'License Plate', 'Number of Trip', 'Total Mileage']; + // // // RETURN 2 - REPORT + // // if($req->type == 'report'){ + // // $headings = ['Name', 'License Plate', 'Number of Trip', 'Total Mileage']; - // $export = new class($list, $headings) implements FromArray, WithHeadings { - // private $list; - // private $headings; + // // $export = new class($list, $headings) implements FromArray, WithHeadings { + // // private $list; + // // private $headings; - // public function __construct($list, $headings) - // { - // $this->list = $list; - // $this->headings = $headings; - // } + // // public function __construct($list, $headings) + // // { + // // $this->list = $list; + // // $this->headings = $headings; + // // } - // public function array(): array - // { - // return array_map(function ($item) { - // return [ - // $item->name, - // $item->nopol1, - // $item->numOfTrip, - // $item->total_milleage, - // ]; - // }, $this->list); - // } + // // public function array(): array + // // { + // // return array_map(function ($item) { + // // return [ + // // $item->name, + // // $item->nopol1, + // // $item->numOfTrip, + // // $item->total_milleage, + // // ]; + // // }, $this->list); + // // } - // public function headings(): array - // { - // return $this->headings; - // } + // // public function headings(): array + // // { + // // return $this->headings; + // // } - // // Start table from A3 - // public function startCell(): string - // { - // return 'A3'; - // } + // // // Start table from A3 + // // public function startCell(): string + // // { + // // return 'A3'; + // // } - // // Add title & border styling - // public function styles(Worksheet $sheet) - // { - // $tgl0 = date('d-m-Y', $GLOBALS['from_date']); - // $tgl1 = date('d-m-Y', $GLOBALS['to_date']); + // // // Add title & border styling + // // public function styles(Worksheet $sheet) + // // { + // // $tgl0 = date('d-m-Y', $GLOBALS['from_date']); + // // $tgl1 = date('d-m-Y', $GLOBALS['to_date']); - // // Title in A1 - // $sheet->setCellValue('A1', 'Vehicle Trip Report $tgl0 until $tgl1'); - // $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16); - // $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); - // $sheet->mergeCells('A1:D1'); // Merge across 4 columns + // // // Title in A1 + // // $sheet->setCellValue('A1', 'Vehicle Trip Report $tgl0 until $tgl1'); + // // $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16); + // // $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); + // // $sheet->mergeCells('A1:D1'); // Merge across 4 columns - // // Get last row - // $lastRow = $this->list->count() + 3; // 3 = heading row - // $range = "A3:D{$lastRow}"; + // // // Get last row + // // $lastRow = $this->list->count() + 3; // 3 = heading row + // // $range = "A3:D{$lastRow}"; - // // Add borders - // $sheet->getStyle($range)->getBorders()->getAllBorders() - // ->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); + // // // Add borders + // // $sheet->getStyle($range)->getBorders()->getAllBorders() + // // ->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); - // // Bold headings - // $sheet->getStyle('A3:D3')->getFont()->setBold(true); + // // // Bold headings + // // $sheet->getStyle('A3:D3')->getFont()->setBold(true); - // return []; - // } - // }; + // // return []; + // // } + // // }; - // return Excel::download($export, 'trip_report.xlsx'); - // } - } catch (\Exception $e) { - $apiResp = Responses::error($e->getMessage()); - return new Response($apiResp, $apiResp["meta"]["code"]); - // return Responses::json(Responses::SERVER_ERROR, 'An error occurred while generating the report.', (object)[]); - } + // // return Excel::download($export, 'trip_report.xlsx'); + // // } + // } catch (\Exception $e) { + // $apiResp = Responses::error($e->getMessage()); + // return new Response($apiResp, $apiResp["meta"]["code"]); + // // return Responses::json(Responses::SERVER_ERROR, 'An error occurred while generating the report.', (object)[]); + // } + // } + +public function api_report_vehicle_trips_list(Request $req) +{ + // $TIMEFIX = Helper::TIMEFIX; + // Validate input + // date in unix datetime format + // dd($req->type); + $rules = [ + // 'from_date' => 'required|date', + // 'to_date' => 'required|date|after_or_equal:from_date', + 'type' => 'nullable|in:report,list', // enum "report", "list". nullable default "list" + ]; + + $isValidInput = Validator::make($req->all(), $rules); + if (!$isValidInput->passes()) { + $apiResp = Responses::bad_input($isValidInput->messages()->first()); + return new Response($apiResp, $apiResp["meta"]["code"]); } + + // $from_date = $req->input('from_date'); + // $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'); + $vt = $req->input('vt'); + $poolcode = $req->input('poolcode'); + // $from_date = 1756054800; + // $to_date = 1756745940; + + // get month year + $date = Carbon::createFromTimestamp($from_date); + $yymm = $date->format('ym'); + + try { + // $list = DB::select("WITH + // gaps AS ( + // SELECT + // -- previous gap since previous row > 1 hour (3600s) + // CASE + // WHEN (crt_d - LAG(crt_d, 1, NULL) OVER (PARTITION BY vhc_id ORDER BY crt_d)) > 3600 + // THEN 1 ELSE 0 + // END AS isStop, + // t.* + // FROM tracks_2509 t + // WHERE + // t.latitude IS NOT NULL + // AND t.longitude IS NOT NULL + // AND t.action = 'location' + // AND t.crt_d BETWEEN ? AND ? + // ) + // , trips AS ( + // SELECT + // -- mark the start of a trip when ignition=4 and previous ignition <> 4 + // CASE + // WHEN ignition = 4 + // AND LAG(ignition, 1, 0) OVER (PARTITION BY vhc_id ORDER BY crt_d) <> 4 + // or LAG(isStop, 1, 0) over (PARTITION BY vhc_id ORDER BY crt_d) = 1 + // THEN 1 ELSE 0 + // END AS trip_start, + // g.* + // FROM gaps g + // ) + // , numbered AS ( + // SELECT + // *, + // -- assign a trip_id by cumulative sum of trip_start + // SUM(trip_start) OVER (PARTITION BY vhc_id ORDER BY crt_d) AS trip_id + // FROM trips + // where + // ignition = 4 + // and isStop = 0 + // ), + // agg AS ( + // SELECT + // COUNT(*) AS row_count, + // v.name, + // v.nopol1, + // vhc_id, + // -- trip_id, + // ROW_NUMBER() OVER (PARTITION BY v.id ORDER BY MIN(a.crt_d)) AS trip_id, + // SUM(pre_milleage) AS mileage, + // MIN(a.crt_d) AS start, + // MAX(a.crt_d) AS finish, + // MIN(a.vhc_milleage) AS startMileage, + // MAX(a.vhc_milleage) AS finishMileage, + // (SELECT fulladdress FROM t_gps_tracks_address WHERE master_id = MIN(a.id) LIMIT 1) AS startLoc, + // (SELECT fulladdress FROM t_gps_tracks_address WHERE master_id = MAX(a.id) LIMIT 1) AS finishLoc + // FROM t_vehicles v + // LEFT JOIN numbered a ON a.vhc_id = v.id + // WHERE + // v.dlt is null and trip_id != 0 + // and if(? , v.id = ? , 1=1) + // GROUP BY v.id, a.trip_id + // HAVING COUNT(*) > 1 + // ) + // SELECT + // *, + // SUM(mileage) OVER (PARTITION BY agg.id) AS total_mileage, + // COUNT(trip_id) OVER (PARTITION BY agg.id) AS total_trip, + // tvd.pool_code, tvd.dc_code + // FROM agg agg + // join t_vehicles_detail tvd on tvd.vid = agg.vhc_id + // ORDER BY agg.id, trip_id + // ", [$from_date, $to_date, $vid, $vid]); + + // $list = DB::select("WITH TotalMileage AS ( + // SELECT id, SUM(mileage) AS total_mileage, count(*) total_trip + // FROM trips + // WHERE start BETWEEN ? AND ? + // GROUP BY id + // ) + // SELECT + // t.*, + // tm.total_mileage, 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 if(? , t.id = ? , 1=1) + // 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]); + + $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 = ?); + "; + + $vid = $vid ?: null; + $vt = $vt ?: null; + $poolcode = $poolcode ?: null; + + $list = DB::select($sql, [ + $from_date, + $to_date, + $from_date, + $to_date, + $vid, + $vid, + $vt, + $vt, + $poolcode, + $poolcode, + ]); + + /** + * ========================================================== + * GET LAST GPS POSITION FOR EACH VEHICLE + * ========================================================== + */ + $vehicleIds = collect($list) + ->pluck('vhc_id') + ->filter() + ->unique() + ->values() + ->toArray(); + + if (!empty($vehicleIds)) { + + $placeholders = implode(',', array_fill(0, count($vehicleIds), '?')); + + $gpsSql = " + SELECT + gt.vhc_id, + gt.latitude, + gt.longitude, + gt.speed, + gt.crt_d, + tgta.fulladdress + FROM t_gps_tracks gt + LEFT JOIN t_gps_tracks_address tgta + ON tgta.master_id = gt.id + INNER JOIN ( + SELECT + vhc_id, + MAX(crt_d) AS last_crt_d + FROM t_gps_tracks + WHERE + action = 'location' + AND latitude IS NOT NULL + AND longitude IS NOT NULL + AND crt_d BETWEEN ? AND ? + AND vhc_id IN ($placeholders) + GROUP BY vhc_id + ) latest + ON latest.vhc_id = gt.vhc_id + AND latest.last_crt_d = gt.crt_d + "; + + $gpsParams = array_merge( + [$from_date, $to_date], + $vehicleIds + ); + + $gpsList = DB::select($gpsSql, $gpsParams); + + $gpsByVehicle = collect($gpsList)->keyBy('vhc_id'); + + foreach ($list as &$item) { + + $gps = $gpsByVehicle->get($item->vhc_id); + + $item->latitude = $gps->latitude ?? null; + $item->longitude = $gps->longitude ?? null; + $item->speed = $gps->speed ?? null; + $item->fulladdress = $gps->fulladdress ?? null; + $item->gps_time = $gps->crt_d ?? null; + } + + unset($item); + } + + // // RETURN 1 - LIST + // if($req->type != 'report'){ + $apiResp = Responses::success("success list vehicles report"); + $apiResp["data"] = $list; + return new Response($apiResp, $apiResp["meta"]["code"]); + // } + + // // RETURN 2 - REPORT + // if($req->type == 'report'){ + // ... + // } + } catch (\Exception $e) { + $apiResp = Responses::error($e->getMessage()); + return new Response($apiResp, $apiResp["meta"]["code"]); + // return Responses::json(Responses::SERVER_ERROR, 'An error occurred while generating the report.', (object)[]); + } +} + public function view_report_trip_detail(Request $req) { $vid = $req->vid; diff --git a/resources/views/menu_v1/reports/vehicle_trips.blade.php b/resources/views/menu_v1/reports/vehicle_trips.blade.php index 3a938e5..2717189 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 {{--