diff --git a/.env.example b/.env.example index 87bbe2f7..ebfd2389 100644 --- a/.env.example +++ b/.env.example @@ -65,4 +65,8 @@ CMMS_MACHINE_INFO_VIEW_NAME= FMS_VEHICLE_ACTIVITY_URL= FMS_VEHICLE_ACTIVITY_PASSWORD= -FMS_VEHICLE_ACTIVITY_USERNAME= \ No newline at end of file +FMS_VEHICLE_ACTIVITY_USERNAME= + +FMS_ERROR_RATE_URL= +FMS_ERROR_RATE_PASSWORD= +FMS_ERROR_RATE_USERNAME= \ No newline at end of file diff --git a/app/Console/Commands/ExtractGeometryForCities.php b/app/Console/Commands/ExtractGeometryForCities.php new file mode 100644 index 00000000..42108fee --- /dev/null +++ b/app/Console/Commands/ExtractGeometryForCities.php @@ -0,0 +1,131 @@ +argument('jsonPath'); + + $json = File::get($jsonPath); + $data = json_decode($json, true); + + $features = $data['features'] ?? null; + if ($features === null) { + $this->error('No features were found'); + return parent::FAILURE; + } + + foreach ($data['features'] as $city) { + + $cityId = $city['properties']['city_id'] ?? null; + if ($cityId === null) + { + $this->info("this city doesn't have id: $city"); + continue; + } + + $coordinates = $city['geometry']['coordinates'] ?? null; + if ($coordinates === null) + { + $this->info("this city doesn't have coordinates: $coordinates"); + continue; + } + + $type = $city['geometry']['type'] ?? null; + if ($type === null) + { + $this->info("This city doesn't have a type: $city"); + continue; + } + + try { + switch ($type) { + + case 'Polygon': + $wktCoords = collect($coordinates[0]) + ->map(fn($pair) => $pair[1] . ' ' . $pair[0]) + ->implode(','); + $wellKnownText = "POLYGON(($wktCoords))"; + break; + + case 'MultiPolygon': + $wktCoords = collect($coordinates) + ->map(function ($polygon) { + $rings = collect($polygon)->map(function ($ring) { + if ($ring[0] !== end($ring)) { + $ring[] = $ring[0]; + } + return collect($ring) + ->map(fn($pair) => $pair[1] . ' ' . $pair[0]) + ->implode(','); + }); + return '((' . $rings->implode('),(') . '))'; + }) + ->implode(','); + + $wellKnownText = "MULTIPOLYGON($wktCoords)"; + break; + + default: + $this->info("$type is not a valid type in city: $city"); + continue 2; + } + } + catch (\Throwable $th) + { + $this->error("Something went wrong: $th"); + continue; + } + + + + $query = City::query() + ->find($cityId); + + if (!$query) { + $this->info("City $cityId not found"); + continue; + } + + try { + $query->update([ + 'geometry' => DB::raw("ST_GeomFromText('$wellKnownText', 4326)") + ]); + } + catch (\Throwable $th) + { + $this->error("Something went wrong: $th"); + } + + + } + + return parent::SUCCESS; + } +} diff --git a/app/Enums/MissionStates.php b/app/Enums/MissionStates.php index b72a5637..44df6680 100644 --- a/app/Enums/MissionStates.php +++ b/app/Enums/MissionStates.php @@ -10,6 +10,7 @@ enum MissionStates: int case END_MISSION = 4; case REJECT_BY_TRANSPORTATION = 5; case CANCELLED = 6; + case CREATED_NO_PROCESS = 7 ; public static function name(int $state): string { @@ -20,6 +21,7 @@ enum MissionStates: int 4 => 'اتمام ماموریت', 5 => 'عدم تخصیص خودرو توسط واحد نقلیه و بازگشت درخواست به کارتابل کاربر', 6 => 'ماموریت لغو شد', + 7 => 'ماموریت بدون فرایند ثبت شد' ]; return $mapArray[$state]; diff --git a/app/Enums/MissionTypes.php b/app/Enums/MissionTypes.php index e19472cf..356fbd33 100644 --- a/app/Enums/MissionTypes.php +++ b/app/Enums/MissionTypes.php @@ -6,12 +6,14 @@ enum MissionTypes: int { case SAATY= 1; case ROZANE = 2; + case NO_PROCESS = 3; public static function name(int $state): string { $mapArray = [ 1 => 'ساعتی', 2 => 'روزانه', + 3 => 'بدون فرآیند', ]; return $mapArray[$state]; diff --git a/app/Events/V3/Dashboard/Harim/ConfirmGuaranteeLetterNeedEvent.php b/app/Events/V3/Dashboard/Harim/ConfirmGuaranteeLetterNeedEvent.php new file mode 100644 index 00000000..aaa7fc04 --- /dev/null +++ b/app/Events/V3/Dashboard/Harim/ConfirmGuaranteeLetterNeedEvent.php @@ -0,0 +1,16 @@ +successResponse($matchedSearchedMachines); } + + public function carTypes(): Collection + { + return DB::table('cmms_machines') + ->distinct() + ->pluck('car_type'); + } } diff --git a/app/Http/Controllers/V3/Dashboard/Harim/GeneralManagerController.php b/app/Http/Controllers/V3/Dashboard/Harim/GeneralManagerController.php index 04c1ad76..e065acc3 100644 --- a/app/Http/Controllers/V3/Dashboard/Harim/GeneralManagerController.php +++ b/app/Http/Controllers/V3/Dashboard/Harim/GeneralManagerController.php @@ -4,6 +4,11 @@ namespace App\Http\Controllers\V3\Dashboard\Harim; use App\Enums\HarimAction; use App\Enums\HarimStates; +use App\Events\V3\Dashboard\Harim\ConfirmGuaranteeLetterNeedEvent; +use App\Events\V3\Dashboard\Harim\ConfirmNoRoadAccessNeedEvent; +use App\Events\V3\Dashboard\Harim\ConfirmRoadAccessEditNeedEvent; +use App\Events\V3\Dashboard\Harim\ConfirmRoadAccessNeedEvent; +use App\Events\V3\Dashboard\Harim\RejectRequestEvent; use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; use App\Http\Requests\V3\Dashboard\Harim\GeneralManager\ConfirmRoadAccessEditNeedRequest; @@ -23,6 +28,7 @@ use Illuminate\Support\Facades\DB; class GeneralManagerController extends Controller { use ApiResponse; + public function index(Request $request): JsonResponse { $query = Harim::query() @@ -40,8 +46,10 @@ class GeneralManagerController extends Controller public function rejectRequest(RejectRequest $request, Harim $harim): JsonResponse { - DB::transaction(function () use ($request, $harim) { + DB::transaction(function () use ($request, $harim) + { $action = HarimAction::CONFIRM->value; + $harim->histories()->create([ 'expert_id' => auth()->user()->id, 'previous_state_id' => $harim->state_id, @@ -57,14 +65,19 @@ class GeneralManagerController extends Controller 'state_id' => $state, 'state_name' => HarimStates::name($state), ]); + + RejectRequestEvent::dispatch($harim); }); + return $this->successResponse(); } public function referRequest(ReferRequest $request, Harim $harim): JsonResponse { - DB::transaction(function () use ($request, $harim) { + DB::transaction(function () use ($request, $harim) + { $action = HarimAction::REFER->value; + $harim->histories()->create([ 'expert_id'=> auth()->user()->id, 'previous-state_id' => $harim->state_id, @@ -81,13 +94,16 @@ class GeneralManagerController extends Controller 'state_name' => HarimStates::name($state), ]); }); + return $this->successResponse(); } public function referFile(ReferFileRequest $request, Harim $harim): JsonResponse { - DB::transaction(function () use ($request, $harim) { + DB::transaction(function () use ($request, $harim) + { $action = HarimAction::REFER->value; + $harim->histories()->create([ 'expert_id'=> auth()->user()->id, 'previous-state_id' => $harim->state_id, @@ -104,13 +120,16 @@ class GeneralManagerController extends Controller 'state_name' => HarimStates::name($state), ]); }); + return $this->successResponse(); } public function confirmRoadAccessNeed(ConfirmRoadAccessNeedRequest $request, Harim $harim): JsonResponse { - DB::transaction(function () use ($request, $harim) { + DB::transaction(function () use ($request, $harim) + { $action = HarimAction::CONFIRM->value; + $harim->histories()->create([ 'expert_id' => auth()->user()->id, 'previous_state_id' => $harim->state_id, @@ -121,18 +140,24 @@ class GeneralManagerController extends Controller ]); $state = HarimStates::ERSAL_BE_PANJAREH_VAHED_NIAZ_BE_RAH_DASTRASI->value; + $harim->update([ 'state_id' => $state, 'state_name' => HarimStates::name($state), ]); + + ConfirmRoadAccessNeedEvent::dispatch($harim); }); + return $this->successResponse(); } public function confirmNoRoadAccessNeed(ConfirmNoRoadAccessNeedRequest $request, Harim $harim): JsonResponse { - DB::transaction(function () use ($request, $harim) { + DB::transaction(function () use ($request, $harim) + { $action = HarimAction::CONFIRM->value; + $harim->histories()->create([ 'expert_id' => auth()->user()->id, 'previous_state_id' => $harim->state_id, @@ -143,18 +168,25 @@ class GeneralManagerController extends Controller ]); $state = HarimStates::ERSAL_BE_PANJAREH_VAHED_BEDONEH_NIAZ_BE_RAH_DASTRASI->value; + $harim->update([ 'state_id' => $state, 'state_name' => HarimStates::name($state), ]); + + ConfirmNoRoadAccessNeedEvent::dispatch($harim); + }); + return $this->successResponse(); } public function confirmRoadAccessEditNeed(ConfirmRoadAccessEditNeedRequest $request, Harim $harim): JsonResponse { - DB::transaction(function () use ($request, $harim) { + DB::transaction(function () use ($request, $harim) + { $action = HarimAction::CONFIRM->value; + $harim->histories()->create([ 'expert_id' => auth()->user()->id, 'previous_state_id' => $harim->state_id, @@ -165,18 +197,24 @@ class GeneralManagerController extends Controller ]); $state = HarimStates::UPDATE_FILE_BARGOZARE_SHODE->value; + $harim->update([ 'state_id' => $state, 'state_name' => HarimStates::name($state), ]); + + ConfirmRoadAccessEditNeedEvent::dispatch($harim); }); + return $this->successResponse(); } public function confirmGuaranteeLetterNeed(ConfirmGuaranteeLetterNeedRequest $request, Harim $harim): JsonResponse { - DB::transaction(function () use ($request, $harim) { + DB::transaction(function () use ($request, $harim) + { $action = HarimAction::CONFIRM->value; + $harim->histories()->create([ 'expert_id' => auth()->user()->id, 'previous_state_id' => $harim->state_id, @@ -187,16 +225,20 @@ class GeneralManagerController extends Controller ]); $state = HarimStates::ERSAL_ZEMANAT_NAME_TAVASOTE_KARBAR->value; + $harim->update([ 'state_id' => $state, 'state_name' => HarimStates::name($state), ]); + + ConfirmGuaranteeLetterNeedEvent::dispatch($harim); }); + return $this->successResponse(); } + public function show(ShowRequest $request, Harim $harim): JsonResponse { return $this->successResponse($harim->load('histories')); - } } diff --git a/app/Http/Controllers/V3/Dashboard/Harim/HarimOfficeController.php b/app/Http/Controllers/V3/Dashboard/Harim/HarimOfficeController.php index 30bdc2ff..3f5c3587 100644 --- a/app/Http/Controllers/V3/Dashboard/Harim/HarimOfficeController.php +++ b/app/Http/Controllers/V3/Dashboard/Harim/HarimOfficeController.php @@ -86,7 +86,7 @@ class HarimOfficeController extends Controller 'state_id' => $state, 'state_name' => HarimStates::name($state), 'is_possible' => true, - 'need_road_access' => true, + 'need_access_road' => true, ]); }); return $this->successResponse(); @@ -112,7 +112,7 @@ class HarimOfficeController extends Controller 'state_id' => $state, 'state_name' => HarimStates::name($state), 'is_possible' => true, - 'need_road_access' => false, + 'need_access_road' => false, ]); }); return $this->successResponse(); @@ -135,7 +135,7 @@ class HarimOfficeController extends Controller $harim ->update([ 'state_id' => $state, 'state_name' => HarimStates::name($state), - 'is_file_good' => true, + 'access_road_allowed' => true, ]); }); return $this->successResponse(); @@ -158,7 +158,7 @@ class HarimOfficeController extends Controller $harim ->update([ 'state_id' => $state, 'state_name' => HarimStates::name($state), - 'is_file_good' => false, + 'access_road_allowed' => false, ]); }); return $this->successResponse(); diff --git a/app/Http/Controllers/V3/Dashboard/Harim/PanjareVahedController.php b/app/Http/Controllers/V3/Dashboard/Harim/PanjareVahedController.php new file mode 100644 index 00000000..f3272cf5 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Harim/PanjareVahedController.php @@ -0,0 +1,74 @@ +whereRaw("ST_Contains( + geometry, + ST_SRID(ST_GeomFromText('POINT($request->lng $request->lat)'), 4326))" + ) + ->firstOrFail(['id', 'name_fa', 'province_id']); + } + catch (ModelNotFoundException $exception){ + $city = City::query() + ->orderByRaw("ST_Distance( + geometry, + ST_SRID(ST_GeomFromText('POINT($request->lng $request->lat)'), 4326) + ) ASC" + ) + ->first(['id', 'name_fa', 'province_id']); + } + + $state = HarimStates::BARESI_EDARE_SHAHRESTAN->value; + + Harim::query()->create([ + 'state_id' => $state, + 'state_name' => HarimStates::name($state), + 'panjare_vahed_id' => $request->id, + 'national_id' => $request->national_id, + 'phone_number' => $request->phone_number, + 'request_date' => $request->request_date, + 'province_id' => $city->province_id, + 'province_name' => $city->province()->first()->name_fa, + 'city_id' => $city->id, + 'city_name' => $city->name, + 'edareh_shahri_id' => $city->edarateShahri()->first()->id, + 'requested_organization' => $request->organization, + 'plan_group' => $request->plan_group, + 'plan_title' => $request->plan_title, + 'worksheet_id' => $request->worksheet_id, + 'response_options' => json_encode($request->response_options), + 'isic' => $request->isic, + 'primary_area' => $request->primary_area, + ]); + + return $this->successResponse([ + 'city' => $city->edarateShahri()->first()->name_fa, + 'province' => $city->province()->first()->name_fa, + ]); + } + public function getAccessRoad(GetAccessRoadRequest $request, Harim $harim) + { + Harim::update([ + 'panjarevahed_id' => $request->panjarevahed_id, + 'polygon' => $request->polygon, + ]); + return $this->successResponse(); + } +} diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php index 5b44888a..588ea09c 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php @@ -2,9 +2,14 @@ namespace App\Http\Controllers\V3\Dashboard\Mission; +use App\Enums\MissionCategory; use App\Enums\MissionStates; +use App\Enums\MissionTypes; +use App\Enums\MissionZones; +use App\Events\V3\Dashboard\Mission\SendDataToFMSEvent; use App\Http\Controllers\Controller; use App\Http\Requests\V3\Mission\ControlUnit\FinishRequest; +use App\Http\Requests\V3\Mission\ControlUnit\NoProcessRequest; use App\Http\Requests\V3\Mission\ControlUnit\StartRequest; use App\Http\Traits\ApiResponse; use App\Models\Mission; @@ -51,6 +56,7 @@ class ControlUnitController extends Controller ]); $state = MissionStates::END_MISSION->value; + $mission->update([ 'state_id' => $state, 'state_name' => MissionStates::name($state), @@ -58,6 +64,48 @@ class ControlUnitController extends Controller ]); }); + SendDataToFMSEvent::dispatch($mission); + + return $this->successResponse(); + } + + + public function noProcess(NoProcessRequest $request): JsonResponse + { + DB::transaction(function () use ($request) { + $user = auth()->user(); + $zone= $request->zone; + $type= MissionTypes::NO_PROCESS->value; + $state = MissionStates::CREATED_NO_PROCESS->value; + + $mission = Mission::query()->create([ + 'user_id' => $user->id, + 'username' => $user->username, + 'province_id' => $user->province_id, + 'province_name' => $user->province_fa, + 'edare_shahri_id' => $user->edarate_shahri_id ?? null, + 'edare_shahri_name' => $user->edarate_shahri_name ?? null, + 'zone' => $zone, + 'zone_fa' => MissionZones::name($zone), + 'type' => $type, + 'type_fa' => MissionTypes::name($type), + 'start_date' => $request->start_date, + 'end_date' => $request->end_date, + 'end_point' => $request->end_point, + 'area' => json_encode($request->area), + 'category_id' => $request->category_id, + 'category_name' => MissionCategory::name($request->category_id), + 'start_time' => $request->start_date, + 'finish_time' => $request->end_date, + 'state_id' => $state, + 'state_name' => MissionStates::name($state), + ]); + + $mission->rahdaran()->sync($request->rahdaran); + $mission->machines()->attach($request->machines); + $mission->rahdaran()->attach($request->driver, ['is_driver' => true]); + }); + return $this->successResponse(); } } diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index 8e5385da..a7f68b25 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -96,7 +96,6 @@ class RequestPortalController extends Controller 'zone_fa' => MissionZones::name($request->zone), 'start_date' => $request->start_date, 'end_date' => $request->end_date, - 'request_date' => $request->request_date, 'description' => $request->description, 'end_point' => $request->end_point, 'area' => json_encode($request->area), diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReport/AccessRoadActivityController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReport/AccessRoadActivityController.php index f3e4a9cc..0abd41b3 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReport/AccessRoadActivityController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReport/AccessRoadActivityController.php @@ -19,9 +19,7 @@ class AccessRoadActivityController extends Controller use ApiResponse; public function countryActivity(Request $request, OperatorService $operatorService): JsonResponse { - $request->merge(['info_id' => 90]); - - $data = $operatorService->countryActivity($request); + $data = $operatorService->countryActivity(90); return $this->successResponse([ 'activities' => $data, @@ -31,9 +29,11 @@ class AccessRoadActivityController extends Controller public function provinceActivity(Request $request, OperatorService $operatorService): JsonResponse { - $request->merge(['info_id' => 90]); - $data = $operatorService->provinceActivity($request); + $data = $operatorService->provinceActivity( + info_id: 90, + province_id: $request->input('province_id') + ); return $this->successResponse([ 'activities' => $data, @@ -42,14 +42,17 @@ class AccessRoadActivityController extends Controller } public function countryExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse { - $data = $operatorService->countryActivity($request); + $data = $operatorService->countryActivity(90); $name = 'گزارش نگهداری حریم راه برای راه دسترسی غیر مجاز ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; return Excel::download(new ExcelReport($data), $name); } public function provinceExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse { - $data = $operatorService->provinceActivity($request); + $data = $operatorService->provinceActivity( + info_id: 90, + province_id: $request->input('province_id') + ); $name = 'گزارش نگهداری حریم راه برای راه دسترسی غیر مجاز ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; return Excel::download(new AccessRoadReport($data, $request), $name); } diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReport/ConstructionActivityController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReport/ConstructionActivityController.php index 54dbad4b..cef7b562 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReport/ConstructionActivityController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReport/ConstructionActivityController.php @@ -19,20 +19,19 @@ class ConstructionActivityController extends Controller use ApiResponse; public function countryActivity(Request $request, OperatorService $operatorService): JsonResponse { - $request->merge(['info_id' => 89]); - - $data = $operatorService->countryActivity($request); + $data = $operatorService->countryActivity(89); return $this->successResponse([ 'activities' => $data, 'provinces' => Province::all(['id', 'name_fa']), ]); } - public function provinceActivity(Request $request, OperatorService $operatorService): JsonResponse + public function provinceActivity(Request $request, OperatorService $operatorService,): JsonResponse { - $request->merge(['info_id' => 89]); - - $data = $operatorService->provinceActivity($request); + $data = $operatorService->provinceActivity( + info_id: 89, + province_id: $request->input('province_id') + ); return $this->successResponse([ 'activities' => $data, @@ -41,17 +40,20 @@ class ConstructionActivityController extends Controller } public function countryExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse { - $data = $operatorService->countryActivity($request); + $data = $operatorService->countryActivity(89); $name = ' گزارش نگهداری حریم راه برای ساخت و ساز غیر مجاز' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + return Excel::download(new ExcelReport($data), $name); } public function provinceExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse { - $data = $operatorService->provinceActivity($request); + $data = $operatorService->provinceActivity( + info_id: 89, + province_id: $request->input('province_id') + ); $name = ' گزارش نگهداری حریم راه برای ساخت و ساز غیر مجاز' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + return Excel::download(new ConstructionReport($data, $request), $name); } - - } diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReport/UtilityPassingActivityController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReport/UtilityPassingActivityController.php index dd61ed53..d11623aa 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReport/UtilityPassingActivityController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReport/UtilityPassingActivityController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\V3\Dashboard\SafetyAndPrivacy\OperatorReport; use App\Exports\V3\SafetyAndPrivacy\Country\UtilityPassingReport as ExcelReport; use App\Exports\V3\SafetyAndPrivacy\Province\UtilityPassingReport; use App\Http\Controllers\Controller; +use App\Http\Traits\ApiResponse; use App\Models\EdarateShahri; use App\Models\Province; use App\Services\Cartables\SafetyAndPrivacy\OperatorService; @@ -15,11 +16,11 @@ use Symfony\Component\HttpFoundation\BinaryFileResponse; class UtilityPassingActivityController extends Controller { + use ApiResponse; + public function countryActivity(Request $request, OperatorService $operatorService): JsonResponse { - $request->merge(['info_id' => 91]); - - $data = $operatorService->countryActivity($request); + $data = $operatorService->countryActivity(91); return $this->successResponse([ 'activities' => $data, @@ -28,9 +29,10 @@ class UtilityPassingActivityController extends Controller } public function provinceActivity(Request $request, OperatorService $operatorService): JsonResponse { - $request->merge(['info_id' => 91]); - - $data = $operatorService->provinceActivity($request); + $data = $operatorService->provinceActivity( + info_id: 91, + province_id: $request->input('province_id') + ); return $this->successResponse([ 'activities' => $data, @@ -39,16 +41,20 @@ class UtilityPassingActivityController extends Controller } public function countryExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse { - $data = $operatorService->countryActivity($request); + $data = $operatorService->countryActivity(91); + $name = 'گزارش نگهداری حریم راه برای عبور تاسیسات زیربنایی غیر مجاز ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; return Excel::download(new ExcelReport($data), $name); } public function provinceExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse { - $data = $operatorService->provinceActivity($request); + $data = $operatorService->provinceActivity( + info_id: 91, + province_id: $request->input('province_id') + ); $name = 'گزارش نگهداری حریم راه برای عبور تاسیسات زیربنایی غیر مجاز ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + return Excel::download(new UtilityPassingReport($data, $request), $name); } - } diff --git a/app/Http/Controllers/V3/Dashboard/UserManagementController.php b/app/Http/Controllers/V3/Dashboard/UserManagementController.php new file mode 100644 index 00000000..d56b0753 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/UserManagementController.php @@ -0,0 +1,771 @@ +can('full-user-managment') || Auth::user()->can('limited-user-management')) { +// return view('version2.dashboard_pages.user_management.list'); +// } +// +// abort(403); +// } + public function indexUser(Request $request) + { + if (auth()->user()) { + auth()->user()->addActivityComplete(1038); + } + + $province = $request->province ?? null; + $city = $request->city ?? null; + $province_office = $request->province_office ?? null; + + if (Auth::user()->checkUserHasPermission('full-user-management')) { + $users = User::when($province, function ($query, $province) { + return $query->where('province_id', $province); + }) + ->when($city, function ($query, $city) { + return $query->where('city_id', $city); + }) + ->when($province_office, function ($query, $province_office) { + if ($province_office == -1) { + return $query->where('edarate_ostani_id', null)->whereNotNull('edarate_shahri_id'); + } else { + return $query->where('edarate_ostani_id', $province_office); + } + }) + ->with(['roles' => function ($query) { + $query->where('for_report', 1); + }]) + ->get(); + } elseif (Auth::user()->checkUserHasPermission('limited-user-management')) { + $users = User::when($province, function ($query, $province) { + return $query->where('province_id', $province); + }) + ->where('province_id', Auth::user()->province_id) + ->when($city, function ($query, $city) { + return $query->where('city_id', $city); + }) + ->when($province_office, function ($query, $province_office) { + if ($province_office == -1) { + return $query->where('edarate_ostani_id', null)->whereNotNull('edarate_shahri_id'); + } else { + return $query->where('edarate_ostani_id', $province_office); + } + }) + ->with(['roles' => function ($query) { + $query->where('for_report', 1); + }]) + ->get(); + } else { + return response()->json([ + 'message' => 'Forbidden' + ], 403); + } + + return response()->json([ + 'status' => '200', + 'message' => 'success', + 'data' => $users, + ], 200); + } + + public function store(StoreRequest $request): jsonResponse + { + User::query()->create([ + 'username' => $request->username, + 'national_code' => $request->national_code, + 'password' => Hash::make($request->password), + 'province_id' => $request->province_id, + 'edarate_ostani_id' => $request->edarate_ostani_id, + 'city_id' => $request->city_id, + 'edarate_shahri_id' => $request->edarate_shahri_id, + ]); + + $user = new User(); + $user->username = $request->username; + + $user->province_id = $request->province_id == 0 ? null : $request->province_id; + $user->province_fa = ($request->province_id == 0) ? 'ستاد' : Province::find($request->province_id)->name_fa; + + $user->city_id = $request->city_id == 0 ? null : $request->city_id; + $user->city_fa = ($request->city_id == 0) ? null : City::find($request->city_id)->name_fa ; + + if ($request->edarate_ostani_id != 'null') { + $temp = EdarateOstani::find($request->edarate_ostani_id)->name_fa; + $user->edarate_ostani_id = $request->edarate_ostani_id; + $user->edarate_ostani_name = $temp; + if ($request->province_id == 0) { + $user->name = $temp .' '. $user->province_fa; + } else { + $user->name = $temp .' استان '. $user->province_fa; + } + } else { + $temp = EdarateShahri::find($request->edarate_shahri_id)->name_fa; + $user->edarate_shahri_id = $request->edarate_shahri_id; + $user->edarate_shahri_name = $temp; + + if ($request->province_id == 0) { + $user->name = $temp .' '. $user->province_fa; + } else { + $user->name = $temp .' استان '. $user->province_fa; + } + } + + $user->password = Hash::make($request->password); + $user->national_code = $request->national_code; + $user->save(); + + if (auth()->user()) { + auth()->user()->addActivityComplete(1039, $user); + } + + return response()->json([ + 'message' => 'success', + 'data' => $user + ], 200); + } + + public function editRole(Request $request, $id) + { + $request->validate([ + 'role_name' => 'required|string', + 'permissions' => 'required' + ], [ + 'permissions.required' => 'انتخاب دسترسی‌ها الزامی است.', + 'role_name.required' => 'نام نقش الزامی است.' + ]); + + if (auth()->user()) { + auth()->user()->addActivityComplete(1044); + } + $role = Role::find($id); + + + $updateRole = $role->update([ + 'name_fa' => $request->role_name, + 'description' => $request->description + ]); + + $permissions = $request->permissions; + // $permissions = explode(",", $request->permissions); + + $role->syncPermissions($permissions); + + return response()->json([ + 'message' => 'success', + 'data' => $role + ]); + } + + + public function createRole(Request $request) + { + $request->validate([ + 'role_name' => 'required|string', + 'permissions' => 'required' + ], [ + 'permissions.required' => 'انتخاب دسترسی‌ها الزامی است.', + 'role_name.required' => 'نام نقش الزامی است.' + ]); + + if (auth()->user()) { + auth()->user()->addActivityComplete(1043); + } + + $role = Role::create([ + 'name' => time(), + 'name_fa' => $request->role_name, + 'description' => $request->description + ]); + + $permissions = $request->permissions; + + // $permissions = explode(",", $request->permissions); + $role->givePermissionTo($permissions); + + return response()->json([ + 'message' => 'success', + 'data' => $role + ]); + } + + public function show(User $user) + { + $user = User::where('id', $user->id)->with(['roles', 'permissions'])->get(); + return response()->json([ + 'status' => '200', + 'message' => 'success', + 'data' => $user + ], 200); + } + + public function update(UpdateRequest $request, User $user): JsonResponse + { + $user->update([ + 'username' => $request->username, + 'national_code' => $request->national_code, + 'password' => Hash::make($request->password), + 'province_id' => $request->province_id, + 'edarate_ostani_id' => $request->edarate_ostani_id, + 'city_id' => $request->city_id, + 'edarate_shahri_id' => $request->edarate_shahri_id, + ]); + + $user->province_id = $request->province_id == 0 ? null : $request->province_id; + $user->province_fa = ($request->province_id == 0) ? 'ستاد' : Province::find($request->province_id)->name_fa; + + $user->city_id = $request->city_id == 0 ? null : $request->city_id; + $user->city_fa = ($request->city_id == 0) ? null : City::find($request->city_id)->name_fa ; + + if ($request->edarate_ostani_id != "null") { + $temp = EdarateOstani::find($request->edarate_ostani_id)->name_fa; + $user->edarate_ostani_id = $request->edarate_ostani_id; + $user->edarate_ostani_name = $temp; + + $user->edarate_shahri_id = null; + $user->edarate_shahri_name = null; + + if ($request->province_id == 0) { + $user->name = $temp .' '. $user->province_fa; + } else { + $user->name = $temp .' استان '. $user->province_fa; + } + } else { + $temp = EdarateShahri::find($request->edarate_shahri_id)->name_fa; + $user->edarate_shahri_id = $request->edarate_shahri_id; + $user->edarate_shahri_name = $temp; + $user->edarate_ostani_id = null; + $user->edarate_ostani_name = null; + if ($request->province_id == 0) { + $user->name = $temp .' '. $user->province_fa; + } else { + $user->name = $temp .' استان '. $user->province_fa; + } + } + + $user->first_name = $request->first_name; + $user->last_name = $request->last_name; + $user->position = $request->position; + $user->mobile = $request->mobile; + $user->degree = $request->degree; + $user->major = $request->major; + $user->national_code = $request->national_code; + + if (!is_null($request->password)) { + $request->validate([ + 'password' => ['string'] + ]); + $user->password = Hash::make($request->password); + } + + if (! $request->permissions == null) { + $user->syncPermissions(explode(",", $request->permissions)); + } + + $roles = $request->only('roles'); + if (! $roles == null) { + $user->syncRoles($roles); + } + + $user->save(); + + if (auth()->user()) { + auth()->user()->addActivityComplete(1040, $user); + } + + return response()->json([ + 'message' => 'success', + 'data' => $user + ]); + } + + public function activityReport() + { + return view('version2.dashboard_pages.user_management.activity_report'); + } + + public function userActivityLogs() + { + return response()->json([ + 'status' => 'succeed', + 'message' => '', + 'data' => auth()->user()->activityLogs, + ], 200); + } + + public function changeConfirmedStatus(Request $request) + { + $request->validate([ + 'user_ids' => 'required|regex:/^(\d+)(,\d+)*$/', + 'confirm' => 'required|in:0,1' + ]); + + $user_ids = explode(",", $request->user_ids); + + User::whereIn('id', $user_ids)->update([ + 'confirmed' => $request->confirm + ]); + return response()->json([ + 'status' => 'succeed', + ]); + } + + public function changePassword(User $user, Request $request) + { + $validData = $request->validate([ + 'password' => 'required|string|min:8|confirmed', + ]); + $user->password = Hash::make($request->password); + $user->save(); + return response()->json(['message' => "password changed successfully!!!!"], 200); + } + + public function givePermissionsTo(Request $request) + { + $request->validate([ + 'user_ids' => 'required|regex:/^(\d+)(,\d+)*$/', + 'permission_ids' => 'required', + ]); + + $user_ids = explode(",", $request->user_ids); + $permission_ids = $request->permission_ids; + + User::whereIn('id', $user_ids)->get()->each(function ($user) use ($permission_ids) { + $user->syncPermissions($permission_ids); + }); + + return response()->json([ + 'status' => 'succeed', + 'message' => 'permissions assigned to users succussfully.' + ]); + } + + public function destroy(Request $request) + { + $request->validate([ + 'user_ids' => 'required|regex:/^(\d+)(,\d+)*$/', + ]); + + $user_ids = explode(',', $request->user_ids); + + foreach ($user_ids as $id) { + $user = User::find($id); + + if ($user->avatar) { + if (Storage::disk('public')->exists(str_replace('storage/', '', $user->avatar))) { + Storage::disk('public')->delete(str_replace('storage/', '', $user->avatar)); + } + } + + if ($user->photo) { + if (Storage::disk('public')->exists(str_replace('storage/', '', $user->photo))) { + Storage::disk('public')->delete(str_replace('storage/', '', $user->photo)); + } + } + + $user->delete(); + } + + return response()->json([ + 'status' => 200, + 'message' => 'The users deleted succussfully.' + ]); + } + + public function getUserPermissions() + { + $userPermissions = Auth::user()->getUserPermissions(); + + return response()->json([ + 'message' => 'success', + 'data' => $userPermissions + ]); + } + + public function getUserSummaryReport(Request $request, User $user) + { + $request->fromDate = $request->fromDate ? $request->fromDate . " 00:00:00" : Carbon::now()->subDays(30)->format('Y-m-d 00:00:00'); + $request->toDate = $request->toDate ? $request->toDate . " 23:59:59" : Carbon::now()->format('Y-m-d 23:59:59'); + $data = []; + + $ids_list = ''; + $temp_sql_for_activity_time = " + SELECT sum(majmoe) AS activity FROM (SELECT *, + COUNT(cnt) AS majmoe + FROM ( + SELECT *, + COUNT(*) AS cnt + FROM ( + SELECT YEAR (created_at) AS yy, + MONTH (created_at) AS mm, + DAY (created_at) AS dd, + HOUR (created_at) AS hh, + user_id + FROM user_activity_logs + WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$user->id.") + ) user_activity_distinct + GROUP BY yy, + mm, + dd, + hh, + user_id + ) user_activity_by_hour_and_ + GROUP BY user_id) AS calculated_table;"; + + $temp_sql_for_activity_list = " + SELECT *, + COUNT(*) AS cnt + FROM ( + SELECT + description, + log_unique_code + FROM user_activity_logs + WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$user->id.") + ) user_activity_distinct + GROUP BY + log_unique_code + ORDER BY cnt desc"; + + $number_of_active_days = " + SELECT COUNT(*) AS cnt + FROM ( + SELECT mm,dd + FROM user_activity_logs + WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$user->id.") + GROUP BY + mm,dd + ) active_days + ORDER BY cnt desc"; + + + $number_of_activities = " + SELECT COUNT(*) AS cnt + FROM user_activity_logs + WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$user->id.") + ORDER BY cnt desc"; + + $number_of_active_days = (DB::select($number_of_active_days)[0]->cnt ? DB::select($number_of_active_days)[0]->cnt : -1); + $activity_time = DB::select($temp_sql_for_activity_time)[0]->activity; + $number_of_activities = DB::select($number_of_activities)[0]->cnt; + $data = [ + 'number_of_active_days' => $number_of_active_days, + + 'activity_time' => $user->id ? $activity_time : null, + 'average_activity_time' => round(($user->id ? $activity_time : 0) / $number_of_active_days, 2) , + 'number_of_activities' => $number_of_activities , + 'average_activity_number' => round(($user->id ? $number_of_activities : 0) / $number_of_active_days, 2) , + + 'activity_list' => $user->id ? DB::select($temp_sql_for_activity_list) : null, + 'last_login' => $user->last_login, + ]; + return $data; + } + + public function printGroup(User $user, Request $request) + { + $request->fromDate = $request->fromDate ? $request->fromDate . " 00:00:00" : Carbon::now()->format('Y-m-d 00:00:00') ; + $request->toDate = $request->toDate ? $request->toDate . " 23:59:59" : Carbon::now()->format('Y-m-d 23:59:59'); + + $data = []; + + $ids_list = ''; + // $users = $role->users()->select("*")->get()->toArray(); + // foreach ($user as $index => $item) { + $user_activity_quantity_temp[$user->id] = [ + "majmoe" => 0, + "name" => $user->first_name ? $user->first_name." ".$user->last_name." (".$user->username.")" : $user->name." (".$user->username.")", + ]; + + $user_activity_time_temp[$user->id] = [ + "majmoe" => 0, + "name" => $user->first_name ? $user->first_name." ".$user->last_name." (".$user->username.")" : $user->name."(".$user->username.")", + ]; + + $user_activity_top_5_temp[$user->id] = [ + "activity_list" => [], + "name" => $user->first_name ? $user->first_name." ".$user->last_name." (".$user->username.")" : $user->name."(".$user->username.")", + ]; + + + // if (!$index) { + $ids_list = $user->id; + // } else { + // $ids_list .= ",".$item['id']; + // } + // } + $total_activity_time_sql = " + SELECT sum(majmoe) AS activity FROM (SELECT *, + COUNT(quantity) AS majmoe + FROM ( + SELECT user_id, + COUNT(*) AS quantity + + FROM user_activity_logs + WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.") + + GROUP BY yy, + mm, + dd, + hh, + user_id + ) user_activity_by_hour_and_ + GROUP BY user_id) AS calculated_table;"; + + $quantitative_activity_chart_sql = " + SELECT created_at, + COUNT(*) AS quantity + + FROM user_activity_logs + WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.") + GROUP BY + yy, + mm, + dd ;"; + + $hourly_activity_chart_sql = " + SELECT + COUNT(quantity) AS majmoe + FROM ( + SELECT yy, + mm, + dd, + hh, + COUNT(*) AS quantity + FROM user_activity_logs + WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.") + GROUP BY yy, + mm, + dd, + hh, + user_id + ) user_activity_by_hour_and_ + GROUP BY + yy, + mm, + dd;"; + + $total_activity_quantity_sql = " + SELECT COUNT(*) AS total_activity_quantity + FROM user_activity_logs + WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.") + "; + + + $top_10_activity_list_sql = " + SELECT *, + COUNT(*) AS quantity + FROM ( + SELECT + description, + log_unique_code + FROM user_activity_logs + WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.") + ) user_activity_distinct + GROUP BY + log_unique_code + ORDER BY quantity desc + LIMIT 10"; + + + $user_activity_quantity_sql = " + SELECT *, + COUNT(*) AS quantity + FROM ( + SELECT + user_id, + user_first_name, + user_last_name, + user_name, + username + FROM user_activity_logs + WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.") + ) user_activity_distinct + GROUP BY user_id + ORDER BY quantity desc"; + + $active_user_count_sql = " + SELECT COUNT(*) AS active_user_count + FROM( + SELECT + user_id + FROM user_activity_logs + WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.") + GROUP BY user_id + ) grpuped_by_user_id"; + + $user_activity_time_sql = " + select + *, + COUNT(quantity) AS majmoe + FROM ( + SELECT + user_first_name, + user_last_name, + user_name, + username, + user_id, + COUNT(*) AS quantity + FROM user_activity_logs + WHERE created_at between '{$request->fromDate}' and '{$request->toDate}' and user_id IN(".$ids_list.") + GROUP BY yy, + mm, + dd, + hh, + user_id + ) user_activity_by_hour_and_ + GROUP BY user_id + ORDER BY majmoe desc;"; + + foreach (DB::select($user_activity_quantity_sql) as $key => $value) { + $user_activity_quantity_temp[$value->user_id] = [ + "majmoe" => $value->quantity ?? 0, + "name" => $value->user_first_name ? $value->user_first_name." ".$value->user_last_name." (".$value->username.")" : $value->user_name." (".$value->username.")", + ]; + } + + foreach (DB::select($user_activity_time_sql) as $key => $value) { + $user_activity_time_temp[$value->user_id] = [ + "majmoe" => $value->majmoe ?? 0, + "name" => $value->user_first_name ? $value->user_first_name." ".$value->user_last_name." (".$value->username.")" : $value->user_name." (".$value->username.")", + ]; + } + + foreach ($user_activity_top_5_temp as $key => $value) { + $user_activity_top_5_temp_sql = " + SELECT + description, + COUNT(*) AS quantity + FROM user_activity_logs + WHERE user_id = {$key} AND created_at between '{$request->fromDate}' and '{$request->toDate}' + GROUP BY log_unique_code + ORDER BY quantity DESC + LIMIT 5 + "; + + $activity_list = DB::select($user_activity_top_5_temp_sql); + $sum = 0; + foreach ($activity_list as $index => $item) { + $sum += (int) $item->quantity; + } + $user_activity_top_5_temp[$key] = [ + "sum" => $sum, + "name" => $value['name'], + "activity_list" => $activity_list, + ]; + } + arsort($user_activity_top_5_temp); + arsort($user_activity_time_temp); + arsort($user_activity_quantity_temp); + $data = [ + 'fromDate' => $request->fromDate ? $request->fromDate : null, + 'toDate' => $request->toDate ? $request->toDate : null, + 'user_activity_time' => $ids_list ? $user_activity_time_temp : null, + 'hourly_activity_chart' => $ids_list ? DB::select($hourly_activity_chart_sql) : null, + 'quantitative_activity_chart' => $ids_list ? DB::select($quantitative_activity_chart_sql) : null, + 'total_activity_quantity' => $ids_list ? DB::select($total_activity_quantity_sql)[0]->total_activity_quantity : null, + 'total_activity_time' => $ids_list ? DB::select($total_activity_time_sql)[0]->activity : null, + 'top_10_activity_list' => $ids_list ? DB::select($top_10_activity_list_sql) : null, + 'user_activity_quantity' => $ids_list ? $user_activity_quantity_temp : null, + 'group_name' => $user->first_name." ".$user->last_name, + 'average' => round(($ids_list ? DB::select($total_activity_time_sql)[0]->activity : 0) / 1, 2) , + 'user_activity_top_5_temp' => $user_activity_top_5_temp, + 'total_user_count' => 1, + 'active_user_count' => $ids_list ? DB::select($active_user_count_sql)[0]->active_user_count : null, + 'group_id' => $user->id + ]; + + return View('word.user-activity-individual', compact('data')); + } + public function userPermission($id) + { + $user = User::find($id); + return response()->json([ + 'message' => 'success', + 'data' => $user->permissions, + ]); + } + + public function assignPermission(Request $request, User $user) + { + if (auth()->user()) { + auth()->user()->addActivityComplete(1042); + } + $permissions = explode(",", $request->permissions); + if (! $permissions == null) { + $user->syncPermissions($permissions); + } + + return response()->json([ + 'message' => 'status', + 'data' => User::where('id', $user->id)->with(['permissions'])->get() + ]); + } + + public function showAllRoles(Request $request) + { + $roles = Role::where('for_report', 0)->get(); + + return response()->json([ + 'message' => 'success', + 'data' => $roles + ]); + } + + public function deleteRole(Request $request, $id) + { + if (auth()->user()) { + auth()->user()->addActivityComplete(1045); + } + $role = Role::find($id)->delete(); + + return response()->json([ + 'message' => 'success', + 'data' => 1 + ]); + } + + public function changeUserEnabeld(User $user) + { + if (Auth::user()->checkUserHasPermission('full-user-management')) { + $user->enabled = !$user->enabled; + $user->save(); + return response()->json([ + 'message' => 'success' + ], 200); + } elseif (Auth::user()->checkUserHasPermission('limited-user-management') && Auth::user()->province_id == $user->province_id) { + $user->enabled = !$user->enabled; + $user->save(); + return response()->json([ + 'message' => 'success' + ], 200); + } else { + return response()->json([ + 'message' => 'Forbidden' + ], 403); + } + } +} diff --git a/app/Http/Middleware/CheckAxisTypeMiddleware.php b/app/Http/Middleware/CheckAxisTypeMiddleware.php index 6c50a26b..ee4bb37b 100644 --- a/app/Http/Middleware/CheckAxisTypeMiddleware.php +++ b/app/Http/Middleware/CheckAxisTypeMiddleware.php @@ -21,9 +21,9 @@ class CheckAxisTypeMiddleware */ public function handle(Request $request, Closure $next): Response { - $s = $request->route('safetyAndPrivacy'); + $s = $request->safetyAndPrivacy; - if (($s->step == 3 || $s->step == 2) && is_null($s->axis_type_id)) + if (($s->step == 1 || $s->step == 2) && is_null($s->axis_type_id)) { throw new ProhibitedAction('ابتدا نوع محور را مشخص کنید'); } diff --git a/app/Http/Requests/V3/AccidentReceipt/ConfirmPaymentInfoRequest.php b/app/Http/Requests/V3/AccidentReceipt/ConfirmPaymentInfoRequest.php index 0bbed211..fc24bf06 100644 --- a/app/Http/Requests/V3/AccidentReceipt/ConfirmPaymentInfoRequest.php +++ b/app/Http/Requests/V3/AccidentReceipt/ConfirmPaymentInfoRequest.php @@ -13,7 +13,9 @@ class ConfirmPaymentInfoRequest extends FormRequest */ public function authorize(): bool { - return $this->accident->status === AccidentStates::SODOR_NAME_BIME_VA_DAGHI->value; + return in_array($this->accident->status, + [AccidentStates::SODOR_NAME_BIME_VA_DAGHI->value, AccidentStates::SABT_FISH->value] + ); } /** diff --git a/app/Http/Requests/V3/Dashboard/Harim/PanjareVahed/GetAccessRoadRequest.php b/app/Http/Requests/V3/Dashboard/Harim/PanjareVahed/GetAccessRoadRequest.php new file mode 100644 index 00000000..cc9a5dab --- /dev/null +++ b/app/Http/Requests/V3/Dashboard/Harim/PanjareVahed/GetAccessRoadRequest.php @@ -0,0 +1,30 @@ + + */ + public function rules(): array + { + return [ + 'panjarevahed_id'=> 'required|string', + 'polygon' => 'required|string', + ]; + } +} diff --git a/app/Http/Requests/V3/Dashboard/UserManagement/StoreRequest.php b/app/Http/Requests/V3/Dashboard/UserManagement/StoreRequest.php new file mode 100644 index 00000000..522f6107 --- /dev/null +++ b/app/Http/Requests/V3/Dashboard/UserManagement/StoreRequest.php @@ -0,0 +1,35 @@ +|string> + */ + public function rules(): array + { + return [ + 'province_id' => 'required|exists:provinces,id', + 'edarate_ostani_id' => 'exists:edarate_ostanis,id', + 'city_id' => 'exists:cities,id', + 'edarate_shahri_id' => 'exists:edarate_shahris,id', + 'username' => 'required|unique:users,username', + 'national_code' => 'unique:users,national_code', + 'password' => 'required|min:8', + + ]; + } +} diff --git a/app/Http/Requests/V3/Dashboard/UserManagement/UpdateRequest.php b/app/Http/Requests/V3/Dashboard/UserManagement/UpdateRequest.php new file mode 100644 index 00000000..d831991c --- /dev/null +++ b/app/Http/Requests/V3/Dashboard/UserManagement/UpdateRequest.php @@ -0,0 +1,35 @@ +|string> + */ + public function rules(): array + { + return [ + 'province_id' => 'required|exists:provinces,id', + 'edarate_ostani_id' => 'exists:edarate_ostanis,id', + 'city_id' => 'exists:cities,id', + 'edarate_shahri_id' => 'exists:edarate_shahris,id', + 'username' => ['required',Rule::unique('users','username')->ignore($this->user->id)], + 'national_code' =>['required',Rule::unique('users','national_code')->ignore($this->user->id)], + 'password' => 'required|min:8', + ]; + } +} diff --git a/app/Http/Requests/V3/Mission/ControlUnit/NoProcessRequest.php b/app/Http/Requests/V3/Mission/ControlUnit/NoProcessRequest.php new file mode 100644 index 00000000..3b914dc0 --- /dev/null +++ b/app/Http/Requests/V3/Mission/ControlUnit/NoProcessRequest.php @@ -0,0 +1,52 @@ + + */ + public function rules(): array + { + return [ + 'rahdaran' => 'array', + 'rahdaran.*' => 'exists:rahdaran,id', + 'machines' => 'required|array', + 'machines.*' => 'required|integer|exists:cmms_machines,id', + 'driver' => 'required|integer|exists:rahdaran,id', + 'zone' => 'required|in:1,2,3', + 'start_date' => 'required|date', + 'end_date' => 'required|date|after:start_date|before:now', + 'end_point' => 'required|string', + 'area' => 'required|array', + 'area.type' => 'required|string', + 'area.coordinates' => 'required|array', + 'category_id' => 'required|in:1,2,3', + ]; + } + + public function messages(): array + { + return [ + 'end_date.before' => 'تاریخ پایان باید قبل از زمان فعلی باشد.', + 'end_date.after' => 'تاریخ پایان نباید قبل از تاریخ شروع باشد.', + ]; + } +} diff --git a/app/Listeners/V3/Dashboard/Harim/ConfirmGuaranteeLetterNeedListener.php b/app/Listeners/V3/Dashboard/Harim/ConfirmGuaranteeLetterNeedListener.php new file mode 100644 index 00000000..8dd0eeca --- /dev/null +++ b/app/Listeners/V3/Dashboard/Harim/ConfirmGuaranteeLetterNeedListener.php @@ -0,0 +1,46 @@ +url = config('harim_web_services.reject.url'); + $this->username = config('harim_web_services.reject.username'); + $this->password = config('harim_web_services.reject.password'); + } + + /** + * @throws RequestException + */ + public function handle(ConfirmGuaranteeLetterNeedEvent $event): void + { + Http::post($this->url, + array( + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + ))->throw(); + } +} diff --git a/app/Listeners/V3/Dashboard/Harim/ConfirmNoRoadAccessNeedListener.php b/app/Listeners/V3/Dashboard/Harim/ConfirmNoRoadAccessNeedListener.php new file mode 100644 index 00000000..e4a2600c --- /dev/null +++ b/app/Listeners/V3/Dashboard/Harim/ConfirmNoRoadAccessNeedListener.php @@ -0,0 +1,46 @@ +url = config('harim_web_services.reject.url'); + $this->username = config('harim_web_services.reject.username'); + $this->password = config('harim_web_services.reject.password'); + } + + /** + * @throws RequestException + */ + public function handle(ConfirmNoRoadAccessNeedEvent $event): void + { + Http::post($this->url, + array( + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + ))->throw(); + } +} diff --git a/app/Listeners/V3/Dashboard/Harim/ConfirmRoadAccessEditNeedListener.php b/app/Listeners/V3/Dashboard/Harim/ConfirmRoadAccessEditNeedListener.php new file mode 100644 index 00000000..7ad2e903 --- /dev/null +++ b/app/Listeners/V3/Dashboard/Harim/ConfirmRoadAccessEditNeedListener.php @@ -0,0 +1,46 @@ +url = config('harim_web_services.reject.url'); + $this->username = config('harim_web_services.reject.username'); + $this->password = config('harim_web_services.reject.password'); + } + + /** + * @throws RequestException + */ + public function handle(ConfirmRoadAccessEditNeedEvent $event): void + { + Http::post($this->url, + array( + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + ))->throw(); + } +} diff --git a/app/Listeners/V3/Dashboard/Harim/ConfirmRoadAccessNeedListener.php b/app/Listeners/V3/Dashboard/Harim/ConfirmRoadAccessNeedListener.php new file mode 100644 index 00000000..c94bc368 --- /dev/null +++ b/app/Listeners/V3/Dashboard/Harim/ConfirmRoadAccessNeedListener.php @@ -0,0 +1,47 @@ +url = config('harim_web_services.reject.url'); + $this->username = config('harim_web_services.reject.username'); + $this->password = config('harim_web_services.reject.password'); + } + + /** + * Handle the event. + * @throws RequestException + */ + public function handle(ConfirmRoadAccessNeedEvent $event): void + { + Http::post($this->url, + array( + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + ))->throw(); + } +} diff --git a/app/Listeners/V3/Dashboard/Harim/RejectRequestListener.php b/app/Listeners/V3/Dashboard/Harim/RejectRequestListener.php new file mode 100644 index 00000000..6ccc698c --- /dev/null +++ b/app/Listeners/V3/Dashboard/Harim/RejectRequestListener.php @@ -0,0 +1,46 @@ +url = config('harim_web_services.reject.url'); + $this->username = config('harim_web_services.reject.username'); + $this->password = config('harim_web_services.reject.password'); + } + + /** + * @throws RequestException + */ + public function handle(RejectRequestEvent $event): void + { + Http::post($this->url, + array( + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + '' => $event->harim->id, + ))->throw(); + } +} diff --git a/app/Listeners/V3/Dashboard/Mission/SendDataToFMSListener.php b/app/Listeners/V3/Dashboard/Mission/SendDataToFMSListener.php new file mode 100644 index 00000000..500f1ed1 --- /dev/null +++ b/app/Listeners/V3/Dashboard/Mission/SendDataToFMSListener.php @@ -0,0 +1,39 @@ +mission; + + $this->getErrorRateService->setInputParameters([ + 'area' => $mission->area, + 'start_date' => $mission->start_date, + 'end_date' => $mission->end_date, + 'machine_code' => $mission->machines()->first('cmms_machines.machine_code') + ]); + + $this->getErrorRateService->run(); + } +} diff --git a/app/Models/City.php b/app/Models/City.php index 0aa06865..088c475d 100644 --- a/app/Models/City.php +++ b/app/Models/City.php @@ -23,7 +23,11 @@ class City extends Model 'updated_at' ]; - public function province() + protected $fillable = [ + 'geometry', + ]; + + public function province(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo('App\Models\Province'); } @@ -72,7 +76,7 @@ class City extends Model return $this->hasMany('App\Models\RoadConstructionRural'); } - public function edarateShahri() + public function edarateShahri(): \Illuminate\Database\Eloquent\Relations\BelongsToMany { return $this->belongsToMany('App\Models\EdarateShahri', 'edarate_shahri_be_city')->withPivot('is_primary','id'); } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index e077a519..16c73d00 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -2,6 +2,18 @@ namespace App\Providers; +use App\Events\V3\Dashboard\Harim\ConfirmGuaranteeLetterNeedEvent; +use App\Events\V3\Dashboard\Harim\ConfirmNoRoadAccessNeedEvent; +use App\Events\V3\Dashboard\Harim\ConfirmRoadAccessEditNeedEvent; +use App\Events\V3\Dashboard\Harim\ConfirmRoadAccessNeedEvent; +use App\Events\V3\Dashboard\Harim\RejectRequestEvent; +use App\Events\V3\Dashboard\Mission\SendDataToFMSEvent; +use App\Listeners\V3\Dashboard\Harim\ConfirmGuaranteeLetterNeedListener; +use App\Listeners\V3\Dashboard\Harim\ConfirmNoRoadAccessNeedListener; +use App\Listeners\V3\Dashboard\Harim\ConfirmRoadAccessEditNeedListener; +use App\Listeners\V3\Dashboard\Harim\ConfirmRoadAccessNeedListener; +use App\Listeners\V3\Dashboard\Harim\RejectRequestListener; +use App\Listeners\V3\Dashboard\Mission\SendDataToFMSListener; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; @@ -25,6 +37,25 @@ class EventServiceProvider extends ServiceProvider 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\LogSuccessfulLogin', ], + + RejectRequestEvent::class => [ + RejectRequestListener::class + ], + ConfirmRoadAccessNeedEvent::class => [ + ConfirmRoadAccessNeedListener::class + ], + ConfirmNoRoadAccessNeedEvent::class => [ + ConfirmNoRoadAccessNeedListener::class + ], + ConfirmRoadAccessEditNeedEvent::class => [ + ConfirmRoadAccessEditNeedListener::class + ], + ConfirmGuaranteeLetterNeedEvent::class => [ + ConfirmGuaranteeLetterNeedListener::class + ], + SendDataToFMSEvent::class => [ + SendDataToFMSListener::class + ] ]; /** diff --git a/app/Providers/HorizonServiceProvider.php b/app/Providers/HorizonServiceProvider.php new file mode 100644 index 00000000..8b52b089 --- /dev/null +++ b/app/Providers/HorizonServiceProvider.php @@ -0,0 +1,34 @@ +username == 'witel'; + }); + } +} diff --git a/app/Services/Cartables/AccidentReceiptTableService.php b/app/Services/Cartables/AccidentReceiptTableService.php index 69ab80d3..45de66a6 100644 --- a/app/Services/Cartables/AccidentReceiptTableService.php +++ b/app/Services/Cartables/AccidentReceiptTableService.php @@ -57,7 +57,7 @@ class AccidentReceiptTableService SUM(CASE WHEN STATUS > 3 THEN `deposit_daghi_amount` END) AS vasel_shode_daghi, SUM(CASE WHEN STATUS > 3 THEN `final_amount` END) AS vasel_shode_final FROM `accidents` - where created_at BETWEEN "'.$request->from_date.'" AND "'.$request->date_to.'" + where created_at BETWEEN "'.$request->from_date.' 00:00:00" AND "'.$request->date_to.' 23:59:59" union SELECT province_fa, @@ -74,7 +74,7 @@ class AccidentReceiptTableService SUM(CASE WHEN STATUS > 3 THEN `deposit_daghi_amount` END) AS vasel_shode_daghi, SUM(CASE WHEN STATUS > 3 THEN `final_amount` END) AS vasel_shode_final FROM `accidents` - where created_at BETWEEN "'.$request->from_date.'" AND "'.$request->date_to.'" + where created_at BETWEEN "'.$request->from_date.' 00:00:00" AND "'.$request->date_to.' 23:59:59" GROUP BY province_id ' ); @@ -104,7 +104,7 @@ class AccidentReceiptTableService SUM(CASE WHEN STATUS > 3 THEN `deposit_daghi_amount` END) AS vasel_shode_daghi, SUM(CASE WHEN STATUS > 3 THEN `final_amount` END) AS vasel_shode_final FROM `accidents` - where created_at BETWEEN "'.$request->from_date.'" AND "'.$request->date_to.'" AND province_id ='.$request->province_id.' + where created_at BETWEEN "'.$request->from_date.' 00:00:00" AND "'.$request->date_to.' 23:59:59" AND province_id ='.$request->province_id.' union SELECT city_fa, @@ -121,7 +121,7 @@ class AccidentReceiptTableService SUM(CASE WHEN STATUS > 3 THEN `deposit_daghi_amount` END) AS vasel_shode_daghi, SUM(CASE WHEN STATUS > 3 THEN `final_amount` END) AS vasel_shode_final FROM `accidents` - where created_at BETWEEN "'.$request->from_date.'" AND "'.$request->date_to.'" AND province_id ='.$request->province_id.' + where created_at BETWEEN "'.$request->from_date.' 00:00:00" AND "'.$request->date_to.' 23:59:59" AND province_id ='.$request->province_id.' GROUP BY city_id ' ); diff --git a/app/Services/Cartables/SafetyAndPrivacy/OperatorService.php b/app/Services/Cartables/SafetyAndPrivacy/OperatorService.php index c840e5d8..81b2ce82 100644 --- a/app/Services/Cartables/SafetyAndPrivacy/OperatorService.php +++ b/app/Services/Cartables/SafetyAndPrivacy/OperatorService.php @@ -37,92 +37,103 @@ class OperatorService public function countryActivity(int $info_id): array { return DB::select(" - WITH combinations AS ( - SELECT - axis_type_id, - step - FROM ( - SELECT 1 AS axis_type_id UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 - ) a - CROSS JOIN ( - SELECT 1 AS step UNION ALL SELECT 2 UNION ALL SELECT 3 - ) s - ), - provinces AS ( - SELECT DISTINCT province_fa FROM safety_and_privacy WHERE info_id = ? - ), - data AS ( - SELECT - p.province_fa, - c.axis_type_id, - c.step, - COUNT(sp.id) AS total - FROM combinations c - CROSS JOIN provinces p - LEFT JOIN safety_and_privacy sp - ON sp.axis_type_id = c.axis_type_id - AND sp.step = c.step - AND sp.province_fa = p.province_fa - AND sp.info_id = ? - GROUP BY p.province_fa, c.axis_type_id, c.step + WITH base AS ( + SELECT + p.id AS province_id, + a.id AS axis_type_id, + COALESCE(SUM(t.step = 1), 0) AS s1, + COALESCE(SUM(t.step = 2), 0) AS s2, + COALESCE(SUM(t.step = 3), 0) AS s3 + FROM provinces p + JOIN axis_types a + LEFT JOIN safety_and_privacy t + ON t.province_id = p.id + AND t.axis_type_id = a.id + AND t.info_id = :infoId + GROUP BY p.id, a.id ) - SELECT - province_fa, + SELECT + province_id, axis_type_id, - step, - total, - SUM(total) OVER (PARTITION BY province_fa) AS total_sum - FROM data - ORDER BY province_fa, axis_type_id, step - ", [$info_id, $info_id]); + s1, + s2, + s3, + COALESCE( + SUM(s1 + s2 + s3) + OVER (PARTITION BY province_id), 0 + ) AS total_sum + FROM base + + UNION ALL + + SELECT + -1 AS province_id, + axis_type_id, + COALESCE(SUM(s1), 0) AS s1, + COALESCE(SUM(s2), 0) AS s2, + COALESCE(SUM(s3), 0) AS s3, + COALESCE( + SUM(SUM(s1 + s2 + s3)) OVER (), 0 + ) AS total_sum + FROM base + GROUP BY axis_type_id + + ORDER BY province_id, axis_type_id + + ", [ + 'infoId' => $info_id, + ]); } public function provinceActivity(int $info_id, int $province_id): array { return DB::select(" - WITH combinations AS ( - SELECT axis_type_id, step - FROM ( - SELECT 1 AS axis_type_id UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 - ) a - CROSS JOIN ( - SELECT 1 AS step UNION ALL SELECT 2 UNION ALL SELECT 3 - ) s - ), - edarat AS ( - SELECT id AS edare_id, name_fa - FROM edarate_shahri - WHERE province_id = :provinceId - ), - data AS ( - SELECT - e.edare_id, - c.axis_type_id, - c.step, - COUNT(sp.id) AS total - FROM combinations c - CROSS JOIN edarat e - LEFT JOIN safety_and_privacy sp - ON sp.axis_type_id = c.axis_type_id - AND sp.step = c.step - AND sp.city_id = e.edare_id - AND sp.info_id = :infoId - GROUP BY e.edare_id, c.axis_type_id, c.step - ) - SELECT - e.edare_id, - e.name_fa AS edare_name, - d.axis_type_id, - d.step, - d.total, - SUM(d.total) OVER (PARTITION BY e.edare_id) AS total_sum - FROM data d - JOIN edarat e ON e.edare_id = d.edare_id - ORDER BY e.edare_id, d.axis_type_id, d.step - ",[ + WITH edareh_data AS ( + SELECT + e.id AS edareh_id, + a.id AS axis_type_id, + COALESCE(SUM(t.step = 1), 0) AS s1, + COALESCE(SUM(t.step = 2), 0) AS s2, + COALESCE(SUM(t.step = 3), 0) AS s3 + FROM edarate_shahri e + JOIN axis_types a ON 1 + LEFT JOIN safety_and_privacy t + ON e.id = t.edare_shahri_id + AND t.axis_type_id = a.id + AND t.info_id = :infoId + WHERE e.province_id = :provinceId + GROUP BY e.id, a.id + ) + SELECT + edareh_id, + axis_type_id, + s1, + s2, + s3, + COALESCE( + SUM(s1 + s2 + s3) + OVER (PARTITION BY edareh_id), 0 + ) AS total_sum + FROM edareh_data + + UNION ALL + + SELECT + -1 AS edareh_id, + axis_type_id, + COALESCE(SUM(s1), 0) AS s1, + COALESCE(SUM(s2), 0) AS s2, + COALESCE(SUM(s3), 0) AS s3, + COALESCE( + SUM(SUM(s1 + s2 + s3)) OVER (), 0 + ) AS total_sum + FROM edareh_data + GROUP BY axis_type_id + + ORDER BY edareh_id , axis_type_id + ", [ 'provinceId' => $province_id, 'infoId' => $info_id, ]); } - } \ No newline at end of file diff --git a/app/Services/Cartables/SafetyAndPrivacy/SupervisorService.php b/app/Services/Cartables/SafetyAndPrivacy/SupervisorService.php index 20d0257c..79ee14aa 100644 --- a/app/Services/Cartables/SafetyAndPrivacy/SupervisorService.php +++ b/app/Services/Cartables/SafetyAndPrivacy/SupervisorService.php @@ -35,7 +35,7 @@ class SupervisorService 'id','lat','lon', 'recognize_picture','action_picture','created_at','status', 'final_description', 'province_fa', 'info_fa', 'activity_date_time', 'action_picture_document_upload_date', 'judiciary_document_upload_date', 'edare_shahri_name', 'step_fa', 'axis_type_id', 'axis_type_name', 'action_date', 'is_finished', 'status_fa', - 'supervisor_description', 'operator_description' + 'supervisor_description', 'operator_description', 'finish_picture', 'evidence_picture', 'recognize_picture_second' ] ); } diff --git a/app/Services/FMS/GetErrorRateService.php b/app/Services/FMS/GetErrorRateService.php new file mode 100644 index 00000000..aa86d83c --- /dev/null +++ b/app/Services/FMS/GetErrorRateService.php @@ -0,0 +1,71 @@ +url = config('fms_web_services.Error_Rate.url'); + $this->password = config('fms_web_services.Error_Rate.password'); + $this->username = config('fms_web_services.Error_Rate.username'); + $this->channelName = 'fms_error_rate'; + } + + public function setInputParameters(array $inputs): void + { + $this->inputParameters = $inputs; + } + + /** + * @throws Exception + */ + public function run(): array + { + try { + return $this->sendRequest(); + } + catch (Exception $e) { + Log::channel($this->channelName) + ->error(get_class($this), + [ + 'message' => $e->getMessage(), + ] + ); + + throw $e; + } + } + + public function sendRequest(): array + { + $inputData = $this->makeInputParameters(); + + return Http::withBody($inputData) + ->throw() + ->withoutVerifying() + ->post($this->url) + ->json(); + } + + private function makeInputParameters(): string + { + $inputData = $this->inputParameters + array( + "username" => $this->username, + "password" => $this->password, + "minStopDuration" => 1, + ); + + return json_encode($inputData); + } +} diff --git a/bootstrap/cache/packages.php b/bootstrap/cache/packages.php index 58a2a104..1a06b457 100755 --- a/bootstrap/cache/packages.php +++ b/bootstrap/cache/packages.php @@ -28,6 +28,17 @@ 0 => 'KitLoong\\MigrationsGenerator\\MigrationsGeneratorServiceProvider', ), ), + 'laravel/horizon' => + array ( + 'aliases' => + array ( + 'Horizon' => 'Laravel\\Horizon\\Horizon', + ), + 'providers' => + array ( + 0 => 'Laravel\\Horizon\\HorizonServiceProvider', + ), + ), 'laravel/pulse' => array ( 'aliases' => diff --git a/bootstrap/cache/services.php b/bootstrap/cache/services.php index da457a76..13531056 100755 --- a/bootstrap/cache/services.php +++ b/bootstrap/cache/services.php @@ -26,28 +26,30 @@ 22 => 'Barryvdh\\Debugbar\\ServiceProvider', 23 => 'Hekmatinasser\\Verta\\Laravel\\VertaServiceProvider', 24 => 'KitLoong\\MigrationsGenerator\\MigrationsGeneratorServiceProvider', - 25 => 'Laravel\\Pulse\\PulseServiceProvider', - 26 => 'Laravel\\Sail\\SailServiceProvider', - 27 => 'Laravel\\Sanctum\\SanctumServiceProvider', - 28 => 'Laravel\\Telescope\\TelescopeServiceProvider', - 29 => 'Laravel\\Tinker\\TinkerServiceProvider', - 30 => 'Laravel\\Ui\\UiServiceProvider', - 31 => 'Livewire\\LivewireServiceProvider', - 32 => 'Maatwebsite\\Excel\\ExcelServiceProvider', - 33 => 'Carbon\\Laravel\\ServiceProvider', - 34 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider', - 35 => 'Termwind\\Laravel\\TermwindServiceProvider', - 36 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider', - 37 => 'Spatie\\Permission\\PermissionServiceProvider', + 25 => 'Laravel\\Horizon\\HorizonServiceProvider', + 26 => 'Laravel\\Pulse\\PulseServiceProvider', + 27 => 'Laravel\\Sail\\SailServiceProvider', + 28 => 'Laravel\\Sanctum\\SanctumServiceProvider', + 29 => 'Laravel\\Telescope\\TelescopeServiceProvider', + 30 => 'Laravel\\Tinker\\TinkerServiceProvider', + 31 => 'Laravel\\Ui\\UiServiceProvider', + 32 => 'Livewire\\LivewireServiceProvider', + 33 => 'Maatwebsite\\Excel\\ExcelServiceProvider', + 34 => 'Carbon\\Laravel\\ServiceProvider', + 35 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider', + 36 => 'Termwind\\Laravel\\TermwindServiceProvider', + 37 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider', 38 => 'Spatie\\Permission\\PermissionServiceProvider', - 39 => 'App\\Providers\\AppServiceProvider', - 40 => 'App\\Providers\\AuthServiceProvider', - 41 => 'App\\Providers\\EventServiceProvider', - 42 => 'App\\Providers\\RouteServiceProvider', - 43 => 'App\\Providers\\TelescopeServiceProvider', - 44 => 'Barryvdh\\Debugbar\\ServiceProvider', - 45 => 'App\\Providers\\DataTableServiceProvider', - 46 => 'App\\Providers\\FileServiceProvider', + 39 => 'Spatie\\Permission\\PermissionServiceProvider', + 40 => 'App\\Providers\\AppServiceProvider', + 41 => 'App\\Providers\\AuthServiceProvider', + 42 => 'App\\Providers\\EventServiceProvider', + 43 => 'App\\Providers\\HorizonServiceProvider', + 44 => 'App\\Providers\\RouteServiceProvider', + 45 => 'App\\Providers\\TelescopeServiceProvider', + 46 => 'Barryvdh\\Debugbar\\ServiceProvider', + 47 => 'App\\Providers\\DataTableServiceProvider', + 48 => 'App\\Providers\\FileServiceProvider', ), 'eager' => array ( @@ -64,26 +66,28 @@ 10 => 'Barryvdh\\Debugbar\\ServiceProvider', 11 => 'Hekmatinasser\\Verta\\Laravel\\VertaServiceProvider', 12 => 'KitLoong\\MigrationsGenerator\\MigrationsGeneratorServiceProvider', - 13 => 'Laravel\\Pulse\\PulseServiceProvider', - 14 => 'Laravel\\Sanctum\\SanctumServiceProvider', - 15 => 'Laravel\\Telescope\\TelescopeServiceProvider', - 16 => 'Laravel\\Ui\\UiServiceProvider', - 17 => 'Livewire\\LivewireServiceProvider', - 18 => 'Maatwebsite\\Excel\\ExcelServiceProvider', - 19 => 'Carbon\\Laravel\\ServiceProvider', - 20 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider', - 21 => 'Termwind\\Laravel\\TermwindServiceProvider', - 22 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider', - 23 => 'Spatie\\Permission\\PermissionServiceProvider', + 13 => 'Laravel\\Horizon\\HorizonServiceProvider', + 14 => 'Laravel\\Pulse\\PulseServiceProvider', + 15 => 'Laravel\\Sanctum\\SanctumServiceProvider', + 16 => 'Laravel\\Telescope\\TelescopeServiceProvider', + 17 => 'Laravel\\Ui\\UiServiceProvider', + 18 => 'Livewire\\LivewireServiceProvider', + 19 => 'Maatwebsite\\Excel\\ExcelServiceProvider', + 20 => 'Carbon\\Laravel\\ServiceProvider', + 21 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider', + 22 => 'Termwind\\Laravel\\TermwindServiceProvider', + 23 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider', 24 => 'Spatie\\Permission\\PermissionServiceProvider', - 25 => 'App\\Providers\\AppServiceProvider', - 26 => 'App\\Providers\\AuthServiceProvider', - 27 => 'App\\Providers\\EventServiceProvider', - 28 => 'App\\Providers\\RouteServiceProvider', - 29 => 'App\\Providers\\TelescopeServiceProvider', - 30 => 'Barryvdh\\Debugbar\\ServiceProvider', - 31 => 'App\\Providers\\DataTableServiceProvider', - 32 => 'App\\Providers\\FileServiceProvider', + 25 => 'Spatie\\Permission\\PermissionServiceProvider', + 26 => 'App\\Providers\\AppServiceProvider', + 27 => 'App\\Providers\\AuthServiceProvider', + 28 => 'App\\Providers\\EventServiceProvider', + 29 => 'App\\Providers\\HorizonServiceProvider', + 30 => 'App\\Providers\\RouteServiceProvider', + 31 => 'App\\Providers\\TelescopeServiceProvider', + 32 => 'Barryvdh\\Debugbar\\ServiceProvider', + 33 => 'App\\Providers\\DataTableServiceProvider', + 34 => 'App\\Providers\\FileServiceProvider', ), 'deferred' => array ( diff --git a/composer.json b/composer.json index 8d9ff456..a2345809 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "guzzlehttp/guzzle": "^7.2", "hekmatinasser/verta": "^8.3", "laravel/framework": "^10.10", + "laravel/horizon": "^5.33", "laravel/pulse": "^1.0@beta", "laravel/sanctum": "^3.2", "laravel/telescope": "^4.17", diff --git a/composer.lock b/composer.lock index 0388dc70..2928ac05 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bf9b86b55591e7c7df84cb1be8ea9db3", + "content-hash": "379d6ba4ded00ca7079f26aa5b12e04e", "packages": [ { "name": "beberlei/assert", @@ -1949,6 +1949,86 @@ }, "time": "2024-01-30T16:25:02+00:00" }, + { + "name": "laravel/horizon", + "version": "v5.33.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/horizon.git", + "reference": "aabcd425b34005182acc4c22aae48692684cb765" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/horizon/zipball/aabcd425b34005182acc4c22aae48692684cb765", + "reference": "aabcd425b34005182acc4c22aae48692684cb765", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcntl": "*", + "ext-posix": "*", + "illuminate/contracts": "^9.21|^10.0|^11.0|^12.0", + "illuminate/queue": "^9.21|^10.0|^11.0|^12.0", + "illuminate/support": "^9.21|^10.0|^11.0|^12.0", + "nesbot/carbon": "^2.17|^3.0", + "php": "^8.0", + "ramsey/uuid": "^4.0", + "symfony/console": "^6.0|^7.0", + "symfony/error-handler": "^6.0|^7.0", + "symfony/polyfill-php83": "^1.28", + "symfony/process": "^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "phpstan/phpstan": "^1.10|^2.0", + "phpunit/phpunit": "^9.0|^10.4|^11.5|^12.0", + "predis/predis": "^1.1|^2.0|^3.0" + }, + "suggest": { + "ext-redis": "Required to use the Redis PHP driver.", + "predis/predis": "Required when not using the Redis PHP driver (^1.1|^2.0|^3.0)." + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Horizon": "Laravel\\Horizon\\Horizon" + }, + "providers": [ + "Laravel\\Horizon\\HorizonServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Horizon\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Dashboard and code-driven configuration for Laravel queues.", + "keywords": [ + "laravel", + "queue" + ], + "support": { + "issues": "https://github.com/laravel/horizon/issues", + "source": "https://github.com/laravel/horizon/tree/v5.33.3" + }, + "time": "2025-08-11T14:55:49+00:00" + }, { "name": "laravel/prompts", "version": "v0.1.15", diff --git a/config/app.php b/config/app.php index 43214a21..699fea14 100644 --- a/config/app.php +++ b/config/app.php @@ -177,6 +177,7 @@ return [ App\Providers\AuthServiceProvider::class, // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, + App\Providers\HorizonServiceProvider::class, App\Providers\RouteServiceProvider::class, App\Providers\TelescopeServiceProvider::class, Barryvdh\Debugbar\ServiceProvider::class, diff --git a/config/fms_web_services.php b/config/fms_web_services.php index fe06bba3..a9715926 100644 --- a/config/fms_web_services.php +++ b/config/fms_web_services.php @@ -6,4 +6,9 @@ return [ 'password' => env('FMS_VEHICLE_ACTIVITY_PASSWORD'), 'username' => env('FMS_VEHICLE_ACTIVITY_USERNAME'), ], + 'Error_Rate' => [ + 'url' => env('FMS_ERROR_RATE_URL'), + 'password' => env('FMS_ERROR_RATE_PASSWORD'), + 'username' => env('FMS_ERROR_RATE_USERNAME'), + ], ]; \ No newline at end of file diff --git a/config/horizon.php b/config/horizon.php new file mode 100644 index 00000000..30c4c398 --- /dev/null +++ b/config/horizon.php @@ -0,0 +1,236 @@ + env('HORIZON_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | Horizon Path + |-------------------------------------------------------------------------- + | + | This is the URI path where Horizon will be accessible from. Feel free + | to change this path to anything you like. Note that the URI will not + | affect the paths of its internal API that aren't exposed to users. + | + */ + + 'path' => env('HORIZON_PATH', 'horizon'), + + /* + |-------------------------------------------------------------------------- + | Horizon Redis Connection + |-------------------------------------------------------------------------- + | + | This is the name of the Redis connection where Horizon will store the + | meta information required for it to function. It includes the list + | of supervisors, failed jobs, job metrics, and other information. + | + */ + + 'use' => 'default', + + /* + |-------------------------------------------------------------------------- + | Horizon Redis Prefix + |-------------------------------------------------------------------------- + | + | This prefix will be used when storing all Horizon data in Redis. You + | may modify the prefix when you are running multiple installations + | of Horizon on the same server so that they don't have problems. + | + */ + + 'prefix' => env( + 'HORIZON_PREFIX', + Str::slug(env('APP_NAME', 'laravel'), '_').'_horizon:' + ), + + /* + |-------------------------------------------------------------------------- + | Horizon Route Middleware + |-------------------------------------------------------------------------- + | + | These middleware will get attached onto each Horizon route, giving you + | the chance to add your own middleware to this list or change any of + | the existing middleware. Or, you can simply stick with this list. + | + */ + + 'middleware' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Queue Wait Time Thresholds + |-------------------------------------------------------------------------- + | + | This option allows you to configure when the LongWaitDetected event + | will be fired. Every connection / queue combination may have its + | own, unique threshold (in seconds) before this event is fired. + | + */ + + 'waits' => [ + 'redis:default' => 60, + ], + + /* + |-------------------------------------------------------------------------- + | Job Trimming Times + |-------------------------------------------------------------------------- + | + | Here you can configure for how long (in minutes) you desire Horizon to + | persist the recent and failed jobs. Typically, recent jobs are kept + | for one hour while all failed jobs are stored for an entire week. + | + */ + + 'trim' => [ + 'recent' => 60, + 'pending' => 60, + 'completed' => 60, + 'recent_failed' => 10080, + 'failed' => 10080, + 'monitored' => 10080, + ], + + /* + |-------------------------------------------------------------------------- + | Silenced Jobs + |-------------------------------------------------------------------------- + | + | Silencing a job will instruct Horizon to not place the job in the list + | of completed jobs within the Horizon dashboard. This setting may be + | used to fully remove any noisy jobs from the completed jobs list. + | + */ + + 'silenced' => [ + // App\Jobs\ExampleJob::class, + ], + + /* + |-------------------------------------------------------------------------- + | Metrics + |-------------------------------------------------------------------------- + | + | Here you can configure how many snapshots should be kept to display in + | the metrics graph. This will get used in combination with Horizon's + | `horizon:snapshot` schedule to define how long to retain metrics. + | + */ + + 'metrics' => [ + 'trim_snapshots' => [ + 'job' => 24, + 'queue' => 24, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Fast Termination + |-------------------------------------------------------------------------- + | + | When this option is enabled, Horizon's "terminate" command will not + | wait on all of the workers to terminate unless the --wait option + | is provided. Fast termination can shorten deployment delay by + | allowing a new instance of Horizon to start while the last + | instance will continue to terminate each of its workers. + | + */ + + 'fast_termination' => false, + + /* + |-------------------------------------------------------------------------- + | Memory Limit (MB) + |-------------------------------------------------------------------------- + | + | This value describes the maximum amount of memory the Horizon master + | supervisor may consume before it is terminated and restarted. For + | configuring these limits on your workers, see the next section. + | + */ + + 'memory_limit' => 64, + + /* + |-------------------------------------------------------------------------- + | Queue Worker Configuration + |-------------------------------------------------------------------------- + | + | Here you may define the queue worker settings used by your application + | in all environments. These supervisors and settings handle all your + | queued jobs and will be provisioned by Horizon during deployment. + | + */ + + 'defaults' => [ + 'supervisor-1' => [ + 'connection' => 'redis', + 'queue' => ['harim'], + 'balance' => 'auto', + 'autoScalingStrategy' => 'time', + 'maxProcesses' => 1, + 'maxTime' => 0, + 'maxJobs' => 0, + 'memory' => 128, + 'tries' => 2, + 'timeout' => 60, + 'nice' => 0, + 'backoff' => 10, + ], + 'supervisor-2' => [ + 'connection' => 'redis', + 'queue' => ['fms'], + 'balance' => 'auto', + 'autoScalingStrategy' => 'time', + 'maxProcesses' => 1, + 'maxTime' => 0, + 'maxJobs' => 0, + 'memory' => 128, + 'tries' => 2, + 'timeout' => 60, + 'nice' => 0, + 'backoff' => 10, + ], + ], + + 'environments' => [ + 'production' => [ + 'supervisor-1' => [ + 'maxProcesses' => 10, + 'balanceMaxShift' => 1, + 'balanceCooldown' => 3, + ], + 'supervisor-2' => [ + 'maxProcesses' => 10, + 'balanceMaxShift' => 1, + 'balanceCooldown' => 3, + ], + ], + + 'local' => [ + 'supervisor-1' => [ + 'maxProcesses' => 3, + ], + 'supervisor-2' => [ + 'maxProcesses' => 3, + ], + ], + ], +]; diff --git a/config/logging.php b/config/logging.php index c0b8208e..dced418b 100644 --- a/config/logging.php +++ b/config/logging.php @@ -129,6 +129,12 @@ return [ 'path' => storage_path('logs/nikarayan.log'), 'level' => 'info', ], + + 'fms_error_rate' => [ + 'driver' => 'single', + 'path' => storage_path('logs/fms/error_rate_service.log'), + 'level' => 'info', + ], ], ]; diff --git a/database/migrations/2025_07_30_153041_create_harims_table.php b/database/migrations/2025_07_30_153041_create_harims_table.php index cddf389a..67f85ddf 100644 --- a/database/migrations/2025_07_30_153041_create_harims_table.php +++ b/database/migrations/2025_07_30_153041_create_harims_table.php @@ -13,35 +13,38 @@ return new class extends Migration { Schema::create('harims', function (Blueprint $table) { $table->id(); + $table->unsignedBigInteger('panjare_vahed_id'); + $table->string('national_id'); + $table->string('phone_number'); $table->foreignId('state_id')->constrained('harim_states'); $table->string('state_name'); - $table->string('first_name'); - $table->string('last_name'); - $table->string('phone_number'); - $table->string('request_number'); $table->date('request_date'); $table->unsignedTinyInteger('province_id'); $table->foreign('province_id')->references('id')->on('provinces'); $table->string('province_name'); - $table->unsignedSmallInteger('city_id'); + $table->unsignedSmallInteger('city_id')->nullable(); $table->foreign('city_id')->references('id')->on('cities'); - $table->string('city_name'); + $table->string('city_name')->nullable(); $table->unsignedBigInteger('edareh_shahri_id'); $table->foreign('edareh_shahri_id')->references('id')->on('edarate_shahri'); - $table->string('county'); - $table->string('division'); - $table->string('village'); - $table->integer('grand_area'); - $table->integer('plan_area'); $table->string('requested_organization'); $table->string('plan_group'); $table->string('plan_title'); - $table->string('address'); - $table->string('file'); - $table->json('polygon'); - $table->boolean('need_road_access')->nullable(); - $table->boolean('is_file_good')->nullable(); $table->boolean('is_possible')->nullable(); + $table->string('worksheet_id'); + $table->json('response_options')->nullable(); + $table->string('isic'); + $table->polygon('primary_area'); + $table->polygon('forbidden_area')->nullable(); + $table->polygon('final_area')->nullable(); + $table->polygon('final_plan')->nullable(); + $table->polygon('access_road')->nullable(); + $table->boolean('need_payment')->nullable(); + $table->string('payment_amount')->nullable(); + $table->boolean('need_access_road')->nullable(); + $table->boolean('access_road_allowed')->nullable(); + $table->string('lat')->nullable(); + $table->string('lng')->nullable(); $table->timestamps(); }); } diff --git a/database/migrations/2025_07_30_153216_create_harim_histories_table.php b/database/migrations/2025_07_30_153216_create_harim_histories_table.php index 8ac45608..f9e27146 100644 --- a/database/migrations/2025_07_30_153216_create_harim_histories_table.php +++ b/database/migrations/2025_07_30_153216_create_harim_histories_table.php @@ -15,7 +15,7 @@ return new class extends Migration $table->id(); $table->foreignId('previous_state_id')->constrained('harim_states'); $table->string('previous_state_name'); - $table->foreignId('harim_id')->constrained('harims'); + $table->foreignId('harim_id')->constrained('harims')->cascadeOnDelete(); $table->foreignId('action_id')->constrained('harim_actions'); $table->string('action_name'); $table->unsignedInteger('expert_id'); diff --git a/database/migrations/2025_08_18_153617_add_geometry_column_to_cities_table.php b/database/migrations/2025_08_18_153617_add_geometry_column_to_cities_table.php new file mode 100644 index 00000000..4bb50d28 --- /dev/null +++ b/database/migrations/2025_08_18_153617_add_geometry_column_to_cities_table.php @@ -0,0 +1,29 @@ +geometry('geometry')->nullable(); + }); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('cities', function (Blueprint $table) { + $table->dropColumn('geometry'); + }); + } +}; diff --git a/routes/v2.php b/routes/v2.php index 566c1a44..d5e56515 100644 --- a/routes/v2.php +++ b/routes/v2.php @@ -226,6 +226,12 @@ Route::get('axis_reports', function (Request $request) { return view('version2.dashboard_pages.axis_reports'); })->name('v2.axis_reports'); +Route::get('receipt/send-to-insurance/{accident}', 'ReceiptController@sendToInsurance'); +Route::get('receipt/document-release/{accident}', 'ReceiptController@documentRelease'); + +Route::any('/receipt/{any?}', fn() => abort(404, 'not found')) + ->where('any', '.*'); + Route::prefix('receipt')->group(function () { Route::prefix('/report')->group(function () { diff --git a/routes/v3.php b/routes/v3.php index 906a4ca0..1dcb42c3 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -10,6 +10,7 @@ use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshSampleController; use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshTypeController; use App\Http\Controllers\V3\Dashboard\Harim\GeneralManagerController; use App\Http\Controllers\V3\Dashboard\Harim\HarimOfficeController; +use App\Http\Controllers\V3\Dashboard\Harim\PanjareVahedController; use App\Http\Controllers\V3\Dashboard\Harim\ProvinceOfficeController; use App\Http\Controllers\V3\Dashboard\Harim\TechnicalDeputyController; use App\Http\Controllers\V3\Dashboard\ItemsManagementController; @@ -26,6 +27,7 @@ use App\Http\Controllers\V3\Dashboard\SafetyAndPrivacy\OperatorReport\AccessRoad use App\Http\Controllers\V3\Dashboard\SafetyAndPrivacy\OperatorReport\ConstructionActivityController; use App\Http\Controllers\V3\Dashboard\SafetyAndPrivacy\OperatorReport\UtilityPassingActivityController; use App\Http\Controllers\V3\Dashboard\SafetyAndPrivacy\SupervisorController; +use App\Http\Controllers\V3\Dashboard\UserManagementController; use App\Http\Controllers\V3\FMSVehicleManagementController; use App\Http\Controllers\V3\Harim\DivarkeshiController; use App\Http\Controllers\V3\LogListManagementController; @@ -179,6 +181,7 @@ Route::prefix('cmms_machines') Route::get('/', 'index')->name('index'); Route::get('/list', 'list')->name('list'); Route::get('/search', 'search')->name('search'); + Route::get('/car_types', 'carTypes')->name('carTypes'); }); Route::prefix('rahdaran') @@ -381,7 +384,7 @@ Route::prefix('safety_and_privacy') Route::get('operator/{safetyAndPrivacy}', 'show')->name('show'); Route::delete('operator/{safetyAndPrivacy}', 'destroy')->name('destroy')->middleware('permission:delete-safety-and-privacy'); Route::get('/deserialize/{safetyAndPrivacy}', 'deserialize')->name('deserialize'); - Route::post('operator/finish/{safetyAndPrivacy}', 'finish')->name('finish'); + Route::post('operator/finish/{safetyAndPrivacy}', 'finish')->middleware(['check-axis-type'])->name('finish'); }); Route::prefix('supervisor') @@ -498,6 +501,7 @@ Route::prefix('missions') ->controller(ControlUnitController::class) ->group(function () { Route::get('/', 'index')->name('index'); + Route::post('/no_process','noProcess')->name('noProcess'); Route::post('/start/{mission}', 'start')->name('start'); Route::post('/finish/{mission}', 'finish')->name('finish'); }); @@ -557,5 +561,37 @@ Route::prefix('harim') Route::post('/confirm_guarantee_letter_need/{harim}', 'confirmGuaranteeLetterNeed')->name('confirmGuaranteeLetterNeed'); Route::get('/{harim}', 'show')->name('show'); }); + Route::prefix('panjarevahed') + ->name('panjarevahed.') + ->controller(PanjarevahedController::class) + ->group(function () { + Route::post('/get_access_road','getAccessRoad')->name('getAccessRoad'); + }); }); +Route::prefix('user_management') + ->name('user_management.') + ->controller(UserManagementController::class) + ->group(function () { +// Route::get('/', 'index')->name('index'); + Route::get('/index_user', 'indexUser')->name('indexUser'); + Route::get('/activity_report', 'activityReport')->name('activityReport'); + Route::get('/userActivityLogs', 'userActivityLogs')->name('userActivityLogs'); + Route::post('/change_confirmed_status', 'changeConfirmedStatus')->name('changeConfirmedStatus'); + Route::get('/give_permissions_to', 'givePermissionsTo')->name('givePermissionsTo'); + Route::get('/get_user_permissions', 'getUserPermissions')->name('getUserPermissions'); + Route::get('/get_user_summary_report', 'getUserSummaryReport')->name('getUserSummaryReport'); + Route::get('/print_group', 'printGroup')->name('printGroup'); + Route::get('/user_permission', 'userPermission')->name('userPermission'); + Route::get('/assign_permission', 'assignPermission')->name('assignPermission'); + Route::get('/show_all_roles', 'showAllRoles')->name('showAllRoles'); + Route::post('/change_user_enabeld','changeUserEnabeld')->name('changeUserEnabeld'); + Route::post('/','store')->name('store'); + Route::post('/create_role','createRole')->name('createRole'); + Route::post('/edit_role','editRole')->name('editRole'); + Route::get('/{user}', 'show')->name('show'); + Route::post('/{user}', 'update')->name('update'); + Route::delete('/{user}', 'destroy')->name('destroy'); + Route::post('/change_password/{user}', 'changePassword')->name('changePassword'); + Route::post('delete-role/{id}', 'deleteRole')->name('deleteRole'); + });