From aef3bfdd9465a21a37ff0b63bedfadb61c576c64 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Tue, 22 Apr 2025 13:45:04 +0330 Subject: [PATCH 1/6] create new middlware and add in route and kernel --- .../Dashboard/SafetyAndPrivacyController.php | 24 -------------- app/Http/Kernel.php | 1 + app/Http/Middleware/ValidateStoreAccess.php | 32 +++++++++++++++++++ routes/v3.php | 8 +++-- 4 files changed, 38 insertions(+), 27 deletions(-) create mode 100644 app/Http/Middleware/ValidateStoreAccess.php diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php index 693a1864..ce39c5e3 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -52,14 +52,6 @@ class SafetyAndPrivacyController extends Controller { $user = auth()->user(); - if ($user->edarate_ostani_id || is_null($user->city_id)) { - return $this->errorResponse('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!'); - } - - if (is_null($user->edarate_shahri_id)) { - return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); - } - $coordinates = explode(',', $request->point); $item = InfoItem::query() ->where('id', $request->info_id) @@ -104,14 +96,6 @@ class SafetyAndPrivacyController extends Controller { $user = auth()->user(); - if ($user->edarate_ostani_id || is_null($user->city_id)) { - return $this->errorResponse('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!'); - } - - if (is_null($user->edarate_shahri_id)) { - return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); - } - DB::transaction(function () use ($request, $safetyAndPrivacy, $user) { $judiciary_document = []; @@ -135,14 +119,6 @@ class SafetyAndPrivacyController extends Controller { $user = auth()->user(); - if ($user->edarate_ostani_id || is_null($user->city_id)) { - return $this->errorResponse('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!'); - } - - if (is_null($user->edarate_shahri_id)) { - return $this->errorResponse('اداره شهری برای شما در سامانه ثبت نشده است!'); - } - DB::transaction(function () use ($request, $safetyAndPrivacy, $user) { $safetyAndPrivacy->update([ 'step' => 3, diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index bc9e3c68..04705bf0 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -77,6 +77,7 @@ class Kernel extends HttpKernel 'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class, 'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class, 'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class, + 'validate-store-access' => \App\Http\Middleware\ValidateStoreAccess::class, ]; /** diff --git a/app/Http/Middleware/ValidateStoreAccess.php b/app/Http/Middleware/ValidateStoreAccess.php new file mode 100644 index 00000000..ec57469f --- /dev/null +++ b/app/Http/Middleware/ValidateStoreAccess.php @@ -0,0 +1,32 @@ +edarate_ostani_id || is_null($user->city_id), + new ProhibitedAction('امکان ثبت این مورد برای ادارات استانی و ستادی وجود ندارد!')); + + throw_if(is_null($user->edarate_shahri_id), + new ProhibitedAction('اداره شهری برای شما در سامانه ثبت نشده است!')); + + return $next($request); + } +} diff --git a/routes/v3.php b/routes/v3.php index a71859a2..5d58b5b5 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -339,11 +339,13 @@ Route::prefix('safety_and_privacy') ->group(function () { Route::get('/', 'index')->name('index')->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province|show-safety-and-privacy-operator-cartable-edarate-shahri'); Route::get('/excel_report', 'excelReport')->name('excelReport')->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province|show-safety-and-privacy-operator-cartable-edarate-shahri'); - Route::post('/first_step_store', 'firstStepStore')->name('firstStepStore')->middleware('permission:add-safety-and-privacy'); + Route::post('/first_step_store', 'firstStepStore')->name('firstStepStore') + ->middleware(['validate-store-access', 'permission:add-safety-and-privacy']); + Route::get('/sub_items', 'subItems')->name('subItems'); Route::get('/map', 'map')->name('map'); - Route::post('/second_step_store/{safetyAndPrivacy}', 'secondStepStore')->name('secondStepStore')->middleware('permission:add-safety-and-privacy'); - Route::post('/third_step_store/{safetyAndPrivacy}', 'thirdStepStore')->name('thirdStepStore')->middleware('permission:add-safety-and-privacy'); + Route::post('/second_step_store/{safetyAndPrivacy}', 'secondStepStore')->name('secondStepStore')->middleware(['validate-store-access','permission:add-safety-and-privacy']); + Route::post('/third_step_store/{safetyAndPrivacy}', 'thirdStepStore')->name('thirdStepStore')->middleware(['validate-store-access','permission:add-safety-and-privacy']); Route::post('/{safetyAndPrivacy}', 'update')->name('update')->middleware('permission:update-safety-and-privacy'); Route::get('/{safetyAndPrivacy}', 'show')->name('show'); Route::delete('/{safetyAndPrivacy}', 'destroy')->name('destroy')->middleware('permission:delete-safety-and-privacy'); From d6d9009649533fb3344b0c49c59e2760c4d641da Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 22 Apr 2025 13:48:04 +0330 Subject: [PATCH 2/6] create supervisor cartable --- app/Enums/SafetyAndPrivacyStatus.php | 19 ++++++++++++ app/Models/SafetyAndPrivacy.php | 5 +++- .../SafetyAndPrivacyTableService.php | 26 +++++++++++++++- ...add_column_to_safety_and_privacy_table.php | 30 +++++++++++++++++++ 4 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 app/Enums/SafetyAndPrivacyStatus.php create mode 100644 database/migrations/2025_04_22_100327_add_column_to_safety_and_privacy_table.php diff --git a/app/Enums/SafetyAndPrivacyStatus.php b/app/Enums/SafetyAndPrivacyStatus.php new file mode 100644 index 00000000..4e7c164d --- /dev/null +++ b/app/Enums/SafetyAndPrivacyStatus.php @@ -0,0 +1,19 @@ + 'تایید', + 2 => 'عدم تایید', + ]; + + return $mapArray[$state]; + } +} \ No newline at end of file diff --git a/app/Models/SafetyAndPrivacy.php b/app/Models/SafetyAndPrivacy.php index ac347063..77a64138 100644 --- a/app/Models/SafetyAndPrivacy.php +++ b/app/Models/SafetyAndPrivacy.php @@ -36,7 +36,10 @@ class SafetyAndPrivacy extends Model 'action_picture_document_upload_date', 'axis_type_id', 'axis_type_name', - 'action_date' + 'action_date', + 'status', + 'final_description', + 'is_finished' ]; public $table = "safety_and_privacy"; diff --git a/app/Services/Cartables/SafetyAndPrivacyTableService.php b/app/Services/Cartables/SafetyAndPrivacyTableService.php index afe8c30a..8aca0a54 100644 --- a/app/Services/Cartables/SafetyAndPrivacyTableService.php +++ b/app/Services/Cartables/SafetyAndPrivacyTableService.php @@ -18,7 +18,7 @@ class SafetyAndPrivacyTableService /** * @throws Throwable */ - public function dataTable(Request $request, $loadRelations = false) + public function operatorDataTable(Request $request) { $user = auth()->user(); @@ -50,6 +50,30 @@ class SafetyAndPrivacyTableService ); } + public function supervisorDataTable(Request $request) + { + $user = auth()->user(); + + $fields = ['id','lat','lon','province_id','province_fa','city_id','city_fa','edare_shahri_id','edare_shahri_name', + 'recognize_picture','action_picture','operator_id','operator_name','way_id','created_at','updated_at','step', + 'info_id','info_fa','activity_date_time', 'action_picture_document_upload_date', 'judiciary_document_upload_date', + 'step_fa', 'axis_type_id', 'axis_type_name', 'action_date' + ]; + + $query = SafetyAndPrivacy::query()->where([ + ['province_id', '=', $user->province_id], + ['is_finished', '=', 1] + ]); + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: $fields + ); + } + public function countryActivity(Request $request): array { $activities = []; diff --git a/database/migrations/2025_04_22_100327_add_column_to_safety_and_privacy_table.php b/database/migrations/2025_04_22_100327_add_column_to_safety_and_privacy_table.php new file mode 100644 index 00000000..1a63dd23 --- /dev/null +++ b/database/migrations/2025_04_22_100327_add_column_to_safety_and_privacy_table.php @@ -0,0 +1,30 @@ +boolean('is_finished')->nullable(); + $table->integer('status')->nullable(); + $table->string('final_description')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('safety_and_privacy', function (Blueprint $table) { + $table->dropColumn(['status', 'final_description', 'is_finished']); + }); + } +}; From 05060078a193ac3736da8870636e67aa0f8f480f Mon Sep 17 00:00:00 2001 From: joddyabott Date: Tue, 22 Apr 2025 14:33:03 +0330 Subject: [PATCH 3/6] create enum for safety and privacy steps --- app/Enums/SafetyAndPrivacySteps.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 app/Enums/SafetyAndPrivacySteps.php diff --git a/app/Enums/SafetyAndPrivacySteps.php b/app/Enums/SafetyAndPrivacySteps.php new file mode 100644 index 00000000..5589bdcf --- /dev/null +++ b/app/Enums/SafetyAndPrivacySteps.php @@ -0,0 +1,23 @@ + 'گام اول (شناسایی)', + 2 => 'گام دوم (مستندات قضایی)', + 3 => 'گام سوم (برخورد)', + ]; + + return $mapArray[$state]; + } +} \ No newline at end of file From ef373a9f5b8c70609aa3f34c6411fcc05e7e8a2a Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 22 Apr 2025 14:36:43 +0330 Subject: [PATCH 4/6] add confirm and reject api --- .../Dashboard/SafetyAndPrivacyController.php | 47 ++++++++++++++++--- app/Models/SafetyAndPrivacy.php | 3 +- ...add_column_to_safety_and_privacy_table.php | 3 +- routes/v3.php | 2 +- 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php index ce39c5e3..d5d6aa2a 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\V3\Dashboard; use App\Enums\AxisTypes; +use App\Enums\SafetyAndPrivacyStatus; use App\Exports\V3\SafetyAndPrivacy\CartableReport; use App\Facades\DataTable\DataTableFacade; use App\Facades\File\FileFacade; @@ -18,10 +19,8 @@ use App\Services\Cartables\SafetyAndPrivacyTableService; use App\Services\NominatimService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; -use Illuminate\Support\Facades\Validator; use Maatwebsite\Excel\Facades\Excel; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Throwable; @@ -33,9 +32,9 @@ class SafetyAndPrivacyController extends Controller /** * @throws Throwable */ - public function index(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse + public function operatorIndex(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse { - return response()->json($safetyAndPrivacyTableService->datatable($request)); + return response()->json($safetyAndPrivacyTableService->operatorDatatable($request)); } /** @@ -44,7 +43,7 @@ class SafetyAndPrivacyController extends Controller public function excelReport(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse { $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - $data = $safetyAndPrivacyTableService->datatable($request); + $data = $safetyAndPrivacyTableService->operatorDatatable($request); return Excel::download(new CartableReport($data['data']), $name); } @@ -78,7 +77,8 @@ class SafetyAndPrivacyController extends Controller 'axis_type_id' => $request->axis_type_id, 'axis_type_name' => AxisTypes::name($request->axis_type_id), 'step' => 1, - 'step_fa' => 'گام اول (شناسایی)' + 'step_fa' => 'گام اول (شناسایی)', + 'is_finished' => false ]); $safety_and_privacy->recognize_picture = $request->has('recognize_picture') ? @@ -197,4 +197,39 @@ class SafetyAndPrivacyController extends Controller allowedSelects: ['id', 'lat', 'lon', 'step'] )); } + + public function confirm(Request $request, SafetyAndPrivacy $safetyAndPrivacy): JsonResponse + { + $safetyAndPrivacy->update([ + 'status' => SafetyAndPrivacyStatus::CONFIRM->value, + 'supervisor_description' => $request->supervisor_description + ]); + + return $this->successResponse(); + } + + public function reject(Request $request, SafetyAndPrivacy $safetyAndPrivacy): JsonResponse + { + $safetyAndPrivacy->update([ + 'status' => SafetyAndPrivacyStatus::REJECT->value, + 'supervisor_description' => $request->supervisor_description + ]); + + return $this->successResponse(); + } + + public function finish(Request $request, SafetyAndPrivacy $safetyAndPrivacy): JsonResponse + { + $safetyAndPrivacy->update([ + 'is_finished' => $request->is_finished, + 'final_description' => $request->final_description + ]); + + return $this->successResponse(); + } + + public function supervisorIndex(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse + { + return response()->json($safetyAndPrivacyTableService->supervisorDataTable($request)); + } } diff --git a/app/Models/SafetyAndPrivacy.php b/app/Models/SafetyAndPrivacy.php index 77a64138..d1c6cc3f 100644 --- a/app/Models/SafetyAndPrivacy.php +++ b/app/Models/SafetyAndPrivacy.php @@ -39,7 +39,8 @@ class SafetyAndPrivacy extends Model 'action_date', 'status', 'final_description', - 'is_finished' + 'is_finished', + 'supervisor_description' ]; public $table = "safety_and_privacy"; diff --git a/database/migrations/2025_04_22_100327_add_column_to_safety_and_privacy_table.php b/database/migrations/2025_04_22_100327_add_column_to_safety_and_privacy_table.php index 1a63dd23..49d997a7 100644 --- a/database/migrations/2025_04_22_100327_add_column_to_safety_and_privacy_table.php +++ b/database/migrations/2025_04_22_100327_add_column_to_safety_and_privacy_table.php @@ -14,6 +14,7 @@ return new class extends Migration Schema::table('safety_and_privacy', function (Blueprint $table) { $table->boolean('is_finished')->nullable(); $table->integer('status')->nullable(); + $table->string('supervisor_description')->nullable(); $table->string('final_description')->nullable(); }); } @@ -24,7 +25,7 @@ return new class extends Migration public function down(): void { Schema::table('safety_and_privacy', function (Blueprint $table) { - $table->dropColumn(['status', 'final_description', 'is_finished']); + $table->dropColumn(['status', 'final_description', 'is_finished', 'supervisor_description']); }); } }; diff --git a/routes/v3.php b/routes/v3.php index 5d58b5b5..d0924334 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -337,7 +337,7 @@ Route::prefix('safety_and_privacy') ->name('SafetyAndPrivacy.') ->controller(SafetyAndPrivacyController::class) ->group(function () { - Route::get('/', 'index')->name('index')->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province|show-safety-and-privacy-operator-cartable-edarate-shahri'); + Route::get('/', 'operatorIndex')->name('operatorIndex')->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province|show-safety-and-privacy-operator-cartable-edarate-shahri'); Route::get('/excel_report', 'excelReport')->name('excelReport')->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province|show-safety-and-privacy-operator-cartable-edarate-shahri'); Route::post('/first_step_store', 'firstStepStore')->name('firstStepStore') ->middleware(['validate-store-access', 'permission:add-safety-and-privacy']); From 16c143fa4cc3fdb55cbd493aaa6ad7e142f3e7f8 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 22 Apr 2025 14:58:02 +0330 Subject: [PATCH 5/6] use enum for saving --- app/Enums/SafetyAndPrivacySteps.php | 6 ++---- .../V3/Dashboard/SafetyAndPrivacyController.php | 15 ++++++++------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/app/Enums/SafetyAndPrivacySteps.php b/app/Enums/SafetyAndPrivacySteps.php index 5589bdcf..b0e30776 100644 --- a/app/Enums/SafetyAndPrivacySteps.php +++ b/app/Enums/SafetyAndPrivacySteps.php @@ -8,9 +8,7 @@ enum SafetyAndPrivacySteps: int case MOSTANADAT_GAZAEI = 2; case BARKHORD = 3; - - - public static function name(int $state): string + public static function name(int $step): string { $mapArray = [ 1 => 'گام اول (شناسایی)', @@ -18,6 +16,6 @@ enum SafetyAndPrivacySteps: int 3 => 'گام سوم (برخورد)', ]; - return $mapArray[$state]; + return $mapArray[$step]; } } \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php index d5d6aa2a..2f5ddfa5 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\V3\Dashboard; use App\Enums\AxisTypes; use App\Enums\SafetyAndPrivacyStatus; +use App\Enums\SafetyAndPrivacySteps; use App\Exports\V3\SafetyAndPrivacy\CartableReport; use App\Facades\DataTable\DataTableFacade; use App\Facades\File\FileFacade; @@ -76,8 +77,8 @@ class SafetyAndPrivacyController extends Controller 'way_id' => $nominatimService->get_way_id_from_nominatim($coordinates[0], $coordinates[1]), 'axis_type_id' => $request->axis_type_id, 'axis_type_name' => AxisTypes::name($request->axis_type_id), - 'step' => 1, - 'step_fa' => 'گام اول (شناسایی)', + 'step' => SafetyAndPrivacySteps::SHENASAEI->value, + 'step_fa' => SafetyAndPrivacySteps::name(1), 'is_finished' => false ]); @@ -105,8 +106,8 @@ class SafetyAndPrivacyController extends Controller $safetyAndPrivacy->update([ 'judiciary_document' => serialize($judiciary_document), 'judiciary_document_upload_date' => now(), - 'step' => 2, - 'step_fa' => 'گام دوم (مستندات قضایی)' + 'step' => SafetyAndPrivacySteps::MOSTANADAT_GAZAEI->value, + 'step_fa' => SafetyAndPrivacySteps::name(2), ]); $user->addActivityComplete(1135); @@ -121,8 +122,8 @@ class SafetyAndPrivacyController extends Controller DB::transaction(function () use ($request, $safetyAndPrivacy, $user) { $safetyAndPrivacy->update([ - 'step' => 3, - 'step_fa' => 'گام سوم (برخورد)', + 'step' => SafetyAndPrivacySteps::BARKHORD->value, + 'step_fa' => SafetyAndPrivacySteps::name(3), 'action_picture' => FileFacade::save($request->action_picture, "safety_and_privacy/{$safetyAndPrivacy->id}/action_picture"), 'action_picture_document_upload_date' => now(), 'action_date' => $request->action_date, @@ -155,7 +156,7 @@ class SafetyAndPrivacyController extends Controller public function destroy(SafetyAndPrivacy $safetyAndPrivacy): JsonResponse { - Storage::deleteDirectory("public/safety_and_privacy/{$safetyAndPrivacy->id}"); + FileFacade::deleteDirectory("safety_and_privacy/{$safetyAndPrivacy->id}"); DB::transaction(function () use ($safetyAndPrivacy) { From 8513ebd72822fb445c306dbeca11d94881de250c Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 23 Apr 2025 09:06:50 +0330 Subject: [PATCH 6/6] add pending to status --- app/Enums/SafetyAndPrivacyStatus.php | 2 ++ .../Controllers/V3/Dashboard/SafetyAndPrivacyController.php | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/Enums/SafetyAndPrivacyStatus.php b/app/Enums/SafetyAndPrivacyStatus.php index 4e7c164d..34358e24 100644 --- a/app/Enums/SafetyAndPrivacyStatus.php +++ b/app/Enums/SafetyAndPrivacyStatus.php @@ -6,12 +6,14 @@ enum SafetyAndPrivacyStatus: int { case CONFIRM = 1; case REJECT = 2; + case PENDING = 3; public static function name(int $state): string { $mapArray = [ 1 => 'تایید', 2 => 'عدم تایید', + 3 => 'در حال بررسی' ]; return $mapArray[$state]; diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php index 2f5ddfa5..3124cce8 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -127,6 +127,7 @@ class SafetyAndPrivacyController extends Controller 'action_picture' => FileFacade::save($request->action_picture, "safety_and_privacy/{$safetyAndPrivacy->id}/action_picture"), 'action_picture_document_upload_date' => now(), 'action_date' => $request->action_date, + 'is_finished' => true ]); $user->addActivityComplete(1136); @@ -223,7 +224,8 @@ class SafetyAndPrivacyController extends Controller { $safetyAndPrivacy->update([ 'is_finished' => $request->is_finished, - 'final_description' => $request->final_description + 'final_description' => $request->final_description, + 'status' => SafetyAndPrivacyStatus::PENDING->value, ]); return $this->successResponse();