diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 398653a..e69330f 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -16,240 +16,248 @@ use App\Models\UserLogs; use Illuminate\Support\Facades\Crypt; use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Support\Facades\Log; +use App\Models\ConfTruckTypes; class ReportsController extends Controller { - public function view_report_vehicle_trips(Request $req) - { - $q = "SELECT id, nopol1 from t_vehicles WHERE dlt is null order by nopol1"; - $listNopol = DB::select($q); + public function view_report_vehicle_trips(Request $req) + { + $q = "SELECT id, nopol1 from t_vehicles WHERE dlt is null order by nopol1"; + $vehicletype = DB::table('t_vehicles_types')->where('is_active', 1)->get(); + $listNopol = DB::select($q); - $data = [ - 'listNopol' => $listNopol, - ]; + $data = [ + 'listNopol' => $listNopol, + 'vehicletype' => $vehicletype + ]; - $log = [ - "module" => "Vehicle Trips Report", - "action" => "View", - "desc" => "Open Vehicle Trips Report menu", - ]; - 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" - ]; + $log = [ + "module" => "Vehicle Trips Report", + "action" => "View", + "desc" => "Open Vehicle Trips Report menu", + ]; + 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" + ]; - $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'); - // $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'); + // $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, - 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 - WHERE - t.start BETWEEN ? AND ? - and if(? , t.id = ? , 1=1) - ", [$from_date, $to_date, $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_types vt ON vt.id = tvt.type_id + WHERE + t.start BETWEEN ? AND ? + and if(? , t.id = ? , 1=1) + and if(? , vt.id = ? , 1=1) + ", [$from_date, $to_date, $from_date, $to_date, $vid, $vid, $vt, $vt]); - // // 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 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)[]); - } - } - public function view_report_trip_detail(Request $req) - { - $vid = $req->vid; - $tgl0 = $req->tgl0; - $tgl1 = $req->tgl1; - $nopol1 = $req->nopol1; + // 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 view_report_trip_detail(Request $req) + { + $vid = $req->vid; + $tgl0 = $req->tgl0; + $tgl1 = $req->tgl1; + $nopol1 = $req->nopol1; - $d = [$vid, $tgl0, $tgl1]; - $list = DB::select("SELECT + $d = [$vid, $tgl0, $tgl1]; + $list = DB::select("SELECT t.crt_d , t.latitude, t.longitude, t.speed, tgta.fulladdress, t.pre_milleage, t.vhc_milleage, fuel_count - FROM + FROM t_gps_tracks t - left join t_gps_tracks_address tgta on tgta.master_id = t.id - WHERE + left join t_gps_tracks_address tgta on tgta.master_id = t.id + WHERE t.vhc_id = ? and t.latitude IS NOT NULL AND t.longitude IS NOT NULL @@ -258,167 +266,167 @@ class ReportsController extends Controller ORDER BY t.crt_d asc ", $d); - $start = [ - 'time' => $list[0]->crt_d, - 'fulladdress' => urldecode($list[0]->fulladdress), - 'mileage' => $list[0]->vhc_milleage, - ]; - $finish = [ - 'time' => $list[count($list) - 1]->crt_d, - 'fulladdress' => urldecode($list[count($list) - 1]->fulladdress), - 'mileage' => $list[count($list) - 1]->vhc_milleage, - ]; + $start = [ + 'time' => $list[0]->crt_d, + 'fulladdress' => urldecode($list[0]->fulladdress), + 'mileage' => $list[0]->vhc_milleage, + ]; + $finish = [ + 'time' => $list[count($list) - 1]->crt_d, + 'fulladdress' => urldecode($list[count($list) - 1]->fulladdress), + 'mileage' => $list[count($list) - 1]->vhc_milleage, + ]; - $t0 = Carbon::createFromTimestamp($list[0]->crt_d); - $t1 = Carbon::createFromTimestamp($list[count($list) - 1]->crt_d); - $diff = $t1->diff($t0); - $hours = $diff->h + ($diff->days * 24); // include days converted to hours - $minutes = $diff->i; - $duration = "{$hours} hour" . ($hours > 1 ? 's' : '') . " {$minutes} minute" . ($minutes > 1 ? 's' : ''); + $t0 = Carbon::createFromTimestamp($list[0]->crt_d); + $t1 = Carbon::createFromTimestamp($list[count($list) - 1]->crt_d); + $diff = $t1->diff($t0); + $hours = $diff->h + ($diff->days * 24); // include days converted to hours + $minutes = $diff->i; + $duration = "{$hours} hour" . ($hours > 1 ? 's' : '') . " {$minutes} minute" . ($minutes > 1 ? 's' : ''); - $distance = $list[count($list) - 1]->vhc_milleage - $list[0]->vhc_milleage; - $fuel_consumed = $list[count($list) - 1]->fuel_count - $list[0]->fuel_count; + $distance = $list[count($list) - 1]->vhc_milleage - $list[0]->vhc_milleage; + $fuel_consumed = $list[count($list) - 1]->fuel_count - $list[0]->fuel_count; - $data = [ - 'nopol1' => $nopol1, - 'vid' => $vid, - 'tgl0' => $tgl0, - 'tgl1' => $tgl1, - 'list' => $list, - 'start' => $start, - 'finish' => $finish, - 'duration' => $duration, - 'distance' => $distance, - 'fuel_consumed' => $fuel_consumed, - ]; - // dd($list); - return view('menu_v1.reports._trip_detail', $data); - } + $data = [ + 'nopol1' => $nopol1, + 'vid' => $vid, + 'tgl0' => $tgl0, + 'tgl1' => $tgl1, + 'list' => $list, + 'start' => $start, + 'finish' => $finish, + 'duration' => $duration, + 'distance' => $distance, + 'fuel_consumed' => $fuel_consumed, + ]; + // dd($list); + return view('menu_v1.reports._trip_detail', $data); + } - public function view_report_abnormalities(Request $req) - { - $q = "select id, nopol1 from t_vehicles WHERE dlt is null order by nopol1"; - $listNopol = DB::select($q); + public function view_report_abnormalities(Request $req) + { + $q = "select id, nopol1 from t_vehicles WHERE dlt is null order by nopol1"; + $listNopol = DB::select($q); - $data = [ - 'listNopol' => $listNopol, - ]; + $data = [ + 'listNopol' => $listNopol, + ]; - $log = [ - "module" => "Abnormalities Report", - "action" => "View", - "desc" => "Open Abnormalities Report menu", - ]; - UserLogs::insert(Auth::user()->id, $log); - return view('menu_v1.reports.abnormalities', $data); - } - public function api_report_abnormalities_list(Request $req) - { - // Validate input - $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" - ]; + $log = [ + "module" => "Abnormalities Report", + "action" => "View", + "desc" => "Open Abnormalities Report menu", + ]; + UserLogs::insert(Auth::user()->id, $log); + return view('menu_v1.reports.abnormalities', $data); + } + public function api_report_abnormalities_list(Request $req) + { + // Validate input + $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') - Helper::TIMEFIX; - $to_date = $req->input('to_date') - Helper::TIMEFIX; - $vid = $req->input('vid'); + $from_date = $req->input('from_date') - Helper::TIMEFIX; + $to_date = $req->input('to_date') - Helper::TIMEFIX; + $vid = $req->input('vid'); - // Create a period between the two timestamps - $period = CarbonPeriod::create( - Carbon::createFromTimestamp($from_date)->startOfMonth(), - '1 month', - Carbon::createFromTimestamp($to_date) - ); - $subQueryParts = []; - foreach ($period as $date) { - $tableName = "tracks_" . $date->format('ym'); + // Create a period between the two timestamps + $period = CarbonPeriod::create( + Carbon::createFromTimestamp($from_date)->startOfMonth(), + '1 month', + Carbon::createFromTimestamp($to_date) + ); + $subQueryParts = []; + foreach ($period as $date) { + $tableName = "tracks_" . $date->format('ym'); - // We filter inside each table so the DB uses indexes immediately - $subQueryParts[] = "SELECT id, vhc_id, crt_d, speed - FROM $tableName - WHERE crt_d BETWEEN $from_date AND $to_date + // We filter inside each table so the DB uses indexes immediately + $subQueryParts[] = "SELECT id, vhc_id, crt_d, speed + FROM $tableName + WHERE crt_d BETWEEN $from_date AND $to_date AND action = 'location' and speed>60 "; - } - $qString = "(" . implode(' UNION ALL ', $subQueryParts) . ")"; - // dd("qString", $qString); - try { - $list = DB::select("SELECT - tv.name, - tv.nopol1, - t.crt_d, - t.speed, + } + $qString = "(" . implode(' UNION ALL ', $subQueryParts) . ")"; + // dd("qString", $qString); + try { + $list = DB::select("SELECT + tv.name, + tv.nopol1, + t.crt_d, + t.speed, tgta.fulladdress, - tvd.speed_limit, - tvd.pool_code, + tvd.speed_limit, + tvd.pool_code, tvd.dc_code - FROM + FROM $qString t INNER JOIN t_vehicles tv ON tv.id = t.vhc_id INNER JOIN t_vehicles_detail tvd ON tvd.vid = tv.id LEFT JOIN t_gps_tracks_address tgta ON tgta.master_id = t.id - WHERE + WHERE if(? , tv.id = ? , 1=1) AND t.speed > tvd.speed_limit ORDER BY t.crt_d; ", [$vid, $vid]); - // // RETURN 1 - LIST - // if($req->type != 'report'){ - $apiResp = Responses::success("success list abnormalities report"); - $apiResp["data"] = $list; - return new Response($apiResp, $apiResp["meta"]["code"]); - // } + // // RETURN 1 - LIST + // if($req->type != 'report'){ + $apiResp = Responses::success("success list abnormalities report"); + $apiResp["data"] = $list; + return new Response($apiResp, $apiResp["meta"]["code"]); + // } - } 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)[]); - } - } + } 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_view_trip_detail(Request $req, $token) - { - // token = base64(unix(start_time) + '|' + unix(end_time) + '|' + nopol + '|' + unix(now())) - // $token = "1759686805|1759693045|B.10-517|1765845676"; - $token = base64_decode($token); - $token = explode('|', $token); - $tgl0 = (int) $token[0] ?? null; - $tgl1 = (int) $token[1] ?? null; - $nopol1 = $token[2] ?? null; - $now = (int) $token[3] ?? null; - $isMoreThanOneHour = time() - $now > 60 * 60; + public function api_view_trip_detail(Request $req, $token) + { + // token = base64(unix(start_time) + '|' + unix(end_time) + '|' + nopol + '|' + unix(now())) + // $token = "1759686805|1759693045|B.10-517|1765845676"; + $token = base64_decode($token); + $token = explode('|', $token); + $tgl0 = (int) $token[0] ?? null; + $tgl1 = (int) $token[1] ?? null; + $nopol1 = $token[2] ?? null; + $now = (int) $token[3] ?? null; + $isMoreThanOneHour = time() - $now > 60 * 60; - if ($tgl0 == null || $tgl1 == null || $nopol1 == null || $now == null || $isMoreThanOneHour) { - $apiResp = Responses::bad_request("Invalid token"); - return new Response($apiResp, $apiResp["meta"]["code"]); - } + if ($tgl0 == null || $tgl1 == null || $nopol1 == null || $now == null || $isMoreThanOneHour) { + $apiResp = Responses::bad_request("Invalid token"); + return new Response($apiResp, $apiResp["meta"]["code"]); + } - // get vid by nopol1 - $vid = DB::select("SELECT id FROM t_vehicles WHERE nopol1 = ?", [$nopol1]); - if (count($vid) == 0) { - $apiResp = Responses::bad_request("Vehicle not found"); - return new Response($apiResp, $apiResp["meta"]["code"]); - } - $vid = $vid[0]->id; + // get vid by nopol1 + $vid = DB::select("SELECT id FROM t_vehicles WHERE nopol1 = ?", [$nopol1]); + if (count($vid) == 0) { + $apiResp = Responses::bad_request("Vehicle not found"); + return new Response($apiResp, $apiResp["meta"]["code"]); + } + $vid = $vid[0]->id; - $d = [$vid, $tgl0, $tgl1]; - $list = DB::select("SELECT + $d = [$vid, $tgl0, $tgl1]; + $list = DB::select("SELECT t.crt_d, t.latitude, t.longitude, t.speed, tgta.fulladdress, t.pre_milleage, t.vhc_milleage, fuel_count - FROM + FROM t_gps_tracks t - left join t_gps_tracks_address tgta on tgta.master_id = t.id - WHERE + left join t_gps_tracks_address tgta on tgta.master_id = t.id + WHERE t.vhc_id = ? and t.latitude IS NOT NULL AND t.longitude IS NOT NULL @@ -426,75 +434,75 @@ class ReportsController extends Controller AND t.crt_d BETWEEN ? AND ? ORDER BY t.crt_d asc ", $d); - if (count($list) == 0) { - $apiResp = Responses::not_found("Track not found"); - return new Response($apiResp, $apiResp["meta"]["code"]); - } + if (count($list) == 0) { + $apiResp = Responses::not_found("Track not found"); + return new Response($apiResp, $apiResp["meta"]["code"]); + } - $start = [ - 'time' => $list[0]->crt_d, - 'fulladdress' => urldecode($list[0]->fulladdress), - 'mileage' => $list[0]->vhc_milleage, - ]; - $finish = [ - 'time' => $list[count($list) - 1]->crt_d, - 'fulladdress' => urldecode($list[count($list) - 1]->fulladdress), - 'mileage' => $list[count($list) - 1]->vhc_milleage, - ]; + $start = [ + 'time' => $list[0]->crt_d, + 'fulladdress' => urldecode($list[0]->fulladdress), + 'mileage' => $list[0]->vhc_milleage, + ]; + $finish = [ + 'time' => $list[count($list) - 1]->crt_d, + 'fulladdress' => urldecode($list[count($list) - 1]->fulladdress), + 'mileage' => $list[count($list) - 1]->vhc_milleage, + ]; - $t0 = Carbon::createFromTimestamp($list[0]->crt_d); - $t1 = Carbon::createFromTimestamp($list[count($list) - 1]->crt_d); - $diff = $t1->diff($t0); - $hours = $diff->h + ($diff->days * 24); // include days converted to hours - $minutes = $diff->i; - $duration = "{$hours} hour" . ($hours > 1 ? 's' : '') . " {$minutes} minute" . ($minutes > 1 ? 's' : ''); + $t0 = Carbon::createFromTimestamp($list[0]->crt_d); + $t1 = Carbon::createFromTimestamp($list[count($list) - 1]->crt_d); + $diff = $t1->diff($t0); + $hours = $diff->h + ($diff->days * 24); // include days converted to hours + $minutes = $diff->i; + $duration = "{$hours} hour" . ($hours > 1 ? 's' : '') . " {$minutes} minute" . ($minutes > 1 ? 's' : ''); - $distance = $list[count($list) - 1]->vhc_milleage - $list[0]->vhc_milleage; - $fuel_consumed = $list[count($list) - 1]->fuel_count - $list[0]->fuel_count; + $distance = $list[count($list) - 1]->vhc_milleage - $list[0]->vhc_milleage; + $fuel_consumed = $list[count($list) - 1]->fuel_count - $list[0]->fuel_count; - $data = [ - 'nopol1' => $nopol1, - 'vid' => $vid, - 'tgl0' => $tgl0, - 'tgl1' => $tgl1, - 'list' => $list, - 'start' => $start, - 'finish' => $finish, - 'duration' => $duration, - 'distance' => $distance, - 'fuel_consumed' => $fuel_consumed, - ]; - // dd($list); - return view('menu_v1.reports.view_trip_detail', $data); - } + $data = [ + 'nopol1' => $nopol1, + 'vid' => $vid, + 'tgl0' => $tgl0, + 'tgl1' => $tgl1, + 'list' => $list, + 'start' => $start, + 'finish' => $finish, + 'duration' => $duration, + 'distance' => $distance, + 'fuel_consumed' => $fuel_consumed, + ]; + // dd($list); + return view('menu_v1.reports.view_trip_detail', $data); + } - public function decryptText(string $ciphertext = "FqujI/06YPCpCSP0Xlt6bA==") - { - $secret = "Mg3Xt1169cRNJWX6HG12DVkgmAXINVuq"; - $iv_str = "Mg3Xt1169cRNJWX6"; + public function decryptText(string $ciphertext = "FqujI/06YPCpCSP0Xlt6bA==") + { + $secret = "Mg3Xt1169cRNJWX6HG12DVkgmAXINVuq"; + $iv_str = "Mg3Xt1169cRNJWX6"; - // Derive key and IV exactly as the web tool does - $md5 = md5($secret, true); // 16-byte raw binary MD5 - $key = $md5 . $md5; // 32 bytes → AES-256 key - $iv = substr($md5, 0, 16); // IV = first 16 bytes of MD5 + // Derive key and IV exactly as the web tool does + $md5 = md5($secret, true); // 16-byte raw binary MD5 + $key = $md5 . $md5; // 32 bytes → AES-256 key + $iv = substr($md5, 0, 16); // IV = first 16 bytes of MD5 - $data = base64_decode($ciphertext, true); - if ($data === false) { - return 'Invalid Base64'; - } + $data = base64_decode($ciphertext, true); + if ($data === false) { + return 'Invalid Base64'; + } - $plaintext = openssl_decrypt( - $data, - 'aes-256-cbc', - $key, - 0, - $iv - ); + $plaintext = openssl_decrypt( + $data, + 'aes-256-cbc', + $key, + 0, + $iv + ); - if ($plaintext === false) { - return 'Decryption failed: ' . openssl_error_string(); - } + if ($plaintext === false) { + return 'Decryption failed: ' . openssl_error_string(); + } - return $plaintext; // → "1764833739" - } + return $plaintext; // → "1764833739" + } } diff --git a/resources/views/menu_v1/reports/abnormalities.blade.php b/resources/views/menu_v1/reports/abnormalities.blade.php index a164ea2..6fa2643 100644 --- a/resources/views/menu_v1/reports/abnormalities.blade.php +++ b/resources/views/menu_v1/reports/abnormalities.blade.php @@ -210,7 +210,7 @@ data: 'pool_code', className: 'text-start', }, - { + { data: "crt_d", className: 'text-nowrap', render: (data, type, row, meta) => { @@ -218,7 +218,7 @@ } }, { data: "speed", className: 'text-end'}, - { + { data: "fulladdress", render: (data, type, row, meta) => { return Helper.shortenText(decodeURIComponent(data || ''), 255) @@ -231,9 +231,9 @@ extend: 'excelHtml5', title: () => { return ` - Abnormality Trip Report - - ${moment($('#tgl0').val(), "DD-MM-YYYY HH:mm").format('DD MMM YYYY HH:mm')} - to + Abnormality Trip Report - + ${moment($('#tgl0').val(), "DD-MM-YYYY HH:mm").format('DD MMM YYYY HH:mm')} + to ${moment($('#tgl1').val(), "DD-MM-YYYY HH:mm").format('DD MMM YYYY HH:mm')}` }, className: 'd-none', // hide default button diff --git a/resources/views/menu_v1/reports/vehicle_trips.blade.php b/resources/views/menu_v1/reports/vehicle_trips.blade.php index 5e1446e..e565311 100644 --- a/resources/views/menu_v1/reports/vehicle_trips.blade.php +++ b/resources/views/menu_v1/reports/vehicle_trips.blade.php @@ -9,12 +9,8 @@ @endsection @section('customcss') - + @endsection @section('content') @@ -29,8 +25,8 @@ @if ($user_role == \App\Models\Users::ROLE_VENDOR || $user_role == \App\Models\Users::ROLE_ADMIN) @can('vehicle.create') + + --> @endcan {{--
@@ -43,170 +39,189 @@
- -
-
-
- - - - -
-
-
-
- - - -
-
-
-
- - -
-
-
- -
-
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - -
License Plate NumberDist. Cat.PoolNumber of TripTotal Mileage (km)Trip #StartFinishDurationStart (km)Finish (km)Distance (km)Fuel (L)Detail
+ +
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
License Plate NumberDist. Cat.PoolNumber of TripTotal Mileage (km)Trip #StartFinishDurationStart (km)Finish (km)Distance (km)Fuel (L)Vehicle TypeDetail
+
+ - - @endsection @section('customjs') - - - - - - + + + + + + - - - - + + + + -