diff --git a/app/Enums/SafetyAndPrivacyStatus.php b/app/Enums/SafetyAndPrivacyStatus.php index 34358e24..78168c2a 100644 --- a/app/Enums/SafetyAndPrivacyStatus.php +++ b/app/Enums/SafetyAndPrivacyStatus.php @@ -4,16 +4,16 @@ namespace App\Enums; enum SafetyAndPrivacyStatus: int { + case PENDING = 0; case CONFIRM = 1; case REJECT = 2; - case PENDING = 3; public static function name(int $state): string { $mapArray = [ + 0 => 'در حال بررسی', 1 => 'تایید', 2 => 'عدم تایید', - 3 => 'در حال بررسی' ]; return $mapArray[$state]; diff --git a/app/Exports/V3/SafetyAndPrivacy/CartableReport.php b/app/Exports/V3/SafetyAndPrivacy/OperatorCartableReport.php similarity index 91% rename from app/Exports/V3/SafetyAndPrivacy/CartableReport.php rename to app/Exports/V3/SafetyAndPrivacy/OperatorCartableReport.php index 6c066aa1..81137eea 100644 --- a/app/Exports/V3/SafetyAndPrivacy/CartableReport.php +++ b/app/Exports/V3/SafetyAndPrivacy/OperatorCartableReport.php @@ -12,13 +12,13 @@ use Maatwebsite\Excel\Events\AfterSheet; use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; -class CartableReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings +class OperatorCartableReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { public function __construct(private ?Collection $data){} public function view(): View { - return view('v3.Reports.SafetyAndPrivacy.CartableReport', [ + return view('v3.Reports.SafetyAndPrivacy.OperatorCartableReport', [ 'data' => $this->data, ]); } diff --git a/app/Exports/V3/SafetyAndPrivacy/SupervisorCartableReport.php b/app/Exports/V3/SafetyAndPrivacy/SupervisorCartableReport.php new file mode 100644 index 00000000..cf712aaf --- /dev/null +++ b/app/Exports/V3/SafetyAndPrivacy/SupervisorCartableReport.php @@ -0,0 +1,69 @@ + $this->data, + ]); + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + $event->sheet->getDelegate()->setRightToLeft(true); + }, + ]; + } + + public function drawings(): array + { + $drawing = new Drawing(); + $drawing->setName('Logo'); + $drawing->setDescription('This is my logo'); + $drawing->setPath(public_path('/dist/logo.png')); + $drawing->setWidth(50); + $drawing->setHeight(50); + $drawing->setOffsetX(5); + $drawing->setOffsetY(5); + $drawing->setCoordinates('A1'); + + $drawing2 = new Drawing(); + $drawing2->setName('Logo'); + $drawing2->setDescription('This is my logo'); + $drawing2->setPath(public_path('/dist/141icon.png')); + $drawing2->setWidth(50); + $drawing2->setHeight(50); + $drawing2->setOffsetX(5); + $drawing2->setOffsetY(5); + $drawing2->setCoordinates('B1'); + return [$drawing, $drawing2]; + } + + public function styles(Worksheet $sheet): array + { + return [ + 'A:BA' => [ + 'font' => [ + 'name' => 'B Nazanin' + ] + ], + ]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php index 3124cce8..06b03021 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -5,10 +5,13 @@ 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\Exports\V3\SafetyAndPrivacy\OperatorCartableReport; +use App\Exports\V3\SafetyAndPrivacy\SupervisorCartableReport; use App\Facades\DataTable\DataTableFacade; use App\Facades\File\FileFacade; use App\Http\Controllers\Controller; +use App\Http\Requests\V3\SafetyAndPrivacy\FinishRequest; +use App\Http\Requests\V3\SafetyAndPrivacy\RejectRequest; use App\Http\Requests\V3\SafetyAndPrivacy\FirstStepStoreRequest; use App\Http\Requests\V3\SafetyAndPrivacy\SecondStepStoreRequest; use App\Http\Requests\V3\SafetyAndPrivacy\ThirdStepStoreRequest; @@ -41,11 +44,11 @@ class SafetyAndPrivacyController extends Controller /** * @throws Throwable */ - public function excelReport(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + public function operatorExcelReport(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse { $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; $data = $safetyAndPrivacyTableService->operatorDatatable($request); - return Excel::download(new CartableReport($data['data']), $name); + return Excel::download(new OperatorCartableReport($data['data']), $name); } public function firstStepStore(FirstStepStoreRequest $request, NominatimService $nominatimService): JsonResponse @@ -60,6 +63,7 @@ class SafetyAndPrivacyController extends Controller DB::transaction(function () use ($request, $coordinates, $item, $nominatimService, $user) { + $step = SafetyAndPrivacySteps::SHENASAEI->value; $safety_and_privacy = SafetyAndPrivacy::query()->create([ 'lat' => $coordinates[0], 'lon' => $coordinates[1], @@ -77,9 +81,9 @@ 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' => SafetyAndPrivacySteps::SHENASAEI->value, - 'step_fa' => SafetyAndPrivacySteps::name(1), - 'is_finished' => false + 'step' => $step, + 'step_fa' => SafetyAndPrivacySteps::name($step), + 'is_finished' => false, ]); $safety_and_privacy->recognize_picture = $request->has('recognize_picture') ? @@ -97,17 +101,27 @@ class SafetyAndPrivacyController extends Controller { $user = auth()->user(); - DB::transaction(function () use ($request, $safetyAndPrivacy, $user) - { + DB::transaction(function () use ($request, $safetyAndPrivacy, $user) { + + $need_judiciary = $request->need_judiciary; + $judiciary_document = []; - foreach ($request->judiciary_document as $index => $file) { - $judiciary_document[] = FileFacade::save($file, "safety_and_privacy/{$safetyAndPrivacy->id}/judiciary_document"); + if ($need_judiciary) { + foreach ($request->judiciary_document as $index => $file) { + $judiciary_document[] = FileFacade::save( + $file, + "safety_and_privacy/{$safetyAndPrivacy->id}/judiciary_document" + ); + } } + + $step = SafetyAndPrivacySteps::MOSTANADAT_GAZAEI->value; $safetyAndPrivacy->update([ - 'judiciary_document' => serialize($judiciary_document), - 'judiciary_document_upload_date' => now(), - 'step' => SafetyAndPrivacySteps::MOSTANADAT_GAZAEI->value, - 'step_fa' => SafetyAndPrivacySteps::name(2), + 'step' => $step, + 'step_fa' => SafetyAndPrivacySteps::name($step), + 'judiciary_document' => $need_judiciary ? serialize($judiciary_document) : null, + 'judiciary_document_upload_date' => $need_judiciary ? now() : null, + 'need_judiciary' => $need_judiciary, ]); $user->addActivityComplete(1135); @@ -121,13 +135,15 @@ class SafetyAndPrivacyController extends Controller $user = auth()->user(); DB::transaction(function () use ($request, $safetyAndPrivacy, $user) { + $step = SafetyAndPrivacySteps::BARKHORD->value; $safetyAndPrivacy->update([ - 'step' => SafetyAndPrivacySteps::BARKHORD->value, - 'step_fa' => SafetyAndPrivacySteps::name(3), + 'step' => $step, + 'step_fa' => SafetyAndPrivacySteps::name($step), '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 + 'is_finished' => true, + 'final_description' => 'پیام سیستمی : این عملیات پس از طی تمامی گام ها خاتمه یافت' ]); $user->addActivityComplete(1136); @@ -200,32 +216,40 @@ class SafetyAndPrivacyController extends Controller )); } - public function confirm(Request $request, SafetyAndPrivacy $safetyAndPrivacy): JsonResponse + public function confirm(SafetyAndPrivacy $safetyAndPrivacy): JsonResponse { + $status_id = SafetyAndPrivacyStatus::CONFIRM->value; + $safetyAndPrivacy->update([ - 'status' => SafetyAndPrivacyStatus::CONFIRM->value, + 'status' => $status_id, + 'status_fa' => SafetyAndPrivacyStatus::name($status_id), + ]); + + return $this->successResponse(); + } + + public function reject(RejectRequest $request, SafetyAndPrivacy $safetyAndPrivacy): JsonResponse + { + $status_id = SafetyAndPrivacyStatus::REJECT->value; + + $safetyAndPrivacy->update([ + 'status' => $status_id, + 'status_fa' => SafetyAndPrivacyStatus::name($status_id), 'supervisor_description' => $request->supervisor_description ]); return $this->successResponse(); } - public function reject(Request $request, SafetyAndPrivacy $safetyAndPrivacy): JsonResponse + public function finish(FinishRequest $request, SafetyAndPrivacy $safetyAndPrivacy): JsonResponse { - $safetyAndPrivacy->update([ - 'status' => SafetyAndPrivacyStatus::REJECT->value, - 'supervisor_description' => $request->supervisor_description - ]); + $status_id = SafetyAndPrivacyStatus::PENDING->value; - return $this->successResponse(); - } - - public function finish(Request $request, SafetyAndPrivacy $safetyAndPrivacy): JsonResponse - { $safetyAndPrivacy->update([ - 'is_finished' => $request->is_finished, + 'is_finished' => 1, 'final_description' => $request->final_description, - 'status' => SafetyAndPrivacyStatus::PENDING->value, + 'status' => $status_id, + 'status_fa' => SafetyAndPrivacyStatus::name($status_id), ]); return $this->successResponse(); @@ -235,4 +259,11 @@ class SafetyAndPrivacyController extends Controller { return response()->json($safetyAndPrivacyTableService->supervisorDataTable($request)); } + + public function supervisorExcelReport(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + { + $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + $data = $safetyAndPrivacyTableService->supervisorDataTable($request); + return Excel::download(new SupervisorCartableReport($data['data']), $name); + } } diff --git a/app/Http/Requests/V3/SafetyAndPrivacy/FinishRequest.php b/app/Http/Requests/V3/SafetyAndPrivacy/FinishRequest.php new file mode 100644 index 00000000..a8cb30bc --- /dev/null +++ b/app/Http/Requests/V3/SafetyAndPrivacy/FinishRequest.php @@ -0,0 +1,28 @@ +|string> + */ + public function rules(): array + { + return [ + 'final_description' => 'required|string', + ]; + } +} diff --git a/app/Http/Requests/V3/SafetyAndPrivacy/RejectRequest.php b/app/Http/Requests/V3/SafetyAndPrivacy/RejectRequest.php new file mode 100644 index 00000000..7ddc7700 --- /dev/null +++ b/app/Http/Requests/V3/SafetyAndPrivacy/RejectRequest.php @@ -0,0 +1,28 @@ +|string> + */ + public function rules(): array + { + return [ + 'supervisor_description' => 'required|string', + ]; + } +} diff --git a/app/Http/Requests/V3/SafetyAndPrivacy/SecondStepStoreRequest.php b/app/Http/Requests/V3/SafetyAndPrivacy/SecondStepStoreRequest.php index 5d130d51..78e471ad 100644 --- a/app/Http/Requests/V3/SafetyAndPrivacy/SecondStepStoreRequest.php +++ b/app/Http/Requests/V3/SafetyAndPrivacy/SecondStepStoreRequest.php @@ -22,6 +22,7 @@ class SecondStepStoreRequest extends FormRequest public function rules(): array { return [ + 'need_judiciary' => 'required|boolean', 'judiciary_document' => 'required|array', 'judiciary_document.*' => 'file', ]; diff --git a/app/Models/SafetyAndPrivacy.php b/app/Models/SafetyAndPrivacy.php index d1c6cc3f..55e0a239 100644 --- a/app/Models/SafetyAndPrivacy.php +++ b/app/Models/SafetyAndPrivacy.php @@ -40,7 +40,9 @@ class SafetyAndPrivacy extends Model 'status', 'final_description', 'is_finished', - 'supervisor_description' + 'supervisor_description', + 'status_fa', + 'need_judiciary' ]; public $table = "safety_and_privacy"; diff --git a/app/Services/Cartables/SafetyAndPrivacyTableService.php b/app/Services/Cartables/SafetyAndPrivacyTableService.php index 8aca0a54..4e651ef4 100644 --- a/app/Services/Cartables/SafetyAndPrivacyTableService.php +++ b/app/Services/Cartables/SafetyAndPrivacyTableService.php @@ -22,10 +22,10 @@ class SafetyAndPrivacyTableService { $user = auth()->user(); - $fields = ['id','lat','lon','province_id','province_fa','city_id','city_fa','edare_shahri_id','edare_shahri_name', - 'recognize_picture','action_picture','operator_id','operator_name','way_id','created_at','updated_at','step', - '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' + $fields = [ + 'id','lat','lon', 'recognize_picture','action_picture','created_at','step', 'final_description', + 'info_fa', 'activity_date_time', 'action_picture_document_upload_date', 'judiciary_document_upload_date', + 'step_fa', 'axis_type_id', 'axis_type_name', 'action_date', 'is_finished', 'status_fa', 'supervisor_description' ]; if ($user->hasPermissionTo('show-safety-and-privacy-operator-cartable')) { 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 49d997a7..e78b6af7 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,8 +14,12 @@ return new class extends Migration Schema::table('safety_and_privacy', function (Blueprint $table) { $table->boolean('is_finished')->nullable(); $table->integer('status')->nullable(); + $table->string('status_fa')->nullable(); $table->string('supervisor_description')->nullable(); $table->string('final_description')->nullable(); + $table->boolean('need_judiciary')->nullable(); + $table->text('judiciary_document')->nullable()->change(); + $table->dateTime('judiciary_document_upload_date')->nullable()->change(); }); } @@ -25,7 +29,9 @@ return new class extends Migration public function down(): void { Schema::table('safety_and_privacy', function (Blueprint $table) { - $table->dropColumn(['status', 'final_description', 'is_finished', 'supervisor_description']); + $table->dropColumn(['status', 'final_description', 'is_finished', 'supervisor_description', 'status_fa', 'need_judiciary']); + $table->text('judiciary_document')->change(); + $table->dateTime('judiciary_document_upload_date')->change(); }); } }; diff --git a/resources/views/v3/Reports/SafetyAndPrivacy/OperatorCartableReport.blade.php b/resources/views/v3/Reports/SafetyAndPrivacy/OperatorCartableReport.blade.php new file mode 100644 index 00000000..043a3f4d --- /dev/null +++ b/resources/views/v3/Reports/SafetyAndPrivacy/OperatorCartableReport.blade.php @@ -0,0 +1,99 @@ + + + + + + + + فعالیت های نگهداری حریم راه + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @foreach ($data as $item) + + + + + + + + + + + + + + @endforeach + +
+ تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }} +
+
+ گزارش فعالیت های نگهداری حریم راه +
+ کد یکتا + + مورد مشاهده شده + + نوع محور + + تاریخ ثبت + + تاریخ بازدید + + تاریخ بارگذاری مستندات قضایی + + تاریخ اقدام + + وضعیت +
{{ $item['id'] ?? '-' }}{{ $item['info_fa'] ?? '-' }}{{ $item['axis_type_name'] ?? '-' }}{{ $item['created_at'] ? verta($item['created_at'])->format('Y/n/j H:i:s') : '-' }}{{ $item['activity_date_time'] ? verta($item['activity_date_time'])->format('Y/n/j H:i:s') : '-' }} + {{ $item['judiciary_document_upload_date'] && $item['judiciary_document_upload_date'] != '0000-00-00 00:00:00' ? verta($item['judiciary_document_upload_date'])->format('Y/n/j H:i:s') : '-' }} + + {{ $item['action_picture_document_upload_date'] ? verta($item['action_date'])->format('Y/n/j H:i:s') : '-' }} + {{ $item['step_fa'] ?? '-' }}
+ + diff --git a/resources/views/v3/Reports/SafetyAndPrivacy/CartableReport.blade.php b/resources/views/v3/Reports/SafetyAndPrivacy/SupervisorCartableReport.blade.php similarity index 100% rename from resources/views/v3/Reports/SafetyAndPrivacy/CartableReport.blade.php rename to resources/views/v3/Reports/SafetyAndPrivacy/SupervisorCartableReport.blade.php diff --git a/routes/v3.php b/routes/v3.php index d0924334..7d6b2e8f 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -337,11 +337,16 @@ Route::prefix('safety_and_privacy') ->name('SafetyAndPrivacy.') ->controller(SafetyAndPrivacyController::class) ->group(function () { - 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']); + Route::get('/operator_index', 'operatorIndex')->name('operatorIndex') + ->middleware('permission:show-safety-and-privacy-operator-cartable-edarate-shahri'); + Route::get('/supervisor_index', 'supervisorIndex')->name('supervisorIndex') + ->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province'); + Route::get('/operator_excel_report', 'operatorExcelReport')->name('operatorExcelReport') + ->middleware('permission:show-safety-and-privacy-operator-cartable-edarate-shahri'); + Route::get('/supervisor_excel_report', 'supervisorExcelReport')->name('supervisorExcelReport') + ->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province'); + 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(['validate-store-access','permission:add-safety-and-privacy']); @@ -350,6 +355,9 @@ Route::prefix('safety_and_privacy') Route::get('/{safetyAndPrivacy}', 'show')->name('show'); Route::delete('/{safetyAndPrivacy}', 'destroy')->name('destroy')->middleware('permission:delete-safety-and-privacy'); Route::get('/deserialize/{safetyAndPrivacy}', 'deserialize')->name('deserialize'); + Route::post('/confirm/{safetyAndPrivacy}', 'confirm')->name('confirm'); + Route::post('/reject/{safetyAndPrivacy}', 'reject')->name('reject'); + Route::post('/finish/{safetyAndPrivacy}', 'finish')->name('finish'); }); Route::prefix('safety_and_privacy_report')