diff --git a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php new file mode 100644 index 00000000..24e7c32c --- /dev/null +++ b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php @@ -0,0 +1,210 @@ +groupBy('item')->get(); + + return $this->successResponse([ + 'items' => $items, + 'data' => $data, + ]); + } + + public function provinceActivityPerSubItem(Request $request): JsonResponse + { + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + $item = $request->item; + + $provinceRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw(' + sub_item AS t, + COUNT(*) AS c, + CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, + province_id AS p') + ->where('item', '=', $item) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('status', '=', 1) + ->groupBy('province_id', 'sub_item') + ->get(); + + $countryRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw(' + sub_item AS t, + COUNT(*) AS c, + CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, + -1 AS p') + ->where('item', '=', $item) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('status', '=', 1) + ->groupBy('sub_item') + ->get(); + + $infoItems = InfoItem::query()->where('item', '=', $item)->get()->keyBy('sub_item'); + + $provinceRoadItemsPerSubItem->each(function ($value) use ($infoItems) { + if (isset($infoItems[$value->t])) { + $value->u = $infoItems[$value->t]->sub_item_unit; + } + }); + + return $this->successResponse([ + 'provincesData' => $provinceRoadItemsPerSubItem, + 'countryData' => $countryRoadItemsPerSubItem, + 'items' => $infoItems + ]); + } + + public function cityActivityPerSubItem(Request $request): JsonResponse + { + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + $item = $request->item; + $province = $request->province_id; + + $cityRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw(' + sub_item AS t, + COUNT(*) AS c, + CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, + province_id AS p, + edarat_id AS ci + ') + ->where('item', '=', $item) + ->where('province_id', '=', $province) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('status', '=', 1) + ->groupBy('edarat_id', 'sub_item') + ->get(); + + $items = InfoItem::query()->where('item', $item)->get()->keyBy('sub_item'); + + $cityRoadItemsPerSubItem->each(function ($value) use ($items) { + if (isset($items[$value->t])) { + $value->u = $items[$value->t]->sub_item_unit; + } + }); + + return $this->successResponse([ + 'citiesData' => $cityRoadItemsPerSubItem, + 'items' => $items + ]); + } + + public function provinceActivityPerItem(Request $request): JsonResponse + { + if (auth()->check()) { + auth()->user()->addActivityComplete(1033); + } + + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + $user = auth()->user(); + $isSpecialUser = in_array($user->username, ['witel', 'drdanesh']); + $provinceId = $isSpecialUser ? null : $user->province_id; + + $roadItemsProjectsQuery = RoadItemsProject::query() + ->selectRaw('COUNT(*) AS s, province_id AS p, item AS i') + ->where('status', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->when(!$isSpecialUser, function ($query) use ($provinceId) { + $query->where('province_id', $provinceId); + }) + ->groupBy('province_id', 'item'); + + $roadItemsProjectsSummaryQuery = RoadItemsProject::query() + ->selectRaw('COUNT(*) AS s, -1 AS p, item AS i') + ->where('status', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->when(!$isSpecialUser, function ($query) use ($provinceId) { + $query->where('province_id', $provinceId); + }) + ->groupBy('item'); + + $data = $roadItemsProjectsQuery + ->unionAll($roadItemsProjectsSummaryQuery) + ->get(); + + $provinces = Province::all(['id', 'name_fa']); + + return $this->successResponse([ + 'activities' => $data, + 'provinces' => $provinces, + ]); + } + + public function cityActivityPerItem(Request $request): JsonResponse + { + $provinceId = $request->province_id; + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + + $roadItemsProjectsQuery = RoadItemsProject::query() + ->selectRaw(' + COUNT(*) AS s, + edarat_id AS c, + item AS i') + ->where('status', '=', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('province_id', $provinceId) + ->groupBy('item', 'edarat_id'); + + $roadItemsProjectsSummaryQuery = RoadItemsProject::query() + ->selectRaw(' + COUNT(*) AS s, + -1 AS c, + item AS i') + ->where('status', '=', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('province_id', $provinceId) + ->groupBy('item'); + + $data = $roadItemsProjectsQuery + ->unionAll($roadItemsProjectsSummaryQuery) + ->get(); + + $edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name']); + + return $this->successResponse([ + 'activities' => $data, + 'edaratShahri' => $edarateShahri, + ]); + } + + public function map(Request $request): JsonResponse + { + $provinceId = $request->province_id; + $cityId = $request->city_id; + $subId = $request->sub_id; + $item = $request->item; + $dateFrom = $request->date_from ? $request->date_from . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->addDay()->startOfDay()->toDateTimeString(); + + $data = RoadItemsProject::query() + ->where('is_new', '=', 1) + ->when($provinceId, fn($query) => $query->where('province_id', '=', $provinceId)) + ->when($cityId, fn($query) => $query->where('city_id', '=', $cityId)) + ->when($subId, fn($query) => $query->where('sub_items', 'like', '%' . $subId . '%')) + ->when($item, fn($query) => $query->where('item', '=', $item)) + ->when(!is_null($request->status), fn($query) => $query->where('status', '=', $request->status)) + ->whereBetween('activity_date', [$dateFrom, $dateTo]) + ->leftJoin('users', 'users.id', '=', 'road_items_projects.user_id') + ->select('road_items_projects.id as i', 'start_lat as l', 'start_lng as g', 'status') + ->get(); + + return $this->successResponse($data); + } +} diff --git a/app/Http/Controllers/V3/Reports/RoadPatrolReportController.php b/app/Http/Controllers/V3/Reports/RoadPatrolReportController.php new file mode 100644 index 00000000..16f85d01 --- /dev/null +++ b/app/Http/Controllers/V3/Reports/RoadPatrolReportController.php @@ -0,0 +1,44 @@ +from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + + $data = RoadPatrolProject::provincePatrolData($fromDate, $dateTo); + return $this->successResponse($data); + } + + public function edarehPatrolData(Request $request): JsonResponse + { + $request->validate(["province_id" => "required",]); + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + + $data = RoadPatrolProject::edarehPatrolData($fromDate, $dateTo, $request->province_id); + return $this->successResponse($data); + } + + public function roadPatrolsReportTable(Request $request): BinaryFileResponse + { + $name = 'گزارش از گشت راهداری و ترابری ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + + return Excel::download( + new RoadPatrolTable($request->from_date, $request->date_to), $name + ); + } +} diff --git a/routes/v3.php b/routes/v3.php index 405f76c8..198fc35d 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -10,6 +10,8 @@ use App\Http\Controllers\V3\Harim\DivarkeshiController; use App\Http\Controllers\V3\ObservedItemController; use App\Http\Controllers\V3\ProfileController; use App\Http\Controllers\V3\RahdaranController; +use App\Http\Controllers\V3\Reports\RoadItemsReportController; +use App\Http\Controllers\V3\Reports\RoadPatrolReportController; use App\Http\Controllers\V3\RoadItemsProjectController; use App\Http\Controllers\V3\RoadPatrolProjectController; use Illuminate\Support\Facades\Route; @@ -187,3 +189,24 @@ Route::prefix('observed_items') Route::get('/filter', 'filter')->name('filter'); Route::get('/{observedItem}', 'show')->name('show'); }); + +Route::prefix('road_item_reports') + ->name('roadItemReports.') + ->controller(RoadItemsReportController::class) + ->group(function () { + Route::get('/get_sub_items', 'getSubItems')->name('getSubItems'); + Route::get('/get_items', 'provinceActivityPerSubItem')->name('provinceActivityPerSubItem'); + Route::get('/get_items_city', 'cityActivityPerSubItem')->name('cityActivityPerSubItem'); + Route::get('/province_statistics', 'provinceActivityPerItem')->name('provinceActivityPerItem'); + Route::get('/city_statistics', 'cityActivityPerItem')->name('cityActivityPerItem'); + Route::get('/map', 'map')->name('map'); + }); + +Route::prefix('road_patrol_reports') + ->name('roadPatrolReports.') + ->controller(RoadPatrolReportController::class) + ->group(function () { + Route::get('/province_data', 'provincePatrolData')->name('provincePatrolData'); + Route::get('/edareh_data', 'edarehPatrolData')->name('edarehPatrolData'); + Route::get('/report_excel', 'roadPatrolsReportTable')->name('roadPatrolsReportTable'); + }); diff --git a/storage/sql-files/edarate_shahri.sql b/storage/sql-files/edarate_shahri.sql index b61474b3..85a2b042 100644 --- a/storage/sql-files/edarate_shahri.sql +++ b/storage/sql-files/edarate_shahri.sql @@ -520,3 +520,4 @@ INSERT INTO edarate_shahri (name_fa,province_id,created_at,updated_at) VALUES ('اداره خمام',28,'2023-06-17 08:43:14','2023-06-17 08:43:14'), ('اداره اصلاندوز',3,'2023-08-15 09:33:55','2023-08-15 09:33:55'); ('اداره گالیکش',27,'2024-11-16 14:33:55','2024-11-16 14:33:55'); + ('آزادراه ساوه-تهران',32,'2025-01-06 14:33:55','2025-01-06 14:33:55');