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/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/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php b/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php new file mode 100644 index 00000000..b6e6ccb2 --- /dev/null +++ b/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php @@ -0,0 +1,78 @@ +data; + $existedProvinces = array_keys($data['activities']); + + foreach (\App\Models\Province::all() as $value) { + $provinceId = $value->id; + + if (!array_key_exists($provinceId, $existedProvinces)) { + $data['activities'][] = (object) [ + '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'], + '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..399b5bca --- /dev/null +++ b/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php @@ -0,0 +1,81 @@ +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'][] = (object) [ + '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'], + '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/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/Reports/SafetyAndPrivacyReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php new file mode 100644 index 00000000..cc3d5673 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php @@ -0,0 +1,52 @@ +countryActivity($request); + 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([ + 'activities' => $data['activities'], + 'edarateShahri' => EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']), + ]); + } + + 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, $request), $name); + } +} 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/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php new file mode 100644 index 00000000..a36842d3 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -0,0 +1,189 @@ +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 ($user->edarate_ostani_id || is_null($user->city_id)) { + return $this->errorResponse('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!'); + } + + if (is_null($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, $user) + { + $safety_and_privacy = SafetyAndPrivacy::query()->create([ + 'lat' => $coordinates[0], + 'lon' => $coordinates[1], + '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' => $user->city_id, + 'city_fa' => $user->city_fa, + 'activity_date_time' => $request->activity_date." ".$request->activity_time, + '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' => 'گام اول (شناسایی)' + ]); + + $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(SafetyAndPrivacy $safetyAndPrivacy, SecondStepStoreRequest $request): JsonResponse + { + $user = auth()->user(); + + if ($user->edarate_ostani_id || is_null($user->city_id)) { + return $this->errorResponse('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!'); + } + + if (is_null($user->edarate_shahri_id)) { + return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); + } + + DB::transaction(function () use ($request, $safetyAndPrivacy, $user) + { + $judiciary_document = []; + foreach ($request->judiciary_document as $index => $file) { + $judiciary_document[] = FileFacade::save($file, "safety_and_privacy/{$safetyAndPrivacy->id}/judiciary_document"); + } + $safetyAndPrivacy->update([ + 'judiciary_document' => serialize($judiciary_document), + 'judiciary_document_upload_date' => now(), + 'step' => 2, + 'step_fa' => 'گام دوم (مستندات قضایی)' + ]); + + $user->addActivityComplete(1135); + }); + + return $this->successResponse(); + } + + public function thirdStepStore(SafetyAndPrivacy $safetyAndPrivacy, ThirdStepStoreRequest $request): JsonResponse + { + $user = auth()->user(); + + if ($user->edarate_ostani_id || is_null($user->city_id)) { + return $this->errorResponse('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!'); + } + + if (is_null($user->edarate_shahri_id)) { + return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); + } + + DB::transaction(function () use ($request, $safetyAndPrivacy, $user) { + $safetyAndPrivacy->update([ + 'step' => 3, + 'step_fa' => 'گام سوم (برخورد)', + 'action_picture' => FileFacade::save($request->action_picture, "safety_and_privacy/{$safetyAndPrivacy->id}/action_picture"), + 'action_picture_document_upload_date' => now(), + ]); + + $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(); + } + + public function deserialize(SafetyAndPrivacy $safetyAndPrivacy): JsonResponse + { + $judiciaries = $safetyAndPrivacy->judiciary_document ? unserialize($safetyAndPrivacy->judiciary_document) : []; + + $result = []; + + foreach ($judiciaries as $judiciary) { + $result[] = Storage::disk('public')->url($judiciary); + } + + return $this->successResponse($result); + } + + public function subItems(): 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/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php b/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php new file mode 100644 index 00000000..b7b7cf82 --- /dev/null +++ b/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php @@ -0,0 +1,41 @@ +|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', + 'axis_type_id' => 'required|integer|exists:axis_types,id', + ]; + } + + 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/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 @@ + $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/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..e7c9a85d --- /dev/null +++ b/app/Services/Cartables/SafetyAndPrivacyTableService.php @@ -0,0 +1,240 @@ +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', + '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')) { + $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: ['*'] + ); + } + + 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(); + $axisTypeId = $request->axis_type_id; + + $activities = []; + + $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, + '3' => 0, + ], + '90' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + '91' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + ]; + foreach ($country as $key => $value) { + $countryTotalSum += $value->qty; + $countryData[$value->info_id][$value->step] = $value->qty; + $countryData["sum"] = $countryTotalSum; + } + $activities[] = (object) $countryData; + + $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; + + // 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, + '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; + $axisTypeId = $request->axis_type_id; + $activities = []; + + $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, + '3' => 0, + ], + '90' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + '91' => [ + '1' => 0, + '2' => 0, + '3' => 0, + ], + ]; + foreach ($province as $key => $value) { + $provinceTotalSum += $value->qty; + $provinceData["sum"] = $provinceTotalSum; + $provinceData[$value->info_id][$value->step] = $value->qty; + } + $activities[] = (object) $provinceData; + + $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; + + // 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, + 'toDate' => $toDate, + ]; + } +} 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 @@ + + + + + + + + فعالیت های نگهداری حریم راه + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @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') : '-' }}
+ + 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..f7c5bd53 --- /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->{'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] }}
+ + 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..7e156b78 --- /dev/null +++ b/resources/views/v3/Reports/SafetyAndPrivacy/ProvinceActivityReport.blade.php @@ -0,0 +1,106 @@ + + + + + + + + استانی + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @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->{'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] }}
+ + diff --git a/routes/v3.php b/routes/v3.php index 3b8b1a9a..43cc8367 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -6,14 +6,18 @@ 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; +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; +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; @@ -23,7 +27,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); @@ -319,3 +323,42 @@ 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('/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'); + 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'); + Route::get('/deserialize/{safetyAndPrivacy}', 'deserialize')->name('deserialize'); + }); + +Route::prefix('safety_and_privacy_report') + ->name('SafetyAndPrivacyReport.') + ->controller(SafetyAndPrivacyReportController::class) + ->group(function () { + 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'); + }); + +Route::prefix('otp') + ->name('otp.') + ->controller(OtpManagementController::class) + ->group(function () { + Route::post('/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'); + });