From 03fd210671dcf53f3f407aa971299a1cb2962f5a Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 21 Jan 2025 10:31:25 +0330 Subject: [PATCH] create excel files --- app/Enums/InfoItem.php | 77 +++++++++++++++++++ .../CountryActivityPerSubItemReport.php | 60 ++------------- .../ProvinceActivityPerSubItemReport.php | 58 ++------------ .../Reports/RoadItemsReportController.php | 70 ++++++++++------- .../Reports/RoadItemReportService.php | 70 +++++++++++++++++ routes/v3.php | 4 + 6 files changed, 205 insertions(+), 134 deletions(-) create mode 100644 app/Enums/InfoItem.php create mode 100644 app/Services/Reports/RoadItemReportService.php diff --git a/app/Enums/InfoItem.php b/app/Enums/InfoItem.php new file mode 100644 index 00000000..8d17d409 --- /dev/null +++ b/app/Enums/InfoItem.php @@ -0,0 +1,77 @@ + [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 2 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 3 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 4 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 5 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 6 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 7 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 8 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 9 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 10 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 11 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 12 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 13 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 14 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 15 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 16 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 17 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + 20 => [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13], + ]; + + return $subitems[$item]; + } + + public static function persianName(int $item): string + { + $persianName = [ + 1 => '', + 2 => '', + 3 => '', + 4 => '', + 5 => '', + 6 => '', + 7 => '', + 8 => '', + 9 => '', + 10 => '', + 11 => '', + 12 => '', + 13 => '', + 14 => '', + 15 => '', + 16 => '', + 17 => '', + 20 => '', + ]; + + return $persianName[$item]; + } +} \ No newline at end of file diff --git a/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php b/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php index 611e0a44..9d6426fa 100644 --- a/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php +++ b/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php @@ -6,6 +6,7 @@ use App\Models\Province; use App\Models\RoadItemsProject; use Carbon\Carbon; use Illuminate\Contracts\View\View; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Concerns\FromView; use Maatwebsite\Excel\Concerns\ShouldAutoSize; @@ -17,65 +18,16 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; class CountryActivityPerSubItemReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private ?string $fromDate, private ?string $toDate){} + public function __construct(private Collection $activities){} public function view(): View { - $fromDate = $this->fromDate ?? '2021-03-21'; - $toDate = $this->toDate ?? Carbon::now(); - - $query = "SELECT - COUNT(CASE WHEN sub_item = 1 THEN 1 END) as LabeAsphaltCount, - SUM(CASE WHEN sub_item = 1 THEN sub_item_data END) as LabeAsphaltSum, - - COUNT(CASE WHEN sub_item = 2 THEN 1 END) as ShaneSaziCount, - SUM(CASE WHEN sub_item = 2 THEN sub_item_data END) as ShaneSaziSum, - - COUNT(CASE WHEN sub_item = 3 THEN 1 END) as GodOftadegiCount, - SUM(CASE WHEN sub_item = 3 THEN sub_item_data END) as GodOftadegiSum, - - COUNT(CASE WHEN sub_item = 4 THEN 1 END) as LakegiriCount, - SUM(CASE WHEN sub_item = 4 THEN sub_item_data END) as LakegiriSum, - - COUNT(CASE WHEN sub_item = 5 THEN 1 END) as MarematCount, - SUM(CASE WHEN sub_item = 5 THEN sub_item_data END) as MarematSum, - - COUNT(CASE WHEN sub_item = 6 THEN 1 END) as BastarHarimCount, - SUM(CASE WHEN sub_item = 6 THEN sub_item_data END) as BastarHarimSum, - - COUNT(CASE WHEN sub_item = 8 THEN 1 END) as DarzgiriCount, - SUM(CASE WHEN sub_item = 8 THEN sub_item_data END) as DarzgiriSum, - - COUNT(CASE WHEN sub_item = 9 THEN 1 END) as MozresCount, - SUM(CASE WHEN sub_item = 9 THEN sub_item_data END) as MozresSum, - - COUNT(CASE WHEN sub_item = 10 THEN 1 END) as TarashRooyeCount, - SUM(CASE WHEN sub_item = 10 THEN sub_item_data END) as TarashRooyeSum, - - COUNT(CASE WHEN sub_item = 11 THEN 1 END) as TighzaniCount, - SUM(CASE WHEN sub_item = 11 THEN sub_item_data END) as TighzaniSum, - - COUNT(CASE WHEN sub_item = 12 THEN 1 END) as ShenriziCount, - SUM(CASE WHEN sub_item = 12 THEN sub_item_data END) as ShenriziSum, - - COUNT(CASE WHEN sub_item = 13 THEN 1 END) as KhakbardariCount, - SUM(CASE WHEN sub_item = 13 THEN sub_item_data END) as KhakbardariSum, - - province_id, - province_fa - - FROM road_items_projects - WHERE item = 1 and status = 1 - AND activity_date_time BETWEEN '{$fromDate} 00:00:00' and '{$toDate} 23:59:59' - GROUP BY province_id, province_fa - ORDER BY province_id ASC;"; - - $countryActivities = DB::select($query); + $activities = $this->activities; return view('', [ - 'activities' => $countryActivities, - 'fromDate' => $fromDate, - 'toDate' => $toDate + 'activities' => $activities->data, + 'fromDate' => $activities->fromDate, + 'toDate' => $activities->toDate ]); } diff --git a/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php index f966747e..6b8be60d 100644 --- a/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php +++ b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php @@ -6,6 +6,7 @@ use App\Models\Province; use App\Models\RoadItemsProject; use Carbon\Carbon; use Illuminate\Contracts\View\View; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Concerns\FromView; use Maatwebsite\Excel\Concerns\ShouldAutoSize; @@ -17,63 +18,16 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; class ProvinceActivityPerSubItemReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private ?string $fromDate, private ?string $toDate, private string $provinceId,){} + public function __construct(private Collection $activities){} public function view(): View { - $fromDate = $this->fromDate ?? '2021-03-21'; - $toDate = $this->toDate ?? Carbon::now(); - - $query = "SELECT - COUNT(CASE WHEN sub_item = 1 THEN 1 END) as LabeAsphaltCount, - SUM(CASE WHEN sub_item = 1 THEN sub_item_data END) as LabeAsphaltSum, - - COUNT(CASE WHEN sub_item = 2 THEN 1 END) as ShaneSaziCount, - SUM(CASE WHEN sub_item = 2 THEN sub_item_data END) as ShaneSaziSum, - - COUNT(CASE WHEN sub_item = 3 THEN 1 END) as GodOftadegiCount, - SUM(CASE WHEN sub_item = 3 THEN sub_item_data END) as GodOftadegiSum, - - COUNT(CASE WHEN sub_item = 4 THEN 1 END) as LakegiriCount, - SUM(CASE WHEN sub_item = 4 THEN sub_item_data END) as LakegiriSum, - - COUNT(CASE WHEN sub_item = 5 THEN 1 END) as MarematCount, - SUM(CASE WHEN sub_item = 5 THEN sub_item_data END) as MarematSum, - - COUNT(CASE WHEN sub_item = 6 THEN 1 END) as BastarHarimCount, - SUM(CASE WHEN sub_item = 6 THEN sub_item_data END) as BastarHarimSum, - - COUNT(CASE WHEN sub_item = 8 THEN 1 END) as DarzgiriCount, - SUM(CASE WHEN sub_item = 8 THEN sub_item_data END) as DarzgiriSum, - - COUNT(CASE WHEN sub_item = 9 THEN 1 END) as MozresCount, - SUM(CASE WHEN sub_item = 9 THEN sub_item_data END) as MozresSum, - - COUNT(CASE WHEN sub_item = 10 THEN 1 END) as TarashRooyeCount, - SUM(CASE WHEN sub_item = 10 THEN sub_item_data END) as TarashRooyeSum, - - COUNT(CASE WHEN sub_item = 11 THEN 1 END) as TighzaniCount, - SUM(CASE WHEN sub_item = 11 THEN sub_item_data END) as TighzaniSum, - - COUNT(CASE WHEN sub_item = 12 THEN 1 END) as ShenriziCount, - SUM(CASE WHEN sub_item = 12 THEN sub_item_data END) as ShenriziSum, - - COUNT(CASE WHEN sub_item = 13 THEN 1 END) as KhakbardariCount, - SUM(CASE WHEN sub_item = 13 THEN sub_item_data END) as KhakbardariSum, - - province_id, province_fa, city_id, user_name as city_fa - - FROM road_items_projects - WHERE item =1 AND status = 1 - AND province_id = {$this->provinceId} - AND activity_date_time BETWEEN '{$fromDate}' AND '{$toDate}' GROUP BY city_id ORDER BY province_id ASC;"; - - $provinceActivities = DB::select($query); + $activities = $this->activities; return view('', [ - 'activities' => $provinceActivities, - 'fromDate' => $fromDate, - 'toDate' => $toDate + 'activities' => $activities->data, + 'fromDate' => $activities->fromDate, + 'toDate' => $activities->toDate ]); } diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php index 5c0d789c..45b18fc7 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -2,13 +2,17 @@ namespace App\Http\Controllers\V3\Dashboard\Reports; -use App\Exports\Activities\One\AllSheets as OneSheet; +use App\Exports\V3\RoadItemsProjects\CountryActivityPerItemReport; +use App\Exports\V3\RoadItemsProjects\CountryActivityPerSubItemReport; +use App\Exports\V3\RoadItemsProjects\ProvinceActivityPerItemReport; +use App\Exports\V3\RoadItemsProjects\ProvinceActivityPerSubItemReport; use App\Http\Controllers\Controller; use App\Http\Traits\ApiResponse; use App\Models\EdarateShahri; use App\Models\InfoItem; use App\Models\Province; use App\Models\RoadItemsProject; +use App\Services\Reports\RoadItemReportService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Maatwebsite\Excel\Facades\Excel; @@ -224,38 +228,48 @@ class RoadItemsReportController extends Controller return $this->successResponse($data); } - public function activityExcelPerItem(Request $request): BinaryFileResponse + public function countryActivityExcelPerItem(Request $request): BinaryFileResponse { auth()->user()->addActivityComplete(1034); - $name = 'گزارش از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - return Excel::download(new OneSheet($request->fromDate, $request->toDate, $request->province), $name); + $name = 'گزارش کشوری از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + return Excel::download(new CountryActivityPerItemReport($request->fromDate, $request->toDate), $name); } - public function activityExcelPerSubItem(Request $request) + public function provinceActivityExcelPerItem(Request $request): BinaryFileResponse { - $url_correction = $request->province ? "&province={$request->province}" : ""; + 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); + } - return match ($request->type) { - 1 => redirect("/reports/two/maremat?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 2 => redirect("/reports/two/paksazi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 3 => redirect("/reports/two/alaem?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 4 => redirect("/reports/two/hefaz?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 5 => redirect("/reports/two/roshanaei?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 6 => redirect("/reports/two/khatkeshi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 7 => redirect("/reports/two/rangamizi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 8 => redirect("/reports/two/shosteshoo?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 9 => redirect("/reports/two/imensazi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 10 => redirect("/reports/two/harim?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 11 => redirect("/reports/two/pol?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 12 => redirect("/reports/two/toonel?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 13 => redirect("/reports/two/zemestani?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 14 => redirect("/reports/two/mashinalat?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 15 => redirect("/reports/two/rahdar?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 16 => redirect("/reports/two/ezterari?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - 20 => redirect("/reports/two/bazrasi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), - default => response()->json([ - 'error' => '404' - ], 404), - }; + 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'; + + 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 + ); + + $name = "گزارش استانی از فعالیت روزانه و جاری({}) - جدول 2 " . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + + return Excel::download(new ProvinceActivityPerSubItemReport($activities), $name); } } diff --git a/app/Services/Reports/RoadItemReportService.php b/app/Services/Reports/RoadItemReportService.php new file mode 100644 index 00000000..25210900 --- /dev/null +++ b/app/Services/Reports/RoadItemReportService.php @@ -0,0 +1,70 @@ +selectRaw('province_id, province_fa'); + + foreach ($subItems as $key => $name) { + $query->selectRaw(" + COUNT(CASE WHEN sub_item = {$key} THEN 1 END) as {$name}Count, + SUM(CASE WHEN sub_item = {$key} THEN sub_item_data END) as {$name}Sum + "); + } + + $query->where('item', '=', $item) + ->where('status', '=', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->groupBy('province_id', 'province_fa') + ->orderBy('province_id'); + + $activities = $query->get(); + + return collect([ + 'data' => $activities, + 'fromDate' => $fromDate, + 'toDate' => $toDate, + ]); + } + + public function provinceActivityPerSubItem(int $item, string $fromDate, string $toDate, int $provinceId): Collection + { + $subItems = InfoItem::subItems($item); + + $query = DB::table('road_items_projects') + ->selectRaw('province_id, province_fa, user_name as city_fa, city_id'); + + foreach ($subItems as $key => $name) { + $query->selectRaw(" + COUNT(CASE WHEN sub_item = {$key} THEN 1 END) as {$name}Count, + SUM(CASE WHEN sub_item = {$key} THEN sub_item_data END) as {$name}Sum + "); + } + + $query->where('item', '=', $item) + ->where('status', '=', 1) + ->where('province_id', '=', $provinceId) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->groupBy('city_id') + ->orderBy('province_id'); + + $activities = $query->get(); + + return collect([ + 'data' => $activities, + 'fromDate' => $fromDate, + 'toDate' => $toDate, + ]); + } +} \ No newline at end of file diff --git a/routes/v3.php b/routes/v3.php index 78e8be34..4d3177e0 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -200,6 +200,10 @@ Route::prefix('road_item_reports') Route::get('/province_activity_per_item', 'provinceActivityPerItem')->name('provinceActivityPerItem'); Route::get('/city_activity_per_item', 'cityActivityPerItem')->name('cityActivityPerItem'); Route::get('/map', 'map')->name('map'); + Route::get('/country_activity_excel_per_item', 'countryActivityExcelPerItem')->name('countryActivityExcelPerItem'); + Route::get('/province_activity_excel_per_item', 'provinceActivityExcelPerItem')->name('provinceActivityExcelPerItem'); + Route::get('/country_activity_excel_per_sub_item', 'countryActivityExcelPerSubItem')->name('countryActivityExcelPerSubItem'); + Route::get('/province_activity_excel_per_sub_item', 'provinceActivityExcelPerSubItem')->name('provinceActivityExcelPerSubItem'); }); Route::prefix('road_patrol_reports')