From cb91f469f8bc28fa63d373f86f775359d4cf9ab9 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 1 Mar 2025 16:02:33 +0330 Subject: [PATCH 01/11] create safety and privacy controller --- .../Dashboard/SafetyAndPrivacyController.php | 149 ++++++++++++++++++ .../FirstStepStoreRequest.php | 40 +++++ .../SecondStepStoreRequest.php | 29 ++++ .../ThirdStepStoreRequest.php | 28 ++++ .../Cartables/RoadObservationTableService.php | 23 ++- .../SafetyAndPrivacyTableService.php | 49 ++++++ routes/v3.php | 13 ++ 7 files changed, 317 insertions(+), 14 deletions(-) create mode 100644 app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php create mode 100644 app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php create mode 100644 app/Http/Requests/V3/SafetyAndPrivacy/SecondStepStoreRequest.php create mode 100644 app/Http/Requests/V3/SafetyAndPrivacy/ThirdStepStoreRequest.php create mode 100644 app/Services/Cartables/SafetyAndPrivacyTableService.php diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php new file mode 100644 index 00000000..2191e2c4 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -0,0 +1,149 @@ +json($safetyAndPrivacyTableService->datatable($request)); + } + + public function firstStepStore(FirstStepStoreRequest $request, NominatimService $nominatimService): JsonResponse + { + $user = auth()->user(); + + if (auth()->user()->edarate_ostani_id || is_null(auth()->user()->city_id)) { + return $this->errorResponse('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!'); + } + + if (is_null(auth()->user()->edarate_shahri_id)) { + return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); + } + + $coordinates = explode(',', $request->point); + $item = InfoItem::query() + ->where('id', $request->info_id) + ->where('item', 17) + ->firstOrFail(); + + DB::transaction(function () use ($request, $coordinates, $item, $nominatimService) + { + $safety_and_privacy = SafetyAndPrivacy::query()->create([ + 'lat' => $coordinates[0], + 'lon' => $coordinates[1], + 'operator_id' => auth()->user()->id, + 'operator_name' => auth()->user()->name, + 'province_id' => auth()->user()->province_id, + 'province_fa' => auth()->user()->province_fa, + 'info_id' => $item->id, + 'info_fa' => $item->sub_item_str, + 'city_id' => auth()->user()->city_id, + 'city_fa' => auth()->user()->city_fa, + 'activity_date_time' => $request->activity_date." ".$request->activity_time, + 'edare_shahri_id' => auth()->user()->edarate_shahri_id, + 'edare_shahri_name' => auth()->user()->edarate_shahri_name, + 'way_id' => $nominatimService->get_way_id_from_nominatim($coordinates[0], $coordinates[1]), + 'recognize_picture' => $request->has('recognize_picture') ? FileFacade::save($request->recognize_picture, 'safety_and_privacy') : null, + 'step' => 1, + 'step_fa' => 'گام اول (شناسایی)' + ]); + + auth()->user()->addActivityComplete(1134); + }); + + return $this->successResponse(); + } + + public function secondStepStore(SecondStepStoreRequest $safety_and_privacy, Request $request): JsonResponse + { + $user = auth()->user(); + + if (auth()->user()->edarate_ostani_id || is_null(auth()->user()->city_id)) { + return $this->errorResponse('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!'); + } + + if (is_null(auth()->user()->edarate_shahri_id)) { + return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); + } + + DB::transaction(function () use ($request, $safety_and_privacy) + { + $judiciary_document = []; + foreach ($request->judiciary_document as $index => $item) { + $judiciary_document[] = $item->store('safety_and_privacy/'.$safety_and_privacy->id.'/judiciary_document', 'public'); + } + $safety_and_privacy->judiciary_document = serialize($judiciary_document); + $safety_and_privacy->judiciary_document_upload_date = now(); + + $safety_and_privacy->goToSecondStep(); + $safety_and_privacy->save(); + + auth()->user()->addActivityComplete(1135); + }); + + return $this->successResponse(); + } + + public function thirdStepStore(ThirdStepStoreRequest $safety_and_privacy, Request $request): JsonResponse + { + $user = auth()->user(); + + if (auth()->user()->edarate_ostani_id || is_null(auth()->user()->city_id)) { + return $this->errorResponse('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!'); + } + + if (is_null(auth()->user()->edarate_shahri_id)) { + return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); + } + + DB::transaction(function () use ($request, $safety_and_privacy) { + $action_picture = $request->file('action_picture')->store('safety_and_privacy/'.$safety_and_privacy->id.'/action_picture', 'public'); + $safety_and_privacy->action_picture = Storage::disk('public')->url($action_picture); + $safety_and_privacy->action_picture_document_upload_date = now(); + + $safety_and_privacy->goToThirdStep(); + $safety_and_privacy->save(); + auth()->user()->addActivityComplete(1136); + }); + + return $this->successResponse(); + } + + public function show(SafetyAndPrivacy $safetyAndPrivacy): JsonResponse + { + return $this->successResponse($safetyAndPrivacy); + } + + public function destroy(SafetyAndPrivacy $safetyAndPrivacy): JsonResponse + { + Storage::deleteDirectory('public/' . 'safety_and_privacy/' . $safetyAndPrivacy->id); + + DB::transaction(function () use ($safetyAndPrivacy) + { + auth()->user()->addActivityComplete(1155); + $safetyAndPrivacy->delete(); + }); + + return $this->successResponse(); + } +} diff --git a/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php b/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php new file mode 100644 index 00000000..a307f87e --- /dev/null +++ b/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php @@ -0,0 +1,40 @@ +|string> + */ + public function rules(): array + { + return [ + 'point' => 'required', + 'info_id' => 'required', + 'activity_date' => 'required|date_format:Y-m-d', + 'activity_time' => 'required|date_format:H:i', + 'recognize_picture' => 'required|image', + ]; + } + + public function attributes(): array + { + return [ + 'activity_date' => 'تاریخ فعالیت', + 'activity_time' => 'ساعت فعالیت', + ]; + } +} diff --git a/app/Http/Requests/V3/SafetyAndPrivacy/SecondStepStoreRequest.php b/app/Http/Requests/V3/SafetyAndPrivacy/SecondStepStoreRequest.php new file mode 100644 index 00000000..5d130d51 --- /dev/null +++ b/app/Http/Requests/V3/SafetyAndPrivacy/SecondStepStoreRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + 'judiciary_document' => 'required|array', + 'judiciary_document.*' => 'file', + ]; + } +} diff --git a/app/Http/Requests/V3/SafetyAndPrivacy/ThirdStepStoreRequest.php b/app/Http/Requests/V3/SafetyAndPrivacy/ThirdStepStoreRequest.php new file mode 100644 index 00000000..652ea3a4 --- /dev/null +++ b/app/Http/Requests/V3/SafetyAndPrivacy/ThirdStepStoreRequest.php @@ -0,0 +1,28 @@ +|string> + */ + public function rules(): array + { + return [ + 'action_picture' => 'required|image', + ]; + } +} diff --git a/app/Services/Cartables/RoadObservationTableService.php b/app/Services/Cartables/RoadObservationTableService.php index 15d5dcce..810d4b88 100644 --- a/app/Services/Cartables/RoadObservationTableService.php +++ b/app/Services/Cartables/RoadObservationTableService.php @@ -16,7 +16,7 @@ class RoadObservationTableService $user = auth()->user(); $fields = [ - 'fk_RegisteredEventMessage', 'road_observeds.id', 'Title', 'road_observeds.created_at', + 'fk_RegisteredEventMessage', 'road_observeds.id', 'Title', 'road_observeds.created_at', 'StartTime_DateTime', 'lat', 'lng', 'FeatureTypeTitle', 'Description', 'MobileForSendEventSms', 'rms_start_latlng', 'rms_description', 'rms_status', 'rms_last_activity_fa', 'rms_last_activity', 'edarate_shahri_id', 'road_observeds.province_id', 'province_fa', 'city_id', 'city_fa', 'edarate_shahri.name_fa', @@ -53,7 +53,7 @@ class RoadObservationTableService $user = auth()->user(); $fields = [ - 'fk_RegisteredEventMessage', 'road_observeds.id', 'Title', 'road_observeds.created_at', + 'fk_RegisteredEventMessage', 'road_observeds.id', 'Title', 'road_observeds.created_at', 'StartTime_DateTime', 'lat', 'lng', 'FeatureTypeTitle', 'Description', 'MobileForSendEventSms', 'edarate_shahri_id', 'rms_description', 'rms_status', 'rms_start_latlng', 'rms_last_activity_fa', 'image_after', 'image_before', 'rms_last_activity', 'road_observeds.province_id', 'province_fa', 'city_id', 'city_fa', @@ -79,14 +79,15 @@ class RoadObservationTableService { $user = auth()->user(); + $fields = 'fk_RegisteredEventMessage, road_observeds.id, Title, FeatureTypeTitle, MobileForSendEventSms, StartTime_DateTime, + road_observeds.created_at, rms_last_activity, rms_last_activity_fa, status, edarate_shahri_id, + status_fa, supervisor_description, rms_description, province_fa, city_id, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng'; + if ($user->hasPermissionTo('show-fast-react')) { $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') ->where('rms_status', '=', 0) ->whereNotNull('edarate_shahri_id') - ->selectRaw('fk_RegisteredEventMessage, road_observeds.id, Title, FeatureTypeTitle, MobileForSendEventSms, - road_observeds.created_at, rms_last_activity, rms_last_activity_fa, status, edarate_shahri_id, - status_fa, supervisor_description, rms_description, province_fa, city_id, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng' - ); + ->selectRaw($fields); } elseif ($user->hasPermissionTo('show-fast-react-province')) { @@ -98,10 +99,7 @@ class RoadObservationTableService ->where('rms_status', '=', 0) ->whereNotNull('road_observeds.province_id') ->where('road_observeds.province_id', '=', $user->province_id) - ->selectRaw('fk_RegisteredEventMessage, road_observeds.id, Title, FeatureTypeTitle, MobileForSendEventSms, - road_observeds.created_at, rms_last_activity, rms_last_activity_fa, status, edarate_shahri_id, - status_fa, supervisor_description, rms_description, province_fa, city_id, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng' - ); + ->selectRaw($fields); } elseif ($user->hasPermissionTo('show-fast-react-edarate-shahri')) { @@ -114,10 +112,7 @@ class RoadObservationTableService ->where('rms_status', '=', 0) ->whereNotNull('edarate_shahri_id') ->where('edarate_shahri_id', '=', $user->edarate_shahri_id) - ->selectRaw('fk_RegisteredEventMessage, road_observeds.id, Title, FeatureTypeTitle, MobileForSendEventSms, - road_observeds.created_at, rms_last_activity, rms_last_activity_fa, status, edarate_shahri_id, - status_fa, supervisor_description, rms_description, province_fa, city_id, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng' - ); + ->selectRaw($fields); } diff --git a/app/Services/Cartables/SafetyAndPrivacyTableService.php b/app/Services/Cartables/SafetyAndPrivacyTableService.php new file mode 100644 index 00000000..56eae8f1 --- /dev/null +++ b/app/Services/Cartables/SafetyAndPrivacyTableService.php @@ -0,0 +1,49 @@ +user(); + + $fields = ['id','lat','lon','province_id','province_fa','city_id','city_fa','edare_shahri_id','edare_shahri_name', + 'recognize_picture','action_picture','operator_id','operator_name','way_id','created_at','updated_at','step','judiciary_document', + 'judiciary_document_upload_date','info_id','info_fa','activity_date_time','judiciary_document_upload_date','action_picture_document_upload_date', + 'step_fa' + ]; + + if ($user->hasPermissionTo('show-safety-and-privacy-operator-cartable')) { + $query = SafetyAndPrivacy::query()->select($fields); + } + elseif ($user->hasPermissionTo('show-safety-and-privacy-operator-cartable-province')) { + if (is_null($user->province_id)) { + return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); + } + + $query = SafetyAndPrivacy::query()->where('province_id', '=', $user->province_id)->select($fields); + } + elseif ($user->hasPermissionTo('show-safety-and-privacy-operator-cartable-edarate-shahri')) { + if (is_null($user->edarate_shahri_id)) { + return $this->errorResponse('اداره ای برای شما در سامانه ثبت نشده است!'); + } + + $query = SafetyAndPrivacy::query()->where('edare_shahri_id', '=', $user->edarate_shahri_id); + } + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'] + ); + } +} diff --git a/routes/v3.php b/routes/v3.php index 3b8b1a9a..91969d31 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -14,6 +14,7 @@ use App\Http\Controllers\V3\Dashboard\Reports\RoadPatrolReportController; use App\Http\Controllers\V3\Dashboard\RoadItemsProjectController; use App\Http\Controllers\V3\Dashboard\RoadObservationController; use App\Http\Controllers\V3\Dashboard\RoadPatrolProjectController; +use App\Http\Controllers\V3\Dashboard\SafetyAndPrivacyController; use App\Http\Controllers\V3\FMSVehicleManagementController; use App\Http\Controllers\V3\Harim\DivarkeshiController; use App\Http\Controllers\V3\LogListController; @@ -319,3 +320,15 @@ Route::prefix('log_list') ->group(function () { Route::get('/', 'index')->name('index'); }); + +Route::prefix('safety_and_privacy') + ->name('SafetyAndPrivacy.') + ->controller(SafetyAndPrivacyController::class) + ->group(function () { + Route::get('/', 'index')->name('index')->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province|show-safety-and-privacy-operator-cartable-edarate-shahri'); + Route::get('/first_step_store', 'firstStepStore')->name('firstStepStore')->middleware('permission:add-safety-and-privacy'); + Route::get('/second_step_store', 'secondStepStore')->name('secondStepStore')->middleware('permission:add-safety-and-privacy'); + Route::get('/third_step_store', 'thirdStepStore')->name('thirdStepStore')->middleware('permission:add-safety-and-privacy'); + Route::get('/{safetyAndPrivacy}', 'show')->name('show'); + Route::get('/{safetyAndPrivacy}', 'destroy')->name('destroy')->middleware('permission:delete-safety-and-privacy'); + }); From a65ec5e2bde91be27eb752525dce1cc94d0688c7 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sun, 2 Mar 2025 10:11:13 +0330 Subject: [PATCH 02/11] create blade file for report --- .../V3/SafetyAndPrivacy/CartableReport.php | 69 ++++++++++++ .../Dashboard/SafetyAndPrivacyController.php | 88 +++++++++------ app/Models/SafetyAndPrivacy.php | 21 ++++ .../SafetyAndPrivacy/CartableReport.blade.php | 104 ++++++++++++++++++ 4 files changed, 246 insertions(+), 36 deletions(-) create mode 100644 app/Exports/V3/SafetyAndPrivacy/CartableReport.php create mode 100644 resources/views/v3/Reports/SafetyAndPrivacy/CartableReport.blade.php diff --git a/app/Exports/V3/SafetyAndPrivacy/CartableReport.php b/app/Exports/V3/SafetyAndPrivacy/CartableReport.php new file mode 100644 index 00000000..6c066aa1 --- /dev/null +++ b/app/Exports/V3/SafetyAndPrivacy/CartableReport.php @@ -0,0 +1,69 @@ + $this->data, + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + }, + ]; + } + + 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('B1'); + return [$drawing, $drawing2]; + } + + public function styles(Worksheet $sheet): array + { + return [ + 'A:BA' => [ + 'font' => [ + 'name' => 'B Nazanin' + ] + ], + ]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php index 2191e2c4..85024011 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\V3\Dashboard; +use App\Exports\V3\SafetyAndPrivacy\CartableReport; use App\Facades\File\FileFacade; use App\Http\Controllers\Controller; use App\Http\Requests\V3\SafetyAndPrivacy\FirstStepStoreRequest; @@ -18,6 +19,8 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Validator; +use Maatwebsite\Excel\Facades\Excel; +use Symfony\Component\HttpFoundation\BinaryFileResponse; class SafetyAndPrivacyController extends Controller { @@ -28,15 +31,22 @@ class SafetyAndPrivacyController extends Controller return response()->json($safetyAndPrivacyTableService->datatable($request)); } + public function excelReport(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + { + $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + $data = $safetyAndPrivacyTableService->datatable($request); + return Excel::download(new CartableReport($data['data']), $name); + } + public function firstStepStore(FirstStepStoreRequest $request, NominatimService $nominatimService): JsonResponse { $user = auth()->user(); - if (auth()->user()->edarate_ostani_id || is_null(auth()->user()->city_id)) { + if ($user->edarate_ostani_id || is_null($user->city_id)) { return $this->errorResponse('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!'); } - if (is_null(auth()->user()->edarate_shahri_id)) { + if (is_null($user->edarate_shahri_id)) { return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); } @@ -46,84 +56,90 @@ class SafetyAndPrivacyController extends Controller ->where('item', 17) ->firstOrFail(); - DB::transaction(function () use ($request, $coordinates, $item, $nominatimService) + DB::transaction(function () use ($request, $coordinates, $item, $nominatimService, $user) { $safety_and_privacy = SafetyAndPrivacy::query()->create([ 'lat' => $coordinates[0], 'lon' => $coordinates[1], - 'operator_id' => auth()->user()->id, - 'operator_name' => auth()->user()->name, - 'province_id' => auth()->user()->province_id, - 'province_fa' => auth()->user()->province_fa, + 'operator_id' => $user->id, + 'operator_name' => $user->name, + 'province_id' => $user->province_id, + 'province_fa' => $user->province_fa, 'info_id' => $item->id, 'info_fa' => $item->sub_item_str, - 'city_id' => auth()->user()->city_id, - 'city_fa' => auth()->user()->city_fa, + 'city_id' => $user->city_id, + 'city_fa' => $user->city_fa, 'activity_date_time' => $request->activity_date." ".$request->activity_time, - 'edare_shahri_id' => auth()->user()->edarate_shahri_id, - 'edare_shahri_name' => auth()->user()->edarate_shahri_name, + 'edare_shahri_id' => $user->edarate_shahri_id, + 'edare_shahri_name' => $user->edarate_shahri_name, 'way_id' => $nominatimService->get_way_id_from_nominatim($coordinates[0], $coordinates[1]), - 'recognize_picture' => $request->has('recognize_picture') ? FileFacade::save($request->recognize_picture, 'safety_and_privacy') : null, 'step' => 1, 'step_fa' => 'گام اول (شناسایی)' ]); - auth()->user()->addActivityComplete(1134); + $safety_and_privacy->recognize_picture = $request->has('recognize_picture') ? + FileFacade::save($request->recognize_picture, "safety_and_privacy/{$safety_and_privacy->id}") : + null; + $safety_and_privacy->save(); + + $user->addActivityComplete(1134); }); return $this->successResponse(); } - public function secondStepStore(SecondStepStoreRequest $safety_and_privacy, Request $request): JsonResponse + public function secondStepStore(SafetyAndPrivacy $safety_and_privacy, SecondStepStoreRequest $request): JsonResponse { $user = auth()->user(); - if (auth()->user()->edarate_ostani_id || is_null(auth()->user()->city_id)) { + if ($user->edarate_ostani_id || is_null($user->city_id)) { return $this->errorResponse('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!'); } - if (is_null(auth()->user()->edarate_shahri_id)) { + if (is_null($user->edarate_shahri_id)) { return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); } - DB::transaction(function () use ($request, $safety_and_privacy) + DB::transaction(function () use ($request, $safety_and_privacy, $user) { $judiciary_document = []; - foreach ($request->judiciary_document as $index => $item) { - $judiciary_document[] = $item->store('safety_and_privacy/'.$safety_and_privacy->id.'/judiciary_document', 'public'); + foreach ($request->judiciary_document as $index => $file) { + $judiciary_document[] = FileFacade::save($file, "safety_and_privacy/{$safety_and_privacy->id}/judiciary_document"); } - $safety_and_privacy->judiciary_document = serialize($judiciary_document); - $safety_and_privacy->judiciary_document_upload_date = now(); + $safety_and_privacy->update([ + 'judiciary_document' => serialize($judiciary_document), + 'judiciary_document_upload_date' => now(), + 'step' => 2, + 'step_fa' => 'گام دوم (مستندات قضایی)' + ]); - $safety_and_privacy->goToSecondStep(); - $safety_and_privacy->save(); - - auth()->user()->addActivityComplete(1135); + $user->addActivityComplete(1135); }); return $this->successResponse(); } - public function thirdStepStore(ThirdStepStoreRequest $safety_and_privacy, Request $request): JsonResponse + public function thirdStepStore(SafetyAndPrivacy $safety_and_privacy, ThirdStepStoreRequest $request): JsonResponse { $user = auth()->user(); - if (auth()->user()->edarate_ostani_id || is_null(auth()->user()->city_id)) { + if ($user->edarate_ostani_id || is_null($user->city_id)) { return $this->errorResponse('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!'); } - if (is_null(auth()->user()->edarate_shahri_id)) { + if (is_null($user->edarate_shahri_id)) { return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); } - DB::transaction(function () use ($request, $safety_and_privacy) { - $action_picture = $request->file('action_picture')->store('safety_and_privacy/'.$safety_and_privacy->id.'/action_picture', 'public'); - $safety_and_privacy->action_picture = Storage::disk('public')->url($action_picture); - $safety_and_privacy->action_picture_document_upload_date = now(); + DB::transaction(function () use ($request, $safety_and_privacy, $user) { + $safety_and_privacy->update([ + 'step' => 3, + 'step_fa' => 'گام سوم (برخورد)', + 'action_picture' => FileFacade::save($request->action_picture, "safety_and_privacy/{$safety_and_privacy->id}/action_picture"), + 'action_picture_document_upload_date' => now(), + ]); - $safety_and_privacy->goToThirdStep(); - $safety_and_privacy->save(); - auth()->user()->addActivityComplete(1136); + $user->addActivityComplete(1136); }); return $this->successResponse(); @@ -136,7 +152,7 @@ class SafetyAndPrivacyController extends Controller public function destroy(SafetyAndPrivacy $safetyAndPrivacy): JsonResponse { - Storage::deleteDirectory('public/' . 'safety_and_privacy/' . $safetyAndPrivacy->id); + Storage::deleteDirectory("public/safety_and_privacy/{$safetyAndPrivacy->id}"); DB::transaction(function () use ($safetyAndPrivacy) { diff --git a/app/Models/SafetyAndPrivacy.php b/app/Models/SafetyAndPrivacy.php index 7df8202d..8d1fc29c 100644 --- a/app/Models/SafetyAndPrivacy.php +++ b/app/Models/SafetyAndPrivacy.php @@ -2,9 +2,11 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use App\Traits\SafetyAndPrivacyReportAble; +use Illuminate\Support\Facades\Storage; class SafetyAndPrivacy extends Model { @@ -60,4 +62,23 @@ class SafetyAndPrivacy extends Model } } + protected function recognizePicture(): Attribute + { + return Attribute::make( + get: fn($value) => $value == null ? null : + (filter_var($value, FILTER_VALIDATE_URL) + ? $value + : Storage::disk('public')->url($value)) + ); + } + + protected function actionPicture(): Attribute + { + return Attribute::make( + get: fn($value) => $value == null ? null : + (filter_var($value, FILTER_VALIDATE_URL) + ? $value + : Storage::disk('public')->url($value)) + ); + } } diff --git a/resources/views/v3/Reports/SafetyAndPrivacy/CartableReport.blade.php b/resources/views/v3/Reports/SafetyAndPrivacy/CartableReport.blade.php new file mode 100644 index 00000000..48fb08bf --- /dev/null +++ b/resources/views/v3/Reports/SafetyAndPrivacy/CartableReport.blade.php @@ -0,0 +1,104 @@ + + + + + + + + فعالیت های نگهداری حریم راه + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @foreach ($data as $item) + + + + + + + + + + + + + + + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش فعالیت های نگهداری حریم راه +
+ کد یکتا + + استان + + اداره + + مورد + + تاریخ بازدید + + تاریخ ثبت مستندات قضایی + + تاریخ اقدام + + وضعیت + + تاریخ ثبت +
{{ $item['id'] ?? '-' }}{{ $item['province_fa'] ?? '-' }}{{ $item['edare_shahri_name'] ?? '-' }}{{ $item['info_fa'] ?? '-' }}{{ $item['activity_date_time'] ? verta($item['activity_date_time'])->format('Y/n/j H:i:s') : '-' }} + {{ $item['judiciary_document_upload_date'] && $item['judiciary_document_upload_date'] != '0000-00-00 00:00:00' ? verta($item['judiciary_document_upload_date'])->format('Y/n/j H:i:s') : '-' }} + + {{ $item['action_picture_document_upload_date'] ? verta($item['action_picture_document_upload_date'])->format('Y/n/j H:i:s') : '-' }} + {{ $item['step_fa'] ?? '-' }}{{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }}
+ + From b31ea8bba24fd921c5bc2eb9a09db504bf04c616 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sun, 2 Mar 2025 10:55:03 +0330 Subject: [PATCH 03/11] add country activity report --- .../Dashboard/SafetyAndPrivacyController.php | 13 ++++ .../SafetyAndPrivacyTableService.php | 77 ++++++++++++++++++- routes/v3.php | 1 + 3 files changed, 89 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php index 85024011..ff596cff 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -162,4 +162,17 @@ class SafetyAndPrivacyController extends Controller return $this->successResponse(); } + + public function deserialize(SafetyAndPrivacy $safety_and_privacy): JsonResponse + { + $judiciaries = isset($safety_and_privacy->judiciary_document) ? unserialize($safety_and_privacy->judiciary_document) : []; + + $result = []; + + foreach ($judiciaries as $judiciary) { + $result[] = Storage::disk('public')->url($judiciary); + } + + return $this->successResponse($result); + } } diff --git a/app/Services/Cartables/SafetyAndPrivacyTableService.php b/app/Services/Cartables/SafetyAndPrivacyTableService.php index 56eae8f1..35904a97 100644 --- a/app/Services/Cartables/SafetyAndPrivacyTableService.php +++ b/app/Services/Cartables/SafetyAndPrivacyTableService.php @@ -6,6 +6,7 @@ use App\Facades\DataTable\DataTableFacade; use App\Http\Traits\ApiResponse; use App\Models\SafetyAndPrivacy; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; class SafetyAndPrivacyTableService { @@ -16,8 +17,8 @@ class SafetyAndPrivacyTableService $user = auth()->user(); $fields = ['id','lat','lon','province_id','province_fa','city_id','city_fa','edare_shahri_id','edare_shahri_name', - 'recognize_picture','action_picture','operator_id','operator_name','way_id','created_at','updated_at','step','judiciary_document', - 'judiciary_document_upload_date','info_id','info_fa','activity_date_time','judiciary_document_upload_date','action_picture_document_upload_date', + 'recognize_picture','action_picture','operator_id','operator_name','way_id','created_at','updated_at','step', + 'info_id','info_fa','activity_date_time', 'action_picture_document_upload_date', 'step_fa' ]; @@ -46,4 +47,76 @@ class SafetyAndPrivacyTableService allowedSortings: ['*'] ); } + + public function countryActivity(Request $request) + { + $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(); + + $country_name = "کشوری"; + $all[0]["info-89"]["step-1"] = 0; + $all[0]["info-89"]["step-2"] = 0; + $all[0]["info-89"]["step-3"] = 0; + + $all[0]["info-90"]["step-1"] = 0; + $all[0]["info-90"]["step-2"] = 0; + $all[0]["info-90"]["step-3"] = 0; + + $all[0]["info-91"]["step-1"] = 0; + $all[0]["info-91"]["step-2"] = 0; + $all[0]["info-91"]["step-3"] = 0; + + $all[0]["sum"] = 0; + $all[0]["name_fa"] = $country_name; + $all[0]["id"] = -1; + + foreach (\App\Models\Province::all() as $key => $value) { + $all[$value->id]["info-89"]["step-1"] = 0; + $all[$value->id]["info-89"]["step-2"] = 0; + $all[$value->id]["info-89"]["step-3"] = 0; + + $all[$value->id]["info-90"]["step-1"] = 0; + $all[$value->id]["info-90"]["step-2"] = 0; + $all[$value->id]["info-90"]["step-3"] = 0; + + $all[$value->id]["info-91"]["step-1"] = 0; + $all[$value->id]["info-91"]["step-2"] = 0; + $all[$value->id]["info-91"]["step-3"] = 0; + + $all[$value->id]["sum"] = 0; + $all[$value->id]["name_fa"] = $value->name_fa; + $all[$value->id]["id"] = $value->id; + } + + $temp = DB::select("SELECT COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' GROUP BY info_id,step"); + + $sum = 0; + foreach ($temp as $key => $value) { + $sum += $value->qty; + $all[0]["info-".$value->info_id]["step-".$value->step] = $value->qty; + $all[0]["sum"] = $sum; + } + + $temp = DB::select("SELECT province_id, COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' GROUP BY info_id,step,province_id order by province_id"); + $province_id_flag = ""; + $sum = 0; + + foreach ($temp as $key => $value) { + + if ($province_id_flag !== $value->province_id) { + + $province_id_flag = $value->province_id; + $sum = $value->qty ; + + }else { + + $sum += $value->qty; + + } + + $all[$value->province_id]["info-".$value->info_id]["step-".$value->step] = $value->qty; + $all[$value->province_id]["sum"] = $sum; + } + return $all; + } } diff --git a/routes/v3.php b/routes/v3.php index 91969d31..8cf70f84 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -331,4 +331,5 @@ Route::prefix('safety_and_privacy') Route::get('/third_step_store', 'thirdStepStore')->name('thirdStepStore')->middleware('permission:add-safety-and-privacy'); Route::get('/{safetyAndPrivacy}', 'show')->name('show'); Route::get('/{safetyAndPrivacy}', 'destroy')->name('destroy')->middleware('permission:delete-safety-and-privacy'); + Route::get('/deserialize/{safetyAndPrivacy}', 'deserialize')->name('deserialize'); }); From 945fa0792b7d5b567264a8a7d6ddbbf0db10b2a0 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sun, 2 Mar 2025 14:38:59 +0330 Subject: [PATCH 04/11] create report controller --- .../SafetyAndPrivacyReportController.php | 20 ++++ .../Dashboard/SafetyAndPrivacyController.php | 12 ++- .../SafetyAndPrivacyTableService.php | 100 ++++++++---------- routes/v3.php | 10 +- 4 files changed, 81 insertions(+), 61 deletions(-) create mode 100644 app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php diff --git a/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php new file mode 100644 index 00000000..19151055 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php @@ -0,0 +1,20 @@ +successResponse(); } - public function deserialize(SafetyAndPrivacy $safety_and_privacy): JsonResponse + public function deserialize(SafetyAndPrivacy $safetyAndPrivacy): JsonResponse { - $judiciaries = isset($safety_and_privacy->judiciary_document) ? unserialize($safety_and_privacy->judiciary_document) : []; + $judiciaries = isset($safetyAndPrivacy->judiciary_document) ? unserialize($safetyAndPrivacy->judiciary_document) : []; $result = []; @@ -175,4 +175,12 @@ class SafetyAndPrivacyController extends Controller return $this->successResponse($result); } + + public function subItem(): JsonResponse + { + return $this->successResponse(InfoItem::query() + ->where('item', 17) + ->select('id', 'item', 'item_str', 'sub_item_str as name', 'sub_item_unit as unit', 'needs_image', 'needs_end_point', 'sub_item') + ->get()); + } } diff --git a/app/Services/Cartables/SafetyAndPrivacyTableService.php b/app/Services/Cartables/SafetyAndPrivacyTableService.php index 35904a97..e646367c 100644 --- a/app/Services/Cartables/SafetyAndPrivacyTableService.php +++ b/app/Services/Cartables/SafetyAndPrivacyTableService.php @@ -4,6 +4,7 @@ namespace App\Services\Cartables; use App\Facades\DataTable\DataTableFacade; use App\Http\Traits\ApiResponse; +use App\Models\Province; use App\Models\SafetyAndPrivacy; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; @@ -48,75 +49,58 @@ class SafetyAndPrivacyTableService ); } - public function countryActivity(Request $request) + public function countryActivity(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(); - $country_name = "کشوری"; - $all[0]["info-89"]["step-1"] = 0; - $all[0]["info-89"]["step-2"] = 0; - $all[0]["info-89"]["step-3"] = 0; + $activities = []; - $all[0]["info-90"]["step-1"] = 0; - $all[0]["info-90"]["step-2"] = 0; - $all[0]["info-90"]["step-3"] = 0; + $country = DB::select( + "SELECT COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' GROUP BY info_id,step" + ); + $provinces = DB::select( + "SELECT province_id, COUNT(*) as qty,info_id, step, step_fa, info_fa FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' GROUP BY info_id,step,province_id,province_fa" + ); - $all[0]["info-91"]["step-1"] = 0; - $all[0]["info-91"]["step-2"] = 0; - $all[0]["info-91"]["step-3"] = 0; - - $all[0]["sum"] = 0; - $all[0]["name_fa"] = $country_name; - $all[0]["id"] = -1; - - foreach (\App\Models\Province::all() as $key => $value) { - $all[$value->id]["info-89"]["step-1"] = 0; - $all[$value->id]["info-89"]["step-2"] = 0; - $all[$value->id]["info-89"]["step-3"] = 0; - - $all[$value->id]["info-90"]["step-1"] = 0; - $all[$value->id]["info-90"]["step-2"] = 0; - $all[$value->id]["info-90"]["step-3"] = 0; - - $all[$value->id]["info-91"]["step-1"] = 0; - $all[$value->id]["info-91"]["step-2"] = 0; - $all[$value->id]["info-91"]["step-3"] = 0; - - $all[$value->id]["sum"] = 0; - $all[$value->id]["name_fa"] = $value->name_fa; - $all[$value->id]["id"] = $value->id; + $countryTotalSum = 0; + foreach ($country as $key => $value) { + $countryTotalSum += $value->qty; + $activities[-1]["info-".$value->info_id]["step-".$value->step] = $value->qty; + $activities[-1]["sum"] = $countryTotalSum; } - $temp = DB::select("SELECT COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' GROUP BY info_id,step"); - $sum = 0; - foreach ($temp as $key => $value) { - $sum += $value->qty; - $all[0]["info-".$value->info_id]["step-".$value->step] = $value->qty; - $all[0]["sum"] = $sum; + foreach (Province::all() as $key => $value) { + $activities[$value->id]["info-89"]["step-1"] = 0; + $activities[$value->id]["info-89"]["step-2"] = 0; + $activities[$value->id]["info-89"]["step-3"] = 0; + + $activities[$value->id]["info-90"]["step-1"] = 0; + $activities[$value->id]["info-90"]["step-2"] = 0; + $activities[$value->id]["info-90"]["step-3"] = 0; + + $activities[$value->id]["info-91"]["step-1"] = 0; + $activities[$value->id]["info-91"]["step-2"] = 0; + $activities[$value->id]["info-91"]["step-3"] = 0; + + $activities[$value->id]["sum"] = 0; + $activities[$value->id]["name_fa"] = $value->name_fa; + $activities[$value->id]["id"] = $value->id; } - $temp = DB::select("SELECT province_id, COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' GROUP BY info_id,step,province_id order by province_id"); - $province_id_flag = ""; - $sum = 0; - - foreach ($temp as $key => $value) { - - if ($province_id_flag !== $value->province_id) { - - $province_id_flag = $value->province_id; - $sum = $value->qty ; - - }else { - - $sum += $value->qty; - - } - - $all[$value->province_id]["info-".$value->info_id]["step-".$value->step] = $value->qty; - $all[$value->province_id]["sum"] = $sum; + $provinceTotalSum = 0; + foreach ($provinces as $key => $value) { + $provinceTotalSum += $value->qty; + $activities[$value->province_id]["info-".$value->info_id]["step-".$value->step] = $value->qty; + $activities[$value->province_id]["sum"] = $provinceTotalSum; + $activities[$value->province_id]["province_fa"] = $value->province_fa; } - return $all; + + return [ + 'activities' => $activities, + 'fromDate' => $fromDate, + 'toDate' => $toDate, + ]; } } diff --git a/routes/v3.php b/routes/v3.php index 8cf70f84..62781fe6 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -11,6 +11,7 @@ use App\Http\Controllers\V3\Dashboard\AccidentReceiptController; use App\Http\Controllers\V3\Dashboard\Reports\AccidentReceiptReportController; use App\Http\Controllers\V3\Dashboard\Reports\RoadItemsReportController; use App\Http\Controllers\V3\Dashboard\Reports\RoadPatrolReportController; +use App\Http\Controllers\V3\Dashboard\Reports\SafetyAndPrivacyReportController; use App\Http\Controllers\V3\Dashboard\RoadItemsProjectController; use App\Http\Controllers\V3\Dashboard\RoadObservationController; use App\Http\Controllers\V3\Dashboard\RoadPatrolProjectController; @@ -24,7 +25,7 @@ use Illuminate\Support\Facades\Route; Route::get('admin/permissions', function () { if (auth()->user()->username == 'witel') { - auth()->user()->syncPermissions(\App\Models\Permission::all()->pluck('id')->toArray()); + auth()->user()->syncPermissions(\App\Models\Permission::all()); return response('done'); } abort(404); @@ -333,3 +334,10 @@ Route::prefix('safety_and_privacy') Route::get('/{safetyAndPrivacy}', 'destroy')->name('destroy')->middleware('permission:delete-safety-and-privacy'); Route::get('/deserialize/{safetyAndPrivacy}', 'deserialize')->name('deserialize'); }); + +Route::prefix('safety_and_privacy_report') + ->name('SafetyAndPrivacyReport.') + ->controller(SafetyAndPrivacyReportController::class) + ->group(function () { + Route::get('/', 'index')->name('index'); + }); From f2258c3521da547200dea24593c4e79691575f21 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 3 Mar 2025 10:39:38 +0330 Subject: [PATCH 05/11] create blade files for report --- .../CountryActivityReport.php | 62 ++++++++ .../ProvinceActivityReport.php | 62 ++++++++ .../SafetyAndPrivacyReportController.php | 30 +++- .../Dashboard/SafetyAndPrivacyController.php | 4 +- .../SafetyAndPrivacyTableService.php | 63 ++++++++- .../CountryActivityReport.blade.php | 107 ++++++++++++++ .../ProvinceActivityReport.blade.php | 133 ++++++++++++++++++ routes/v3.php | 14 +- 8 files changed, 461 insertions(+), 14 deletions(-) create mode 100644 app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php create mode 100644 app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php create mode 100644 resources/views/v3/Reports/SafetyAndPrivacy/CountryActivityReport.blade.php create mode 100644 resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php diff --git a/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php b/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php new file mode 100644 index 00000000..99a9fb7d --- /dev/null +++ b/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php @@ -0,0 +1,62 @@ +data; + + return view('v3.Reports.SafetyAndPrivacy.CountryActivityReport', [ + 'data' => $data['activities'], + 'fromDate' => $data['fromDate'], + 'toDate' => $data['toDate'], + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + }, + ]; + } + + 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('K1'); + return [$drawing, $drawing2]; + } +} \ No newline at end of file diff --git a/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php b/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php new file mode 100644 index 00000000..c5ffa6ab --- /dev/null +++ b/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php @@ -0,0 +1,62 @@ +data; + + return view('v3.Reports.SafetyAndPrivacy.ProvinceActivityReport', [ + 'data' => $data['activities'], + 'fromDate' => $data['fromDate'], + 'toDate' => $data['toDate'], + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + }, + ]; + } + + 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('K1'); + return [$drawing, $drawing2]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php index 19151055..cc4291f8 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php @@ -2,19 +2,43 @@ namespace App\Http\Controllers\V3\Dashboard\Reports; +use App\Exports\V3\SafetyAndPrivacy\CountryActivityReport; +use App\Exports\V3\SafetyAndPrivacy\ProvinceActivityReport; use App\Http\Controllers\Controller; +use App\Http\Traits\ApiResponse; use App\Services\Cartables\SafetyAndPrivacyTableService; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Maatwebsite\Excel\Facades\Excel; +use Symfony\Component\HttpFoundation\BinaryFileResponse; class SafetyAndPrivacyReportController extends Controller { - public function countryActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService) - { + use ApiResponse; + public function countryActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse + { + $data = $safetyAndPrivacyTableService->countryActivity($request); + return $this->successResponse($data['activities']); } - public function provinceActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService) + public function provinceActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse { + $data = $safetyAndPrivacyTableService->provinceActivity($request); + return $this->successResponse($data['activities']); + } + public function countryExcelActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + { + $data = $safetyAndPrivacyTableService->countryActivity($request); + $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + return Excel::download(new CountryActivityReport($data), $name); + } + + public function provinceExcelActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + { + $data = $safetyAndPrivacyTableService->provinceActivity($request); + $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + return Excel::download(new ProvinceActivityReport($data), $name); } } diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php index 5c67f6a4..425a203e 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -176,10 +176,10 @@ class SafetyAndPrivacyController extends Controller return $this->successResponse($result); } - public function subItem(): JsonResponse + public function subItems(): JsonResponse { return $this->successResponse(InfoItem::query() - ->where('item', 17) + ->where('item', '=', 17) ->select('id', 'item', 'item_str', 'sub_item_str as name', 'sub_item_unit as unit', 'needs_image', 'needs_end_point', 'sub_item') ->get()); } diff --git a/app/Services/Cartables/SafetyAndPrivacyTableService.php b/app/Services/Cartables/SafetyAndPrivacyTableService.php index e646367c..65a1dc3f 100644 --- a/app/Services/Cartables/SafetyAndPrivacyTableService.php +++ b/app/Services/Cartables/SafetyAndPrivacyTableService.php @@ -59,9 +59,6 @@ class SafetyAndPrivacyTableService $country = DB::select( "SELECT COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' GROUP BY info_id,step" ); - $provinces = DB::select( - "SELECT province_id, COUNT(*) as qty,info_id, step, step_fa, info_fa FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' GROUP BY info_id,step,province_id,province_fa" - ); $countryTotalSum = 0; foreach ($country as $key => $value) { @@ -86,9 +83,12 @@ class SafetyAndPrivacyTableService $activities[$value->id]["sum"] = 0; $activities[$value->id]["name_fa"] = $value->name_fa; - $activities[$value->id]["id"] = $value->id; } + $provinces = DB::select( + "SELECT province_id, province_fa, COUNT(*) as qty,info_id, step, step_fa, info_fa FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' GROUP BY info_id,step,province_id,province_fa" + ); + $provinceTotalSum = 0; foreach ($provinces as $key => $value) { $provinceTotalSum += $value->qty; @@ -103,4 +103,59 @@ class SafetyAndPrivacyTableService 'toDate' => $toDate, ]; } + + public function provinceActivity(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(); + $provinceId = $request->province_id; + $activities = []; + + $province = DB::select(' + SELECT COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step + '); + + $provinceTotalSum = 0; + foreach ($province as $key => $value) { + $provinceTotalSum += $value->qty; + $activities[-1]["info-".$value->info_id]["step-".$value->step] = $value->qty; + $activities[-1]["sum"] = $provinceTotalSum; + } + + foreach (\App\Models\EdarateShahri::query()->where('province_id', $provinceId)->get() as $key => $value) { + $activities[$value->id]["info-89"]["step-1"] = 0; + $activities[$value->id]["info-89"]["step-2"] = 0; + $activities[$value->id]["info-89"]["step-3"] = 0; + + $activities[$value->id]["info-90"]["step-1"] = 0; + $activities[$value->id]["info-90"]["step-2"] = 0; + $activities[$value->id]["info-90"]["step-3"] = 0; + + $activities[$value->id]["info-91"]["step-1"] = 0; + $activities[$value->id]["info-91"]["step-2"] = 0; + $activities[$value->id]["info-91"]["step-3"] = 0; + + $activities[$value->id]["sum"] = 0; + $activities[$value->id]["name_fa"] = $value->name_fa; + } + + + $cities = DB::select(' + SELECT edare_shahri_id, COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step,edare_shahri_id + '); + + $cityTotalSum = 0; + foreach ($cities as $key => $value) { + $cityTotalSum += $value->qty; + $activities[$value->edare_shahri_id]["info-".$value->info_id]["step-".$value->step] = $value->qty; + $activities[$value->edare_shahri_id][""] = $value; + $activities[$value->edare_shahri_id]["sum"] = $cityTotalSum; + } + + return [ + 'activities' => $activities, + 'fromDate' => $fromDate, + 'toDate' => $toDate, + ]; + } } diff --git a/resources/views/v3/Reports/SafetyAndPrivacy/CountryActivityReport.blade.php b/resources/views/v3/Reports/SafetyAndPrivacy/CountryActivityReport.blade.php new file mode 100644 index 00000000..2959afed --- /dev/null +++ b/resources/views/v3/Reports/SafetyAndPrivacy/CountryActivityReport.blade.php @@ -0,0 +1,107 @@ + + + + + + + + کشوری + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @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['name_fa'] }}{{ $item['sum'] }}{{ $item['info-89']['step-1'] }}{{ $item['info-89']['step-2'] }}{{ $item['info-89']['step-3'] }}{{ $item['info-90']['step-1'] }}{{ $item['info-90']['step-2'] }}{{ $item['info-90']['step-3'] }}{{ $item['info-91']['step-1'] }}{{ $item['info-91']['step-2'] }}{{ $item['info-91']['step-3'] }}
+ + diff --git a/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php b/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php new file mode 100644 index 00000000..ffe68f28 --- /dev/null +++ b/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php @@ -0,0 +1,133 @@ + + + + + + + + استانی + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @foreach ($data as $item) + @if ($item['is_province'] == '1') + + + + + + + + + + + + + + @else + + + + + + + + + + + + + + @endif + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش نگهداری حریم راه از تاریخ + {{ verta($fromDate)->format('Y/n/j') }} + تا + تاریخ + {{ verta($toDate)->format('Y/n/j') }} + +
+ اداره کل + + تعداد کل + + ساخت و ساز غیر مجاز + + راه دسترسی غیر مجاز + + عبور تاسیسات زیربنایی غیر مجاز +
+ گام اول (شناسایی) + + گام دوم (مستندات قضایی) + + گام سوم (برخورد) + + گام اول (شناسایی) + + گام دوم (مستندات قضایی) + + گام سوم (برخورد) + + گام اول (شناسایی) + + گام دوم (مستندات قضایی) + + گام سوم (برخورد) +
+ {{ $item['name_fa'] }} + {{ $item['sum'] }} + {{ $item['info-89']['step-1'] }} + {{ $item['info-89']['step-2'] }} + {{ $item['info-89']['step-3'] }} + {{ $item['info-90']['step-1'] }} + {{ $item['info-90']['step-2'] }} + {{ $item['info-90']['step-3'] }} + {{ $item['info-91']['step-1'] }} + {{ $item['info-91']['step-2'] }} + {{ $item['info-91']['step-3'] }}
{{ $item['name_fa'] }}{{ $item['sum'] }}{{ $item['info-89']['step-1'] }}{{ $item['info-89']['step-2'] }}{{ $item['info-89']['step-3'] }}{{ $item['info-90']['step-1'] }}{{ $item['info-90']['step-2'] }}{{ $item['info-90']['step-3'] }}{{ $item['info-91']['step-1'] }}{{ $item['info-91']['step-2'] }}{{ $item['info-91']['step-3'] }}
+ + diff --git a/routes/v3.php b/routes/v3.php index 62781fe6..199f7d56 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -327,11 +327,12 @@ Route::prefix('safety_and_privacy') ->controller(SafetyAndPrivacyController::class) ->group(function () { Route::get('/', 'index')->name('index')->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province|show-safety-and-privacy-operator-cartable-edarate-shahri'); - Route::get('/first_step_store', 'firstStepStore')->name('firstStepStore')->middleware('permission:add-safety-and-privacy'); - Route::get('/second_step_store', 'secondStepStore')->name('secondStepStore')->middleware('permission:add-safety-and-privacy'); - Route::get('/third_step_store', 'thirdStepStore')->name('thirdStepStore')->middleware('permission:add-safety-and-privacy'); + Route::post('/first_step_store', 'firstStepStore')->name('firstStepStore')->middleware('permission:add-safety-and-privacy'); + Route::post('/second_step_store', 'secondStepStore')->name('secondStepStore')->middleware('permission:add-safety-and-privacy'); + Route::post('/third_step_store', 'thirdStepStore')->name('thirdStepStore')->middleware('permission:add-safety-and-privacy'); + Route::get('/sub_items', 'subItems')->name('subItems'); Route::get('/{safetyAndPrivacy}', 'show')->name('show'); - Route::get('/{safetyAndPrivacy}', 'destroy')->name('destroy')->middleware('permission:delete-safety-and-privacy'); + Route::delete('/{safetyAndPrivacy}', 'destroy')->name('destroy')->middleware('permission:delete-safety-and-privacy'); Route::get('/deserialize/{safetyAndPrivacy}', 'deserialize')->name('deserialize'); }); @@ -339,5 +340,8 @@ Route::prefix('safety_and_privacy_report') ->name('SafetyAndPrivacyReport.') ->controller(SafetyAndPrivacyReportController::class) ->group(function () { - Route::get('/', 'index')->name('index'); + Route::get('/country_activity', 'countryActivity')->name('countryActivity'); + Route::get('/province_activity', 'provinceActivity')->name('provinceActivity'); + Route::get('/country_excel_activity', 'countryExcelActivity')->name('countryExcelActivity'); + Route::get('/province_excel_activity', 'provinceExcelActivity')->name('provinceExcelActivity'); }); From cc8175a15ee0c0542b002fbcb75eb9fbdb527d86 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 3 Mar 2025 11:28:19 +0330 Subject: [PATCH 06/11] refactor blade files --- .../Dashboard/SafetyAndPrivacyController.php | 16 ++--- .../SafetyAndPrivacyTableService.php | 62 +++++-------------- .../CountryActivityReport.blade.php | 18 +++--- .../ProvinceActivityReport.blade.php | 51 ++++++--------- routes/v3.php | 4 +- 5 files changed, 55 insertions(+), 96 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php index 425a203e..36fa1928 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -88,7 +88,7 @@ class SafetyAndPrivacyController extends Controller return $this->successResponse(); } - public function secondStepStore(SafetyAndPrivacy $safety_and_privacy, SecondStepStoreRequest $request): JsonResponse + public function secondStepStore(SafetyAndPrivacy $safetyAndPrivacy, SecondStepStoreRequest $request): JsonResponse { $user = auth()->user(); @@ -100,13 +100,13 @@ class SafetyAndPrivacyController extends Controller return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); } - DB::transaction(function () use ($request, $safety_and_privacy, $user) + DB::transaction(function () use ($request, $safetyAndPrivacy, $user) { $judiciary_document = []; foreach ($request->judiciary_document as $index => $file) { - $judiciary_document[] = FileFacade::save($file, "safety_and_privacy/{$safety_and_privacy->id}/judiciary_document"); + $judiciary_document[] = FileFacade::save($file, "safety_and_privacy/{$safetyAndPrivacy->id}/judiciary_document"); } - $safety_and_privacy->update([ + $safetyAndPrivacy->update([ 'judiciary_document' => serialize($judiciary_document), 'judiciary_document_upload_date' => now(), 'step' => 2, @@ -119,7 +119,7 @@ class SafetyAndPrivacyController extends Controller return $this->successResponse(); } - public function thirdStepStore(SafetyAndPrivacy $safety_and_privacy, ThirdStepStoreRequest $request): JsonResponse + public function thirdStepStore(SafetyAndPrivacy $safetyAndPrivacy, ThirdStepStoreRequest $request): JsonResponse { $user = auth()->user(); @@ -131,11 +131,11 @@ class SafetyAndPrivacyController extends Controller return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); } - DB::transaction(function () use ($request, $safety_and_privacy, $user) { - $safety_and_privacy->update([ + DB::transaction(function () use ($request, $safetyAndPrivacy, $user) { + $safetyAndPrivacy->update([ 'step' => 3, 'step_fa' => 'گام سوم (برخورد)', - 'action_picture' => FileFacade::save($request->action_picture, "safety_and_privacy/{$safety_and_privacy->id}/action_picture"), + 'action_picture' => FileFacade::save($request->action_picture, "safety_and_privacy/{$safetyAndPrivacy->id}/action_picture"), 'action_picture_document_upload_date' => now(), ]); diff --git a/app/Services/Cartables/SafetyAndPrivacyTableService.php b/app/Services/Cartables/SafetyAndPrivacyTableService.php index 65a1dc3f..7093dbae 100644 --- a/app/Services/Cartables/SafetyAndPrivacyTableService.php +++ b/app/Services/Cartables/SafetyAndPrivacyTableService.php @@ -61,28 +61,12 @@ class SafetyAndPrivacyTableService ); $countryTotalSum = 0; + $activities[]["name_fa"] = 'کشوری'; + $activities[]["province_id"] = -1; foreach ($country as $key => $value) { $countryTotalSum += $value->qty; - $activities[-1]["info-".$value->info_id]["step-".$value->step] = $value->qty; - $activities[-1]["sum"] = $countryTotalSum; - } - - - foreach (Province::all() as $key => $value) { - $activities[$value->id]["info-89"]["step-1"] = 0; - $activities[$value->id]["info-89"]["step-2"] = 0; - $activities[$value->id]["info-89"]["step-3"] = 0; - - $activities[$value->id]["info-90"]["step-1"] = 0; - $activities[$value->id]["info-90"]["step-2"] = 0; - $activities[$value->id]["info-90"]["step-3"] = 0; - - $activities[$value->id]["info-91"]["step-1"] = 0; - $activities[$value->id]["info-91"]["step-2"] = 0; - $activities[$value->id]["info-91"]["step-3"] = 0; - - $activities[$value->id]["sum"] = 0; - $activities[$value->id]["name_fa"] = $value->name_fa; + $activities[][$value->info_id][$value->step] = $value->qty; + $activities[]["sum"] = $countryTotalSum; } $provinces = DB::select( @@ -92,9 +76,10 @@ class SafetyAndPrivacyTableService $provinceTotalSum = 0; foreach ($provinces as $key => $value) { $provinceTotalSum += $value->qty; - $activities[$value->province_id]["info-".$value->info_id]["step-".$value->step] = $value->qty; - $activities[$value->province_id]["sum"] = $provinceTotalSum; - $activities[$value->province_id]["province_fa"] = $value->province_fa; + $activities[][$value->info_id][$value->step] = $value->qty; + $activities[]["sum"] = $provinceTotalSum; + $activities[]["province_fa"] = $value->province_fa; + $activities[]["province_id"] = $value->province_id; } return [ @@ -116,30 +101,14 @@ class SafetyAndPrivacyTableService '); $provinceTotalSum = 0; + $activities[]["name_fa"] = 'استانی'; + $activities[]["edare_shahri_id"] = -1; foreach ($province as $key => $value) { $provinceTotalSum += $value->qty; - $activities[-1]["info-".$value->info_id]["step-".$value->step] = $value->qty; - $activities[-1]["sum"] = $provinceTotalSum; + $activities[]["info-".$value->info_id]["step-".$value->step] = $value->qty; + $activities[]["sum"] = $provinceTotalSum; } - foreach (\App\Models\EdarateShahri::query()->where('province_id', $provinceId)->get() as $key => $value) { - $activities[$value->id]["info-89"]["step-1"] = 0; - $activities[$value->id]["info-89"]["step-2"] = 0; - $activities[$value->id]["info-89"]["step-3"] = 0; - - $activities[$value->id]["info-90"]["step-1"] = 0; - $activities[$value->id]["info-90"]["step-2"] = 0; - $activities[$value->id]["info-90"]["step-3"] = 0; - - $activities[$value->id]["info-91"]["step-1"] = 0; - $activities[$value->id]["info-91"]["step-2"] = 0; - $activities[$value->id]["info-91"]["step-3"] = 0; - - $activities[$value->id]["sum"] = 0; - $activities[$value->id]["name_fa"] = $value->name_fa; - } - - $cities = DB::select(' SELECT edare_shahri_id, COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step,edare_shahri_id '); @@ -147,9 +116,10 @@ class SafetyAndPrivacyTableService $cityTotalSum = 0; foreach ($cities as $key => $value) { $cityTotalSum += $value->qty; - $activities[$value->edare_shahri_id]["info-".$value->info_id]["step-".$value->step] = $value->qty; - $activities[$value->edare_shahri_id][""] = $value; - $activities[$value->edare_shahri_id]["sum"] = $cityTotalSum; + $activities[][$value->info_id][$value->step] = $value->qty; + $activities[]["name_fa"] = \App\Models\EdarateShahri::query()->find($value->edare_shahri_id)->name_fa; + $activities[]["edare_shahri_id"] = $value->edare_shahri_id; + $activities[]["sum"] = $cityTotalSum; } return [ diff --git a/resources/views/v3/Reports/SafetyAndPrivacy/CountryActivityReport.blade.php b/resources/views/v3/Reports/SafetyAndPrivacy/CountryActivityReport.blade.php index 2959afed..cdd69930 100644 --- a/resources/views/v3/Reports/SafetyAndPrivacy/CountryActivityReport.blade.php +++ b/resources/views/v3/Reports/SafetyAndPrivacy/CountryActivityReport.blade.php @@ -90,15 +90,15 @@ {{ $item['name_fa'] }} {{ $item['sum'] }} - {{ $item['info-89']['step-1'] }} - {{ $item['info-89']['step-2'] }} - {{ $item['info-89']['step-3'] }} - {{ $item['info-90']['step-1'] }} - {{ $item['info-90']['step-2'] }} - {{ $item['info-90']['step-3'] }} - {{ $item['info-91']['step-1'] }} - {{ $item['info-91']['step-2'] }} - {{ $item['info-91']['step-3'] }} + {{ $item[89][1] }} + {{ $item[89][2] }} + {{ $item[89][3] }} + {{ $item[90][1] }} + {{ $item[90][2] }} + {{ $item[90][3] }} + {{ $item[91][1] }} + {{ $item[91][2] }} + {{ $item[91][3] }} @endforeach diff --git a/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php b/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php index ffe68f28..7faf68c3 100644 --- a/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php +++ b/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php @@ -88,42 +88,31 @@ @foreach ($data as $item) @if ($item['is_province'] == '1') - - {{ $item['name_fa'] }} - - {{ $item['sum'] }} - - {{ $item['info-89']['step-1'] }} - - {{ $item['info-89']['step-2'] }} - - {{ $item['info-89']['step-3'] }} - - {{ $item['info-90']['step-1'] }} - - {{ $item['info-90']['step-2'] }} - - {{ $item['info-90']['step-3'] }} - - {{ $item['info-91']['step-1'] }} - - {{ $item['info-91']['step-2'] }} - - {{ $item['info-91']['step-3'] }} + {{ $item['name_fa'] }} + {{ $item['sum'] }} + {{ $item[89][1] }} + {{ $item[89][2] }} + {{ $item[89][3] }} + {{ $item[90][1] }} + {{ $item[90][2] }} + {{ $item[90][3] }} + {{ $item[91][1] }} + {{ $item[91][2] }} + {{ $item[91][3] }} @else {{ $item['name_fa'] }} {{ $item['sum'] }} - {{ $item['info-89']['step-1'] }} - {{ $item['info-89']['step-2'] }} - {{ $item['info-89']['step-3'] }} - {{ $item['info-90']['step-1'] }} - {{ $item['info-90']['step-2'] }} - {{ $item['info-90']['step-3'] }} - {{ $item['info-91']['step-1'] }} - {{ $item['info-91']['step-2'] }} - {{ $item['info-91']['step-3'] }} + {{ $item[89][1] }} + {{ $item[89][2] }} + {{ $item[89][3] }} + {{ $item[90][1] }} + {{ $item[90][2] }} + {{ $item[90][3] }} + {{ $item[91][1] }} + {{ $item[91][2] }} + {{ $item[91][3] }} @endif @endforeach diff --git a/routes/v3.php b/routes/v3.php index 199f7d56..d312cf24 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -328,8 +328,8 @@ Route::prefix('safety_and_privacy') ->group(function () { Route::get('/', 'index')->name('index')->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province|show-safety-and-privacy-operator-cartable-edarate-shahri'); Route::post('/first_step_store', 'firstStepStore')->name('firstStepStore')->middleware('permission:add-safety-and-privacy'); - Route::post('/second_step_store', 'secondStepStore')->name('secondStepStore')->middleware('permission:add-safety-and-privacy'); - Route::post('/third_step_store', 'thirdStepStore')->name('thirdStepStore')->middleware('permission:add-safety-and-privacy'); + Route::post('/second_step_store/{safetyAndPrivacy}', 'secondStepStore')->name('secondStepStore')->middleware('permission:add-safety-and-privacy'); + Route::post('/third_step_store/{safetyAndPrivacy}', 'thirdStepStore')->name('thirdStepStore')->middleware('permission:add-safety-and-privacy'); Route::get('/sub_items', 'subItems')->name('subItems'); Route::get('/{safetyAndPrivacy}', 'show')->name('show'); Route::delete('/{safetyAndPrivacy}', 'destroy')->name('destroy')->middleware('permission:delete-safety-and-privacy'); From 3326ab326ece04e0d16c5e6bcff91e69da4e9d10 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 3 Mar 2025 11:59:29 +0330 Subject: [PATCH 07/11] add more detail to api --- .../SafetyAndPrivacyReportController.php | 12 +- .../Dashboard/SafetyAndPrivacyController.php | 2 +- .../SafetyAndPrivacyTableService.php | 104 +++++++++++++++--- 3 files changed, 99 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php index cc4291f8..0b0b5a84 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php @@ -6,6 +6,8 @@ use App\Exports\V3\SafetyAndPrivacy\CountryActivityReport; use App\Exports\V3\SafetyAndPrivacy\ProvinceActivityReport; use App\Http\Controllers\Controller; use App\Http\Traits\ApiResponse; +use App\Models\EdarateShahri; +use App\Models\Province; use App\Services\Cartables\SafetyAndPrivacyTableService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -19,13 +21,19 @@ class SafetyAndPrivacyReportController extends Controller public function countryActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse { $data = $safetyAndPrivacyTableService->countryActivity($request); - return $this->successResponse($data['activities']); + return $this->successResponse([ + 'activities' => $data['activities'], + 'provinces' => Province::all(['id', 'name_fa']) + ]); } public function provinceActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse { $data = $safetyAndPrivacyTableService->provinceActivity($request); - return $this->successResponse($data['activities']); + return $this->successResponse([ + 'activities' => $data['activities'], + 'edarateShahri' => EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']), + ]); } public function countryExcelActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php index 36fa1928..f1562b5d 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -165,7 +165,7 @@ class SafetyAndPrivacyController extends Controller public function deserialize(SafetyAndPrivacy $safetyAndPrivacy): JsonResponse { - $judiciaries = isset($safetyAndPrivacy->judiciary_document) ? unserialize($safetyAndPrivacy->judiciary_document) : []; + $judiciaries = $safetyAndPrivacy->judiciary_document ? unserialize($safetyAndPrivacy->judiciary_document) : []; $result = []; diff --git a/app/Services/Cartables/SafetyAndPrivacyTableService.php b/app/Services/Cartables/SafetyAndPrivacyTableService.php index 7093dbae..bd2c253a 100644 --- a/app/Services/Cartables/SafetyAndPrivacyTableService.php +++ b/app/Services/Cartables/SafetyAndPrivacyTableService.php @@ -61,25 +61,61 @@ class SafetyAndPrivacyTableService ); $countryTotalSum = 0; - $activities[]["name_fa"] = 'کشوری'; - $activities[]["province_id"] = -1; + $countryData = [ + 'name_fa' => 'کشوری', + 'province_id' => -1, + '89' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + '90' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + '91' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + ]; foreach ($country as $key => $value) { $countryTotalSum += $value->qty; - $activities[][$value->info_id][$value->step] = $value->qty; - $activities[]["sum"] = $countryTotalSum; + $countryData[$value->info_id][$value->step] = $value->qty; + $countryData["sum"] = $countryTotalSum; } + $activities[] = $countryData; $provinces = DB::select( "SELECT province_id, province_fa, COUNT(*) as qty,info_id, step, step_fa, info_fa FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' GROUP BY info_id,step,province_id,province_fa" ); $provinceTotalSum = 0; + $provinceData = [ + '89' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + '90' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + '91' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + ]; foreach ($provinces as $key => $value) { $provinceTotalSum += $value->qty; - $activities[][$value->info_id][$value->step] = $value->qty; - $activities[]["sum"] = $provinceTotalSum; - $activities[]["province_fa"] = $value->province_fa; - $activities[]["province_id"] = $value->province_id; + $provinceData[$value->info_id][$value->step] = $value->qty; + $provinceData["sum"] = $provinceTotalSum; + $provinceData["province_fa"] = $value->province_fa; + $provinceData["province_id"] = $value->province_id; + $activities[] = $provinceData; } return [ @@ -101,25 +137,61 @@ class SafetyAndPrivacyTableService '); $provinceTotalSum = 0; - $activities[]["name_fa"] = 'استانی'; - $activities[]["edare_shahri_id"] = -1; + $provinceData = [ + 'name_fa' => 'استانی', + 'edare_shahri_id' => -1, + '89' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + '90' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + '91' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + ]; foreach ($province as $key => $value) { $provinceTotalSum += $value->qty; - $activities[]["info-".$value->info_id]["step-".$value->step] = $value->qty; - $activities[]["sum"] = $provinceTotalSum; + $provinceData["info-".$value->info_id]["step-".$value->step] = $value->qty; + $provinceData["sum"] = $provinceTotalSum; } + $activities[] = $provinceData; $cities = DB::select(' SELECT edare_shahri_id, COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step,edare_shahri_id '); $cityTotalSum = 0; + $cityData = [ + '89' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + '90' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + '91' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + ]; foreach ($cities as $key => $value) { $cityTotalSum += $value->qty; - $activities[][$value->info_id][$value->step] = $value->qty; - $activities[]["name_fa"] = \App\Models\EdarateShahri::query()->find($value->edare_shahri_id)->name_fa; - $activities[]["edare_shahri_id"] = $value->edare_shahri_id; - $activities[]["sum"] = $cityTotalSum; + $cityData[$value->info_id][$value->step] = $value->qty; + $cityData["name_fa"] = \App\Models\EdarateShahri::query()->find($value->edare_shahri_id)->name_fa; + $cityData["edare_shahri_id"] = $value->edare_shahri_id; + $cityData["sum"] = $cityTotalSum; + $activities[] = $cityData; } return [ From 9f08804454cc61bf106adb21a39cf5bb5b7235ee Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 3 Mar 2025 15:38:06 +0330 Subject: [PATCH 08/11] debug the report tables --- app/Enums/AxisTypes.php | 26 +++++ .../CountryActivityReport.php | 16 +++ .../ProvinceActivityReport.php | 21 +++- .../SafetyAndPrivacyReportController.php | 2 +- .../Dashboard/SafetyAndPrivacyController.php | 3 + .../FirstStepStoreRequest.php | 1 + app/Models/AxisType.php | 13 +++ app/Models/SafetyAndPrivacy.php | 9 +- .../SafetyAndPrivacyTableService.php | 97 ++++++++----------- database/factories/AxisTypeFactory.php | 23 +++++ ...5_03_03_152632_create_axis_types_table.php | 28 ++++++ ...add_column_to_safety_and_privacy_table.php | 30 ++++++ database/seeders/AxisTypeSeeder.php | 17 ++++ routes/v3.php | 1 + 14 files changed, 229 insertions(+), 58 deletions(-) create mode 100644 app/Enums/AxisTypes.php create mode 100644 app/Models/AxisType.php create mode 100644 database/factories/AxisTypeFactory.php create mode 100644 database/migrations/2025_03_03_152632_create_axis_types_table.php create mode 100644 database/migrations/2025_03_03_152816_add_column_to_safety_and_privacy_table.php create mode 100644 database/seeders/AxisTypeSeeder.php diff --git a/app/Enums/AxisTypes.php b/app/Enums/AxisTypes.php new file mode 100644 index 00000000..ae9ac691 --- /dev/null +++ b/app/Enums/AxisTypes.php @@ -0,0 +1,26 @@ + 'آزادراه', + 2 => 'بزرگراه', + 3 => 'اصلی', + 4 => 'فرعی', + 5 => 'روستایی', + ]; + + return $mapArray[$state]; + } +} \ No newline at end of file diff --git a/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php b/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php index 99a9fb7d..b8c6b0e7 100644 --- a/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php +++ b/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php @@ -19,6 +19,22 @@ class CountryActivityReport implements FromView, WithEvents, ShouldAutoSize, Wit public function view(): View { $data = $this->data; + $existedProvinces = array_keys($data['activities']); + + foreach (\App\Models\Province::all() as $value) { + $provinceId = $value->id; + + if (!array_key_exists($provinceId, $existedProvinces)) { + $data['activities'][] = [ + 'province_id' => $provinceId, + 'name_fa' => $value->name_fa, + 'sum' => 0, + '89' => ['1' => 0, '2' => 0, '3' => 0], + '90' => ['1' => 0, '2' => 0, '3' => 0], + '91' => ['1' => 0, '2' => 0, '3' => 0], + ]; + } + } return view('v3.Reports.SafetyAndPrivacy.CountryActivityReport', [ 'data' => $data['activities'], diff --git a/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php b/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php index c5ffa6ab..78fe8ace 100644 --- a/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php +++ b/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php @@ -2,8 +2,10 @@ namespace App\Exports\V3\SafetyAndPrivacy; +use App\Models\EdarateShahri; use Illuminate\Contracts\View\View; use Illuminate\Database\Eloquent\Collection; +use Illuminate\Http\Request; use Maatwebsite\Excel\Concerns\FromView; use Maatwebsite\Excel\Concerns\ShouldAutoSize; use Maatwebsite\Excel\Concerns\WithDrawings; @@ -14,11 +16,28 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; class ProvinceActivityReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private array $data){} + public function __construct(private array $data, Request $request){} public function view(): View { $data = $this->data; + $existedCities = array_keys($data['activities']); + $edarat = EdarateShahri::query()->where('province_id', '=', $this->request->province_id)->get(['id', 'name_fa']); + + foreach ($edarat as $value) { + $edareId = $value->id; + + if (!array_key_exists($edareId, $existedCities)) { + $data['activities'][] = [ + 'edare_shahri_id' => $edareId, + 'name_fa' => $value->name_fa, + 'sum' => 0, + '89' => ['1' => 0, '2' => 0, '3' => 0], + '90' => ['1' => 0, '2' => 0, '3' => 0], + '91' => ['1' => 0, '2' => 0, '3' => 0], + ]; + } + } return view('v3.Reports.SafetyAndPrivacy.ProvinceActivityReport', [ 'data' => $data['activities'], diff --git a/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php index 0b0b5a84..cc3d5673 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php @@ -47,6 +47,6 @@ class SafetyAndPrivacyReportController extends Controller { $data = $safetyAndPrivacyTableService->provinceActivity($request); $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - return Excel::download(new ProvinceActivityReport($data), $name); + return Excel::download(new ProvinceActivityReport($data, $request), $name); } } diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php index f1562b5d..a36842d3 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\V3\Dashboard; +use App\Enums\AxisTypes; use App\Exports\V3\SafetyAndPrivacy\CartableReport; use App\Facades\File\FileFacade; use App\Http\Controllers\Controller; @@ -73,6 +74,8 @@ class SafetyAndPrivacyController extends Controller 'edare_shahri_id' => $user->edarate_shahri_id, 'edare_shahri_name' => $user->edarate_shahri_name, 'way_id' => $nominatimService->get_way_id_from_nominatim($coordinates[0], $coordinates[1]), + 'axis_type_id' => $request->axis_type_id, + 'axis_type_name' => AxisTypes::name($request->axis_type_id), 'step' => 1, 'step_fa' => 'گام اول (شناسایی)' ]); diff --git a/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php b/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php index a307f87e..b7b7cf82 100644 --- a/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php +++ b/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php @@ -27,6 +27,7 @@ class FirstStepStoreRequest extends FormRequest 'activity_date' => 'required|date_format:Y-m-d', 'activity_time' => 'required|date_format:H:i', 'recognize_picture' => 'required|image', + 'axis_type_id' => 'required|integer|exists:axis_types,id', ]; } diff --git a/app/Models/AxisType.php b/app/Models/AxisType.php new file mode 100644 index 00000000..59fbeec1 --- /dev/null +++ b/app/Models/AxisType.php @@ -0,0 +1,13 @@ + [ - '1' => 0, - '2' => 0, - '3' => 0, - ], - '90' => [ - '1' => 0, - '2' => 0, - '3' => 0, - ], - '91' => [ - '1' => 0, - '2' => 0, - '3' => 0, - ], - ]; - foreach ($provinces as $key => $value) { - $provinceTotalSum += $value->qty; - $provinceData[$value->info_id][$value->step] = $value->qty; - $provinceData["sum"] = $provinceTotalSum; - $provinceData["province_fa"] = $value->province_fa; - $provinceData["province_id"] = $value->province_id; - $activities[] = $provinceData; + foreach ($provinces as $value) { + $provinceId = $value->province_id; + + // Check if the province already exists in the activities array + if (!isset($activities[$provinceId])) { + $activities[$provinceId] = (object) [ + 'province_id' => $provinceId, + 'name_fa' => $value->province_fa, + 'sum' => 0, + '89' => ['1' => 0, '2' => 0, '3' => 0], + '90' => ['1' => 0, '2' => 0, '3' => 0], + '91' => ['1' => 0, '2' => 0, '3' => 0], + ]; + } + + $activities[$provinceId]->{$value->info_id}[$value->step] = $value->qty; + $activities[$provinceId]->sum += $value->qty; } + $activities = array_values($activities); + return [ 'activities' => $activities, 'fromDate' => $fromDate, @@ -133,7 +127,7 @@ class SafetyAndPrivacyTableService $activities = []; $province = DB::select(' - SELECT COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step + SELECT COUNT(*) as qty,info_id, step FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step '); $provinceTotalSum = 0; @@ -158,42 +152,35 @@ class SafetyAndPrivacyTableService ]; foreach ($province as $key => $value) { $provinceTotalSum += $value->qty; - $provinceData["info-".$value->info_id]["step-".$value->step] = $value->qty; + $provinceData[$value->info_id][$value->step] = $value->qty; $provinceData["sum"] = $provinceTotalSum; } $activities[] = $provinceData; $cities = DB::select(' - SELECT edare_shahri_id, COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step,edare_shahri_id + SELECT edare_shahri_id, COUNT(*) as qty,info_id, step FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step,edare_shahri_id '); - $cityTotalSum = 0; - $cityData = [ - '89' => [ - '1' => 0, - '2' => 0, - '3' => 0, - ], - '90' => [ - '1' => 0, - '2' => 0, - '3' => 0, - ], - '91' => [ - '1' => 0, - '2' => 0, - '3' => 0, - ], - ]; - foreach ($cities as $key => $value) { - $cityTotalSum += $value->qty; - $cityData[$value->info_id][$value->step] = $value->qty; - $cityData["name_fa"] = \App\Models\EdarateShahri::query()->find($value->edare_shahri_id)->name_fa; - $cityData["edare_shahri_id"] = $value->edare_shahri_id; - $cityData["sum"] = $cityTotalSum; - $activities[] = $cityData; + foreach ($cities as $value) { + $cityId = $value->edare_shahri_id; + + // Initialize data for each unique city + if (!isset($activities[$cityId])) { + $activities[$cityId] = (object) [ + 'edare_shahri_id' => $cityId, + 'name_fa' => \App\Models\EdarateShahri::query()->find($cityId)->name_fa, + 'sum' => 0, + '89' => ['1' => 0, '2' => 0, '3' => 0], + '90' => ['1' => 0, '2' => 0, '3' => 0], + '91' => ['1' => 0, '2' => 0, '3' => 0], + ]; + } + $activities[$cityId]->{$value->info_id}[$value->step] = $value->qty; + $activities[$cityId]->sum += $value->qty; } + $activities = array_values($activities); + return [ 'activities' => $activities, 'fromDate' => $fromDate, diff --git a/database/factories/AxisTypeFactory.php b/database/factories/AxisTypeFactory.php new file mode 100644 index 00000000..78b69bdf --- /dev/null +++ b/database/factories/AxisTypeFactory.php @@ -0,0 +1,23 @@ + + */ +class AxisTypeFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/migrations/2025_03_03_152632_create_axis_types_table.php b/database/migrations/2025_03_03_152632_create_axis_types_table.php new file mode 100644 index 00000000..ec264207 --- /dev/null +++ b/database/migrations/2025_03_03_152632_create_axis_types_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('axis_types'); + } +}; diff --git a/database/migrations/2025_03_03_152816_add_column_to_safety_and_privacy_table.php b/database/migrations/2025_03_03_152816_add_column_to_safety_and_privacy_table.php new file mode 100644 index 00000000..f591eba1 --- /dev/null +++ b/database/migrations/2025_03_03_152816_add_column_to_safety_and_privacy_table.php @@ -0,0 +1,30 @@ +foreignId('axis_type_id')->nullable()->constrained('axis_types'); + $table->string('axis_type_name')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('safety_and_privacy', function (Blueprint $table) { + $table->dropForeign('axis_type_id'); + $table->dropColumn('axis_type_name'); + }); + } +}; diff --git a/database/seeders/AxisTypeSeeder.php b/database/seeders/AxisTypeSeeder.php new file mode 100644 index 00000000..f8ae72bc --- /dev/null +++ b/database/seeders/AxisTypeSeeder.php @@ -0,0 +1,17 @@ +controller(SafetyAndPrivacyController::class) ->group(function () { Route::get('/', 'index')->name('index')->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province|show-safety-and-privacy-operator-cartable-edarate-shahri'); + Route::get('/excel_report', 'excelReport')->name('excelReport')->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province|show-safety-and-privacy-operator-cartable-edarate-shahri'); Route::post('/first_step_store', 'firstStepStore')->name('firstStepStore')->middleware('permission:add-safety-and-privacy'); Route::post('/second_step_store/{safetyAndPrivacy}', 'secondStepStore')->name('secondStepStore')->middleware('permission:add-safety-and-privacy'); Route::post('/third_step_store/{safetyAndPrivacy}', 'thirdStepStore')->name('thirdStepStore')->middleware('permission:add-safety-and-privacy'); From 1e933d83843435c1904891c09bbff534449a80cf Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 4 Mar 2025 11:10:35 +0330 Subject: [PATCH 09/11] debug the return types --- .../CountryActivityReport.php | 2 +- .../ProvinceActivityReport.php | 4 +- .../SafetyAndPrivacyTableService.php | 84 +++++++++++++++---- .../CountryActivityReport.blade.php | 22 ++--- .../ProvinceActivityReport.blade.php | 42 +++------- 5 files changed, 94 insertions(+), 60 deletions(-) diff --git a/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php b/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php index b8c6b0e7..b6e6ccb2 100644 --- a/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php +++ b/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php @@ -25,7 +25,7 @@ class CountryActivityReport implements FromView, WithEvents, ShouldAutoSize, Wit $provinceId = $value->id; if (!array_key_exists($provinceId, $existedProvinces)) { - $data['activities'][] = [ + $data['activities'][] = (object) [ 'province_id' => $provinceId, 'name_fa' => $value->name_fa, 'sum' => 0, diff --git a/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php b/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php index 78fe8ace..399b5bca 100644 --- a/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php +++ b/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php @@ -16,7 +16,7 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; class ProvinceActivityReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private array $data, Request $request){} + public function __construct(private array $data, public Request $request){} public function view(): View { @@ -28,7 +28,7 @@ class ProvinceActivityReport implements FromView, WithEvents, ShouldAutoSize, Wi $edareId = $value->id; if (!array_key_exists($edareId, $existedCities)) { - $data['activities'][] = [ + $data['activities'][] = (object) [ 'edare_shahri_id' => $edareId, 'name_fa' => $value->name_fa, 'sum' => 0, diff --git a/app/Services/Cartables/SafetyAndPrivacyTableService.php b/app/Services/Cartables/SafetyAndPrivacyTableService.php index d635dbe5..e7c9a85d 100644 --- a/app/Services/Cartables/SafetyAndPrivacyTableService.php +++ b/app/Services/Cartables/SafetyAndPrivacyTableService.php @@ -19,8 +19,8 @@ class SafetyAndPrivacyTableService $fields = ['id','lat','lon','province_id','province_fa','city_id','city_fa','edare_shahri_id','edare_shahri_name', 'recognize_picture','action_picture','operator_id','operator_name','way_id','created_at','updated_at','step', - 'info_id','info_fa','activity_date_time', 'action_picture_document_upload_date', - 'step_fa' + 'info_id','info_fa','activity_date_time', 'action_picture_document_upload_date', 'judiciary_document_upload_date', + 'step_fa', 'axis_type_id', 'axis_type_name' ]; if ($user->hasPermissionTo('show-safety-and-privacy-operator-cartable')) { @@ -53,17 +53,30 @@ class SafetyAndPrivacyTableService { $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(); + $axisTypeId = $request->axis_type_id; $activities = []; - $country = DB::select( - "SELECT COUNT(*) as qty,info_id, step FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' GROUP BY info_id,step" - ); + $country = SafetyAndPrivacy::query() + ->selectRaw('COUNT(*) as qty,info_id, step') + ->whereBetween('created_at', [$fromDate, $toDate]) + ->when($axisTypeId, function ($query) use ($axisTypeId) { + $query->where('axis_type_id', '=', $axisTypeId); + }) + ->groupBy('info_id', 'step') + ->get(); + +// $country = DB::select( +// "SELECT COUNT(*) as qty,info_id, step +// FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' +// GROUP BY info_id,step" +// ); $countryTotalSum = 0; $countryData = [ 'name_fa' => 'کشوری', 'province_id' => -1, + 'sum' => 0, '89' => [ '1' => 0, '2' => 0, @@ -85,11 +98,22 @@ class SafetyAndPrivacyTableService $countryData[$value->info_id][$value->step] = $value->qty; $countryData["sum"] = $countryTotalSum; } - $activities[] = $countryData; + $activities[] = (object) $countryData; - $provinces = DB::select( - "SELECT province_id, province_fa, COUNT(*) as qty,info_id, step FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' GROUP BY info_id,step,province_id,province_fa" - ); + $provinces = SafetyAndPrivacy::query() + ->selectRaw('province_id, province_fa, COUNT(*) as qty,info_id, step') + ->whereBetween('created_at', [$fromDate, $toDate]) + ->when($axisTypeId, function ($query) use ($axisTypeId) { + $query->where('axis_type_id', '=', $axisTypeId); + }) + ->groupBy('info_id', 'step', 'province_id', 'province_fa') + ->get(); + +// $provinces = DB::select( +// "SELECT province_id, province_fa, COUNT(*) as qty,info_id, step +// FROM safety_and_privacy where created_at BETWEEN '".$fromDate."' and '".$toDate."' +// GROUP BY info_id,step,province_id,province_fa" +// ); foreach ($provinces as $value) { $provinceId = $value->province_id; @@ -124,16 +148,30 @@ class SafetyAndPrivacyTableService $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(); $provinceId = $request->province_id; + $axisTypeId = $request->axis_type_id; $activities = []; - $province = DB::select(' - SELECT COUNT(*) as qty,info_id, step FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step - '); + $province = SafetyAndPrivacy::query() + ->selectRaw('COUNT(*) as qty,info_id, step') + ->where('province_id', '=', $provinceId) + ->whereBetween('created_at', [$fromDate, $toDate]) + ->when($axisTypeId, function ($query) use ($axisTypeId) { + $query->where('axis_type_id', '=', $axisTypeId); + }) + ->groupBy('info_id', 'step') + ->get(); + +// $province = DB::select(' +// SELECT COUNT(*) as qty,info_id, step +// FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" +// GROUP BY info_id,step +// '); $provinceTotalSum = 0; $provinceData = [ 'name_fa' => 'استانی', 'edare_shahri_id' => -1, + 'sum' => 0, '89' => [ '1' => 0, '2' => 0, @@ -152,14 +190,26 @@ class SafetyAndPrivacyTableService ]; foreach ($province as $key => $value) { $provinceTotalSum += $value->qty; - $provinceData[$value->info_id][$value->step] = $value->qty; $provinceData["sum"] = $provinceTotalSum; + $provinceData[$value->info_id][$value->step] = $value->qty; } - $activities[] = $provinceData; + $activities[] = (object) $provinceData; - $cities = DB::select(' - SELECT edare_shahri_id, COUNT(*) as qty,info_id, step FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step,edare_shahri_id - '); + $cities = SafetyAndPrivacy::query() + ->selectRaw('edare_shahri_id, COUNT(*) as qty,info_id, step') + ->where('province_id', '=', $provinceId) + ->whereBetween('created_at', [$fromDate, $toDate]) + ->when($axisTypeId, function ($query) use ($axisTypeId) { + $query->where('axis_type_id', '=', $axisTypeId); + }) + ->groupBy('info_id', 'step', 'edare_shahri_id') + ->get(); + +// $cities = DB::select(' +// SELECT edare_shahri_id, COUNT(*) as qty,info_id, step +// FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" +// GROUP BY info_id,step,edare_shahri_id +// '); foreach ($cities as $value) { $cityId = $value->edare_shahri_id; diff --git a/resources/views/v3/Reports/SafetyAndPrivacy/CountryActivityReport.blade.php b/resources/views/v3/Reports/SafetyAndPrivacy/CountryActivityReport.blade.php index cdd69930..f7c5bd53 100644 --- a/resources/views/v3/Reports/SafetyAndPrivacy/CountryActivityReport.blade.php +++ b/resources/views/v3/Reports/SafetyAndPrivacy/CountryActivityReport.blade.php @@ -88,17 +88,17 @@ @foreach ($data as $item) - {{ $item['name_fa'] }} - {{ $item['sum'] }} - {{ $item[89][1] }} - {{ $item[89][2] }} - {{ $item[89][3] }} - {{ $item[90][1] }} - {{ $item[90][2] }} - {{ $item[90][3] }} - {{ $item[91][1] }} - {{ $item[91][2] }} - {{ $item[91][3] }} + {{ $item->name_fa }} + {{ $item->sum }} + {{ $item->{'89'}[1] }} + {{ $item->{'89'}[2] }} + {{ $item->{'89'}[3] }} + {{ $item->{'90'}[1] }} + {{ $item->{'90'}[2] }} + {{ $item->{'90'}[3] }} + {{ $item->{'91'}[1] }} + {{ $item->{'91'}[2] }} + {{ $item->{'91'}[3] }} @endforeach diff --git a/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php b/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php index 7faf68c3..6d45aca0 100644 --- a/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php +++ b/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php @@ -86,35 +86,19 @@ @foreach ($data as $item) - @if ($item['is_province'] == '1') - - {{ $item['name_fa'] }} - {{ $item['sum'] }} - {{ $item[89][1] }} - {{ $item[89][2] }} - {{ $item[89][3] }} - {{ $item[90][1] }} - {{ $item[90][2] }} - {{ $item[90][3] }} - {{ $item[91][1] }} - {{ $item[91][2] }} - {{ $item[91][3] }} - - @else - - {{ $item['name_fa'] }} - {{ $item['sum'] }} - {{ $item[89][1] }} - {{ $item[89][2] }} - {{ $item[89][3] }} - {{ $item[90][1] }} - {{ $item[90][2] }} - {{ $item[90][3] }} - {{ $item[91][1] }} - {{ $item[91][2] }} - {{ $item[91][3] }} - - @endif + + {{ $item['name_fa'] }} + {{ $item['sum'] }} + {{ $item->{'89'}[1] }} + {{ $item->{'89'}[2] }} + {{ $item->{'89'}[3] }} + {{ $item->{'90'}[1] }} + {{ $item->{'90'}[2] }} + {{ $item->{'90'}[3] }} + {{ $item->{'91'}[1] }} + {{ $item->{'91'}[2] }} + {{ $item->{'91'}[3] }} + @endforeach From e8fd051e47a2c2940bfb5e4b736e51d69569baa5 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 4 Mar 2025 11:41:23 +0330 Subject: [PATCH 10/11] add routes --- .../ProvinceActivityReport.blade.php | 4 ++-- routes/v3.php | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php b/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php index 6d45aca0..7e156b78 100644 --- a/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php +++ b/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php @@ -87,8 +87,8 @@ @foreach ($data as $item) - {{ $item['name_fa'] }} - {{ $item['sum'] }} + {{ $item->name_fa }} + {{ $item->sum }} {{ $item->{'89'}[1] }} {{ $item->{'89'}[2] }} {{ $item->{'89'}[3] }} diff --git a/routes/v3.php b/routes/v3.php index 221e4867..75b34a64 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -346,3 +346,17 @@ Route::prefix('safety_and_privacy_report') Route::get('/country_excel_activity', 'countryExcelActivity')->name('countryExcelActivity'); Route::get('/province_excel_activity', 'provinceExcelActivity')->name('provinceExcelActivity'); }); + +Route::prefix('otp') + ->name('otp.') + ->controller(OtpManagementController::class) + ->group(function () { + Route::get('/get_token', 'getOtpToken')->name('getOtpToken'); + }); + +Route::name('items.') + ->controller(ItemsManagementController::class) + ->group(function () { + Route::get('/items', 'getItems')->name('list'); + Route::get('/sub_items/{item}', 'getSubItems')->name('subItems'); + }); From df8873882785425a41b73dec1362a836c8b537e2 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 4 Mar 2025 14:25:32 +0330 Subject: [PATCH 11/11] add namespace to v3 route --- .../Controllers/V3/Dashboard/ItemsManagementController.php | 2 +- .../Controllers/V3/Dashboard/RoadObservationController.php | 4 +++- routes/v3.php | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/ItemsManagementController.php b/app/Http/Controllers/V3/Dashboard/ItemsManagementController.php index ab52266b..dcdf0094 100644 --- a/app/Http/Controllers/V3/Dashboard/ItemsManagementController.php +++ b/app/Http/Controllers/V3/Dashboard/ItemsManagementController.php @@ -22,7 +22,7 @@ class ItemsManagementController extends Controller ); } - public function getSubItems(InfoItem $item): JsonResponse + public function getSubItems($item): JsonResponse { return $this->successResponse( InfoItem::query() diff --git a/app/Http/Controllers/V3/Dashboard/RoadObservationController.php b/app/Http/Controllers/V3/Dashboard/RoadObservationController.php index 6cb292b6..a3b97c4c 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadObservationController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadObservationController.php @@ -254,7 +254,9 @@ class RoadObservationController extends Controller { $data = RoadObservationHistory::query() ->where('id', '=', $roadObserved->id) - ->where('action', '=', 'refer')->get([ + ->where('action', '=', 'refer') + ->orderBy('created_at', 'desc') + ->get([ 'created_at', 'description', 'from_edareh', 'to_edareh', 'from_province', 'to_province', 'user_id' ]); diff --git a/routes/v3.php b/routes/v3.php index 75b34a64..43cc8367 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -6,8 +6,10 @@ use App\Http\Controllers\V3\DamageManagementController; use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshController; use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshSampleController; use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshTypeController; +use App\Http\Controllers\V3\Dashboard\ItemsManagementController; use App\Http\Controllers\V3\Dashboard\ObservedItemController; use App\Http\Controllers\V3\Dashboard\AccidentReceiptController; +use App\Http\Controllers\V3\Dashboard\OtpManagementController; use App\Http\Controllers\V3\Dashboard\Reports\AccidentReceiptReportController; use App\Http\Controllers\V3\Dashboard\Reports\RoadItemsReportController; use App\Http\Controllers\V3\Dashboard\Reports\RoadPatrolReportController; @@ -351,7 +353,7 @@ Route::prefix('otp') ->name('otp.') ->controller(OtpManagementController::class) ->group(function () { - Route::get('/get_token', 'getOtpToken')->name('getOtpToken'); + Route::post('/get_token', 'getOtpToken')->name('getOtpToken'); }); Route::name('items.')