From c543afd62715823eb10909053e9120f46e3f7822 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 27 Jan 2025 08:58:45 +0330 Subject: [PATCH 01/10] change the validation --- .../V3/RoadPatrolProject/StoreRequest.php | 6 ++-- app/Models/RoadPatrol.php | 8 ++++++ ...ange_column_type_in_road_patrols_table.php | 28 +++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 database/migrations/2025_01_27_085125_change_column_type_in_road_patrols_table.php diff --git a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php index b0986e4b..d75d82db 100644 --- a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php +++ b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php @@ -27,7 +27,7 @@ class StoreRequest extends FormRequest 'distance' => 'numeric', 'start_time' => 'required|date_format:Y-m-d H:i', 'end_time' => 'required|date_format:Y-m-d H:i|after:start_time', - 'fuel_consumption' => 'required|integer', + 'fuel_consumption' => 'required|numeric', 'vehicle_runtime' => 'required|integer', 'stop_points' => 'required|array', 'road_patrol_machines_id' => 'required|array', @@ -38,9 +38,9 @@ class StoreRequest extends FormRequest 'observed_items' => 'array', 'observed_items.*.item_id' => 'required|integer', 'observed_items.*.sub_item_id' => 'required|integer', - 'observed_items.*.local_name' => 'required', 'observed_items.*.description' => '', 'observed_items.*.instant_action' => 'required|in:0,1', + 'observed_items.*.local_name' => 'required_if:observed_items.*.instant_action,0', // road item projects fields 'observed_items.*.start_point' => 'required', @@ -50,7 +50,7 @@ class StoreRequest extends FormRequest 'observed_items.*.after_image' => 'image|max:4096', 'observed_items.*.priority' => 'integer|in:1,2,3|required_if:observed_items.*.instant_action,0', 'observed_items.*.priority_fa' => 'string|required_if:observed_items.*.instant_action,0', - 'description' => 'string|required_with:observed_items', + 'description' => 'string', 'observed_items.*.road_item_machines_id' => 'required_if:observed_items.*.instant_action,1|array', 'observed_items.*.road_item_machines_id.*' => 'required_if:observed_items.*.instant_action,1|exists:cmms_machines,id', diff --git a/app/Models/RoadPatrol.php b/app/Models/RoadPatrol.php index c39af8c2..19ff01bd 100644 --- a/app/Models/RoadPatrol.php +++ b/app/Models/RoadPatrol.php @@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphToMany; +use Illuminate\Database\Eloquent\Casts\Attribute; class RoadPatrol extends Model { @@ -13,6 +14,13 @@ class RoadPatrol extends Model protected $guarded = ['id']; + protected function stopPoints(): Attribute + { + return Attribute::make( + get: fn ($value) => $value ? json_decode($value) : null, + ); + } + public function observedItems(): HasMany { return $this->hasMany(ObservedItem::class); diff --git a/database/migrations/2025_01_27_085125_change_column_type_in_road_patrols_table.php b/database/migrations/2025_01_27_085125_change_column_type_in_road_patrols_table.php new file mode 100644 index 00000000..2c20efba --- /dev/null +++ b/database/migrations/2025_01_27_085125_change_column_type_in_road_patrols_table.php @@ -0,0 +1,28 @@ +string('fuel_consumption')->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('road_patrols', function (Blueprint $table) { + $table->integer('fuel_consumption')->change(); + }); + } +}; From b505389a8a8a2e0cf56d4f7936d6c9612a809a54 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sun, 2 Feb 2025 10:33:10 +0330 Subject: [PATCH 02/10] rename to meaningful names --- .../V3/Dashboard/Reports/RoadItemsReportController.php | 8 ++++---- routes/v3.php | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php index be92abb6..2d4d07b7 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -32,7 +32,7 @@ class RoadItemsReportController extends Controller ]); } - public function provinceActivityPerSubItem(Request $request): JsonResponse + public function countryActivityPerSubItem(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(); @@ -74,7 +74,7 @@ class RoadItemsReportController extends Controller ]); } - public function cityActivityPerSubItem(Request $request): JsonResponse + 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(); @@ -123,7 +123,7 @@ class RoadItemsReportController extends Controller ]); } - public function provinceActivityPerItem(Request $request): JsonResponse + public function countryActivityPerItem(Request $request): JsonResponse { if (auth()->check()) { auth()->user()->addActivityComplete(1033); @@ -166,7 +166,7 @@ class RoadItemsReportController extends Controller ]); } - public function cityActivityPerItem(Request $request): JsonResponse + public function provinceActivityPerItem(Request $request): JsonResponse { $provinceId = $request->province_id; $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); diff --git a/routes/v3.php b/routes/v3.php index ae606cc8..5172be4f 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -195,10 +195,10 @@ Route::prefix('road_item_reports') ->controller(RoadItemsReportController::class) ->group(function () { Route::get('/get_sub_items', 'getSubItems')->name('getSubItems'); + Route::get('/country_activity_per_sub_item', 'countryActivityPerSubItem')->name('countryActivityPerSubItem'); Route::get('/province_activity_per_sub_item', 'provinceActivityPerSubItem')->name('provinceActivityPerSubItem'); - Route::get('/city_activity_per_sub_item', 'cityActivityPerSubItem')->name('cityActivityPerSubItem'); + Route::get('/country_activity_per_item', 'countryActivityPerItem')->name('countryActivityPerItem'); 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'); From d7990dd985b8ed8629844e043e341eff430fef31 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sun, 2 Feb 2025 11:25:04 +0330 Subject: [PATCH 03/10] add map activities to cartables --- .../Reports/RoadPatrolReportController.php | 23 +++++++++++++ .../Dashboard/RoadItemsProjectController.php | 16 +++------ .../Dashboard/RoadPatrolProjectController.php | 33 ++----------------- routes/v3.php | 4 +-- 4 files changed, 31 insertions(+), 45 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php index 8df975dd..3ce39b0c 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php @@ -8,6 +8,8 @@ use App\Http\Controllers\Controller; use App\Http\Traits\ApiResponse; use App\Models\EdarateShahri; use App\Models\Province; +use App\Models\RoadObserved; +use App\Models\RoadPatrol; use App\Services\Reports\RoadPatrolReportService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -66,4 +68,25 @@ class RoadPatrolReportController extends Controller return Excel::download(new ProvinceActivity($activities), $name); } + + public function activitiesOnMap(Request $request): JsonResponse + { + $date_from = $request->date_from ? $request->date_from .' 00:00:00' : Date('Y-m-d') .' 00:00:00'; + $date_to = $request->date_to ? $request->date_to.' 23:59:59' : (new \DateTime('tomorrow'))->format('Y-m-d').' 23:59:59'; + + $data = RoadPatrol::query()->when($request->province_id, function ($query, $province) { + return $query->where('province_id', '=', $province); + }) + ->when($request->edare_id, function ($query, $edare_id) { + return $query->where('edare_id', '=', $edare_id); + }) + ->whereBetween('created_at', [ + $date_from, + $date_to, + ]) + ->select('id', 'start_lat', 'start_lon') + ->get(); + + return $this->successResponse($data); + } } diff --git a/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php index c2a7d122..525103f8 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php @@ -95,9 +95,7 @@ class RoadItemsProjectController extends Controller public function restore(RoadItemsProject $roadItemsProject): JsonResponse { if ($roadItemsProject->status == 0) { - return response()->json([ - 'message' => 'امکان بازگردانی وضعیت این فعالیت وجود ندارد!' - ], 400); + return $this->errorResponse('امکان بازگردانی وضعیت این فعالیت وجود ندارد!'); } $roadItemsProject->update([ @@ -170,15 +168,11 @@ class RoadItemsProjectController extends Controller $user = auth()->user(); if ($user->edarate_ostani_id || is_null($user->city_id)) { - return response()->json([ - 'message' => 'امکان ثبت فعالیت برای ادارات استانی و ستادی وجود ندارد!' - ], 400); + return $this->errorResponse('امکان ثبت فعالیت برای ادارات استانی و ستادی وجود ندارد!'); } if (is_null($user->edarate_shahri_id)) { - return response()->json([ - 'message' => 'اداره شهری برای شما در سامانه ثبت نشده است!' - ], 400); + return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); } $info_item = InfoItem::query()->where('item', $request->item_id) @@ -241,9 +235,7 @@ class RoadItemsProjectController extends Controller $road_item = RoadItemsProject::store($user, $attributes, $before_image, $after_image, $request->observed_item_id); if ($road_item === -1) { - return response()->json([ - 'message' => 'اقدام مربوطه قبلا رسیدگی شده است.' - ], 400); + return $this->errorResponse('اقدام مربوطه قبلا رسیدگی شده است.'); } $road_item->rahdaran()->attach($request->rahdaran_id); diff --git a/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php b/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php index 6d62ba03..32d5978c 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadPatrolProjectController.php @@ -150,15 +150,11 @@ class RoadPatrolProjectController extends Controller $user = auth()->user(); if ($user->edarate_ostani_id || is_null($user->city_id)) { - return response()->json([ - 'message' => 'امکان ثبت فعالیت برای ادارات استانی وجود ندارد!' - ], 400); + return $this->errorResponse('امکان ثبت فعالیت برای ادارات استانی وجود ندارد!'); } if (is_null($user->edarate_shahri_id)) { - return response()->json([ - 'message' => 'اداره شهری برای شما در سامانه ثبت نشده است!' - ], 400); + return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); } $edare_id = $user->edarate_shahri_id ?? $user->edarate_ostani_id; @@ -279,9 +275,7 @@ class RoadPatrolProjectController extends Controller $road_item = RoadItemsProject::store($user, $attributes, $before_image, $after_image, $observed_item->id); if ($road_item === -1) { - return response()->json([ - 'message' => 'اقدام مربوطه قبلا رسیدگی شده است.' - ], 400); + return $this->errorResponse('اقدام مربوطه قبلا رسیدگی شده است.'); } $road_item->rahdaran()->attach($item['road_item_rahdaran_id']); @@ -332,27 +326,6 @@ class RoadPatrolProjectController extends Controller return $this->successResponse($data); } - public function getAllDataToMap(Request $request): JsonResponse - { - $date_from = $request->date_from ? $request->date_from .' 00:00:00' : Date('Y-m-d') .' 00:00:00'; - $date_to = $request->date_to ? $request->date_to.' 23:59:59' : (new \DateTime('tomorrow'))->format('Y-m-d').' 23:59:59'; - - $data = RoadPatrol::query()->when($request->province_id, function ($query, $province) { - return $query->where('province_id', '=', $province); - }) - ->when($request->edare_id, function ($query, $edare_id) { - return $query->where('edare_id', '=', $edare_id); - }) - ->whereBetween('created_at', [ - $date_from, - $date_to, - ]) - ->select('id', 'start_lat', 'start_lon') - ->get(); - - return $this->successResponse($data); - } - public function map(Request $request): JsonResponse { $province = $request->province_id; diff --git a/routes/v3.php b/routes/v3.php index 5172be4f..9557589f 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -152,9 +152,6 @@ Route::prefix('road_patrols') Route::get('/operator/report/{roadPatrol}', 'getReport') ->name('getReport'); - Route::get('/operator/map_data', 'getAllDataToMap') - ->name('getAllDataToMap'); - Route::get('/detail/{roadPatrol}', 'show') ->name('show'); }); @@ -214,4 +211,5 @@ Route::prefix('road_patrol_reports') Route::get('/province_activity', 'provincePatrolActivity')->name('provincePatrolActivity'); Route::get('/country_activity_excel', 'countryActivityExcel')->name('countryActivityExcel'); Route::get('/province_activity_excel', 'provinceActivityExcel')->name('provinceActivityExcel'); + Route::get('/activities_on_map', 'activitiesOnMap')->name('activitiesOnMap'); }); From 967d0e6db82676a8161d85d75dae25bc51f5c1b9 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 4 Feb 2025 09:34:09 +0330 Subject: [PATCH 04/10] seperate the logic into service reports --- .../CountryActivityPerItemReport.php | 64 +---- .../CountryActivityPerSubItemReport.php | 1 - .../OperatorCartableReport.php | 69 +++++ .../ProvinceActivityPerItemReport.php | 72 +---- .../ProvinceActivityPerSubItemReport.php | 1 - .../SupervisorCartableReport.php | 69 +++++ .../V3/RoadPatrols/OperatorCartableReport.php | 68 +++++ .../RoadPatrols/SupervisorCartableReport.php | 68 +++++ .../Reports/RoadItemsReportController.php | 171 ++---------- .../Dashboard/RoadItemsProjectController.php | 78 +----- .../Dashboard/RoadPatrolProjectController.php | 77 +----- .../Reports/RoadItemReportService.php | 248 ++++++++++++++---- .../Reports/RoadPatrolReportService.php | 65 +++++ 13 files changed, 591 insertions(+), 460 deletions(-) create mode 100644 app/Exports/V3/RoadItemsProjects/OperatorCartableReport.php create mode 100644 app/Exports/V3/RoadItemsProjects/SupervisorCartableReport.php create mode 100644 app/Exports/V3/RoadPatrols/OperatorCartableReport.php create mode 100644 app/Exports/V3/RoadPatrols/SupervisorCartableReport.php 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 From cd9d8211f41b27c2f25b8764b0ffe7d2483f8d22 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 4 Feb 2025 13:09:27 +0330 Subject: [PATCH 05/10] add new blade for reports --- .../Dashboard/RoadItemsProjectController.php | 4 +- app/Services/DataTable/DataTableInput.php | 6 +- app/Services/DataTable/DataTableService.php | 4 +- .../DataTable/Validators/FilterValidator.php | 2 +- .../DataTable/Validators/SortingValidator.php | 2 +- .../OperatorCartableReport.blade.php | 102 +++++++++++++++ .../SupervisorCartableReport.blade.php | 117 ++++++++++++++++++ 7 files changed, 228 insertions(+), 9 deletions(-) create mode 100644 resources/views/v3/Reports/RoadItems/OperatorCartableReport.blade.php create mode 100644 resources/views/v3/Reports/RoadItems/SupervisorCartableReport.blade.php diff --git a/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php index 4893bee3..00295fb7 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php @@ -100,7 +100,7 @@ class RoadItemsProjectController extends Controller { $name = 'گزارش از کارتابل ارزیابی فعالیت روزانه ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; $data = $roadItemReportService->supervisorCartableReport($request); - return Excel::download(new SupervisorCartableReport($data), $name); + return Excel::download(new SupervisorCartableReport($data['data']), $name); } public function operatorIndex(Request $request, RoadItemReportService $roadItemReportService): JsonResponse @@ -268,6 +268,6 @@ class RoadItemsProjectController extends Controller { $name = 'گزارش از کارتابل عملیات فعالیت روزانه ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; $data = $roadItemReportService->operatorCartableReport($request); - return Excel::download(new OperatorCartableReport($data), $name); + return Excel::download(new OperatorCartableReport($data['data']), $name); } } diff --git a/app/Services/DataTable/DataTableInput.php b/app/Services/DataTable/DataTableInput.php index 18e7ea10..64a3f290 100644 --- a/app/Services/DataTable/DataTableInput.php +++ b/app/Services/DataTable/DataTableInput.php @@ -15,10 +15,10 @@ class DataTableInput * @param array $rels */ public function __construct( - private int $start, + private ?int $start, private ?int $size, private array $filters, - private array $sorting, + private ?array $sorting, private array $rels, private array $allowedFilters, private array $allowedSortings, @@ -74,6 +74,4 @@ class DataTableInput { return $this->rels; } - - } diff --git a/app/Services/DataTable/DataTableService.php b/app/Services/DataTable/DataTableService.php index af0d0451..647f6e44 100644 --- a/app/Services/DataTable/DataTableService.php +++ b/app/Services/DataTable/DataTableService.php @@ -76,7 +76,9 @@ class DataTableService $this->totalRowCount = $query->count(); - $query->offset($this->dataTableInput->getStart()); + if (!is_null($this->dataTableInput->getStart())) { + $query->offset($this->dataTableInput->getStart()); + } if(!is_null($this->dataTableInput->getSize())){ $query->limit($this->dataTableInput->getSize()); diff --git a/app/Services/DataTable/Validators/FilterValidator.php b/app/Services/DataTable/Validators/FilterValidator.php index cc45813e..ea837f9e 100644 --- a/app/Services/DataTable/Validators/FilterValidator.php +++ b/app/Services/DataTable/Validators/FilterValidator.php @@ -50,7 +50,7 @@ class FilterValidator protected function isAllowed(Filter $filter, array $allowedFilters): bool { - return in_array($filter->getId(), $allowedFilters); + return $allowedFilters == ['*'] || in_array($filter->getId(), $allowedFilters); } protected function isValidSearchFunction(Filter $filter): bool diff --git a/app/Services/DataTable/Validators/SortingValidator.php b/app/Services/DataTable/Validators/SortingValidator.php index a494ef6a..4409bfba 100644 --- a/app/Services/DataTable/Validators/SortingValidator.php +++ b/app/Services/DataTable/Validators/SortingValidator.php @@ -34,6 +34,6 @@ class SortingValidator protected function isAllowed(Sort $sorting, array $allowedSortings): bool { - return in_array($sorting->getId(), $allowedSortings); + return $allowedSortings == ['*'] || in_array($sorting->getId(), $allowedSortings); } } diff --git a/resources/views/v3/Reports/RoadItems/OperatorCartableReport.blade.php b/resources/views/v3/Reports/RoadItems/OperatorCartableReport.blade.php new file mode 100644 index 00000000..a020d289 --- /dev/null +++ b/resources/views/v3/Reports/RoadItems/OperatorCartableReport.blade.php @@ -0,0 +1,102 @@ + + + + + + + + گزارش فعالیت های روزانه و جاری + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @foreach ($data as $item) + + + + + + + + + + + + + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش کارتابل عملیات فعالیت های روزانه و جاری از تاریخ + {{ verta($fromDate)->format('Y/n/j') }} + تا + تاریخ + {{ verta($toDate)->format('Y/n/j') }} + +
کد + یکتاآیتم + فعالیت + موضوع مشاهده شده + مقدار + نقطه شروع + نقطه پایان + تاریخ ثبت + تاریخ فعالیت + وضعیت + توضیحات ناظر
{{ $item['id'] ?? '-' }}{{ $item['item_fa'] ?? '-' }}{{ $item['sub_item_fa'] ?? '-' }} + {{ $item['sub_item_data'] ? ($item['unit_fa'] ? $item['sub_item_data'] . '(' . $item['unit_fa'] . ')' : $item['sub_item_data'] . '(-)') : '-' }} + {{ isset($item['start_lat']) && isset($item['start_lng']) ? $item['start_lat'] . ' ' . $item['start_lng'] : '-' }}{{ isset($item['end_lat']) && isset($item['end_lng']) ? $item['end_lat'] . ' ' . $item['end_lng'] : '-' }}{{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }}{{ $item['activity_date_time'] ? verta($item['activity_date_time'])->format('Y/n/j H:i:s') : '-' }} + {{ $item['status_fa'] ?? '-' }}{{ $item['supervisor_description'] ?? '-' }}
+ + + diff --git a/resources/views/v3/Reports/RoadItems/SupervisorCartableReport.blade.php b/resources/views/v3/Reports/RoadItems/SupervisorCartableReport.blade.php new file mode 100644 index 00000000..4822186c --- /dev/null +++ b/resources/views/v3/Reports/RoadItems/SupervisorCartableReport.blade.php @@ -0,0 +1,117 @@ + + + + + + + + گزارش فعالیت های روزانه و جاری + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @foreach ($data as $item) + + + + + + + + + + + + + + + + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش کارتابل ارزیابی فعالیت های روزانه و جاری از تاریخ + {{ verta($fromDate)->format('Y/n/j') }} + تا + تاریخ + {{ verta($toDate)->format('Y/n/j') }} +
کد + یکتا + استان + ادارهآیتم + فعالیت + موضوع مشاهده شده + مقدار + نقطه شروع + نقطه پایان + تاریخ ثبت + تاریخ فعالیت + وضعیت + توضیحات ناظر
{{ $item['id'] ?? '-' }}{{ $item['province_fa'] ?? '-' }}{{ $item['edarat_name'] ?? '-' }}{{ $item['item_fa'] ?? '-' }}{{ $item['sub_item_fa'] ?? '-' }} + {{ $item['sub_item_data'] ? ($item['unit_fa'] ? $item['sub_item_data'] . '(' . $item['unit_fa'] . ')' : $item['sub_item_data'] . '(-)') : '-' }} + + {{ isset($item['start_lat']) && isset($item['start_lng']) ? $item['start_lat'] . ' ' . $item['start_lng'] : '-' }} + + {{ isset($item['end_lat']) && isset($item['end_lng']) ? $item['end_lat'] . ' ' . $item['end_lng'] : '-' }} + {{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }}{{ $item['activity_date_time'] ? verta($item['activity_date_time'])->format('Y/n/j H:i:s') : '-' }} + {{ $item['status_fa'] ?? '-' }} + {{ $item['supervisor_description'] ?? '-' }}
+ + + From d2d7ee2d57217a2d023a946ac7b3de7e859fe469 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 4 Feb 2025 13:27:02 +0330 Subject: [PATCH 06/10] make input parameter null --- .../V3/Dashboard/Reports/RoadItemsReportController.php | 4 ++-- app/Services/DataTable/DataTableInput.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php index 098fc85d..3196ff73 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -74,7 +74,7 @@ class RoadItemsReportController extends Controller $provinces = Province::all(['id', 'name_fa']); return $this->successResponse([ - 'activities' => $activities, + 'activities' => $activities['data'], 'provinces' => $provinces, ]); } @@ -85,7 +85,7 @@ class RoadItemsReportController extends Controller $edarateShahri = EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']); return $this->successResponse([ - 'activities' => $activities, + 'activities' => $activities['data'], 'edarateShahri' => $edarateShahri, ]); } diff --git a/app/Services/DataTable/DataTableInput.php b/app/Services/DataTable/DataTableInput.php index 64a3f290..8464e878 100644 --- a/app/Services/DataTable/DataTableInput.php +++ b/app/Services/DataTable/DataTableInput.php @@ -26,7 +26,7 @@ class DataTableInput { } - public function getStart(): int + public function getStart(): ?int { return $this->start; } From 05f6e42a8067431f8a75ad39c6d9e8e3dab27e88 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 4 Feb 2025 15:26:14 +0330 Subject: [PATCH 07/10] return data --- .../V3/Dashboard/Reports/RoadPatrolReportController.php | 4 ++-- app/Services/Reports/RoadPatrolReportService.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php index 3ce39b0c..d45967b6 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php @@ -29,7 +29,7 @@ class RoadPatrolReportController extends Controller $provinces = Province::all(['id', 'name_fa']); return $this->successResponse([ - 'activities' => $activities, + 'activities' => $activities['data'], 'provinces' => $provinces ]); } @@ -46,7 +46,7 @@ class RoadPatrolReportController extends Controller $edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name_fa']); return $this->successResponse([ - 'activities' => $activities, + 'activities' => $activities['data'], 'edarateShahri' => $edarateShahri, ]); } diff --git a/app/Services/Reports/RoadPatrolReportService.php b/app/Services/Reports/RoadPatrolReportService.php index 1dda5f91..c7051116 100644 --- a/app/Services/Reports/RoadPatrolReportService.php +++ b/app/Services/Reports/RoadPatrolReportService.php @@ -118,7 +118,7 @@ class RoadPatrolReportService ); return [ - 'activities' => $activities, + 'data' => $activities, 'fromDate' => $fromDate, 'toDate' => $toDate ]; @@ -181,7 +181,7 @@ class RoadPatrolReportService ); return [ - 'activities' => $activities, + 'data' => $activities, 'fromDate' => $fromDate, 'toDate' => $toDate ]; From 943b2dbb93ee50236e19895499aae0ef2542e63b Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 5 Feb 2025 13:36:40 +0330 Subject: [PATCH 08/10] refactor blades --- .../CountryActivityPerItemReport.php | 14 +-- .../OperatorCartableReport.php | 3 +- .../ProvinceActivityPerItemReport.php | 14 +-- .../SupervisorCartableReport.php | 3 +- .../Reports/RoadItemsReportController.php | 12 +- .../CountryActivityPerItem.blade.php | 113 +++++++----------- .../OperatorCartableReport.blade.php | 55 ++++++--- .../ProvinceActivityPerItem.blade.php | 110 +++++++---------- .../SupervisorCartableReport.blade.php | 36 +++--- 9 files changed, 170 insertions(+), 190 deletions(-) diff --git a/app/Exports/V3/RoadItemsProjects/CountryActivityPerItemReport.php b/app/Exports/V3/RoadItemsProjects/CountryActivityPerItemReport.php index d85f83f3..60261c20 100644 --- a/app/Exports/V3/RoadItemsProjects/CountryActivityPerItemReport.php +++ b/app/Exports/V3/RoadItemsProjects/CountryActivityPerItemReport.php @@ -17,18 +17,18 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; class CountryActivityPerItemReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private ?array $activities){} + public function __construct(private ?array $data){} public function view(): View { - $activities = $this->activities; - $fromDate = $activities['fromDate'] ?? '2021-03-21 00:00:00'; - $toDate = $activities['toDate'] ?? \Carbon\Carbon::now(); + $data = $this->data; return view('v3.Reports.RoadItems.CountryActivityPerItem', [ - 'activities' => $activities['data'], - 'fromDate' => $fromDate, - 'toDate' => $toDate + 'data' => $data['activities']['data'], + 'provinces' => $data['provinces'], + 'items' => $data['items'], + 'fromDate' => $data['activities']['fromDate'], + 'toDate' => $data['activities']['toDate'] ]); } diff --git a/app/Exports/V3/RoadItemsProjects/OperatorCartableReport.php b/app/Exports/V3/RoadItemsProjects/OperatorCartableReport.php index 43583ba5..ea736dd2 100644 --- a/app/Exports/V3/RoadItemsProjects/OperatorCartableReport.php +++ b/app/Exports/V3/RoadItemsProjects/OperatorCartableReport.php @@ -6,6 +6,7 @@ use App\Models\Province; use App\Models\RoadItemsProject; use Carbon\Carbon; use Illuminate\Contracts\View\View; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Concerns\FromView; use Maatwebsite\Excel\Concerns\ShouldAutoSize; @@ -17,7 +18,7 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; class OperatorCartableReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private ?string $data){} + public function __construct(private ?Collection $data){} public function view(): View { diff --git a/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerItemReport.php b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerItemReport.php index 15b1a1c0..9b7b33d0 100644 --- a/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerItemReport.php +++ b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerItemReport.php @@ -17,18 +17,18 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; class ProvinceActivityPerItemReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private ?array $activities){} + public function __construct(private ?array $data){} public function view(): View { - $activities = $this->activities; - $fromDate = $activities['fromDate'] ?? '2021-03-21 00:00:00'; - $toDate = $activities['toDate'] ?? \Carbon\Carbon::now(); + $data = $this->data; return view('v3.Reports.RoadItems.ProvinceActivityPerItem', [ - 'activitis' => $activities['data'], - 'fromDate' => $fromDate, - 'toDate' => $toDate + 'data' => $data['activities']['data'], + 'edarateShahri' => $data['edarateShahri'], + 'items' => $data['items'], + 'fromDate' => $data['activities']['fromDate'], + 'toDate' => $data['activities']['toDate'] ]); } diff --git a/app/Exports/V3/RoadItemsProjects/SupervisorCartableReport.php b/app/Exports/V3/RoadItemsProjects/SupervisorCartableReport.php index 4aa03957..d559cf50 100644 --- a/app/Exports/V3/RoadItemsProjects/SupervisorCartableReport.php +++ b/app/Exports/V3/RoadItemsProjects/SupervisorCartableReport.php @@ -6,6 +6,7 @@ use App\Models\Province; use App\Models\RoadItemsProject; use Carbon\Carbon; use Illuminate\Contracts\View\View; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Concerns\FromView; use Maatwebsite\Excel\Concerns\ShouldAutoSize; @@ -17,7 +18,7 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; class SupervisorCartableReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private ?string $data){} + public function __construct(private ?Collection $data){} public function view(): View { diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php index 3196ff73..11174fac 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -119,7 +119,11 @@ class RoadItemsReportController extends Controller auth()->user()->addActivityComplete(1034); $name = 'گزارش کشوری از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; $activities = $roadItemReportService->countryActivityPerItem($request); - return Excel::download(new CountryActivityPerItemReport($activities), $name); + return Excel::download(new CountryActivityPerItemReport([ + 'activities' => $activities, + 'provinces' => Province::all(['id', 'name_fa']), + 'items' => InfoItem::query()->distinct()->get(['item', 'item_str']), + ]), $name); } public function provinceActivityExcelPerItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse @@ -127,7 +131,11 @@ class RoadItemsReportController extends Controller auth()->user()->addActivityComplete(1034); $name = 'گزارش استانی از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; $activities = $roadItemReportService->provinceActivityPerItem($request); - return Excel::download(new ProvinceActivityPerItemReport($activities), $name); + return Excel::download(new ProvinceActivityPerItemReport([ + 'activities' => $activities, + 'edarateShahri' => EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']), + 'items' => InfoItem::query()->distinct()->get(['item', 'item_str']), + ]), $name); } public function countryActivityExcelPerSubItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse diff --git a/resources/views/v3/Reports/RoadItems/CountryActivityPerItem.blade.php b/resources/views/v3/Reports/RoadItems/CountryActivityPerItem.blade.php index cc387f3d..8185757e 100644 --- a/resources/views/v3/Reports/RoadItems/CountryActivityPerItem.blade.php +++ b/resources/views/v3/Reports/RoadItems/CountryActivityPerItem.blade.php @@ -14,19 +14,19 @@ - - - - - - + + + - - - - - - - - - - - - - - - - + @foreach($items as $item) + + @endforeach - - - - - - - - - - - - - - - - - - - - + @php + // محاسبه مجموع مقدار s برای کل کشور + $totalForCountry = collect($data)->where('p', -1)->sum('s'); - @foreach ($provinceCount as $activity) + // محاسبه مجموع مقدار s برای هر آیتم در کل کشور + $itemTotalsForCountry = []; + foreach ($items as $item) { + $itemTotalsForCountry[$item['item']] = collect($data)->where('p', -1)->where('i', $item['item'])->sum('s'); + } + @endphp + + {{-- ردیف کل کشور --}} + + + + @foreach($items as $item) + + @endforeach + + + {{-- ردیف‌های مربوط به هر استان --}} + @foreach($provinces as $province) + @php + // محاسبه مجموع مقدار s برای این استان + $totalForProvince = collect($data)->where('p', $province['id'])->sum('s'); + + // محاسبه مجموع مقدار s برای هر آیتم در این استان + $itemTotalsForProvince = []; + foreach ($items as $item) { + $itemTotalsForProvince[$item['item']] = collect($data)->where('p', $province['id'])->where('i', $item['item'])->sum('s'); + } + @endphp - - - - - - - - - - - - - - - - - - + + + @foreach($items as $item) + + @endforeach @endforeach - -
تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
گزارش فعالیت روزانه و جاری راهداری از تاریخ {{ verta($fromDate)->format('Y/n/j') }} @@ -38,83 +38,60 @@
اداره کل - فعالیت های - جاری و روزانه راهداری - کلادارهمجموعایتم های فعالیت روزانه
مرمت رویهپاکسازیعلائمحفاظروشناییخط کشیرنگ آمیزیشستشوایمن سازیحریمپلتونل و گالریعملیات زمستانیماشین آلاتراهدارخانهموارد اضطراری{{ $item['item_str'] }}
کل کشور{{ $countryCount['totalMarematRooyeCount'] }}{{ $countryCount['totalPaksaziCount'] }}{{ $countryCount['totalAlaemCount'] }}{{ $countryCount['totalHefazCount'] }}{{ $countryCount['totalRoshanayiCount'] }}{{ $countryCount['totalKhatkeshiCount'] }}{{ $countryCount['totalRangamiziCount'] }}{{ $countryCount['totalWashingCount'] }}{{ $countryCount['totalImenSaziCount'] }}{{ $countryCount['totalHarimCount'] }}{{ $countryCount['totalPolCount'] }}{{ $countryCount['totalToonelCount'] }}{{ $countryCount['totalAmaliatZemestaniCount'] }}{{ $countryCount['totalMashinAlatCount'] }}{{ $countryCount['totalTollhouseCount'] }}{{ $countryCount['totalEmergencyCount'] }}{{ $countryCount['totalCountryCount'] }}
کل کشور{{ $totalForCountry }}{{ $itemTotalsForCountry[$item['item']] ?? '-' }}
{{ $activity->province_fa }}{{ $activity->MarematRooyeCount }}{{ $activity->PaksaziCount }}{{ $activity->AlaemCount }}{{ $activity->HefazCount }}{{ $activity->RoshanayiCount }}{{ $activity->KhatkeshiCount }}{{ $activity->RangamiziCount }}{{ $activity->WashingCount }}{{ $activity->ImenSaziCount }}{{ $activity->HarimCount }}{{ $activity->PolCount }}{{ $activity->ToonelCount }}{{ $activity->AmaliatZemestaniCount }}{{ $activity->MashinAlatCount }}{{ $activity->TollhouseCount }}{{ $activity->EmergencyCount }}{{ $activity->TotalProvinceCount }}{{ $province['name_fa'] }}{{ $totalForProvince }}{{ $itemTotalsForProvince[$item['item']] ?? '-' }}
- - diff --git a/resources/views/v3/Reports/RoadItems/OperatorCartableReport.blade.php b/resources/views/v3/Reports/RoadItems/OperatorCartableReport.blade.php index a020d289..8c45948a 100644 --- a/resources/views/v3/Reports/RoadItems/OperatorCartableReport.blade.php +++ b/resources/views/v3/Reports/RoadItems/OperatorCartableReport.blade.php @@ -21,56 +21,64 @@ - - - + + + + + اقدام انجام شده - + + - + تاریخ ثبت + @@ -81,15 +89,24 @@ @foreach ($data as $item) + + + + + + + - - - diff --git a/resources/views/v3/Reports/RoadItems/ProvinceActivityPerItem.blade.php b/resources/views/v3/Reports/RoadItems/ProvinceActivityPerItem.blade.php index 55a708ee..2a10a5f4 100644 --- a/resources/views/v3/Reports/RoadItems/ProvinceActivityPerItem.blade.php +++ b/resources/views/v3/Reports/RoadItems/ProvinceActivityPerItem.blade.php @@ -14,19 +14,19 @@
تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
- گزارش کارتابل عملیات فعالیت های روزانه و جاری از تاریخ - {{ verta($fromDate)->format('Y/n/j') }} - تا - تاریخ - {{ verta($toDate)->format('Y/n/j') }} - + گزارش کارتابل عملیات فعالیت های روزانه و جاری
کد یکتا + استان + ادارهآیتم فعالیت - موضوع مشاهده شده مقدار + کد خودرو(ها) + کد راهدار(ها) نقطه شروع نقطه پایان - تاریخ ثبت تاریخ فعالیت - وضعیت + وضعیت نظارت توضیحات ناظر
{{ $item['id'] ?? '-' }}{{ $item['province_fa'] ?? '-' }}{{ $item['edarat_name'] ?? '-' }}{{ $item['item_fa'] ?? '-' }} {{ $item['sub_item_fa'] ?? '-' }} - {{ $item['sub_item_data'] ? ($item['unit_fa'] ? $item['sub_item_data'] . '(' . $item['unit_fa'] . ')' : $item['sub_item_data'] . '(-)') : '-' }} + {{ $item['sub_item_data'] ? ($item['unit_fa'] ? $item['sub_item_data'] . '(' . $item['unit_fa'] . ')' : $item['sub_item_data'] . '(-)') : '-' }} + {{ $item['cmmsMachines'] != null ? $item['cmmsMachines']->pluck('machine_code')->implode(', ') : '-' }}{{ $item['rahdaran'] != null ? $item['rahdaran']->pluck('code')->implode(', ') : '-' }} + {{ isset($item['start_lat']) && isset($item['start_lng']) ? $item['start_lat'] . ' ' . $item['start_lng'] : '-' }} + + {{ isset($item['end_lat']) && isset($item['end_lng']) ? $item['end_lat'] . ' ' . $item['end_lng'] : '-' }} {{ isset($item['start_lat']) && isset($item['start_lng']) ? $item['start_lat'] . ' ' . $item['start_lng'] : '-' }}{{ isset($item['end_lat']) && isset($item['end_lng']) ? $item['end_lat'] . ' ' . $item['end_lng'] : '-' }}{{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }} {{ $item['activity_date_time'] ? verta($item['activity_date_time'])->format('Y/n/j H:i:s') : '-' }} + {{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }} {{ $item['status_fa'] ?? '-' }} {{ $item['supervisor_description'] ?? '-' }}
- - - - - - + + + - - - - - - - - - - - - - - - - + @foreach($items as $item) + + @endforeach - - - - - - - - - - - - - - - - - - - - + @php + $totalForProvince = collect($data)->where('c', -1)->sum('s'); - @foreach ($cityCount as $activity) + $itemTotalsForProvince = []; + foreach ($items as $item) { + $itemTotalsForProvince[$item['item']] = collect($data)->where('c', -1)->where('i', $item['item'])->sum('s'); + } + @endphp + + + + + @foreach($items as $item) + + @endforeach + + + {{-- ردیف‌های مربوط به هر استان --}} + @foreach($edarateShahri as $edareShahri) + @php + // محاسبه مجموع مقدار s برای این استان + $totalForProvince = collect($data)->where('p', $edareShahri['id'])->sum('s'); + + // محاسبه مجموع مقدار s برای هر آیتم در این استان + $itemTotalsForProvince = []; + foreach ($items as $item) { + $itemTotalsForProvince[$item['item']] = collect($data)->where('p', $edareShahri['id'])->where('i', $item['item'])->sum('s'); + } + @endphp - - - - - - - - - - - - - - - - - - + + + @foreach($items as $item) + + @endforeach @endforeach - -
تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
گزارش فعالیت روزانه و جاری راهداری از تاریخ {{ verta($fromDate)->format('Y/n/j') }} @@ -38,83 +38,57 @@
اداره کل - فعالیت های - جاری و روزانه راهداری - کلادارهمجموعایتم های فعالیت روزانه
مرمت رویهپاکسازیعلائمحفاظروشناییخط کشیرنگ آمیزیشستشوایمن سازیحریمپلتونل و گالریعملیات زمستانیماشین آلاتراهدارخانهموارد اضطراری{{ $item['item_str'] }}
کل استان{{ $provinceCount['totalMarematRooyeCount'] }}{{ $provinceCount['totalPaksaziCount'] }}{{ $provinceCount['totalAlaemCount'] }}{{ $provinceCount['totalHefazCount'] }}{{ $provinceCount['totalRoshanayiCount'] }}{{ $provinceCount['totalKhatkeshiCount'] }}{{ $provinceCount['totalRangamiziCount'] }}{{ $provinceCount['totalWashingCount'] }}{{ $provinceCount['totalImenSaziCount'] }}{{ $provinceCount['totalHarimCount'] }}{{ $provinceCount['totalPolCount'] }}{{ $provinceCount['totalToonelCount'] }}{{ $provinceCount['totalAmaliatZemestaniCount'] }}{{ $provinceCount['totalMashinAlatCount'] }}{{ $provinceCount['totalTollhouseCount'] }}{{ $provinceCount['totalEmergencyCount'] }}{{ $provinceCount['TotalProvinceCount'] }}
کل استان{{ $totalForProvince }}{{ $itemTotalsForProvince[$item['item']] ?? '-' }}
{{ $activity->edarat_name }}{{ $activity->MarematRooyeCount }}{{ $activity->PaksaziCount }}{{ $activity->AlaemCount }}{{ $activity->HefazCount }}{{ $activity->RoshanayiCount }}{{ $activity->KhatkeshiCount }}{{ $activity->RangamiziCount }}{{ $activity->WashingCount }}{{ $activity->ImenSaziCount }}{{ $activity->HarimCount }}{{ $activity->PolCount }}{{ $activity->ToonelCount }}{{ $activity->AmaliatZemestaniCount }}{{ $activity->MashinAlatCount }}{{ $activity->TollhouseCount }}{{ $activity->EmergencyCount }}{{ $activity->TotalCityCount }}{{ $edareShahri['name_fa'] }}{{ $totalForProvince }}{{ $itemTotalsForProvince[$item['item']] ?? '-' }}
- - diff --git a/resources/views/v3/Reports/RoadItems/SupervisorCartableReport.blade.php b/resources/views/v3/Reports/RoadItems/SupervisorCartableReport.blade.php index 4822186c..c92fc3ab 100644 --- a/resources/views/v3/Reports/RoadItems/SupervisorCartableReport.blade.php +++ b/resources/views/v3/Reports/RoadItems/SupervisorCartableReport.blade.php @@ -21,24 +21,20 @@ - - - @@ -58,26 +54,31 @@ فعالیت + اقدام انجام شده - + + - + تاریخ ثبت + @@ -96,18 +97,19 @@ + + - - + @endforeach From ed832dab70a9c7adb849e401e7a93a930581d273 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 5 Feb 2025 14:08:23 +0330 Subject: [PATCH 09/10] reform the blade files --- .../CountryActivityPerSubItemReport.php | 12 ++++++----- .../ProvinceActivityPerSubItemReport.php | 12 ++++++----- .../Reports/RoadItemsReportController.php | 20 +++++++++++++++++-- .../CountryActivityPerSubItem.blade.php | 20 +++++++++---------- .../ProvinceActivityPerItem.blade.php | 4 ++-- .../ProvinceActivityPerSubItem.blade.php | 16 +++++++-------- 6 files changed, 51 insertions(+), 33 deletions(-) diff --git a/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php b/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php index da5497e2..7e383bdf 100644 --- a/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php +++ b/app/Exports/V3/RoadItemsProjects/CountryActivityPerSubItemReport.php @@ -13,16 +13,18 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; class CountryActivityPerSubItemReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private array $activities){} + public function __construct(private array $data){} public function view(): View { - $activities = $this->activities; + $data = $this->data; return view('v3.Reports.RoadItems.CountryActivityPerSubItem', [ - 'activities' => $activities["data"], - 'fromDate' => $activities["fromDate"], - 'toDate' => $activities["toDate"], + 'data' => $data['activities']['data'], + 'provinces' => $data['provinces'], + 'subItems' => $data['subItems'], + 'fromDate' => $data['activities']['fromDate'], + 'toDate' => $data['activities']['toDate'] ]); } diff --git a/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php index cf558cab..32faa0de 100644 --- a/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php +++ b/app/Exports/V3/RoadItemsProjects/ProvinceActivityPerSubItemReport.php @@ -18,16 +18,18 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; class ProvinceActivityPerSubItemReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private array $activities){} + public function __construct(private array $data){} public function view(): View { - $activities = $this->activities; + $data = $this->data; return view('v3.Reports.RoadItems.ProvinceActivityPerSubItem', [ - 'activities' => $activities["data"], - 'fromDate' => $activities["fromDate"], - 'toDate' => $activities["toDate"], + 'data' => $data['activities']['data'], + 'edarateShahri' => $data['edarateShahri'], + 'subItems' => $data['subItems'], + 'fromDate' => $data['activities']['fromDate'], + 'toDate' => $data['activities']['toDate'] ]); } diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php index 11174fac..81a8425d 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -143,7 +143,15 @@ class RoadItemsReportController extends Controller auth()->user()->addActivityComplete(1034); $name = "گزارش کشوری از فعالیت روزانه و جاری - جدول 2 " . verta()->now()->format('Y-m-d H-i') . '.xlsx'; $activities = $roadItemReportService->countryActivityPerSubItem($request); - return Excel::download(new CountryActivityPerSubItemReport($activities), $name); + $subItems = InfoItem::query() + ->where('item', $request->item) + ->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']); + + return Excel::download(new CountryActivityPerSubItemReport([ + 'activities' => $activities, + 'provinces' => Province::all(['id', 'name_fa']), + 'subItems' => $subItems + ]), $name); } public function provinceActivityExcelPerSubItem(Request $request, RoadItemReportService $roadItemReportService): BinaryFileResponse @@ -151,6 +159,14 @@ class RoadItemsReportController extends Controller auth()->user()->addActivityComplete(1034); $activities = $roadItemReportService->provinceActivityPerSubItem($request); $name = "گزارش استانی از فعالیت روزانه و جاری - جدول 2 " . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - return Excel::download(new ProvinceActivityPerSubItemReport($activities), $name); + $subItems = InfoItem::query() + ->where('item', $request->item) + ->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']); + + return Excel::download(new ProvinceActivityPerSubItemReport([ + 'activities' => $activities, + 'subItems' => $subItems, + 'edarateShahri' => EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']), + ]), $name); } } diff --git a/resources/views/v3/Reports/RoadItems/CountryActivityPerSubItem.blade.php b/resources/views/v3/Reports/RoadItems/CountryActivityPerSubItem.blade.php index 62d19ec5..00c574d0 100644 --- a/resources/views/v3/Reports/RoadItems/CountryActivityPerSubItem.blade.php +++ b/resources/views/v3/Reports/RoadItems/CountryActivityPerSubItem.blade.php @@ -37,38 +37,36 @@ - @foreach($details as $detail) - + @foreach($subItems as $subItem) + @endforeach - @foreach($details as $detail) + @foreach($subItems as $subItem) - + @endforeach - @foreach ($activities as $activity) + @foreach ($provinces as $province) - + - @foreach ($details as $index => $detail) + @foreach ($subItems as $subItem) @endforeach @endforeach
تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
- گزارش کارتابل ارزیابی فعالیت های روزانه و جاری از تاریخ - {{ verta($fromDate)->format('Y/n/j') }} - تا - تاریخ - {{ verta($toDate)->format('Y/n/j') }} + گزارش کارتابل ارزیابی فعالیت های روزانه و جاری
- موضوع مشاهده شده مقدار + کد خودرو(ها) + کد راهدار(ها) نقطه شروع نقطه پایان - تاریخ ثبت تاریخ فعالیت - وضعیت + وضعیت نظارت توضیحات ناظر {{ $item['sub_item_data'] ? ($item['unit_fa'] ? $item['sub_item_data'] . '(' . $item['unit_fa'] . ')' : $item['sub_item_data'] . '(-)') : '-' }} {{ $item['cmmsMachines'] != null ? $item['cmmsMachines']->pluck('machine_code')->implode(', ') : '-' }}{{ $item['rahdaran'] != null ? $item['rahdaran']->pluck('code')->implode(', ') : '-' }} {{ isset($item['start_lat']) && isset($item['start_lng']) ? $item['start_lat'] . ' ' . $item['start_lng'] : '-' }} {{ isset($item['end_lat']) && isset($item['end_lng']) ? $item['end_lat'] . ' ' . $item['end_lng'] : '-' }} {{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }} {{ $item['activity_date_time'] ? verta($item['activity_date_time'])->format('Y/n/j H:i:s') : '-' }} + {{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }} {{ $item['status_fa'] ?? '-' }} - {{ $item['supervisor_description'] ?? '-' }}{{ $item['supervisor_description'] ?? '-' }}
{{ $detail->sub_item_str }}{{ $subItem->sub_item_str }}
تعدادمجموع ({{ $detail->sub_item_unit }})مجموع ({{ $subItem->sub_item_unit }})
{{ $activity->province_fa }}{{ $province['name_fa'] }} - {{ $activity->{'Count_' . ($index)} ?? '-' }} + {{ $province->{'Count_' . ($index)} ?? '-' }} - {{ isset($activity->{'Sum_' . ($index)}) ? round($activity->{'Sum_' . ($index)}, 1) : '-' }} + {{ isset($province->{'Sum_' . ($index)}) ? round($province->{'Sum_' . ($index)}, 1) : '-' }}
- - \ No newline at end of file diff --git a/resources/views/v3/Reports/RoadItems/ProvinceActivityPerItem.blade.php b/resources/views/v3/Reports/RoadItems/ProvinceActivityPerItem.blade.php index 2a10a5f4..5b621aa5 100644 --- a/resources/views/v3/Reports/RoadItems/ProvinceActivityPerItem.blade.php +++ b/resources/views/v3/Reports/RoadItems/ProvinceActivityPerItem.blade.php @@ -72,12 +72,12 @@ @foreach($edarateShahri as $edareShahri) @php // محاسبه مجموع مقدار s برای این استان - $totalForProvince = collect($data)->where('p', $edareShahri['id'])->sum('s'); + $totalForProvince = collect($data)->where('c', $edareShahri['id'])->sum('s'); // محاسبه مجموع مقدار s برای هر آیتم در این استان $itemTotalsForProvince = []; foreach ($items as $item) { - $itemTotalsForProvince[$item['item']] = collect($data)->where('p', $edareShahri['id'])->where('i', $item['item'])->sum('s'); + $itemTotalsForProvince[$item['item']] = collect($data)->where('c', $edareShahri['id'])->where('i', $item['item'])->sum('s'); } @endphp diff --git a/resources/views/v3/Reports/RoadItems/ProvinceActivityPerSubItem.blade.php b/resources/views/v3/Reports/RoadItems/ProvinceActivityPerSubItem.blade.php index 9ff1b3cf..656bf81c 100644 --- a/resources/views/v3/Reports/RoadItems/ProvinceActivityPerSubItem.blade.php +++ b/resources/views/v3/Reports/RoadItems/ProvinceActivityPerSubItem.blade.php @@ -37,31 +37,31 @@ - @foreach($details as $detail) - {{ $detail->sub_item_str }} + @foreach($subItems as $subItem) + {{ $subItem->sub_item_str }} @endforeach - @foreach($details as $detail) + @foreach($subItems as $subItem) تعداد - مجموع ({{ $detail->sub_item_unit }}) + مجموع ({{ $subItem->sub_item_unit }}) @endforeach - @foreach ($activities as $activity) + @foreach ($edarateShahri as $edareShahri) {{ $activity->city_fa }} - @foreach ($details as $index => $detail) + @foreach ($subItems as $subItem) - {{ $activity->{'Count_' . ($index)} ?? '-' }} + {{ $edareShahri->{'Count_' . ($subItem)} ?? '-' }} - {{ isset($activity->{'Sum_' . ($index)}) ? round($activity->{'Sum_' . ($index)}, 1) : '-' }} + {{ isset($edareShahri->{'Sum_' . ($subItem)}) ? round($edareShahri->{'Sum_' . ($subItem)}, 1) : '-' }} @endforeach From 88c24aa4f87ad0795349644d78cf75f26ca9760c Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 5 Feb 2025 15:24:44 +0330 Subject: [PATCH 10/10] province blade --- .../CountryActivityPerSubItem.blade.php | 46 +++++++++++++---- .../ProvinceActivityPerSubItem.blade.php | 50 +++++++++++++------ 2 files changed, 71 insertions(+), 25 deletions(-) diff --git a/resources/views/v3/Reports/RoadItems/CountryActivityPerSubItem.blade.php b/resources/views/v3/Reports/RoadItems/CountryActivityPerSubItem.blade.php index 00c574d0..7f669bca 100644 --- a/resources/views/v3/Reports/RoadItems/CountryActivityPerSubItem.blade.php +++ b/resources/views/v3/Reports/RoadItems/CountryActivityPerSubItem.blade.php @@ -28,7 +28,7 @@ تا تاریخ {{verta($toDate)->format('Y/n/j')}} - > + @@ -52,17 +52,41 @@ - @foreach ($provinces as $province) - - {{ $province['name_fa'] }} + @php + // محاسبه مقدار c و s برای هر ساب‌آیتم در کل کشور + $countTotalsForCountry = []; + $sumTotalsForCountry = []; - @foreach ($subItems as $subItem) - - {{ $province->{'Count_' . ($index)} ?? '-' }} - - - {{ isset($province->{'Sum_' . ($index)}) ? round($province->{'Sum_' . ($index)}, 1) : '-' }} - + foreach ($subItems as $subItem) { + $countTotalsForCountry[$subItem['sub_item']] = collect($data)->where('p', -1)->where('t', $subItem['sub_item'])->sum('c'); + $sumTotalsForCountry[$subItem['sub_item']] = collect($data)->where('p', -1)->where('t', $subItem['sub_item'])->sum('s'); + } + @endphp + + {{-- ردیف کل کشور --}} + + کل کشور + @foreach($subItems as $subItem) + {{ $countTotalsForCountry[$subItem['sub_item']] ?? '-' }} + {{ $sumTotalsForCountry[$subItem['sub_item']] ?? '-' }} + @endforeach + + + {{-- ردیف‌های مربوط به هر استان --}} + @foreach($provinces as $province) + @php + $countTotalsForProvince = []; + $sumTotalsForProvince = []; + foreach ($subItems as $subItem) { + $countTotalsForProvince[$subItem['sub_item']] = collect($data)->where('p', $province['id'])->where('t', $subItem['sub_item'])->sum('c'); + $sumTotalsForProvince[$subItem['sub_item']] = collect($data)->where('p', $province['id'])->where('t', $subItem['sub_item'])->sum('s'); + } + @endphp + + {{ $province['name_fa'] }} + @foreach($subItems as $subItem) + {{ $countTotalsForProvince[$subItem['sub_item']] ?? '-' }} + {{ $sumTotalsForProvince[$subItem['sub_item']] ?? '-' }} @endforeach @endforeach diff --git a/resources/views/v3/Reports/RoadItems/ProvinceActivityPerSubItem.blade.php b/resources/views/v3/Reports/RoadItems/ProvinceActivityPerSubItem.blade.php index 656bf81c..2b552d68 100644 --- a/resources/views/v3/Reports/RoadItems/ProvinceActivityPerSubItem.blade.php +++ b/resources/views/v3/Reports/RoadItems/ProvinceActivityPerSubItem.blade.php @@ -28,11 +28,11 @@ تا تاریخ {{verta($toDate)->format('Y/n/j')}} - > + - اداره + اداره کل فعالیت های انجام شده @@ -52,23 +52,45 @@ - @foreach ($edarateShahri as $edareShahri) - - {{ $activity->city_fa }} + @php + // محاسبه مقدار c و s برای هر ساب‌آیتم در کل کشور + $countTotalsForProvince = []; + $sumTotalsForProvince = []; - @foreach ($subItems as $subItem) - - {{ $edareShahri->{'Count_' . ($subItem)} ?? '-' }} - - - {{ isset($edareShahri->{'Sum_' . ($subItem)}) ? round($edareShahri->{'Sum_' . ($subItem)}, 1) : '-' }} - + foreach ($subItems as $subItem) { + $countTotalsForProvince[$subItem['sub_item']] = collect($data)->where('ci', -1)->where('t', $subItem['sub_item'])->sum('c'); + $sumTotalsForProvince[$subItem['sub_item']] = collect($data)->where('ci', -1)->where('t', $subItem['sub_item'])->sum('s'); + } + @endphp + + {{-- ردیف کل کشور --}} + + کل کشور + @foreach($subItems as $subItem) + {{ $countTotalsForProvince[$subItem['sub_item']] ?? '-' }} + {{ $sumTotalsForProvince[$subItem['sub_item']] ?? '-' }} + @endforeach + + + {{-- ردیف‌های مربوط به هر استان --}} + @foreach($edarateShahri as $edareShahri) + @php + $countTotalsForProvince = []; + $sumTotalsForProvince = []; + foreach ($subItems as $subItem) { + $countTotalsForProvince[$subItem['sub_item']] = collect($data)->where('ci', $edareShahri['id'])->where('t', $subItem['sub_item'])->sum('c'); + $sumTotalsForProvince[$subItem['sub_item']] = collect($data)->where('ci', $edareShahri['id'])->where('t', $subItem['sub_item'])->sum('s'); + } + @endphp + + {{ $edareShahri['name_fa'] }} + @foreach($subItems as $subItem) + {{ $countTotalsForProvince[$subItem['sub_item']] ?? '-' }} + {{ $sumTotalsForProvince[$subItem['sub_item']] ?? '-' }} @endforeach @endforeach - - \ No newline at end of file