diff --git a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php new file mode 100644 index 00000000..777dd568 --- /dev/null +++ b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php @@ -0,0 +1,215 @@ +groupBy('item')->get(); + + return $this->successResponse([ + 'items' => $items, + 'data' => $data, + ]); + } + + public function getItems(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; + + $all = 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(); + + $country = 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(); + + $itemsFa = InfoItem::query()->where('item', '=', $item)->get()->keyBy('sub_item'); + + $all->each(function ($value) use ($itemsFa) { + if (isset($itemsFa[$value->t])) { + $value->u = $itemsFa[$value->t]->sub_item_unit; + } + }); + + return $this->successResponse([ + 'data' => $all, + 'country' => $country, + 'items_fa' => $itemsFa + ]); + } + + public function getItemsCity(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; + + $all = 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(); + + $itemsFa = InfoItem::where('item', $item)->get()->keyBy('sub_item'); + + $all->each(function ($value) use ($itemsFa) { + if (isset($itemsFa[$value->t])) { + $value->u = $itemsFa[$value->t]->sub_item_unit; + } + }); + + return $this->successResponse([ + 'data' => $all, + 'items_fa' => $itemsFa + ]); + } + + public function provinceExcel(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; + + // Base queries + $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'); + + $roadPatrolsQuery = RoadPatrol::query() + ->selectRaw('COUNT(*) AS s, province_id AS p, 77 AS i') + ->whereBetween('start_time', [$fromDate, $toDate]) + ->when(!$isSpecialUser, function ($query) use ($provinceId) { + $query->where('province_id', $provinceId); + }) + ->groupBy('province_id'); + + $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'); + + $roadPatrolsSummaryQuery = RoadPatrol::query() + ->selectRaw('COUNT(*) AS s, -1 AS p, 77 AS i') + ->whereBetween('start_time', [$fromDate, $toDate]) + ->when(!$isSpecialUser, function ($query) use ($provinceId) { + $query->where('province_id', $provinceId); + }); + + // Combine queries using UNION ALL + $data = $roadItemsProjectsQuery + ->unionAll($roadPatrolsQuery) + ->unionAll($roadItemsProjectsSummaryQuery) + ->unionAll($roadPatrolsSummaryQuery) + ->get(); + + return $this->successResponse($data); + } + + public function cityExcel(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'); + + $roadPatrolsQuery = RoadPatrol::query() + ->selectRaw(' + COUNT(*) AS s, + edare_id AS c, + 77 AS i') + ->whereBetween('start_time', [$fromDate, $toDate]) + ->where('province_id', '=', $provinceId) + ->groupBy('edare_id'); + + $data = $roadItemsProjectsQuery + ->unionAll($roadPatrolsQuery) + ->get(); + + return $this->successResponse($data); + } + + public function map(Request $request): JsonResponse + { + $provinceId = $request->province_id; + $cityId = $request->city_id; + $subId = $request->sub_id; + $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($request->item, fn($query) => $query->where('item', '=', $request->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..4c56abac --- /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()->addDay()->startOfDay()->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()->addDay()->startOfDay()->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..08ea3979 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', 'getItems')->name('getItems'); + Route::get('/get_items_city', 'getItemsCity')->name('getItemsCity'); + Route::get('/province_excel', 'provinceExcel')->name('provinceExcel'); + Route::get('/city_excel', 'cityExcel')->name('cityExcel'); + 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');