diff --git a/app/Exports/V3/RoadObservation/ComplaintsReport.php b/app/Exports/V3/RoadObservation/ComplaintsReport.php new file mode 100644 index 00000000..e8012634 --- /dev/null +++ b/app/Exports/V3/RoadObservation/ComplaintsReport.php @@ -0,0 +1,67 @@ + $this->data, + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + $event->sheet->getDelegate()->getStyle('A:U')->getFont()->setName('Arial'); + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setHorizontal(Alignment::HORIZONTAL_CENTER); + + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setVertical(Alignment::VERTICAL_CENTER); + } + ]; + } + + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('q1'); + return [$drawing, $drawing2]; + } +} diff --git a/app/Exports/V3/RoadObservation/OperatorCartableReport.php b/app/Exports/V3/RoadObservation/OperatorCartableReport.php new file mode 100644 index 00000000..6285c700 --- /dev/null +++ b/app/Exports/V3/RoadObservation/OperatorCartableReport.php @@ -0,0 +1,70 @@ + $this->data, + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + $event->sheet->getDelegate()->getStyle('A:U')->getFont()->setName('Arial'); + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setHorizontal(Alignment::HORIZONTAL_CENTER); + + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setVertical(Alignment::VERTICAL_CENTER); + } + ]; + } + + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('K1'); + return [$drawing, $drawing2]; + } + +} diff --git a/app/Exports/V3/RoadObservation/SupervisorCartableReport.php b/app/Exports/V3/RoadObservation/SupervisorCartableReport.php new file mode 100644 index 00000000..4aa2b072 --- /dev/null +++ b/app/Exports/V3/RoadObservation/SupervisorCartableReport.php @@ -0,0 +1,69 @@ +data; + + return view('v3.Reports.RoadObservation.SupervisorCartableReport', [ + 'data' => $this->data, + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + $event->sheet->getDelegate()->getStyle('A:U')->getFont()->setName('Arial'); + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setHorizontal(Alignment::HORIZONTAL_CENTER); + + $event->sheet->getDelegate()->getStyle('A:U') + ->getAlignment() + ->setVertical(Alignment::VERTICAL_CENTER); + } + ]; + } + + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('K1'); + return [$drawing, $drawing2]; + } +} diff --git a/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php b/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php index 530b4add..5368e931 100644 --- a/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php +++ b/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php @@ -156,7 +156,7 @@ class AccidentReceiptController extends Controller FileFacade::delete($accident->police_file, true); } - if (!$request->report_base) { + if (!$request->report_base && $request->has('police_file')) { FileFacade::delete($accident->police_file, true); $accidentData['police_file'] = FileFacade::save($request->file('police_file'), "receipts_files/{$accident->id}/"); } diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadObservationReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadObservationReportController.php new file mode 100644 index 00000000..eb20abf8 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadObservationReportController.php @@ -0,0 +1,28 @@ +reportIndex($request); + return response()->json($data['data']); + } + + public function excelReport(Request $request, RoadObservationTableService $roadObservationTableService): BinaryFileResponse + { + $name = 'گزارش رسیدگی به شکایات واکنش سریع ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; + $data = $roadObservationTableService->reportIndex($request); + return Excel::download(new ReportComplaintsExport($data), $name); + } +} diff --git a/app/Http/Controllers/V3/Dashboard/RoadObservationController.php b/app/Http/Controllers/V3/Dashboard/RoadObservationController.php new file mode 100644 index 00000000..c8a52bdc --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/RoadObservationController.php @@ -0,0 +1,223 @@ +json($roadObservationTableService->supervisorCartableIndex($request)); + } + + public function verifyBySupervisor(VerifyBySupervisorRequest $request, RoadObserved $roadObserved): JsonResponse + { + $statusFa = $request->verify == 1 ? 'تایید شده' : 'عدم تایید'; + + $roadObserved->update([ + 'status' => $request->verify, + 'status_fa' => $statusFa, + 'supervisor_id' => auth()->user()->id, + 'supervisor_name' => auth()->user()->name, + 'supervisor_description' => $request->description, + 'supervising_time' => now(), + ]); + + auth()->user()->addActivityComplete(1138); + + return $this->successResponse(); + } + + public function supervisorCartableReport(Request $request, RoadObservationTableService $roadObservationTableService): BinaryFileResponse + { + $name = 'گزارش از کارتابل ارزیابی واکنش سریع '. verta()->now()->format('Y-m-d H:i') . '.xlsx'; + $data = $roadObservationTableService->supervisorCartableIndex($request); + + return Excel::download(new SupervisorCartableReport($data['data']), $name); + } + + public function operatorIndex(Request $request, RoadObservationTableService $roadObservationTableService): JsonResponse + { + return response()->json($roadObservationTableService->operatorCartableIndex($request)); + } + + public function operatorCartableReport(Request $request, RoadObservationTableService $roadObservationTableService): BinaryFileResponse + { + $name = 'گزارش از کارتابل عملیات واکنش سریع ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; + $data = $roadObservationTableService->operatorCartableIndex($request); + return Excel::download(new OperatorCartableReport($data['data']), $name); + } + + public function complaintsIndex(Request $request, RoadObservationTableService $roadObservationTableService): JsonResponse + { + return response()->json($roadObservationTableService->complaintsIndex($request)); + } + + public function complaintsReport(Request $request, RoadObservationTableService $roadObservationTableService): BinaryFileResponse + { + $name = 'گزارش از رسیدگی به شکایات واکنش سریع ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; + $data = $roadObservationTableService->complaintsIndex($request); + return Excel::download(new ComplaintsReport($data['data']), $name); + } + + public function register(Request $request, RoadObserved $roadObserved, NikarayanService $nikarayanService): JsonResponse + { + $roadObservedData = [ + 'status' => 0, + 'status_fa' => 'در حال بررسی', + 'rms_status' => $request->rms_status ?? $roadObserved->rms_status, + 'rms_description' => $request->description?? $roadObserved->rms_description, + ]; + + $roadObservedHistoryData = [ + 'user_id' => auth()->user()->id, + 'previous_rms_status' => $roadObserved->rms_status, + 'previous_rms_start_latlng' => $roadObserved->rms_start_latlng, + 'previous_rms_end_latlng' => $roadObserved->rms_end_latlng, + 'previous_rms_description' => $roadObserved->rms_description, + 'new_files' => [] + ]; + + if ($request->rms_status == 1) { + + $files_path = []; + + $roadObserved->files()->where('path', 'like', '%_image_before%')->delete(); + $roadObserved->files()->where('path', 'like', '%_image_after%')->delete(); + + $image_before = FileFacade::save($request->image_before, "road_observeds/{$roadObserved->id}/"); + $image_after = FileFacade::save($request->image_after, "road_observeds/{$roadObserved->id}/"); + + $files_path[0]['path'] = $image_before; + $files_path[1]['path'] = $image_after; + + $files = json_encode($files_path); + $now_date_time = Carbon::now(); + + $roadObservedData['image_before'] = $image_before; + $roadObservedData['image_after'] = $image_after; + $roadObservedData['rms_start_latlng'] = explode(',', $request->start_point); + $roadObservedData['updated_at_fa'] = Verta::instance($now_date_time); + $roadObservedData['rms_last_activity_fa'] = Verta::instance($now_date_time); + $roadObservedData['rms_last_activity'] = $now_date_time; + $roadObservedHistoryData['new_files'] = $files; + } + + $roadObserved->problemHistories()->create($roadObservedHistoryData); + $roadObserved->update($roadObservedData); + + auth()->user()->addActivityComplete(1142); + + try { + $nikarayanService->updateRoadObservedInfoByNikarayan($request, $roadObserved, json_encode($roadObservedHistoryData['new_files'])); + } + catch (SoapFault $e) { + + $msg = "error in send to nikarayan at" . date("Y-m-d H:i:s") . "\n"; + $msg .= $e->getMessage(); + Sms::sendSms(env('RMS_CTO_PHONE_NUMBER'), $msg); + } + + return $this->successResponse(); + } + + public function refer(ReferRequest $request, RoadObserved $roadObserved): JsonResponse + { + RoadObservationHistory::query()->create([ + 'id' => $roadObserved->id, + 'user_id' => auth()->user()->id, + 'action' => 'refer', + 'description' => $request->refer_description, + 'from_edareh' => $roadObserved->edarate_shahri_id, + 'to_edareh' => $request->edarate_shahri_id, + 'from_province' => $roadObserved->province_id, + 'to_province' => $request->province_id + ]); + + $roadObserved->update([ + 'edarate_shahri_id' => $request->edarate_shahri_id, + 'province_id' => $request->province_id, + ]); + + auth()->user()->addActivityComplete(1037); + + return $this->successResponse(); + } + + public function referList(RoadObserved $roadObserved): JsonResponse + { + $referList = []; + $data = RoadObservationHistory::query() + ->where('road_observation_histories.id', $roadObserved->id) + ->where('action', '=', 'refer')->get(); + + foreach ($data as $key => $value) { + $referList[$key]['from_edareh'] = EdarateShahri::query()->find($value->from_edareh)->name_fa; + $referList[$key]['to_edareh'] = EdarateShahri::query()->find($value->to_edareh)->name_fa; + $referList[$key]['from_province'] = Province::query()->find($value->from_province)->name_fa; + $referList[$key]['to_province'] = Province::query()->find($value->to_province)->name_fa; + $user = User::query()->find($value->user_id); + $referList[$key]['user'] = $user->first_name . ' ' . $user->last_name; + } + return $this->successResponse($referList); + } + + public function restore(RestoreRequest $request, RoadObserved $roadObserved): JsonResponse + { + if ($roadObserved->image_before) { + FileFacade::delete($roadObserved->image_before); + } + + if ($roadObserved->image_after) { + FileFacade::delete($roadObserved->image_after); + } + + $roadObserved->update([ + 'image_before' => null, + 'image_after' => null, + 'rms_last_activity' => null, + 'rms_last_activity_fa' => null, + 'updated_at_fa' => null, + 'updated_at' => null, + 'rms_status' => 0, + 'status' => null, + 'status_fa' => null, + ]); + + RoadObservationHistory::query()->create([ + 'id' => $roadObserved->id, + 'user_id' => auth()->user()->id, + 'action' => 'restore', + 'description' => $request->restore_description, + ]); + + auth()->user()->addActivityComplete(1141); + + return $this->successResponse(); + } +} diff --git a/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php b/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php index 3b50bdf5..3160896d 100644 --- a/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php +++ b/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php @@ -35,11 +35,11 @@ class UpdateRequest extends FormRequest 'accident_date' => 'required|date', 'accident_time' => 'required|string', 'report_base' => 'required|in:0,1', - 'police_file' => 'required_if:report_base,0|file|mimes:pdf,jpg,jpeg,png', + 'police_file' => 'file|mimes:pdf,jpg,jpeg,png', 'police_serial' => 'required_if:report_base,0|string', 'police_file_date' => 'required_if:report_base,0|date', - 'damage_picture1' => 'required|file|mimes:pdf,jpg,jpeg,png', - 'damage_picture2' => 'required|file|mimes:pdf,jpg,jpeg,png', + 'damage_picture1' => 'file|mimes:pdf,jpg,jpeg,png', + 'damage_picture2' => 'file|mimes:pdf,jpg,jpeg,png', 'damage_items' => 'required|array', 'damage_items.*.value' => 'required', 'damage_items.*.amount' => 'required', diff --git a/app/Http/Requests/V3/RoadObservation/ReferRequest.php b/app/Http/Requests/V3/RoadObservation/ReferRequest.php new file mode 100644 index 00000000..33e2bc83 --- /dev/null +++ b/app/Http/Requests/V3/RoadObservation/ReferRequest.php @@ -0,0 +1,30 @@ +roadObserved->rms_status == 0; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'edarate_shahri_id' => 'required|exists:edarate_shahri,id', + 'province_id' => 'required|exists:provinces,id', + 'refer_description' => 'required|string', + ]; + } +} diff --git a/app/Http/Requests/V3/RoadObservation/RestoreRequest.php b/app/Http/Requests/V3/RoadObservation/RestoreRequest.php new file mode 100644 index 00000000..651de88a --- /dev/null +++ b/app/Http/Requests/V3/RoadObservation/RestoreRequest.php @@ -0,0 +1,28 @@ +|string> + */ + public function rules(): array + { + return [ + 'restore_description' => 'required|string', + ]; + } +} diff --git a/app/Http/Requests/V3/RoadObservation/VerifyBySupervisorRequest.php b/app/Http/Requests/V3/RoadObservation/VerifyBySupervisorRequest.php new file mode 100644 index 00000000..db1450cd --- /dev/null +++ b/app/Http/Requests/V3/RoadObservation/VerifyBySupervisorRequest.php @@ -0,0 +1,30 @@ +roadObserved); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + {return [ + 'verify' => ['required', 'in:1,2'], + 'description' => ['string'], + ]; + } +} diff --git a/app/Models/RoadObserved.php b/app/Models/RoadObserved.php index 54fd8c29..60131fd0 100644 --- a/app/Models/RoadObserved.php +++ b/app/Models/RoadObserved.php @@ -2,8 +2,10 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Storage; class RoadObserved extends Model { @@ -99,4 +101,18 @@ class RoadObserved extends Model { return $this->belongsTo('App\Models\EdarateShahri', 'edarate_shahri_id'); } + + protected function imageAfter(): Attribute + { + return Attribute::make( + get: fn($value) => $value == null ? null : Storage::disk('public')->url($value) + ); + } + + protected function imageBefore(): Attribute + { + return Attribute::make( + get: fn($value) => $value == null ? null : Storage::disk('public')->url($value) + ); + } } diff --git a/app/Services/Cartables/RoadItemTableService.php b/app/Services/Cartables/RoadItemTableService.php index c0a929fd..0b64e741 100644 --- a/app/Services/Cartables/RoadItemTableService.php +++ b/app/Services/Cartables/RoadItemTableService.php @@ -21,7 +21,7 @@ class RoadItemTableService if ($user->hasPermissionTo('show-road-item-supervise-cartable')) { $query = RoadItemsProject::query() - ->select(['id', 'province_fa', 'edarat_name', 'item_fa', 'sub_item_fa', 'sub_item_data', 'unit_fa', 'start_lat', 'start_lng', + ->select(['id', 'province_fa', 'edarat_name', 'item', 'item_fa', 'sub_item', 'sub_item_fa', 'sub_item_data', 'unit_fa', 'start_lat', 'start_lng', 'end_lat', 'end_lng', 'activity_date_time', 'created_at', 'status_fa', 'status']) ->where('is_new', 1) ->when($loadRelations, fn ($query) => $query->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])); @@ -31,7 +31,7 @@ class RoadItemTableService return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); } $query = RoadItemsProject::query() - ->select(['id', 'province_fa', 'edarat_name', 'item_fa', 'sub_item_fa', 'sub_item_data', 'unit_fa', 'start_lat', 'start_lng', + ->select(['id', 'province_fa', 'edarat_name', 'item', 'item_fa', 'sub_item', 'sub_item_fa', 'sub_item_data', 'unit_fa', 'start_lat', 'start_lng', 'end_lat', 'end_lng', 'activity_date_time', 'created_at', 'status_fa', 'status']) ->where('is_new', 1) ->where('province_id', auth()->user()->province_id) @@ -53,7 +53,7 @@ class RoadItemTableService $allowedSortings = ['*']; $query = RoadItemsProject::query() - ->select(['id', 'supervisor_description', 'item_fa', 'sub_item_fa', 'sub_item_data', 'unit_fa', 'start_lat', 'start_lng', + ->select(['id', 'supervisor_description', 'item', 'item_fa', 'sub_item', 'sub_item_fa', 'sub_item_data', 'unit_fa', 'start_lat', 'start_lng', 'end_lat', 'end_lng', 'activity_date_time', 'created_at', 'status_fa', 'status']) ->where('is_new', 1) ->where('user_id', auth()->user()->id) diff --git a/app/Services/Cartables/RoadObservationTableService.php b/app/Services/Cartables/RoadObservationTableService.php new file mode 100644 index 00000000..504ea8e6 --- /dev/null +++ b/app/Services/Cartables/RoadObservationTableService.php @@ -0,0 +1,179 @@ +user(); + + $fields = [ + 'fk_RegisteredEventMessage', 'road_observeds.id', 'Title', 'road_observeds.created_at', + 'lat', 'lng', 'FeatureTypeTitle', 'Description', 'MobileForSendEventSms', + 'rms_description', 'rms_status', 'rms_last_activity_fa', 'rms_last_activity', + 'road_observeds.province_id', 'province_fa', 'city_id', 'city_fa', 'edarate_shahri.name_fa', + 'status', 'status_fa', 'supervisor_description', 'supervising_time', 'image_after', 'image_before' + ]; + + + if ($user->hasPermissionTo('show-fast-react')) { + $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') + ->whereNotNull('road_observeds.status') + ->select($fields); + } + elseif ($user->hasPermissionTo('show-fast-react-province')) + { + if (is_null($user->province_id)) + { + return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); + } + + $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') + ->where('road_observeds.province_id', $user->province_id) + ->whereNotNull('road_observeds.status') + ->select($fields); + } + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*']); + } + + public function operatorCartableIndex(Request $request) + { + $user = auth()->user(); + + if (is_null($user->edarate_shahri_id)) { + return $this->errorResponse('اداره‌ای برای شما در سامانه ثبت نشده است!'); + } + + $fields = [ + 'fk_RegisteredEventMessage', 'road_observeds.id', 'Title', 'road_observeds.created_at', + 'lat', 'lng', 'FeatureTypeTitle', 'Description', 'MobileForSendEventSms', + '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', + 'edarate_shahri.name_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time' + ]; + + $query = RoadObserved::query() + ->where('rms_status', '<>', 0) + ->whereNotNull('road_observeds.province_id') + ->whereNotNull('status') + ->leftJoin('edarate_shahri', 'road_observeds.edarate_shahri_id', '=', 'edarate_shahri.id') + ->where('edarate_shahri_id', $user->edarate_shahri_id) + ->select($fields); + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*']); + } + + public function complaintsIndex(Request $request) + { + $user = auth()->user(); + + 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, + status_fa, supervisor_description, rms_description, province_fa, city_id, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng' + ); + } + elseif ($user->hasPermissionTo('show-fast-react-province')) { + + if (is_null($user->province_id)) { + return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); + } + + $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') + ->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, + status_fa, supervisor_description, rms_description, province_fa, city_id, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng' + ); + + } + elseif ($user->hasPermissionTo('show-fast-react-edarate-shahri')) { + + if (is_null($user->edarate_shahri_id)) { + return $this->errorResponse('اداره ای برای شما در سامانه ثبت نشده است!'); + } + + $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') + ->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, + status_fa, supervisor_description, rms_description, province_fa, city_id, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng' + ); + + } + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'] + ); + } + + public function reportIndex(Request $request) + { + $fromDate = $request->from_date . ' 00:00:00'; + $toDate = $request->date_to . ' 23:59:59'; + + $fields = [ + 'fk_RegisteredEventMessage', + 'road_observeds.id', + 'Title', + 'road_observeds.created_at', + 'lat', + 'lng', + 'FeatureTypeTitle', + 'Description', + 'MobileForSendEventSms', + 'road_observeds.province_id', + 'province_fa', + 'city_fa', + 'edarate_shahri.name_fa', + 'rms_last_activity_fa', + 'rms_description' + ]; + + $query = RoadObserved::leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') + ->where('rms_status', "<>", 0) + ->whereNotNull('edarate_shahri_id') + ->whereBetween('road_observeds.created_at', [$fromDate, $toDate]) + ->select($fields); + + $data = DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'] + ); + + return [ + 'data' => $data, + 'fromDate' => $fromDate, + 'toDate' => $toDate, + ]; + } +} \ No newline at end of file diff --git a/app/Services/Cartables/RoadPatrolTableService.php b/app/Services/Cartables/RoadPatrolTableService.php index c6f38395..d43a45d7 100644 --- a/app/Services/Cartables/RoadPatrolTableService.php +++ b/app/Services/Cartables/RoadPatrolTableService.php @@ -21,7 +21,7 @@ class RoadPatrolTableService $query = RoadPatrol::query() ->select([ 'province_fa', 'province_id', 'id', 'edare_id', 'edare_name', 'start_time', 'end_time', 'created_at', 'description', - 'distance', 'vehicle_runtime', 'fuel_consumption', 'stop_points,' + 'distance', 'vehicle_runtime', 'fuel_consumption', 'stop_points' ]) ->when($loadRelations, fn ($query) => $query->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])); } @@ -32,7 +32,7 @@ class RoadPatrolTableService $query = RoadPatrol::query() ->select([ 'province_fa', 'province_id', 'id', 'edare_id', 'edare_name', 'start_time', 'end_time', 'created_at', 'description', - 'distance', 'vehicle_runtime', 'fuel_consumption', 'stop_points,' + 'distance', 'vehicle_runtime', 'fuel_consumption', 'stop_points' ]) ->where('province_id', '=', $user->province_id) ->when($loadRelations, fn ($query) => $query->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])); @@ -55,7 +55,7 @@ class RoadPatrolTableService $query = RoadPatrol::query() ->select([ 'province_fa', 'province_id', 'id', 'edare_id', 'edare_name', 'start_time', 'end_time', 'created_at', 'description', - 'distance', 'vehicle_runtime', 'fuel_consumption', 'stop_points,' + 'distance', 'vehicle_runtime', 'fuel_consumption', 'stop_points' ]) ->where('operator_id', '=', auth()->user()->id) ->when($loadRelations, fn ($query) => $query->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number'])); diff --git a/database/migrations/2025_02_25_114351_add_column_to_road_observation_histories_table.php b/database/migrations/2025_02_25_114351_add_column_to_road_observation_histories_table.php new file mode 100644 index 00000000..9e0037c8 --- /dev/null +++ b/database/migrations/2025_02_25_114351_add_column_to_road_observation_histories_table.php @@ -0,0 +1,30 @@ +string('from_province')->nullable(); + $table->string('to_province')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('road_observation_histories', function (Blueprint $table) { + $table->dropColumn('from_province'); + $table->dropColumn('to_province'); + }); + } +}; diff --git a/resources/views/v3/Reports/RoadObservation/ComplaintsReport.blade.php b/resources/views/v3/Reports/RoadObservation/ComplaintsReport.blade.php new file mode 100644 index 00000000..e2d061ba --- /dev/null +++ b/resources/views/v3/Reports/RoadObservation/ComplaintsReport.blade.php @@ -0,0 +1,93 @@ + + + + + + + + گزارش واکنش سریع + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @foreach ($data as $item) + + + + + + + + + + + + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش رسیدگی به شکایات واکنش سریع +
کد + سوانح + استان + + ادارات شهری + + موضوع گزارش + + نوع گزارش + توضیح گزارش + موقعیت مکانی + شماره تماس گیرنده + تاریخ ثبت گزارش
{{ $item['fk_RegisteredEventMessage'] ?? '-' }}{{ $item['province_fa'] ?? '-' }}{{ $item['edarate_shahri_name_fa'] ?? '-' }}{{ $item['Title'] ?? '-' }}{{ $item['FeatureTypeTitle'] ?? '-' }}{{ $item['Description'] ?? '-' }}{{ isset($item['lat']) && isset($item['lng']) ? $item['lat'] . ' ' . $item['lng'] : '-' }}{{ $item['MobileForSendEventSms'] ?? '-' }}{{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }}
+ + diff --git a/resources/views/v3/Reports/RoadObservation/OpratorCartableReport.blade.php b/resources/views/v3/Reports/RoadObservation/OpratorCartableReport.blade.php new file mode 100644 index 00000000..e15d1d53 --- /dev/null +++ b/resources/views/v3/Reports/RoadObservation/OpratorCartableReport.blade.php @@ -0,0 +1,75 @@ + + + + + + + + گزارش واکنش سریع + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @foreach ($data as $item) + + + + + + + + + + + + + + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش کارتابل عملیات واکنش سریع +
کد یکتاکد سوانحاستانادارات شهریموضوع گزارشنوع گزارششماره تماس گیرندهوضعیتتاریخ اقدامتوضیحاتتوضیحات کارشناس
{{ $item['id'] ?? '-' }}{{ $item['fk_RegisteredEventMessage'] ?? '-' }}{{ $item['province_fa'] ?? '-' }}{{ $item['edarate_shahri_name_fa'] ?? '-' }}{{ $item['Title'] ?? '-' }}{{ $item['FeatureTypeTitle'] ?? '-' }}{{ $item['MobileForSendEventSms'] ?? '-' }}{{ $item['status_fa'] ?? '-' }}{{ $item['rms_last_activity_fa'] ?? '-' }}{{ $item['rms_description'] ?? '-' }}{{ $item['supervisor_description'] ?? '-' }}
+ + + diff --git a/resources/views/v3/Reports/RoadObservation/SupervisorCartableReport.blade.php b/resources/views/v3/Reports/RoadObservation/SupervisorCartableReport.blade.php new file mode 100644 index 00000000..2ebaab38 --- /dev/null +++ b/resources/views/v3/Reports/RoadObservation/SupervisorCartableReport.blade.php @@ -0,0 +1,76 @@ + + + + + + + + گزارش واکنش سریع + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @foreach ($data as $item) + + + + + + + + + + + + + + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش کارتابل ارزیابی واکنش سریع + +
کد یکتاکد پیگیریاستانادارات شهریموضوع گزارشنوع گزارششماره تماس گیرندهوضعیتتاریخ اقدامتوضیحاتتوضیحات کارشناس
{{ $item['id'] ?? '-' }}{{ $item['fk_RegisteredEventMessage'] ?? '-' }}{{ $item['province_fa'] ?? '-' }}{{ $item['edarate_shahri_name_fa'] ?? '-' }}{{ $item['Title'] ?? '-' }}{{ $item['FeatureTypeTitle'] ?? '-' }}{{ $item['MobileForSendEventSms'] ?? '-' }}{{ $item['status_fa'] ?? '-' }}{{ $item['rms_last_activity_fa'] ?? '-' }}{{ $item['rms_description'] ?? '-' }}{{ $item['supervisor_description'] ?? '-' }}
+ + + diff --git a/routes/v3.php b/routes/v3.php index 7c68023c..f4e235f0 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -12,6 +12,7 @@ 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\RoadItemsProjectController; +use App\Http\Controllers\V3\Dashboard\RoadObservationController; use App\Http\Controllers\V3\Dashboard\RoadPatrolProjectController; use App\Http\Controllers\V3\FMSVehicleManagementController; use App\Http\Controllers\V3\Harim\DivarkeshiController; @@ -275,3 +276,34 @@ Route::prefix('receipt_reports') Route::get('/country_excel_report', 'countryExcelReport')->name('countryExcelReport'); Route::get('/province_excel_report', 'provinceExcelReport')->name('provinceExcelReport'); }); + +Route::prefix('road_observations') + ->name('roadObservations.') + ->controller(RoadObservationController::class) + ->group(function () { + Route::get('/supervisor_index', 'supervisorIndex')->name('supervisorIndex')->middleware('permission:show-fast-react-province|show-fast-react'); + Route::post('/verify/{road_observed}', 'verifyBySupervisor')->name('verifyBySupervisor'); + Route::get('/supervisor_report', 'supervisorCartableReport')->name('supervisorCartableReport')->middleware('permission:show-fast-react-province|show-fast-react'); + Route::get('/operator_index','operatorIndex')->name('operatorIndex')->middleware('permission:show-fast-react-edarate-shahri'); + Route::get('/operator_report','operatorCartableReport')->name('operatorCartableReport')->middleware('permission:show-fast-react-edarate-shahri'); + Route::get('/complaints_index', 'complaintsIndex') + ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') + ->name('complaintsIndex'); + Route::post('/register/{roadObserved}', 'register') + ->middleware('permission:show-fast-react-edarate-shahri') + ->name('register'); + Route::post('/refer/{roadObserved}', 'refer') + ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') + ->name('refer'); + + Route::get('/refer_list/{roadObserved}', 'referList') + ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') + ->name('referList'); + + Route::post('/restore/{roadObserved}', 'restore') + ->middleware('permission:restore-fast-react') + ->name('restore'); + + Route::get('/complaints_report', 'complaintsReport')->name('complaintsReport') + ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react'); + });