diff --git a/app/Exports/V3/RoadItemsProjects/CountryActivityPerItemReport.php b/app/Exports/V3/RoadItemsProjects/CountryActivityPerItemReport.php index a5f33307..d85f83f3 100644 --- a/app/Exports/V3/RoadItemsProjects/CountryActivityPerItemReport.php +++ b/app/Exports/V3/RoadItemsProjects/CountryActivityPerItemReport.php @@ -17,70 +17,16 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; class CountryActivityPerItemReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private ?string $fromDate, private ?string $toDate){} + public function __construct(private ?array $activities){} public function view(): View { - $fromDate = $this->fromDate ?? '2021-03-21 00:00:00'; - $toDate = $this->toDate ?? \Carbon\Carbon::now(); - - $query = "SELECT - COUNT(CASE WHEN item = 1 THEN 1 END) AS MarematRooyeCount, - COUNT(CASE WHEN item = 2 THEN 1 END) AS PaksaziCount, - COUNT(CASE WHEN item = 3 THEN 1 END) AS AlaemCount, - COUNT(CASE WHEN item = 4 THEN 1 END) AS HefazCount, - COUNT(CASE WHEN item = 5 THEN 1 END) AS RoshanayiCount, - COUNT(CASE WHEN item = 6 THEN 1 END) AS KhatkeshiCount, - COUNT(CASE WHEN item = 7 THEN 1 END) AS RangamiziCount, - COUNT(CASE WHEN item = 8 THEN 1 END) AS WashingCount, - COUNT(CASE WHEN item = 9 THEN 1 END) AS ImenSaziCount, - COUNT(CASE WHEN item = 10 THEN 1 END) AS HarimCount, - COUNT(CASE WHEN item = 11 THEN 1 END) AS PolCount, - COUNT(CASE WHEN item = 12 THEN 1 END) AS ToonelCount, - COUNT(CASE WHEN item = 13 THEN 1 END) AS AmaliatZemestaniCount, - COUNT(CASE WHEN item = 14 THEN 1 END) AS MashinAlatCount, - COUNT(CASE WHEN item = 15 THEN 1 END) AS TollhouseCount, - COUNT(CASE WHEN item = 16 THEN 1 END) AS EmergencyCount, - province_fa, - province_id, - COUNT(CASE WHEN item != 20 THEN 1 END) AS TotalProvinceCount - FROM ( - SELECT - province_fa, - province_id, - item, - status - FROM road_items_projects - WHERE activity_date_time BETWEEN '{$fromDate}' and '{$toDate}' - ) AS merged_table - WHERE status = 1 - GROUP BY province_id, province_fa;"; - - $provinceActivities = collect(DB::select($query)); - - $totalItemCount = [ - 'totalMarematRooyeCount' => $provinceActivities->sum('MarematRooyeCount'), - 'totalPaksaziCount' => $provinceActivities->sum('PaksaziCount'), - 'totalAlaemCount' => $provinceActivities->sum('AlaemCount'), - 'totalHefazCount' => $provinceActivities->sum('HefazCount'), - 'totalRoshanayiCount' => $provinceActivities->sum('RoshanayiCount'), - 'totalKhatkeshiCount' => $provinceActivities->sum('KhatkeshiCount'), - 'totalRangamiziCount' => $provinceActivities->sum('RangamiziCount'), - 'totalWashingCount' => $provinceActivities->sum('WashingCount'), - 'totalImenSaziCount' => $provinceActivities->sum('ImenSaziCount'), - 'totalHarimCount' => $provinceActivities->sum('HarimCount'), - 'totalPolCount' => $provinceActivities->sum('PolCount'), - 'totalToonelCount' => $provinceActivities->sum('ToonelCount'), - 'totalAmaliatZemestaniCount' => $provinceActivities->sum('AmaliatZemestaniCount'), - 'totalMashinAlatCount' => $provinceActivities->sum('MashinAlatCount'), - 'totalTollhouseCount' => $provinceActivities->sum('TollhouseCount'), - 'totalEmergencyCount' => $provinceActivities->sum('EmergencyCount'), - 'totalCountryCount' => $provinceActivities->sum('TotalProvinceCount'), - ]; + $activities = $this->activities; + $fromDate = $activities['fromDate'] ?? '2021-03-21 00:00:00'; + $toDate = $activities['toDate'] ?? \Carbon\Carbon::now(); return view('v3.Reports.RoadItems.CountryActivityPerItem', [ - 'provinceCount' => $provinceActivities, - 'countryCount' => $totalItemCount, + 'activities' => $activities['data'], 'fromDate' => $fromDate, 'toDate' => $toDate ]); diff --git a/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php b/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php index 16fc87cf..da5497e2 100644 --- a/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php +++ b/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php @@ -23,7 +23,6 @@ class CountryActivityPerSubItemReport implements FromView, WithEvents, ShouldAut 'activities' => $activities["data"], 'fromDate' => $activities["fromDate"], 'toDate' => $activities["toDate"], - 'details' => $activities["details"] ]); } diff --git a/app/Exports/V3/RoadItemsProjects/OperatorCartableReport.php b/app/Exports/V3/RoadItemsProjects/OperatorCartableReport.php new file mode 100644 index 00000000..43583ba5 --- /dev/null +++ b/app/Exports/V3/RoadItemsProjects/OperatorCartableReport.php @@ -0,0 +1,69 @@ + $this->data, + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + $event->sheet->getDelegate()->getStyle('A:U')->getFont()->setName('Arial'); + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setHorizontal(Alignment::HORIZONTAL_CENTER); + + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setVertical(Alignment::VERTICAL_CENTER); + } + ]; + } + + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('q1'); + return [$drawing, $drawing2]; + } +} \ No newline at end of file diff --git a/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerItemReport.php b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerItemReport.php index 7b8f99b2..15b1a1c0 100644 --- a/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerItemReport.php +++ b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerItemReport.php @@ -17,78 +17,16 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; class ProvinceActivityPerItemReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private ?string $fromDate, - private ?string $toDate, - private string $provinceId, - ){} + public function __construct(private ?array $activities){} public function view(): View { - $fromDate = $this->fromDate ?? '2021-03-21 00:00:00'; - $toDate = $this->toDate ?? \Carbon\Carbon::now(); - - $query = "SELECT - COUNT(CASE WHEN item = 1 THEN 1 END) AS MarematRooyeCount, - COUNT(CASE WHEN item = 2 THEN 1 END) AS PaksaziCount, - COUNT(CASE WHEN item = 3 THEN 1 END) AS AlaemCount, - COUNT(CASE WHEN item = 4 THEN 1 END) AS HefazCount, - COUNT(CASE WHEN item = 5 THEN 1 END) AS RoshanayiCount, - COUNT(CASE WHEN item = 6 THEN 1 END) AS KhatkeshiCount, - COUNT(CASE WHEN item = 7 THEN 1 END) AS RangamiziCount, - COUNT(CASE WHEN item = 8 THEN 1 END) AS WashingCount, - COUNT(CASE WHEN item = 9 THEN 1 END) AS ImenSaziCount, - COUNT(CASE WHEN item = 10 THEN 1 END) AS HarimCount, - COUNT(CASE WHEN item = 11 THEN 1 END) AS PolCount, - COUNT(CASE WHEN item = 12 THEN 1 END) AS ToonelCount, - COUNT(CASE WHEN item = 13 THEN 1 END) AS AmaliatZemestaniCount, - COUNT(CASE WHEN item = 14 THEN 1 END) AS MashinAlatCount, - COUNT(CASE WHEN item = 15 THEN 1 END) AS TollhouseCount, - COUNT(CASE WHEN item = 16 THEN 1 END) AS EmergencyCount, - province_fa, - province_id, - edarat_name, - edarat_id, - COUNT(CASE WHEN item != 20 THEN 1 END) AS TotalCityCount - FROM ( - SELECT - province_fa, - province_id, - edarat_name, - edarat_id, - item, - status - FROM road_items_projects - WHERE activity_date_time BETWEEN '{$fromDate}' and '{$toDate}' - ) AS merged_table - WHERE status = 1 - AND province_id = {$this->provinceId} - GROUP BY edarat_id, edarat_name order by province_id ASC;"; - - $cityActivities = collect(DB::select($query)); - - $totalItemCount = [ - 'totalMarematRooyeCount' => $cityActivities->sum('MarematRooyeCount'), - 'totalPaksaziCount' => $cityActivities->sum('PaksaziCount'), - 'totalAlaemCount' => $cityActivities->sum('AlaemCount'), - 'totalHefazCount' => $cityActivities->sum('HefazCount'), - 'totalRoshanayiCount' => $cityActivities->sum('RoshanayiCount'), - 'totalKhatkeshiCount' => $cityActivities->sum('KhatkeshiCount'), - 'totalRangamiziCount' => $cityActivities->sum('RangamiziCount'), - 'totalWashingCount' => $cityActivities->sum('WashingCount'), - 'totalImenSaziCount' => $cityActivities->sum('ImenSaziCount'), - 'totalHarimCount' => $cityActivities->sum('HarimCount'), - 'totalPolCount' => $cityActivities->sum('PolCount'), - 'totalToonelCount' => $cityActivities->sum('ToonelCount'), - 'totalAmaliatZemestaniCount' => $cityActivities->sum('AmaliatZemestaniCount'), - 'totalMashinAlatCount' => $cityActivities->sum('MashinAlatCount'), - 'totalTollhouseCount' => $cityActivities->sum('TollhouseCount'), - 'totalEmergencyCount' => $cityActivities->sum('EmergencyCount'), - 'TotalProvinceCount' => $cityActivities->sum('TotalCityCount'), - ]; + $activities = $this->activities; + $fromDate = $activities['fromDate'] ?? '2021-03-21 00:00:00'; + $toDate = $activities['toDate'] ?? \Carbon\Carbon::now(); return view('v3.Reports.RoadItems.ProvinceActivityPerItem', [ - 'cityCount' => $cityActivities, - 'provinceCount' => $totalItemCount, + 'activitis' => $activities['data'], 'fromDate' => $fromDate, 'toDate' => $toDate ]); diff --git a/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php index 2d8aad5a..cf558cab 100644 --- a/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php +++ b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php @@ -28,7 +28,6 @@ class ProvinceActivityPerSubItemReport implements FromView, WithEvents, ShouldAu 'activities' => $activities["data"], 'fromDate' => $activities["fromDate"], 'toDate' => $activities["toDate"], - 'details' => $activities["details"] ]); } diff --git a/app/Exports/V3/RoadItemsProjects/SupervisorCartableReport.php b/app/Exports/V3/RoadItemsProjects/SupervisorCartableReport.php new file mode 100644 index 00000000..4aa03957 --- /dev/null +++ b/app/Exports/V3/RoadItemsProjects/SupervisorCartableReport.php @@ -0,0 +1,69 @@ + $this->data, + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + $event->sheet->getDelegate()->getStyle('A:U')->getFont()->setName('Arial'); + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setHorizontal(Alignment::HORIZONTAL_CENTER); + + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setVertical(Alignment::VERTICAL_CENTER); + } + ]; + } + + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('q1'); + return [$drawing, $drawing2]; + } +} \ No newline at end of file diff --git a/app/Exports/V3/RoadPatrols/OperatorCartableReport.php b/app/Exports/V3/RoadPatrols/OperatorCartableReport.php new file mode 100644 index 00000000..d1279f13 --- /dev/null +++ b/app/Exports/V3/RoadPatrols/OperatorCartableReport.php @@ -0,0 +1,68 @@ +data; + + return view('v3.Reports.RoadPatrols.OperatorCartableReport', [ + 'data' => $data + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + $event->sheet->getDelegate()->getStyle('A:U')->getFont()->setName('Arial'); + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setHorizontal(Alignment::HORIZONTAL_CENTER); + + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setVertical(Alignment::VERTICAL_CENTER); + } + ]; + } + + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('q1'); + return [$drawing, $drawing2]; + } +} \ No newline at end of file diff --git a/app/Exports/V3/RoadPatrols/SupervisorCartableReport.php b/app/Exports/V3/RoadPatrols/SupervisorCartableReport.php new file mode 100644 index 00000000..12f05996 --- /dev/null +++ b/app/Exports/V3/RoadPatrols/SupervisorCartableReport.php @@ -0,0 +1,68 @@ +data; + + return view('v3.Reports.RoadPatrols.SupervisorCartableReport', [ + 'data' => $data + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + $event->sheet->getDelegate()->getStyle('A:U')->getFont()->setName('Arial'); + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setHorizontal(Alignment::HORIZONTAL_CENTER); + + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setVertical(Alignment::VERTICAL_CENTER); + } + ]; + } + + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('q1'); + return [$drawing, $drawing2]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php index 2d4d07b7..098fc85d 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -32,132 +32,45 @@ class RoadItemsReportController extends Controller ]); } - public function countryActivityPerSubItem(Request $request): JsonResponse + public function countryActivityPerSubItem(Request $request, RoadItemReportService $roadItemReportService): 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(); - - - $activities = $provinceRoadItemsPerSubItem->push(...$countryRoadItemsPerSubItem); + $activities = $roadItemReportService->countryActivityPerSubItem($request); $provinces = Province::all(['id', 'name_fa']); $subItems = InfoItem::query() - ->where('item', $item) + ->where('item', $request->item) ->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']); return $this->successResponse([ - 'activities' => $activities, + 'activities' => $activities['data'], 'sub_items' => $subItems, 'provinces' => $provinces, ]); } - public function provinceActivityPerSubItem(Request $request): JsonResponse + public function provinceActivityPerSubItem(Request $request, RoadItemReportService $roadItemReportService): 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; + $activities = $roadItemReportService->provinceActivityPerSubItem($request); - $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(); + $edarateShahri = EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']); - $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, - -1 AS ci - ') - ->where('item', '=', $item) - ->where('province_id', '=', $province) - ->whereBetween('activity_date_time', [$fromDate, $toDate]) - ->where('status', '=', 1) - ->groupBy('sub_item') - ->get(); - - - $edarateShahri = EdarateShahri::query()->where('province_id', '=', $province)->get(['id', 'name_fa']); - $activities = $cityRoadItemsPerSubItem->push(...$provinceRoadItemsPerSubItem); $subItems = InfoItem::query() - ->where('item', $item) + ->where('item', $request->item) ->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']); return $this->successResponse([ - 'activities' => $activities, + 'activities' => $activities['data'], 'edarateShahri' => $edarateShahri, 'sub_items' => $subItems, ]); } - public function countryActivityPerItem(Request $request): JsonResponse + public function countryActivityPerItem(Request $request, RoadItemReportService $roadItemReportService): 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']); - $isSpecialUser = $user->hasPermissionTo("show-road-item-supervise-cartable"); - $provinceId = $isSpecialUser ? null : $user->province_id; - - $provinceActivity = 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'); - - $countryActivity = 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'); - - $activities = $provinceActivity - ->unionAll($countryActivity) - ->get(); - + $activities = $roadItemReportService->countryActivityPerItem($request); $provinces = Province::all(['id', 'name_fa']); return $this->successResponse([ @@ -166,37 +79,10 @@ class RoadItemsReportController extends Controller ]); } - public function provinceActivityPerItem(Request $request): JsonResponse + public function provinceActivityPerItem(Request $request, RoadItemReportService $roadItemReportService): 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(); - - $edarehActivity = 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'); - - $cityActivity = 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'); - - $activities = $edarehActivity - ->unionAll($cityActivity) - ->get(); - - $edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name_fa']); + $activities = $roadItemReportService->provinceActivityPerItem($request); + $edarateShahri = EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']); return $this->successResponse([ 'activities' => $activities, @@ -228,48 +114,35 @@ class RoadItemsReportController extends Controller return $this->successResponse($data); } - public function countryActivityExcelPerItem(Request $request): BinaryFileResponse + public function countryActivityExcelPerItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse { auth()->user()->addActivityComplete(1034); $name = 'گزارش کشوری از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - return Excel::download(new CountryActivityPerItemReport($request->fromDate, $request->toDate), $name); + $activities = $roadItemReportService->countryActivityPerItem($request); + return Excel::download(new CountryActivityPerItemReport($activities), $name); } - public function provinceActivityExcelPerItem(Request $request): BinaryFileResponse + public function provinceActivityExcelPerItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse { auth()->user()->addActivityComplete(1034); $name = 'گزارش استانی از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - return Excel::download(new ProvinceActivityPerItemReport($request->fromDate, $request->toDate, $request->province), $name); + $activities = $roadItemReportService->provinceActivityPerItem($request); + return Excel::download(new ProvinceActivityPerItemReport($activities), $name); } public function countryActivityExcelPerSubItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse { auth()->user()->addActivityComplete(1034); - - $activities = $roadItemReportService->countryActivityPerSubItem( - $request->item, - $request->fromDate, - $request->toDate, - ); - $name = "گزارش کشوری از فعالیت روزانه و جاری - جدول 2 " . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - + $activities = $roadItemReportService->countryActivityPerSubItem($request); return Excel::download(new CountryActivityPerSubItemReport($activities), $name); } public function provinceActivityExcelPerSubItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse { auth()->user()->addActivityComplete(1034); - - $activities = $roadItemReportService->provinceActivityPerSubItem( - $request->item, - $request->fromDate, - $request->toDate, - $request->province_id - ); - + $activities = $roadItemReportService->provinceActivityPerSubItem($request); $name = "گزارش استانی از فعالیت روزانه و جاری - جدول 2 " . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - return Excel::download(new ProvinceActivityPerSubItemReport($activities), $name); } } diff --git a/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php index 525103f8..4893bee3 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php @@ -2,9 +2,8 @@ namespace App\Http\Controllers\V3\Dashboard; -use App\Exports\V2\RoadItems\OperatorCartableExport; -use App\Exports\V2\RoadItems\SupervisorCartableExport; -use App\Facades\DataTable\DataTableFacade; +use App\Exports\V3\RoadItemsProjects\OperatorCartableReport; +use App\Exports\V3\RoadItemsProjects\SupervisorCartableReport; use App\Http\Controllers\Controller; use App\Http\Requests\V3\RoadItemsProject\StoreRequest; use App\Http\Requests\V3\RoadItemsProject\UpdateRequest; @@ -14,6 +13,7 @@ use App\Models\EdarateShahri; use App\Models\InfoItem; use App\Models\RoadItemsProject; use App\Services\NominatimService; +use App\Services\Reports\RoadItemReportService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; @@ -28,39 +28,9 @@ class RoadItemsProjectController extends Controller /** * Display a listing of the resource. */ - public function supervisorIndex(Request $request): JsonResponse + public function supervisorIndex(Request $request, RoadItemReportService $roadItemReportService): JsonResponse { - $columns = array( - 'id', 'user_id', 'start_lat', 'start_lng', 'end_lat', - 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', 'sub_item', - 'sub_item_data', 'created_at', 'updated_at', 'province_id', 'province_fa', - 'unit_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time', - 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time','cmmsMachines.machine_code', 'rahdaran.code', - ); - - $allowedFilters = $columns; - $allowedSortings = $columns; - - $user = auth()->user(); - $query = null; - - if ($user->hasPermissionTo('show-road-item-supervise-cartable')) { - $query = RoadItemsProject::query()->where('is_new', 1)->with(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']); - } - elseif ($user->hasPermissionTo('show-road-item-supervise-cartable-province')) { - if (is_null($user->province_id)) { - return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); - } - $query = RoadItemsProject::query()->where('is_new', 1) - ->with(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])->where('province_id', auth()->user()->province_id); - } - - $data = DataTableFacade::run( - $query, - $request, - allowedFilters: $allowedFilters, - allowedSortings: $allowedSortings); - + $data = $roadItemReportService->supervisorCartableReport($request); foreach ($data['data'] as $road_item) { if (Gate::allows('gate-supervise-road-item', $road_item)) { @@ -126,36 +96,16 @@ class RoadItemsProjectController extends Controller } - public function supervisorCartableReport(Request $request): BinaryFileResponse + public function supervisorCartableReport(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse { $name = 'گزارش از کارتابل ارزیابی فعالیت روزانه ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; - return Excel::download(new SupervisorCartableExport($request->id, $request->item, $request->status, - $request->fromDate, $request->toDate, $request->province_id, $request->edarat_id), $name); + $data = $roadItemReportService->supervisorCartableReport($request); + return Excel::download(new SupervisorCartableReport($data), $name); } - public function operatorIndex(Request $request): JsonResponse + public function operatorIndex(Request $request, RoadItemReportService $roadItemReportService): JsonResponse { - $columns = array( - 'id', 'user_id', 'start_lat', 'start_lng', 'end_lat', - 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', 'sub_item', - 'sub_item_data', 'created_at', 'updated_at', 'province_id', 'province_fa', - 'unit_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time', - 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time', 'cmmsMachines.machine_code', 'rahdaran.code', - ); - - $allowedFilters = $columns; - $allowedSortings = $columns; - - $query = RoadItemsProject::with(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']) - ->where('is_new', 1) - ->where('user_id', auth()->user()->id); - - $data = DataTableFacade::run( - $query, - $request, - allowedFilters: $allowedFilters, - allowedSortings: $allowedSortings); - + $data = $roadItemReportService->operatorCartableReport($request); return response()->json($data); } @@ -314,12 +264,10 @@ class RoadItemsProjectController extends Controller return $this->successResponse(); } - public function operatorCartableReport(Request $request): BinaryFileResponse + public function operatorCartableReport(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse { $name = 'گزارش از کارتابل عملیات فعالیت روزانه ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; - return Excel::download( - new OperatorCartableExport($request->id, $request->item, $request->status, $request->fromDate, $request->toDate), - $name - ); + $data = $roadItemReportService->operatorCartableReport($request); + return Excel::download(new OperatorCartableReport($data), $name); } } diff --git a/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php b/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php index 32d5978c..565ca51e 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php @@ -4,6 +4,8 @@ namespace App\Http\Controllers\V3\Dashboard; use App\Exports\V2\RoadPatrol\OperatorCartableExport; use App\Exports\V2\RoadPatrol\SupervisorCartableExport; +use App\Exports\V3\RoadPatrols\OperatorCartableReport; +use App\Exports\V3\RoadPatrols\SupervisorCartableReport; use App\Facades\DataTable\DataTableFacade; use App\Facades\Sms\Sms; use App\Http\Controllers\Controller; @@ -16,6 +18,7 @@ use App\Models\RoadItemsProject; use App\Models\RoadObserved; use App\Models\RoadPatrol; use App\Services\NominatimService; +use App\Services\Reports\RoadPatrolReportService; use Carbon\Carbon; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -30,40 +33,9 @@ class RoadPatrolProjectController extends Controller { use ApiResponse; - public function supervisorIndex(Request $request): JsonResponse + public function supervisorIndex(Request $request, RoadPatrolReportService $roadPatrolReportService): JsonResponse { - $columns = array( - 'id', 'start_lat', 'start_lon', 'end_lat', 'end_lon', 'operator_id', 'created_at', - 'operator_name', 'officer_plaque', 'officer_phone_number', 'officer_name', - 'supervisor_description', 'supervising_time', 'supervisor_name', 'status', - 'status_fa', 'distance', 'province_id', 'province_fa', 'edare_id', 'edare_name', - 'start_time', 'end_time','description', 'cmmsMachines.machine_code', 'rahdaran.code', - ); - - $allowedFilters = $columns; - $allowedSortings = $columns; - - $user = auth()->user(); - $query = null; - - if ($user->hasPermissionTo('show-road-patrol-supervise-cartable')) { - $query = RoadPatrol::query() - ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']); - } - elseif ($user->hasPermissionTo('show-road-patrol-supervise-cartable-province')) { - if (is_null($user->province_id)) { - return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); - } - $query = RoadPatrol::query() - ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']) - ->where('province_id', '=', $user->province_id); - } - - $data = DataTableFacade::run( - $query, - $request, - allowedFilters: $allowedFilters, - allowedSortings: $allowedSortings); + $data = $roadPatrolReportService->supervisorCartableReport($request); foreach ($data['data'] as $road_patrol) { if (Gate::allows('gate-supervise-road-item', $road_patrol)) { @@ -111,37 +83,16 @@ class RoadPatrolProjectController extends Controller return $this->successResponse(); } - public function supervisorCartableReport(Request $request): BinaryFileResponse + public function supervisorCartableReport(Request $request, RoadPatrolReportService $roadPatrolReportService): BinaryFileResponse { $name = 'گزارش از کارتابل ارزیابی گشت راهداری ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; - return Excel::download( - new SupervisorCartableExport($request->id, $request->fromDate, - $request->toDate, $request->province_id, $request->edare_id - ), $name - ); + $data = $roadPatrolReportService->supervisorCartableReport($request); + return Excel::download(new SupervisorCartableReport($data), $name); } - public function operatorIndex(Request $request): JsonResponse + public function operatorIndex(Request $request, RoadPatrolReportService $roadPatrolReportService): JsonResponse { - $columns = array( - 'id', 'start_lat', 'start_lon', 'end_lat', 'end_lon', 'officer_plaque', 'created_at', - 'officer_phone_number', 'officer_name', 'supervisor_description', 'supervising_time', - 'supervisor_name', 'status', 'status_fa', 'distance', 'start_time', 'end_time', 'cmmsMachines.machine_code', 'rahdaran.code', - ); - - $allowedFilters = $columns; - $allowedSortings = $columns; - - $query = RoadPatrol::query() - ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']) - ->where('operator_id', '=', auth()->user()->id); - - $data = DataTableFacade::run( - $query, - $request, - allowedFilters: $allowedFilters, - allowedSortings: $allowedSortings); - + $data = $roadPatrolReportService->operatorCartableReport($request); return response()->json($data); } @@ -369,12 +320,10 @@ class RoadPatrolProjectController extends Controller return $this->successResponse($roadPatrol); } - public function operatorCartableReport(Request $request): BinaryFileResponse + public function operatorCartableReport(Request $request, RoadPatrolReportService $roadPatrolReportService): BinaryFileResponse { $name = 'گزارش از کارتابل عملیات گشت راهداری ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; - return Excel::download( - new OperatorCartableExport($request->id, $request->status, $request->officer_name, $request->fromDate, $request->toDate), - $name - ); + $data = $roadPatrolReportService->operatorCartableReport($request); + return Excel::download(new OperatorCartableReport($data), $name); } } diff --git a/app/Services/Reports/RoadItemReportService.php b/app/Services/Reports/RoadItemReportService.php index 240d6bb4..4751cda3 100644 --- a/app/Services/Reports/RoadItemReportService.php +++ b/app/Services/Reports/RoadItemReportService.php @@ -2,92 +2,232 @@ namespace App\Services\Reports; +use App\Facades\DataTable\DataTableFacade; use App\Models\InfoItem; +use App\Models\RoadItemsProject; +use Illuminate\Http\Request; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; class RoadItemReportService { - public function countryActivityPerSubItem(int $item, string $fromDate, string $toDate): array + public function supervisorCartableReport(Request $request) { - $subItems = InfoItem::query()->where('item', $item) - ->orderBy('sub_item') - ->get(['sub_item', 'sub_item_str', 'sub_item_unit']); + $columns = array( + 'id', 'user_id', 'start_lat', 'start_lng', 'end_lat', + 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', 'sub_item', + 'sub_item_data', 'created_at', 'updated_at', 'province_id', 'province_fa', + 'unit_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time', + 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time','cmmsMachines.machine_code', 'rahdaran.code', + ); - $query = DB::table('road_items_projects') - ->selectRaw('province_id, province_fa'); + $allowedFilters = $columns; + $allowedSortings = $columns; - foreach ($subItems as $subItem) { - $query->selectRaw(" - COUNT(CASE WHEN sub_item = {$subItem->sub_item} THEN 1 END) as Count_{$subItem->sub_item}, - SUM(CASE WHEN sub_item = {$subItem->sub_item} THEN sub_item_data END) as Sum_{$subItem->sub_item} - "); + $user = auth()->user(); + $query = null; + + if ($user->hasPermissionTo('show-road-item-supervise-cartable')) { + $query = RoadItemsProject::query()->where('is_new', 1)->with(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']); + } + elseif ($user->hasPermissionTo('show-road-item-supervise-cartable-province')) { + if (is_null($user->province_id)) { + return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); + } + $query = RoadItemsProject::query()->where('is_new', 1) + ->with(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])->where('province_id', auth()->user()->province_id); } - $query->where('item', '=', $item) - ->where('status', '=', 1) + $data = DataTableFacade::run( + $query, + $request, + allowedFilters: $allowedFilters, + allowedSortings: $allowedSortings); + + return $data; + } + + public function operatorCartableReport(Request $request) + { + $columns = array( + 'id', 'user_id', 'start_lat', 'start_lng', 'end_lat', + 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', 'sub_item', + 'sub_item_data', 'created_at', 'updated_at', 'province_id', 'province_fa', + 'unit_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time', + 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time', 'cmmsMachines.machine_code', 'rahdaran.code', + ); + + $allowedFilters = $columns; + $allowedSortings = $columns; + + $query = RoadItemsProject::with(['files', 'rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']) + ->where('is_new', 1) + ->where('user_id', auth()->user()->id); + + $data = DataTableFacade::run( + $query, + $request, + allowedFilters: $allowedFilters, + allowedSortings: $allowedSortings); + + return $data; + } + + public function countryActivityPerSubItem(Request $request): array + { + $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]) - ->groupBy('province_id', 'province_fa') - ->orderBy('province_id'); + ->where('status', '=', 1) + ->groupBy('province_id', 'sub_item') + ->get(); - $activities = $query->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(); - $totalItemCount = [ - 'province_fa' => 'کشوری' - ]; - foreach ($subItems as $subItem) { - $totalItemCount["Count_{$subItem->sub_item}"] = $activities->sum("Count_{$subItem->sub_item}"); - $totalItemCount["Sum_{$subItem->sub_item}"] = $activities->sum("Sum_{$subItem->sub_item}"); - } + $activities = $provinceRoadItemsPerSubItem->push(...$countryRoadItemsPerSubItem); return [ - 'data' => $activities->push((object)$totalItemCount), + 'data' => $activities, 'fromDate' => $fromDate, 'toDate' => $toDate, - 'details' => $subItems->keyBy('sub_item'), ]; } - public function provinceActivityPerSubItem(int $item, string $fromDate, string $toDate, int $provinceId): array + public function provinceActivityPerSubItem(Request $request): array { - $subItems = InfoItem::query()->where('item', $item) - ->orderBy('sub_item') - ->get(['sub_item', 'sub_item_str', 'sub_item_unit']); + $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; - $query = DB::table('road_items_projects') - ->selectRaw('province_id, province_fa, TRIM(SUBSTRING_INDEX(user_name, "استان", 1)) as city_fa, city_id'); - - foreach ($subItems as $subItem) { - $query->selectRaw(" - COUNT(CASE WHEN sub_item = {$subItem->sub_item} THEN 1 END) as Count_{$subItem->sub_item}, - SUM(CASE WHEN sub_item = {$subItem->sub_item} THEN sub_item_data END) as Sum_{$subItem->sub_item} - "); - } - - $query->where('item', '=', $item) - ->where('status', '=', 1) - ->where('province_id', '=', $provinceId) + $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]) - ->groupBy('city_id') - ->orderBy('province_id'); + ->where('status', '=', 1) + ->groupBy('edarat_id', 'sub_item') + ->get(); - $activities = $query->get(); + $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, + -1 AS ci + ') + ->where('item', '=', $item) + ->where('province_id', '=', $province) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('status', '=', 1) + ->groupBy('sub_item') + ->get(); - $totalItemCount = [ - 'city_fa' => 'استانی' - ]; - foreach ($subItems as $subItem) { - $totalItemCount["Count_{$subItem->sub_item}"] = $activities->sum("Count_{$subItem->sub_item}"); - $totalItemCount["Sum_{$subItem->sub_item}"] = $activities->sum("Sum_{$subItem->sub_item}"); - } + $activities = $cityRoadItemsPerSubItem->push(...$provinceRoadItemsPerSubItem); return [ - 'data' => $activities->push((object)$totalItemCount), + 'data' => $activities, + 'fromDate' => $fromDate, + 'toDate' => $toDate, + ]; + } + + public function countryActivityPerItem(Request $request): array + { + $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']); + $isSpecialUser = $user->hasPermissionTo("show-road-item-supervise-cartable"); + $provinceId = $isSpecialUser ? null : $user->province_id; + + $provinceActivity = 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'); + + $countryActivity = 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'); + + $activities = $provinceActivity + ->unionAll($countryActivity) + ->get(); + + return [ + 'data' => $activities, + 'fromDate' => $fromDate, + 'toDate' => $toDate, + ]; + } + + public function provinceActivityPerItem(Request $request): array + { + $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(); + + $edarehActivity = 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'); + + $cityActivity = 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'); + + $activities = $edarehActivity + ->unionAll($cityActivity) + ->get(); + + return [ + 'data' => $activities, 'fromDate' => $fromDate, 'toDate' => $toDate, - 'details' => $subItems->keyBy('sub_item') ]; } } \ No newline at end of file diff --git a/app/Services/Reports/RoadPatrolReportService.php b/app/Services/Reports/RoadPatrolReportService.php index 309533b0..1dda5f91 100644 --- a/app/Services/Reports/RoadPatrolReportService.php +++ b/app/Services/Reports/RoadPatrolReportService.php @@ -2,10 +2,75 @@ namespace App\Services\Reports; +use App\Facades\DataTable\DataTableFacade; +use App\Models\RoadPatrol; +use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class RoadPatrolReportService { + public function supervisorCartableReport(Request $request) + { + $columns = array( + 'id', 'start_lat', 'start_lon', 'end_lat', 'end_lon', 'operator_id', 'created_at', + 'operator_name', 'officer_plaque', 'officer_phone_number', 'officer_name', + 'supervisor_description', 'supervising_time', 'supervisor_name', 'status', + 'status_fa', 'distance', 'province_id', 'province_fa', 'edare_id', 'edare_name', + 'start_time', 'end_time','description', 'cmmsMachines.machine_code', 'rahdaran.code', + ); + + $allowedFilters = $columns; + $allowedSortings = $columns; + + $user = auth()->user(); + $query = null; + + if ($user->hasPermissionTo('show-road-patrol-supervise-cartable')) { + $query = RoadPatrol::query() + ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']); + } + elseif ($user->hasPermissionTo('show-road-patrol-supervise-cartable-province')) { + if (is_null($user->province_id)) { + return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); + } + $query = RoadPatrol::query() + ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']) + ->where('province_id', '=', $user->province_id); + } + + $data = DataTableFacade::run( + $query, + $request, + allowedFilters: $allowedFilters, + allowedSortings: $allowedSortings); + + return $data; + } + + public function operatorCartableReport(Request $request) + { + $columns = array( + 'id', 'start_lat', 'start_lon', 'end_lat', 'end_lon', 'officer_plaque', 'created_at', + 'officer_phone_number', 'officer_name', 'supervisor_description', 'supervising_time', + 'supervisor_name', 'status', 'status_fa', 'distance', 'start_time', 'end_time', 'cmmsMachines.machine_code', 'rahdaran.code', + ); + + $allowedFilters = $columns; + $allowedSortings = $columns; + + $query = RoadPatrol::query() + ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']) + ->where('operator_id', '=', auth()->user()->id); + + $data = DataTableFacade::run( + $query, + $request, + allowedFilters: $allowedFilters, + allowedSortings: $allowedSortings); + + return $data; + } + public function countryActivity(string $fromDate, string $toDate): array { $activities = DB::select('SELECT