diff --git a/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php b/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php index 530b4add..5368e931 100644 --- a/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php +++ b/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php @@ -156,7 +156,7 @@ class AccidentReceiptController extends Controller FileFacade::delete($accident->police_file, true); } - if (!$request->report_base) { + if (!$request->report_base && $request->has('police_file')) { FileFacade::delete($accident->police_file, true); $accidentData['police_file'] = FileFacade::save($request->file('police_file'), "receipts_files/{$accident->id}/"); } diff --git a/app/Http/Controllers/V3/Dashboard/RoadObservationController.php b/app/Http/Controllers/V3/Dashboard/RoadObservationController.php index 1000a9ce..937cdb3b 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadObservationController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadObservationController.php @@ -3,14 +3,24 @@ namespace App\Http\Controllers\V3\Dashboard; use App\Exports\V3\RoadObservation\OperatorCartableReport; use App\Exports\V3\RoadObservation\SupervisorCartableReport; +use App\Facades\File\FileFacade; +use App\Facades\Sms\Sms; use App\Http\Controllers\Controller; +use App\Http\Requests\V3\RoadObservation\ReferRequest; use App\Http\Requests\V3\RoadObservation\VerifyBySupervisorRequest; use App\Http\Traits\ApiResponse; +use App\Models\RoadObservationHistory; use App\Models\RoadObserved; +use App\Services\NikarayanService; +use Carbon\Carbon; +use Hekmatinasser\Verta\Verta; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use App\Services\Cartables\RoadObservationTableservice; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Str; use Maatwebsite\Excel\Facades\Excel; +use SoapFault; use Symfony\Component\HttpFoundation\BinaryFileResponse; class RoadObservationController extends Controller @@ -59,10 +69,94 @@ class RoadObservationController extends Controller public function operatorCartableReport(Request $request, RoadObservationTableService $roadObservationTableService): BinaryFileResponse { - $name = 'گزارش از کارتابل ارزیابی واکنش سریع ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; + $name = 'گزارش از کارتابل عملیات واکنش سریع ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; $data = $roadObservationTableService->operatorCartableIndex($request); return Excel::download(new OperatorCartableReport($data['data']), $name); } + public function complaintsIndex(Request $request, RoadObservationTableservice $roadObservationTableservice): JsonResponse + { + return response()->json($roadObservationTableservice->complaintsIndex($request)); + } + + public function register(Request $request, RoadObserved $roadObserved, NikarayanService $nikarayanService): JsonResponse + { + $roadObservedData = [ + 'status' => 0, + 'status_fa' => 'در حال بررسی', + 'rms_status' => $request->rms_status ?? $roadObserved->rms_status, + 'rms_description' => $request->description?? $roadObserved->rms_description, + ]; + + $roadObservedHistoryData = [ + 'user_id' => auth()->user()->id, + 'previous_rms_status' => $roadObserved->rms_status, + 'previous_rms_start_latlng' => $roadObserved->rms_start_latlng, + 'previous_rms_end_latlng' => $roadObserved->rms_end_latlng, + 'previous_rms_description' => $roadObserved->rms_description, + 'new_files' => [] + ]; + + if ($request->rms_status == 1) { + + $files_path = []; + + $roadObserved->files()->where('path', 'like', '%_image_before%')->delete(); + $roadObserved->files()->where('path', 'like', '%_image_after%')->delete(); + + $image_before = FileFacade::save($request->image_before, "road_observeds/{$roadObserved->id}/"); + $image_after = FileFacade::save($request->image_after, "road_observeds/{$roadObserved->id}/"); + + $files_path[0]['path'] = $image_before; + $files_path[1]['path'] = $image_after; + + $files = json_encode($files_path); + $now_date_time = Carbon::now(); + + $roadObservedData['image_before'] = $image_before; + $roadObservedData['image_after'] = $image_after; + $roadObservedData['rms_start_latlng'] = explode(',', $request->start_point); + $roadObservedData['updated_at_fa'] = Verta::instance($now_date_time); + $roadObservedData['rms_last_activity_fa'] = Verta::instance($now_date_time); + $roadObservedData['rms_last_activity'] = $now_date_time; + $roadObservedHistoryData['new_files'] = $files; + } + + $roadObserved->problemHistories()->create($roadObservedHistoryData); + $roadObserved->update($roadObservedData); + + auth()->user()->addActivityComplete(1142); + + try { + $result = $nikarayanService->updateRoadObservedInfoByNikarayan($request, $roadObserved, json_encode($roadObservedHistoryData['new_files'])); + } + catch (SoapFault $e) { + + $msg = "error in send to nikarayan at" . date("Y-m-d H:i:s") . "\n"; + $msg .= $e->getMessage(); + Sms::sendSms(env('RMS_CTO_PHONE_NUMBER'), $msg); + } + + return $this->successResponse(); + } + + public function refer(ReferRequest $request, RoadObserved $roadObserved): JsonResponse + { + $roadObserved->problemHistories()->create([ + 'user_id' => auth()->user()->id, + 'action' => 'refer', + 'description' => $request->refer_description, + 'from_edareh' => $roadObserved->edarate_shahri_id, + 'to_edareh' => $request->edarate_shahri_id + ]); + + $roadObserved->update([ + 'edarate_shahri_id' => $request->edarate_shahri_id, + ]); + + auth()->user()->addActivityComplete(1037); + + return $this->successResponse(); + } } diff --git a/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php b/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php index 3b50bdf5..3160896d 100644 --- a/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php +++ b/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php @@ -35,11 +35,11 @@ class UpdateRequest extends FormRequest 'accident_date' => 'required|date', 'accident_time' => 'required|string', 'report_base' => 'required|in:0,1', - 'police_file' => 'required_if:report_base,0|file|mimes:pdf,jpg,jpeg,png', + 'police_file' => 'file|mimes:pdf,jpg,jpeg,png', 'police_serial' => 'required_if:report_base,0|string', 'police_file_date' => 'required_if:report_base,0|date', - 'damage_picture1' => 'required|file|mimes:pdf,jpg,jpeg,png', - 'damage_picture2' => 'required|file|mimes:pdf,jpg,jpeg,png', + 'damage_picture1' => 'file|mimes:pdf,jpg,jpeg,png', + 'damage_picture2' => 'file|mimes:pdf,jpg,jpeg,png', 'damage_items' => 'required|array', 'damage_items.*.value' => 'required', 'damage_items.*.amount' => 'required', diff --git a/app/Http/Requests/V3/RoadObservation/ReferRequest.php b/app/Http/Requests/V3/RoadObservation/ReferRequest.php new file mode 100644 index 00000000..4db948c2 --- /dev/null +++ b/app/Http/Requests/V3/RoadObservation/ReferRequest.php @@ -0,0 +1,29 @@ +roadObserved->rms_status == 0; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'edarate_shahri_id' => 'required|exists:edarate_shahri,id', + 'refer_description' => 'required|string', + ]; + } +} diff --git a/app/Models/RoadObserved.php b/app/Models/RoadObserved.php index 54fd8c29..60131fd0 100644 --- a/app/Models/RoadObserved.php +++ b/app/Models/RoadObserved.php @@ -2,8 +2,10 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Storage; class RoadObserved extends Model { @@ -99,4 +101,18 @@ class RoadObserved extends Model { return $this->belongsTo('App\Models\EdarateShahri', 'edarate_shahri_id'); } + + protected function imageAfter(): Attribute + { + return Attribute::make( + get: fn($value) => $value == null ? null : Storage::disk('public')->url($value) + ); + } + + protected function imageBefore(): Attribute + { + return Attribute::make( + get: fn($value) => $value == null ? null : Storage::disk('public')->url($value) + ); + } } diff --git a/app/Services/Cartables/RoadObservationTableService.php b/app/Services/Cartables/RoadObservationTableService.php index 9b8bbafd..eac2e585 100644 --- a/app/Services/Cartables/RoadObservationTableService.php +++ b/app/Services/Cartables/RoadObservationTableService.php @@ -88,4 +88,46 @@ class RoadObservationTableService allowedFilters: ['*'], allowedSortings: ['*']); } + + public function complaintsIndex(Request $request) + { + $user = auth()->user(); + + if ($user->hasPermissionTo('show-fast-react')) { + $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') + ->where('rms_status', '=', 0) + ->whereNotNull('edarate_shahri_id'); + } + elseif ($user->hasPermissionTo('show-fast-react-province')) { + + if (is_null($user->province_id)) { + return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); + } + + $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') + ->where('rms_status', '=', 0) + ->whereNotNull('edarate_shahri_id') + ->where('road_observeds.province_id', '=', $user->province_id); + + } + elseif ($user->hasPermissionTo('show-fast-react-edarate-shahri')) { + + if (is_null($user->edarate_shahri_id)) { + return $this->errorResponse('اداره ای برای شما در سامانه ثبت نشده است!'); + } + + $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') + ->where('rms_status', '=', 0) + ->whereNotNull('edarate_shahri_id') + ->where('edarate_shahri_id', '=', $user->edarate_shahri_id); + + } + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'] + ); + } } \ No newline at end of file diff --git a/routes/v3.php b/routes/v3.php index 793ea143..fe623242 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -285,5 +285,10 @@ Route::prefix('road_observations') Route::post('/verify/{road_observed}', 'verifyBySupervisor')->name('verifyBySupervisor'); Route::get('/supervisor_report', 'supervisorCartableReport')->name('report'); Route::get('/operator_index','operatorIndex')->name('operatorIndex')->middleware('permission:show-fast-react|show-fast-react-province'); - Route::get('/operator_report', 'operatorCartableReport')->name('operatorExcelReport'); + Route::get('/complaints_index', 'complaintsIndex') + ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') + ->name('complaintsIndex'); + Route::post('/register/{roadObserved}', 'register') + ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') + ->name('register'); });