From 3a8a6e3a70b3e6e28e279588b41fa91323a087b4 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sun, 18 May 2025 13:19:26 +0330 Subject: [PATCH 01/40] create mission tables with factory and seeder --- .../Commands/RoadObservationProblems.php | 6 +- app/Console/Kernel.php | 5 +- .../Dashboard/Mission/CartableController.php | 65 +++++ .../SafetyAndPrivacyReportController.php | 52 ---- .../SupervisorReportController.php | 32 --- .../Dashboard/SafetyAndPrivacyController.php | 269 ------------------ app/Models/Mission.php | 29 ++ app/Models/MissionHistory.php | 13 + app/Models/MissionState.php | 11 + app/Models/RoadItemsProject.php | 10 + app/Models/RoadObserved.php | 11 + app/Models/RoadPatrol.php | 10 + database/factories/MissionFactory.php | 23 ++ database/factories/MissionHistoryFactory.php | 23 ++ database/factories/MissionStateFactory.php | 23 ++ ..._16_100623_create_mission_states_table.php | 29 ++ ...025_05_17_103927_create_missions_table.php | 41 +++ ...05_18_090655_create_missionables_table.php | 29 ++ ..._093843_create_mission_histories_table.php | 32 +++ database/seeders/MissionHistorySeeder.php | 17 ++ database/seeders/MissionSeeder.php | 18 ++ database/seeders/MissionStateSeeder.php | 17 ++ routes/v3.php | 8 - 23 files changed, 408 insertions(+), 365 deletions(-) create mode 100644 app/Http/Controllers/V3/Dashboard/Mission/CartableController.php delete mode 100644 app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php delete mode 100644 app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php create mode 100644 app/Models/Mission.php create mode 100644 app/Models/MissionHistory.php create mode 100644 app/Models/MissionState.php create mode 100644 database/factories/MissionFactory.php create mode 100644 database/factories/MissionHistoryFactory.php create mode 100644 database/factories/MissionStateFactory.php create mode 100644 database/migrations/2025_05_16_100623_create_mission_states_table.php create mode 100644 database/migrations/2025_05_17_103927_create_missions_table.php create mode 100644 database/migrations/2025_05_18_090655_create_missionables_table.php create mode 100644 database/migrations/2025_05_18_093843_create_mission_histories_table.php create mode 100644 database/seeders/MissionHistorySeeder.php create mode 100644 database/seeders/MissionSeeder.php create mode 100644 database/seeders/MissionStateSeeder.php diff --git a/app/Console/Commands/RoadObservationProblems.php b/app/Console/Commands/RoadObservationProblems.php index 3706103e..69cbc074 100755 --- a/app/Console/Commands/RoadObservationProblems.php +++ b/app/Console/Commands/RoadObservationProblems.php @@ -129,8 +129,8 @@ class RoadObservationProblems extends Command 'rms_city_id' => NikarayanComplaints::mapCities((int) $value->fk_Town) ?? null, 'observed_way_id' => $nominatimService->get_way_id_from_nominatim($value->XGeo, $value->YGeo) ?? null, - 'province_id' => $city ? $city['province_id'] : null, - 'city_id' => $city ? $city['city_id'] : null, + 'province_id' => $cityModel->province()->first()->id, + 'city_id' => $cityModel->id, // 'handler_type' => EdarateShahri::class, 'edarate_shahri_id' => $cityModel->edarateShahri()->first()->id, 'province_fa' => (isset($city['province_id']) ? Province::find($city['province_id'])->name_fa : null), @@ -147,7 +147,7 @@ class RoadObservationProblems extends Command return $result; } echo 'done at: ' . date("Y-m-d H:i:s") . "\n"; - $this->info("{$affectedRows} row's affected"); + echo "{$affectedRows} row's affected"; return 0; } } diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 6a2033c1..1559d32d 100755 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -36,7 +36,10 @@ class Kernel extends ConsoleKernel ->dailyAt('00:00')->appendOutputTo(storage_path('logs/report_summary.log')); $schedule->command("webservice:roadobserved --daily-mode") - ->dailyAt('00:15')->appendOutputTo(storage_path('logs/nikarayan.log')); + ->dailyAt('00:17')->appendOutputTo(storage_path('logs/nikarayan.log')); + + $schedule->command("webservice:roadobserved --daily-mode") + ->dailyAt('00:47')->appendOutputTo(storage_path('logs/nikarayan.log')); } /** diff --git a/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php b/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php new file mode 100644 index 00000000..518bd4c8 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php @@ -0,0 +1,65 @@ +countryActivity($request); - return $this->successResponse([ - 'activities' => $data, - 'provinces' => Province::all(['id', 'name_fa']) - ]); - } - - public function provinceActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse - { - $data = $safetyAndPrivacyTableService->provinceActivity($request); - return $this->successResponse([ - 'activities' => $data, - 'edarateShahri' => EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']), - ]); - } - - public function countryExcelActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse - { - $data = $safetyAndPrivacyTableService->countryActivity($request); - $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - return Excel::download(new CountryActivityReport($data), $name); - } - - public function provinceExcelActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse - { - $data = $safetyAndPrivacyTableService->provinceActivity($request); - $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - return Excel::download(new ProvinceActivityReport($data, $request), $name); - } -} diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/SupervisorReportController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/SupervisorReportController.php index 60b3ab87..601a0384 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/SupervisorReportController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/SupervisorReportController.php @@ -21,36 +21,4 @@ use Symfony\Component\HttpFoundation\BinaryFileResponse; class SupervisorReportController extends Controller { use ApiResponse; - - public function countryActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse - { - $data = $safetyAndPrivacyTableService->countryActivity($request); - return $this->successResponse([ - 'activities' => $data, - 'provinces' => Province::all(['id', 'name_fa']) - ]); - } - - public function provinceActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse - { - $data = $safetyAndPrivacyTableService->provinceActivity($request); - return $this->successResponse([ - 'activities' => $data, - 'edarateShahri' => EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']), - ]); - } - - public function countryExcelActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse - { - $data = $safetyAndPrivacyTableService->countryActivity($request); - $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - return Excel::download(new CountryActivityReport($data), $name); - } - - public function provinceExcelActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse - { - $data = $safetyAndPrivacyTableService->provinceActivity($request); - $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - return Excel::download(new ProvinceActivityReport($data, $request), $name); - } } diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php deleted file mode 100644 index 06b03021..00000000 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ /dev/null @@ -1,269 +0,0 @@ -json($safetyAndPrivacyTableService->operatorDatatable($request)); - } - - /** - * @throws Throwable - */ - 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 OperatorCartableReport($data['data']), $name); - } - - public function firstStepStore(FirstStepStoreRequest $request, NominatimService $nominatimService): JsonResponse - { - $user = auth()->user(); - - $coordinates = explode(',', $request->point); - $item = InfoItem::query() - ->where('id', $request->info_id) - ->where('item', 17) - ->firstOrFail(); - - 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], - 'operator_id' => $user->id, - 'operator_name' => $user->name, - 'province_id' => $user->province_id, - 'province_fa' => $user->province_fa, - 'info_id' => $item->id, - 'info_fa' => $item->sub_item_str, - 'city_id' => $user->city_id, - 'city_fa' => $user->city_fa, - 'activity_date_time' => $request->activity_date." ".$request->activity_time, - 'edare_shahri_id' => $user->edarate_shahri_id, - 'edare_shahri_name' => $user->edarate_shahri_name, - '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' => $step, - 'step_fa' => SafetyAndPrivacySteps::name($step), - 'is_finished' => false, - ]); - - $safety_and_privacy->recognize_picture = $request->has('recognize_picture') ? - FileFacade::save($request->recognize_picture, "safety_and_privacy/{$safety_and_privacy->id}") : - null; - $safety_and_privacy->save(); - - $user->addActivityComplete(1134); - }); - - return $this->successResponse(); - } - - public function secondStepStore(SafetyAndPrivacy $safetyAndPrivacy, SecondStepStoreRequest $request): JsonResponse - { - $user = auth()->user(); - - DB::transaction(function () use ($request, $safetyAndPrivacy, $user) { - - $need_judiciary = $request->need_judiciary; - - $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([ - '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); - }); - - return $this->successResponse(); - } - - public function thirdStepStore(SafetyAndPrivacy $safetyAndPrivacy, ThirdStepStoreRequest $request): JsonResponse - { - $user = auth()->user(); - - DB::transaction(function () use ($request, $safetyAndPrivacy, $user) { - $step = SafetyAndPrivacySteps::BARKHORD->value; - $safetyAndPrivacy->update([ - '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, - 'final_description' => 'پیام سیستمی : این عملیات پس از طی تمامی گام ها خاتمه یافت' - ]); - - $user->addActivityComplete(1136); - }); - - return $this->successResponse(); - } - - public function update(SafetyAndPrivacy $safetyAndPrivacy, UpdateRequest $request): JsonResponse - { - DB::transaction(function () use ($request, $safetyAndPrivacy) { - $safetyAndPrivacy->update([ - 'axis_type_id' => $request->axis_type_id, - 'axis_type_name' => AxisTypes::name($request->axis_type_id), - ]); - - auth()->user()->addActivityComplete(1168); - }); - - return $this->successResponse(); - } - - public function show(SafetyAndPrivacy $safetyAndPrivacy): JsonResponse - { - return $this->successResponse($safetyAndPrivacy); - } - - public function destroy(SafetyAndPrivacy $safetyAndPrivacy): JsonResponse - { - FileFacade::deleteDirectory("safety_and_privacy/{$safetyAndPrivacy->id}"); - - DB::transaction(function () use ($safetyAndPrivacy) - { - auth()->user()->addActivityComplete(1155); - $safetyAndPrivacy->delete(); - }); - - return $this->successResponse(); - } - - public function deserialize(SafetyAndPrivacy $safetyAndPrivacy): JsonResponse - { - $judiciaries = $safetyAndPrivacy->judiciary_document ? unserialize($safetyAndPrivacy->judiciary_document) : []; - - $result = []; - - foreach ($judiciaries as $judiciary) { - $result[] = Storage::disk('public')->url($judiciary); - } - - return $this->successResponse($result); - } - - public function subItems(): JsonResponse - { - return $this->successResponse(InfoItem::query() - ->where('item', '=', 17) - ->select('id', 'item', 'item_str', 'sub_item_str as name', 'sub_item_unit as unit', 'needs_image', 'needs_end_point', 'sub_item') - ->get()); - } - - public function map(Request $request): JsonResponse - { - return response()->json(DataTableFacade::run( - SafetyAndPrivacy::query(), - $request, - allowedFilters: ['*'], - allowedSortings: ['*'], - allowedSelects: ['id', 'lat', 'lon', 'step'] - )); - } - - public function confirm(SafetyAndPrivacy $safetyAndPrivacy): JsonResponse - { - $status_id = SafetyAndPrivacyStatus::CONFIRM->value; - - $safetyAndPrivacy->update([ - '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 finish(FinishRequest $request, SafetyAndPrivacy $safetyAndPrivacy): JsonResponse - { - $status_id = SafetyAndPrivacyStatus::PENDING->value; - - $safetyAndPrivacy->update([ - 'is_finished' => 1, - 'final_description' => $request->final_description, - 'status' => $status_id, - 'status_fa' => SafetyAndPrivacyStatus::name($status_id), - ]); - - return $this->successResponse(); - } - - public function supervisorIndex(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse - { - 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/Models/Mission.php b/app/Models/Mission.php new file mode 100644 index 00000000..a2184352 --- /dev/null +++ b/app/Models/Mission.php @@ -0,0 +1,29 @@ +morphedByMany(RoadItemsProject::class, 'missionable'); + } + + public function roadPatrols(): MorphToMany + { + return $this->morphedByMany(RoadPatrol::class, 'missionable'); + } + + public function roadObserveds(): MorphToMany + { + return $this->morphedByMany(RoadObserved::class, 'missionable'); + } +} diff --git a/app/Models/MissionHistory.php b/app/Models/MissionHistory.php new file mode 100644 index 00000000..6683b063 --- /dev/null +++ b/app/Models/MissionHistory.php @@ -0,0 +1,13 @@ +morphToMany(Mission::class, + 'missionable', + 'missionables', + 'missionable_id', + 'mission_id', + ); + } } diff --git a/app/Models/RoadObserved.php b/app/Models/RoadObserved.php index ce30a7a2..16d30d16 100644 --- a/app/Models/RoadObserved.php +++ b/app/Models/RoadObserved.php @@ -5,6 +5,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Support\Facades\Storage; class RoadObserved extends Model @@ -124,4 +125,14 @@ class RoadObserved extends Model : Storage::disk('public')->url($value)) ); } + + public function missions(): MorphToMany + { + return $this->morphToMany(Mission::class, + 'missionable', + 'missionables', + 'missionable_id', + 'mission_id', + ); + } } diff --git a/app/Models/RoadPatrol.php b/app/Models/RoadPatrol.php index 19ff01bd..819467f2 100644 --- a/app/Models/RoadPatrol.php +++ b/app/Models/RoadPatrol.php @@ -45,4 +45,14 @@ class RoadPatrol extends Model 'rahdar_id', ); } + + public function missions(): MorphToMany + { + return $this->morphToMany(Mission::class, + 'missionable', + 'missionables', + 'missionable_id', + 'mission_id', + ); + } } diff --git a/database/factories/MissionFactory.php b/database/factories/MissionFactory.php new file mode 100644 index 00000000..f089f944 --- /dev/null +++ b/database/factories/MissionFactory.php @@ -0,0 +1,23 @@ + + */ +class MissionFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/factories/MissionHistoryFactory.php b/database/factories/MissionHistoryFactory.php new file mode 100644 index 00000000..3033e6b5 --- /dev/null +++ b/database/factories/MissionHistoryFactory.php @@ -0,0 +1,23 @@ + + */ +class MissionHistoryFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/factories/MissionStateFactory.php b/database/factories/MissionStateFactory.php new file mode 100644 index 00000000..8b1e249b --- /dev/null +++ b/database/factories/MissionStateFactory.php @@ -0,0 +1,23 @@ + + */ +class MissionStateFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/migrations/2025_05_16_100623_create_mission_states_table.php b/database/migrations/2025_05_16_100623_create_mission_states_table.php new file mode 100644 index 00000000..5f9b472f --- /dev/null +++ b/database/migrations/2025_05_16_100623_create_mission_states_table.php @@ -0,0 +1,29 @@ +id(); + $table->string('name'); + $table->text('description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('mission_states'); + } +}; diff --git a/database/migrations/2025_05_17_103927_create_missions_table.php b/database/migrations/2025_05_17_103927_create_missions_table.php new file mode 100644 index 00000000..af2a3340 --- /dev/null +++ b/database/migrations/2025_05_17_103927_create_missions_table.php @@ -0,0 +1,41 @@ +id(); + $table->foreignId('user_id')->constrained('users'); + $table->foreignId('machine_id')->nullable()->constrained('cmms_machines'); + $table->foreignId('rahdar_id')->constrained('rahdaran'); + $table->foreignId('state_id')->constrained('mission_states'); + $table->string('state_name'); + $table->string('requested_machine_type'); + $table->string('requested_machine_numbers'); + $table->string('type'); + $table->dateTime('start_date'); + $table->dateTime('end_date'); + $table->dateTime('request_date'); + $table->text('description')->nullable(); + $table->string('start_point'); + $table->string('end_point'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('missions'); + } +}; diff --git a/database/migrations/2025_05_18_090655_create_missionables_table.php b/database/migrations/2025_05_18_090655_create_missionables_table.php new file mode 100644 index 00000000..3bd88f09 --- /dev/null +++ b/database/migrations/2025_05_18_090655_create_missionables_table.php @@ -0,0 +1,29 @@ +id(); + $table->foreignId('mission_id')->constrained('missions')->noActionOnDelete(); + $table->morphs('missionable'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('missionables'); + } +}; diff --git a/database/migrations/2025_05_18_093843_create_mission_histories_table.php b/database/migrations/2025_05_18_093843_create_mission_histories_table.php new file mode 100644 index 00000000..bf084d14 --- /dev/null +++ b/database/migrations/2025_05_18_093843_create_mission_histories_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignId('mission_id')->constrained('missions'); + $table->foreignId('user_id')->constrained('users'); + $table->foreignId('previous_state_id')->constrained('mission_states'); + $table->string('previous_state_name'); + $table->text('user_description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('mission_histories'); + } +}; diff --git a/database/seeders/MissionHistorySeeder.php b/database/seeders/MissionHistorySeeder.php new file mode 100644 index 00000000..1da76daf --- /dev/null +++ b/database/seeders/MissionHistorySeeder.php @@ -0,0 +1,17 @@ +count(5)->create(); + } +} diff --git a/database/seeders/MissionStateSeeder.php b/database/seeders/MissionStateSeeder.php new file mode 100644 index 00000000..588930c0 --- /dev/null +++ b/database/seeders/MissionStateSeeder.php @@ -0,0 +1,17 @@ +name('countryExcelActivity'); Route::get('/province_excel_activity', 'provinceExcelActivity')->name('provinceExcelActivity'); }); - - Route::prefix('supervisor') - ->name('supervisor.') - ->controller(SupervisorReportController::class) - ->group(function () { - - }); }); Route::prefix('otp') From d330908bd364ee2e73cc74d751a696f362185875 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Sun, 18 May 2025 18:12:15 +0330 Subject: [PATCH 02/40] create controller --- .../Dashboard/Mission/CartableController.php | 79 ++++++++++--------- app/Http/Requests/V3/Mission/StoreRequest.php | 46 +++++++++++ .../Requests/V3/Mission/UpdateRequest.php | 28 +++++++ app/Services/Mission/CartableService.php | 52 ++++++++++++ 4 files changed, 169 insertions(+), 36 deletions(-) create mode 100644 app/Http/Requests/V3/Mission/StoreRequest.php create mode 100644 app/Http/Requests/V3/Mission/UpdateRequest.php create mode 100644 app/Services/Mission/CartableService.php diff --git a/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php b/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php index 518bd4c8..853e91fa 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php @@ -2,62 +2,69 @@ namespace App\Http\Controllers\V3\Dashboard\Mission; +use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; +use App\Http\Requests\V3\Mission\StoreRequest; +use App\Http\Traits\ApiResponse; +use App\Models\CMMSMachine; +use App\Models\Mission; +use App\Models\Rahdaran; +use App\Services\Missions\CartableService; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; class CartableController extends Controller { - /** - * Display a listing of the resource. - */ - public function index() + use ApiResponse; + public function index(Request $request,CartableService $cartableService): JsonResponse { - // + return response()->json($cartableService->datatable($request)); } - /** - * Show the form for creating a new resource. - */ - public function create() + public function store(StoreRequest $request): JsonResponse { - // + + $mission = Mission::query()->create([ + 'user_id'=> auth()->user()->id(), + 'state_id' => $request->state_id, + 'state_name' => $request->state_name, + 'requested_machine_type' =>$request->requested_machine_type, + 'requested_machine_numbers' =>$request->requested_machine_numbers, + 'type' =>$request->type, + 'start_date' =>$request->start_date, + 'end_date' =>$request->end_date, + 'request_date' =>$request->request_date, + 'description' =>$request->description, + 'start_point' =>$request->start_point, + 'end_point' =>$request->end_point, + ]); + + if ($request->filled('machine_id')) { + $mission->machines()->attach($request->machine_ids); + } + + if ($request->filled('rahdar_id')) { + $mission->rahdars()->attach($request->rahdar_ids); + } + + return $this->successResponse(); + } - /** - * Store a newly created resource in storage. - */ - public function store(Request $request) + + public function show(Request $request,Mission $mission,CartableService $cartableService): JsonResponse { - // + return response()->json($cartableService->getMission($request->user(), $mission)); } - /** - * Display the specified resource. - */ - public function show(string $id) - { - // - } - /** - * Show the form for editing the specified resource. - */ - public function edit(string $id) - { - // - } - - /** - * Update the specified resource in storage. - */ public function update(Request $request, string $id) { // } - /** - * Remove the specified resource from storage. - */ + public function destroy(string $id) { // diff --git a/app/Http/Requests/V3/Mission/StoreRequest.php b/app/Http/Requests/V3/Mission/StoreRequest.php new file mode 100644 index 00000000..ceaf036e --- /dev/null +++ b/app/Http/Requests/V3/Mission/StoreRequest.php @@ -0,0 +1,46 @@ +user(); + return $user->hasPermissionTo('mission-manage-country') || + ($user->hasPermissionTo('mission-manage-province') && $this->province_id == $user->province_id)|| + ($user->hasPermissionTo('mission-manage-city') && $this->province_id == $user->province_id && $this->city_id == $user->city_id); + + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'machine_id' => 'nullable|exists:cmms_machines|id', + 'machine_id.*' => 'exists:cmms_machines,id', + 'rahdar_id' => 'required|exists:rahdaran|id', + 'rahdar_id.*' => 'exists:rahdaran,id', + 'state_id' => 'required|exists:mission_states|id', + 'state_name' => 'required|string|max:255', + 'requested_machine_type' => 'required|string|max:255', + 'requested_machine_numbers'=> 'required|string|max:255', + 'type' => 'required'|'string'|'max:50', + 'start_date' => 'required|date', + 'end_date' => 'required|date', + 'request_date' => 'required|date', + 'description' => 'nullable|string', + 'start_point' => 'required|string|max:255', + 'end_point' => 'required|string|max:255', + ]; + } +} diff --git a/app/Http/Requests/V3/Mission/UpdateRequest.php b/app/Http/Requests/V3/Mission/UpdateRequest.php new file mode 100644 index 00000000..59fd052d --- /dev/null +++ b/app/Http/Requests/V3/Mission/UpdateRequest.php @@ -0,0 +1,28 @@ +|string> + */ + public function rules(): array + { + return [ + // + ]; + } +} diff --git a/app/Services/Mission/CartableService.php b/app/Services/Mission/CartableService.php new file mode 100644 index 00000000..0cd41492 --- /dev/null +++ b/app/Services/Mission/CartableService.php @@ -0,0 +1,52 @@ +user(); + $allowedFilters = ['*']; + $allowedSortings = ['*']; + + $query = Mission::query(); + + if ($user->hasPermissionTo('mission-manage-city')) { + $query->where('city_id', $user->edarate_shahri_id); + } + elseif ($user->hasPermissionTo('mission-manage-province')) { + $query->where('province_id', $user->province_id); + } + elseif ($user->hasPermissionTo('mission-manage-country')) { + + } + return DataTableFacade::run( + $query, + $request, + allowedFilters: $allowedFilters, + allowedSortings: $allowedSortings + ); + + } + public function getMission(User $user, Mission $mission): Mission + { + $allowed = + $user->hasPermissionTo('mission-manage-country') || + ($user->hasPermissionTo('mission-manage-province') && + $mission->province_id === $user->province_id) || + ($user->hasPermissionTo('mission-manage-city') && + $mission->city_id === $user->edarate_shahri_id); + + abort_unless($allowed, 403); + + return $mission->load(['machines','rahdars']); + } +} \ No newline at end of file From ece2d687cddcc016d5f5b1ee605fc6d8d3383047 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 19 May 2025 09:18:32 +0330 Subject: [PATCH 03/40] create transportation unit cartable --- .../Mission/TransportationUnitController.php | 36 ++++++++++++++ .../SafetyAndPrivacy/OperatorController.php | 10 ++-- .../OperatorReportController.php | 17 +++---- .../SafetyAndPrivacy/SupervisorController.php | 9 ++-- app/Models/Mission.php | 20 ++++++++ .../Mission/TransportationUnitService.php | 34 +++++++++++++ .../OperatorService.php} | 48 ++----------------- .../SafetyAndPrivacy/SupervisorService.php | 39 +++++++++++++++ ...025_05_17_103927_create_missions_table.php | 2 +- 9 files changed, 153 insertions(+), 62 deletions(-) create mode 100644 app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php create mode 100644 app/Services/Cartables/Mission/TransportationUnitService.php rename app/Services/Cartables/{SafetyAndPrivacyTableService.php => SafetyAndPrivacy/OperatorService.php} (78%) create mode 100644 app/Services/Cartables/SafetyAndPrivacy/SupervisorService.php diff --git a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php new file mode 100644 index 00000000..f735ab17 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php @@ -0,0 +1,36 @@ +json($transportationUnitService->dataTable($request)); + } + + public function allocate(Request $request, Mission $mission): JsonResponse + { + $mission->machines()->attach($request->machines); + + $mission->update([ + 'state' => '' + ]); + + return $this->successResponse(); + } + + public function deallocate() + { + + } +} diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorController.php index b6726fe4..995233c1 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorController.php @@ -17,7 +17,7 @@ use App\Http\Requests\V3\SafetyAndPrivacy\UpdateRequest; use App\Http\Traits\ApiResponse; use App\Models\InfoItem; use App\Models\SafetyAndPrivacy; -use App\Services\Cartables\SafetyAndPrivacyTableService; +use App\Services\Cartables\SafetyAndPrivacy\OperatorService; use App\Services\NominatimService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -34,18 +34,18 @@ class OperatorController extends Controller /** * @throws Throwable */ - public function index(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse + public function index(Request $request, OperatorService $operatorService): JsonResponse { - return response()->json($safetyAndPrivacyTableService->operatorDatatable($request)); + return response()->json($operatorService->datatable($request)); } /** * @throws Throwable */ - public function excelReport(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + public function excelReport(Request $request, OperatorService $operatorService): BinaryFileResponse { $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - $data = $safetyAndPrivacyTableService->operatorDatatable($request); + $data = $operatorService->datatable($request); return Excel::download(new OperatorCartableReport($data['data']), $name); } diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReportController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReportController.php index 31b41c52..0e3c5e78 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReportController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReportController.php @@ -8,6 +8,7 @@ use App\Http\Controllers\Controller; use App\Http\Traits\ApiResponse; use App\Models\EdarateShahri; use App\Models\Province; +use App\Services\Cartables\SafetyAndPrivacy\OperatorService; use App\Services\Cartables\SafetyAndPrivacyTableService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -18,34 +19,34 @@ class OperatorReportController extends Controller { use ApiResponse; - public function countryActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse + public function countryActivity(Request $request, OperatorService $operatorService): JsonResponse { - $data = $safetyAndPrivacyTableService->countryActivity($request); + $data = $operatorService->countryActivity($request); return $this->successResponse([ 'activities' => $data, 'provinces' => Province::all(['id', 'name_fa']) ]); } - public function provinceActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse + public function provinceActivity(Request $request, OperatorService $operatorService): JsonResponse { - $data = $safetyAndPrivacyTableService->provinceActivity($request); + $data = $operatorService->provinceActivity($request); return $this->successResponse([ 'activities' => $data, 'edarateShahri' => EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']), ]); } - public function countryExcelActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + public function countryExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse { - $data = $safetyAndPrivacyTableService->countryActivity($request); + $data = $operatorService->countryActivity($request); $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; return Excel::download(new CountryActivityReport($data), $name); } - public function provinceExcelActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + public function provinceExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse { - $data = $safetyAndPrivacyTableService->provinceActivity($request); + $data = $operatorService->provinceActivity($request); $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; return Excel::download(new ProvinceActivityReport($data, $request), $name); } diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/SupervisorController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/SupervisorController.php index fc026166..0cd984c5 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/SupervisorController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/SupervisorController.php @@ -8,6 +8,7 @@ use App\Http\Controllers\Controller; use App\Http\Requests\V3\SafetyAndPrivacy\RejectRequest; use App\Http\Traits\ApiResponse; use App\Models\SafetyAndPrivacy; +use App\Services\Cartables\SafetyAndPrivacy\SupervisorService; use App\Services\Cartables\SafetyAndPrivacyTableService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -22,18 +23,18 @@ class SupervisorController extends Controller /** * @throws Throwable */ - public function index(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse + public function index(Request $request, SupervisorService $supervisorService): JsonResponse { - return response()->json($safetyAndPrivacyTableService->supervisorDataTable($request)); + return response()->json($supervisorService->dataTable($request)); } /** * @throws Throwable */ - public function excelReport(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + public function excelReport(Request $request, SupervisorService $supervisorService): BinaryFileResponse { $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - $data = $safetyAndPrivacyTableService->supervisorDataTable($request); + $data = $supervisorService->dataTable($request); return Excel::download(new SupervisorCartableReport($data['data']), $name); } diff --git a/app/Models/Mission.php b/app/Models/Mission.php index a2184352..28ba82eb 100644 --- a/app/Models/Mission.php +++ b/app/Models/Mission.php @@ -26,4 +26,24 @@ class Mission extends Model { return $this->morphedByMany(RoadObserved::class, 'missionable'); } + + public function machines(): MorphToMany + { + return $this->morphToMany(CMMSMachine::class, + 'machinable', + 'machinables', + 'machinable_id', + 'machine_id' + ); + } + + public function rahdaran(): MorphToMany + { + return $this->morphToMany(Rahdaran::class, + 'rahdarable', + 'rahdarables', + 'rahdarable_id', + 'rahdar_id', + ); + } } diff --git a/app/Services/Cartables/Mission/TransportationUnitService.php b/app/Services/Cartables/Mission/TransportationUnitService.php new file mode 100644 index 00000000..03c4d203 --- /dev/null +++ b/app/Services/Cartables/Mission/TransportationUnitService.php @@ -0,0 +1,34 @@ +user(); + + $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', 'operator_description' + ]; + + throw_if(is_null($user->edarate_shahri_id), new ProhibitedAction('اداره ای برای شما در سامانه ثبت نشده است!')); + + $query = Mission::query()->where('', '=', ''); + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: $fields + ); + } +} \ No newline at end of file diff --git a/app/Services/Cartables/SafetyAndPrivacyTableService.php b/app/Services/Cartables/SafetyAndPrivacy/OperatorService.php similarity index 78% rename from app/Services/Cartables/SafetyAndPrivacyTableService.php rename to app/Services/Cartables/SafetyAndPrivacy/OperatorService.php index b6331901..f41270fd 100644 --- a/app/Services/Cartables/SafetyAndPrivacyTableService.php +++ b/app/Services/Cartables/SafetyAndPrivacy/OperatorService.php @@ -1,24 +1,15 @@ user(); @@ -41,37 +32,6 @@ class SafetyAndPrivacyTableService ); } - /** - * @throws Throwable - */ - public function supervisorDataTable(Request $request) - { - $user = auth()->user(); - - $fields = [ - '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' - ]; - - $query = SafetyAndPrivacy::query(); - - if ($user->hasPermissionTo('show-safety-and-privacy-operator-cartable-province')) - { - throw_if(is_null($user->province_id), new ProhibitedAction('استانی برای شما در سامانه ثبت نشده است!')); - - $query = $query->where('province_id', '=', $user->province_id); - } - - return DataTableFacade::run( - $query, - $request, - allowedFilters: ['*'], - allowedSortings: ['*'], - allowedSelects: $fields - ); - } - public function countryActivity(Request $request): array { $activities = []; @@ -186,4 +146,4 @@ class SafetyAndPrivacyTableService return array_values($activities); } -} +} \ No newline at end of file diff --git a/app/Services/Cartables/SafetyAndPrivacy/SupervisorService.php b/app/Services/Cartables/SafetyAndPrivacy/SupervisorService.php new file mode 100644 index 00000000..0579bc8b --- /dev/null +++ b/app/Services/Cartables/SafetyAndPrivacy/SupervisorService.php @@ -0,0 +1,39 @@ +user(); + + $fields = [ + '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' + ]; + + $query = SafetyAndPrivacy::query(); + + if ($user->hasPermissionTo('show-safety-and-privacy-operator-cartable-province')) + { + throw_if(is_null($user->province_id), new ProhibitedAction('استانی برای شما در سامانه ثبت نشده است!')); + + $query = $query->where('province_id', '=', $user->province_id); + } + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: $fields + ); + } +} \ No newline at end of file diff --git a/database/migrations/2025_05_17_103927_create_missions_table.php b/database/migrations/2025_05_17_103927_create_missions_table.php index af2a3340..385e8a18 100644 --- a/database/migrations/2025_05_17_103927_create_missions_table.php +++ b/database/migrations/2025_05_17_103927_create_missions_table.php @@ -19,7 +19,7 @@ return new class extends Migration $table->foreignId('state_id')->constrained('mission_states'); $table->string('state_name'); $table->string('requested_machine_type'); - $table->string('requested_machine_numbers'); + $table->integer('requested_machine_numbers'); $table->string('type'); $table->dateTime('start_date'); $table->dateTime('end_date'); From 367eb55db10fa50085d7d05df91d23f515fe6db8 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 19 May 2025 10:29:59 +0330 Subject: [PATCH 04/40] create mission state enum --- app/Enums/MissionStates.php | 28 ++++++++++++++++++ .../Mission/TransportationUnitController.php | 19 +++++++++--- .../TransportaionUnit/AllocateRequest.php | 29 +++++++++++++++++++ .../Mission/TransportationUnitService.php | 9 +++--- ...025_05_17_103927_create_missions_table.php | 12 +++++--- 5 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 app/Enums/MissionStates.php create mode 100644 app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php diff --git a/app/Enums/MissionStates.php b/app/Enums/MissionStates.php new file mode 100644 index 00000000..9a389cb4 --- /dev/null +++ b/app/Enums/MissionStates.php @@ -0,0 +1,28 @@ + 'درخواست ایجاد شد و در حال بررسی در توسط واحد نقلیه است', + 2 => 'خودرو اختصاص داده شد و درخواست توسط واحد کنترل در حال بررسی است', + 3 => 'درخواست توسط واحد کنترل تایید شد و ماموریت آغاز می شود', + 4 => 'اتمام ماموریت', + 5 => 'عدم تخصیص خودرو توسط واحد نقلیه و بازگشت درخواست به کارتابل کاربر', + 6 => 'عدم تایید توسط واحد کنترل', + ]; + + return $mapArray[$state]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php index f735ab17..1262df58 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php @@ -2,7 +2,9 @@ namespace App\Http\Controllers\V3\Dashboard\Mission; +use App\Enums\MissionStates; use App\Http\Controllers\Controller; +use App\Http\Requests\V3\Mission\TransportaionUnit\AllocateRequest; use App\Http\Traits\ApiResponse; use App\Models\Mission; use App\Services\Cartables\Mission\TransportationUnitService; @@ -18,19 +20,28 @@ class TransportationUnitController extends Controller return response()->json($transportationUnitService->dataTable($request)); } - public function allocate(Request $request, Mission $mission): JsonResponse + public function allocate(AllocateRequest $request, Mission $mission): JsonResponse { $mission->machines()->attach($request->machines); + $state = MissionStates::PENDING_CONFIRMATION->value; $mission->update([ - 'state' => '' + 'state_id' => $state, + 'state_name' => MissionStates::name($state), ]); return $this->successResponse(); } - public function deallocate() + public function deallocate(Mission $mission): JsonResponse { - + $state = MissionStates::REJECT_BY_TRANSPORTATION->value; + + $mission->update([ + 'state_id' => $state, + 'state_name' => MissionStates::name($state), + ]); + + return $this->successResponse(); } } diff --git a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php new file mode 100644 index 00000000..bac0e6bd --- /dev/null +++ b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php @@ -0,0 +1,29 @@ +mission->edare_shahri_id == auth()->user()->edarate_shahri_id; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'machines' => 'required|array', + 'machines.*' => 'required|integer|exists:cmms_machines,id', + ]; + } +} diff --git a/app/Services/Cartables/Mission/TransportationUnitService.php b/app/Services/Cartables/Mission/TransportationUnitService.php index 03c4d203..0f9a56a3 100644 --- a/app/Services/Cartables/Mission/TransportationUnitService.php +++ b/app/Services/Cartables/Mission/TransportationUnitService.php @@ -2,6 +2,7 @@ namespace App\Services\Cartables\Mission; +use App\Enums\MissionStates; use App\Exceptions\ProhibitedAction; use App\Facades\DataTable\DataTableFacade; use App\Models\Mission; @@ -14,14 +15,12 @@ class TransportationUnitService $user = auth()->user(); $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', 'operator_description' + 'id', '', '', '', '' ]; - throw_if(is_null($user->edarate_shahri_id), new ProhibitedAction('اداره ای برای شما در سامانه ثبت نشده است!')); +// throw_if(is_null($user->edarate_shahri_id), new ProhibitedAction('اداره ای برای شما در سامانه ثبت نشده است!')); - $query = Mission::query()->where('', '=', ''); + $query = Mission::query()->where('state_id', '=', MissionStates::REQUEST_CREATED->value); return DataTableFacade::run( $query, diff --git a/database/migrations/2025_05_17_103927_create_missions_table.php b/database/migrations/2025_05_17_103927_create_missions_table.php index 385e8a18..adbad8a6 100644 --- a/database/migrations/2025_05_17_103927_create_missions_table.php +++ b/database/migrations/2025_05_17_103927_create_missions_table.php @@ -13,11 +13,15 @@ return new class extends Migration { Schema::create('missions', function (Blueprint $table) { $table->id(); - $table->foreignId('user_id')->constrained('users'); - $table->foreignId('machine_id')->nullable()->constrained('cmms_machines'); - $table->foreignId('rahdar_id')->constrained('rahdaran'); - $table->foreignId('state_id')->constrained('mission_states'); + $table->foreignId('user_id')->constrained('users')->cascadeOnDelete(); + $table->foreignId('machine_id')->nullable()->constrained('cmms_machines')->noActionOnDelete(); + $table->foreignId('rahdar_id')->constrained('rahdaran')->noActionOnDelete(); + $table->foreignId('state_id')->constrained('mission_states')->noActionOnDelete(); $table->string('state_name'); + $table->foreignId('province_id')->constrained('provinces')->noActionOnDelete(); + $table->string('province_name'); + $table->foreignId('edare_shahri_id')->constrained('edarate_shahri')->noActionOnDelete(); + $table->string('edare_shahri_name'); $table->string('requested_machine_type'); $table->integer('requested_machine_numbers'); $table->string('type'); From 4ff296e476a4a6b6036c78b09c282a753c1c789f Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 19 May 2025 14:40:02 +0330 Subject: [PATCH 05/40] create show access middleware --- app/Enums/MissionStates.php | 3 +- app/Http/Middleware/ValidateShowAccess.php | 32 +++++++++++++++++++ .../Mission/TransportationUnitService.php | 14 ++++---- ...025_05_17_103927_create_missions_table.php | 5 +-- 4 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 app/Http/Middleware/ValidateShowAccess.php diff --git a/app/Enums/MissionStates.php b/app/Enums/MissionStates.php index 9a389cb4..5be6b18a 100644 --- a/app/Enums/MissionStates.php +++ b/app/Enums/MissionStates.php @@ -7,10 +7,10 @@ enum MissionStates: int case REQUEST_CREATED= 1; case PENDING_CONFIRMATION = 2; case START_MISSION = 3; - case END_MISSION = 4; case REJECT_BY_TRANSPORTATION = 5; case REJECT_BY_CONTROL_UNIT = 6; + case CANCELLED = 7; public static function name(int $state): string { @@ -21,6 +21,7 @@ enum MissionStates: int 4 => 'اتمام ماموریت', 5 => 'عدم تخصیص خودرو توسط واحد نقلیه و بازگشت درخواست به کارتابل کاربر', 6 => 'عدم تایید توسط واحد کنترل', + 7 => 'ماموریت لغو شد', ]; return $mapArray[$state]; diff --git a/app/Http/Middleware/ValidateShowAccess.php b/app/Http/Middleware/ValidateShowAccess.php new file mode 100644 index 00000000..e0868ca6 --- /dev/null +++ b/app/Http/Middleware/ValidateShowAccess.php @@ -0,0 +1,32 @@ +province_id), + new ProhibitedAction('استانی برای شما در سامانه ثبت نشده است!')); + + throw_if(is_null($user->edarate_shahri_id), + new ProhibitedAction('اداره شهری برای شما در سامانه ثبت نشده است!')); + + return $next($request); + } +} diff --git a/app/Services/Cartables/Mission/TransportationUnitService.php b/app/Services/Cartables/Mission/TransportationUnitService.php index 0f9a56a3..d4535cad 100644 --- a/app/Services/Cartables/Mission/TransportationUnitService.php +++ b/app/Services/Cartables/Mission/TransportationUnitService.php @@ -3,24 +3,24 @@ namespace App\Services\Cartables\Mission; use App\Enums\MissionStates; -use App\Exceptions\ProhibitedAction; use App\Facades\DataTable\DataTableFacade; use App\Models\Mission; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; class TransportationUnitService { public function dataTable(Request $request) { - $user = auth()->user(); - $fields = [ - 'id', '', '', '', '' + 'id', 'user_id', 'username', 'state_name', 'province_name', 'edare_shahri_name', + 'description', 'requested_machine_type', 'requested_machine_numbers', 'type', + 'start_date', 'end_date', 'request_date', 'start_point', 'end_point', ]; -// throw_if(is_null($user->edarate_shahri_id), new ProhibitedAction('اداره ای برای شما در سامانه ثبت نشده است!')); - - $query = Mission::query()->where('state_id', '=', MissionStates::REQUEST_CREATED->value); + $query = Mission::query() + ->where('state_id', '=', MissionStates::REQUEST_CREATED->value) + ->where('edare_shahri_name', '=', Auth::user()->edarate_shahri_id); return DataTableFacade::run( $query, diff --git a/database/migrations/2025_05_17_103927_create_missions_table.php b/database/migrations/2025_05_17_103927_create_missions_table.php index adbad8a6..3d68f8dc 100644 --- a/database/migrations/2025_05_17_103927_create_missions_table.php +++ b/database/migrations/2025_05_17_103927_create_missions_table.php @@ -14,13 +14,14 @@ return new class extends Migration Schema::create('missions', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained('users')->cascadeOnDelete(); + $table->string('username'); $table->foreignId('machine_id')->nullable()->constrained('cmms_machines')->noActionOnDelete(); $table->foreignId('rahdar_id')->constrained('rahdaran')->noActionOnDelete(); $table->foreignId('state_id')->constrained('mission_states')->noActionOnDelete(); $table->string('state_name'); - $table->foreignId('province_id')->constrained('provinces')->noActionOnDelete(); + $table->foreignId('province_id')->nullable()->constrained('provinces')->noActionOnDelete(); $table->string('province_name'); - $table->foreignId('edare_shahri_id')->constrained('edarate_shahri')->noActionOnDelete(); + $table->foreignId('edare_shahri_id')->nullable()->constrained('edarate_shahri')->noActionOnDelete(); $table->string('edare_shahri_name'); $table->string('requested_machine_type'); $table->integer('requested_machine_numbers'); From 62ed8d2973683c25f03bad78b48727b86b0b6832 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 19 May 2025 09:18:32 +0330 Subject: [PATCH 06/40] create transportation unit cartable --- .../Mission/TransportationUnitController.php | 36 ++++++++++++++ .../SafetyAndPrivacy/OperatorController.php | 10 ++-- .../OperatorReportController.php | 17 +++---- .../SafetyAndPrivacy/SupervisorController.php | 9 ++-- app/Models/Mission.php | 20 ++++++++ .../Mission/TransportationUnitService.php | 34 +++++++++++++ .../OperatorService.php} | 48 ++----------------- .../SafetyAndPrivacy/SupervisorService.php | 39 +++++++++++++++ ...025_05_17_103927_create_missions_table.php | 2 +- 9 files changed, 153 insertions(+), 62 deletions(-) create mode 100644 app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php create mode 100644 app/Services/Cartables/Mission/TransportationUnitService.php rename app/Services/Cartables/{SafetyAndPrivacyTableService.php => SafetyAndPrivacy/OperatorService.php} (78%) create mode 100644 app/Services/Cartables/SafetyAndPrivacy/SupervisorService.php diff --git a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php new file mode 100644 index 00000000..f735ab17 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php @@ -0,0 +1,36 @@ +json($transportationUnitService->dataTable($request)); + } + + public function allocate(Request $request, Mission $mission): JsonResponse + { + $mission->machines()->attach($request->machines); + + $mission->update([ + 'state' => '' + ]); + + return $this->successResponse(); + } + + public function deallocate() + { + + } +} diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorController.php index b6726fe4..995233c1 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorController.php @@ -17,7 +17,7 @@ use App\Http\Requests\V3\SafetyAndPrivacy\UpdateRequest; use App\Http\Traits\ApiResponse; use App\Models\InfoItem; use App\Models\SafetyAndPrivacy; -use App\Services\Cartables\SafetyAndPrivacyTableService; +use App\Services\Cartables\SafetyAndPrivacy\OperatorService; use App\Services\NominatimService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -34,18 +34,18 @@ class OperatorController extends Controller /** * @throws Throwable */ - public function index(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse + public function index(Request $request, OperatorService $operatorService): JsonResponse { - return response()->json($safetyAndPrivacyTableService->operatorDatatable($request)); + return response()->json($operatorService->datatable($request)); } /** * @throws Throwable */ - public function excelReport(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + public function excelReport(Request $request, OperatorService $operatorService): BinaryFileResponse { $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - $data = $safetyAndPrivacyTableService->operatorDatatable($request); + $data = $operatorService->datatable($request); return Excel::download(new OperatorCartableReport($data['data']), $name); } diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReportController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReportController.php index 31b41c52..0e3c5e78 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReportController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/OperatorReportController.php @@ -8,6 +8,7 @@ use App\Http\Controllers\Controller; use App\Http\Traits\ApiResponse; use App\Models\EdarateShahri; use App\Models\Province; +use App\Services\Cartables\SafetyAndPrivacy\OperatorService; use App\Services\Cartables\SafetyAndPrivacyTableService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -18,34 +19,34 @@ class OperatorReportController extends Controller { use ApiResponse; - public function countryActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse + public function countryActivity(Request $request, OperatorService $operatorService): JsonResponse { - $data = $safetyAndPrivacyTableService->countryActivity($request); + $data = $operatorService->countryActivity($request); return $this->successResponse([ 'activities' => $data, 'provinces' => Province::all(['id', 'name_fa']) ]); } - public function provinceActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse + public function provinceActivity(Request $request, OperatorService $operatorService): JsonResponse { - $data = $safetyAndPrivacyTableService->provinceActivity($request); + $data = $operatorService->provinceActivity($request); return $this->successResponse([ 'activities' => $data, 'edarateShahri' => EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']), ]); } - public function countryExcelActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + public function countryExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse { - $data = $safetyAndPrivacyTableService->countryActivity($request); + $data = $operatorService->countryActivity($request); $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; return Excel::download(new CountryActivityReport($data), $name); } - public function provinceExcelActivity(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + public function provinceExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse { - $data = $safetyAndPrivacyTableService->provinceActivity($request); + $data = $operatorService->provinceActivity($request); $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; return Excel::download(new ProvinceActivityReport($data, $request), $name); } diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/SupervisorController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/SupervisorController.php index fc026166..0cd984c5 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/SupervisorController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacy/SupervisorController.php @@ -8,6 +8,7 @@ use App\Http\Controllers\Controller; use App\Http\Requests\V3\SafetyAndPrivacy\RejectRequest; use App\Http\Traits\ApiResponse; use App\Models\SafetyAndPrivacy; +use App\Services\Cartables\SafetyAndPrivacy\SupervisorService; use App\Services\Cartables\SafetyAndPrivacyTableService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -22,18 +23,18 @@ class SupervisorController extends Controller /** * @throws Throwable */ - public function index(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): JsonResponse + public function index(Request $request, SupervisorService $supervisorService): JsonResponse { - return response()->json($safetyAndPrivacyTableService->supervisorDataTable($request)); + return response()->json($supervisorService->dataTable($request)); } /** * @throws Throwable */ - public function excelReport(Request $request, SafetyAndPrivacyTableService $safetyAndPrivacyTableService): BinaryFileResponse + public function excelReport(Request $request, SupervisorService $supervisorService): BinaryFileResponse { $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - $data = $safetyAndPrivacyTableService->supervisorDataTable($request); + $data = $supervisorService->dataTable($request); return Excel::download(new SupervisorCartableReport($data['data']), $name); } diff --git a/app/Models/Mission.php b/app/Models/Mission.php index a2184352..28ba82eb 100644 --- a/app/Models/Mission.php +++ b/app/Models/Mission.php @@ -26,4 +26,24 @@ class Mission extends Model { return $this->morphedByMany(RoadObserved::class, 'missionable'); } + + public function machines(): MorphToMany + { + return $this->morphToMany(CMMSMachine::class, + 'machinable', + 'machinables', + 'machinable_id', + 'machine_id' + ); + } + + public function rahdaran(): MorphToMany + { + return $this->morphToMany(Rahdaran::class, + 'rahdarable', + 'rahdarables', + 'rahdarable_id', + 'rahdar_id', + ); + } } diff --git a/app/Services/Cartables/Mission/TransportationUnitService.php b/app/Services/Cartables/Mission/TransportationUnitService.php new file mode 100644 index 00000000..03c4d203 --- /dev/null +++ b/app/Services/Cartables/Mission/TransportationUnitService.php @@ -0,0 +1,34 @@ +user(); + + $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', 'operator_description' + ]; + + throw_if(is_null($user->edarate_shahri_id), new ProhibitedAction('اداره ای برای شما در سامانه ثبت نشده است!')); + + $query = Mission::query()->where('', '=', ''); + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: $fields + ); + } +} \ No newline at end of file diff --git a/app/Services/Cartables/SafetyAndPrivacyTableService.php b/app/Services/Cartables/SafetyAndPrivacy/OperatorService.php similarity index 78% rename from app/Services/Cartables/SafetyAndPrivacyTableService.php rename to app/Services/Cartables/SafetyAndPrivacy/OperatorService.php index b6331901..f41270fd 100644 --- a/app/Services/Cartables/SafetyAndPrivacyTableService.php +++ b/app/Services/Cartables/SafetyAndPrivacy/OperatorService.php @@ -1,24 +1,15 @@ user(); @@ -41,37 +32,6 @@ class SafetyAndPrivacyTableService ); } - /** - * @throws Throwable - */ - public function supervisorDataTable(Request $request) - { - $user = auth()->user(); - - $fields = [ - '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' - ]; - - $query = SafetyAndPrivacy::query(); - - if ($user->hasPermissionTo('show-safety-and-privacy-operator-cartable-province')) - { - throw_if(is_null($user->province_id), new ProhibitedAction('استانی برای شما در سامانه ثبت نشده است!')); - - $query = $query->where('province_id', '=', $user->province_id); - } - - return DataTableFacade::run( - $query, - $request, - allowedFilters: ['*'], - allowedSortings: ['*'], - allowedSelects: $fields - ); - } - public function countryActivity(Request $request): array { $activities = []; @@ -186,4 +146,4 @@ class SafetyAndPrivacyTableService return array_values($activities); } -} +} \ No newline at end of file diff --git a/app/Services/Cartables/SafetyAndPrivacy/SupervisorService.php b/app/Services/Cartables/SafetyAndPrivacy/SupervisorService.php new file mode 100644 index 00000000..0579bc8b --- /dev/null +++ b/app/Services/Cartables/SafetyAndPrivacy/SupervisorService.php @@ -0,0 +1,39 @@ +user(); + + $fields = [ + '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' + ]; + + $query = SafetyAndPrivacy::query(); + + if ($user->hasPermissionTo('show-safety-and-privacy-operator-cartable-province')) + { + throw_if(is_null($user->province_id), new ProhibitedAction('استانی برای شما در سامانه ثبت نشده است!')); + + $query = $query->where('province_id', '=', $user->province_id); + } + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: $fields + ); + } +} \ No newline at end of file diff --git a/database/migrations/2025_05_17_103927_create_missions_table.php b/database/migrations/2025_05_17_103927_create_missions_table.php index af2a3340..385e8a18 100644 --- a/database/migrations/2025_05_17_103927_create_missions_table.php +++ b/database/migrations/2025_05_17_103927_create_missions_table.php @@ -19,7 +19,7 @@ return new class extends Migration $table->foreignId('state_id')->constrained('mission_states'); $table->string('state_name'); $table->string('requested_machine_type'); - $table->string('requested_machine_numbers'); + $table->integer('requested_machine_numbers'); $table->string('type'); $table->dateTime('start_date'); $table->dateTime('end_date'); From b6d66b9191aef98a9965f5d53fa3f35ce989b4c6 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 19 May 2025 10:29:59 +0330 Subject: [PATCH 07/40] create mission state enum --- app/Enums/MissionStates.php | 28 ++++++++++++++++++ .../Mission/TransportationUnitController.php | 19 +++++++++--- .../TransportaionUnit/AllocateRequest.php | 29 +++++++++++++++++++ .../Mission/TransportationUnitService.php | 9 +++--- ...025_05_17_103927_create_missions_table.php | 12 +++++--- 5 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 app/Enums/MissionStates.php create mode 100644 app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php diff --git a/app/Enums/MissionStates.php b/app/Enums/MissionStates.php new file mode 100644 index 00000000..9a389cb4 --- /dev/null +++ b/app/Enums/MissionStates.php @@ -0,0 +1,28 @@ + 'درخواست ایجاد شد و در حال بررسی در توسط واحد نقلیه است', + 2 => 'خودرو اختصاص داده شد و درخواست توسط واحد کنترل در حال بررسی است', + 3 => 'درخواست توسط واحد کنترل تایید شد و ماموریت آغاز می شود', + 4 => 'اتمام ماموریت', + 5 => 'عدم تخصیص خودرو توسط واحد نقلیه و بازگشت درخواست به کارتابل کاربر', + 6 => 'عدم تایید توسط واحد کنترل', + ]; + + return $mapArray[$state]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php index f735ab17..1262df58 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php @@ -2,7 +2,9 @@ namespace App\Http\Controllers\V3\Dashboard\Mission; +use App\Enums\MissionStates; use App\Http\Controllers\Controller; +use App\Http\Requests\V3\Mission\TransportaionUnit\AllocateRequest; use App\Http\Traits\ApiResponse; use App\Models\Mission; use App\Services\Cartables\Mission\TransportationUnitService; @@ -18,19 +20,28 @@ class TransportationUnitController extends Controller return response()->json($transportationUnitService->dataTable($request)); } - public function allocate(Request $request, Mission $mission): JsonResponse + public function allocate(AllocateRequest $request, Mission $mission): JsonResponse { $mission->machines()->attach($request->machines); + $state = MissionStates::PENDING_CONFIRMATION->value; $mission->update([ - 'state' => '' + 'state_id' => $state, + 'state_name' => MissionStates::name($state), ]); return $this->successResponse(); } - public function deallocate() + public function deallocate(Mission $mission): JsonResponse { - + $state = MissionStates::REJECT_BY_TRANSPORTATION->value; + + $mission->update([ + 'state_id' => $state, + 'state_name' => MissionStates::name($state), + ]); + + return $this->successResponse(); } } diff --git a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php new file mode 100644 index 00000000..bac0e6bd --- /dev/null +++ b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php @@ -0,0 +1,29 @@ +mission->edare_shahri_id == auth()->user()->edarate_shahri_id; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'machines' => 'required|array', + 'machines.*' => 'required|integer|exists:cmms_machines,id', + ]; + } +} diff --git a/app/Services/Cartables/Mission/TransportationUnitService.php b/app/Services/Cartables/Mission/TransportationUnitService.php index 03c4d203..0f9a56a3 100644 --- a/app/Services/Cartables/Mission/TransportationUnitService.php +++ b/app/Services/Cartables/Mission/TransportationUnitService.php @@ -2,6 +2,7 @@ namespace App\Services\Cartables\Mission; +use App\Enums\MissionStates; use App\Exceptions\ProhibitedAction; use App\Facades\DataTable\DataTableFacade; use App\Models\Mission; @@ -14,14 +15,12 @@ class TransportationUnitService $user = auth()->user(); $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', 'operator_description' + 'id', '', '', '', '' ]; - throw_if(is_null($user->edarate_shahri_id), new ProhibitedAction('اداره ای برای شما در سامانه ثبت نشده است!')); +// throw_if(is_null($user->edarate_shahri_id), new ProhibitedAction('اداره ای برای شما در سامانه ثبت نشده است!')); - $query = Mission::query()->where('', '=', ''); + $query = Mission::query()->where('state_id', '=', MissionStates::REQUEST_CREATED->value); return DataTableFacade::run( $query, diff --git a/database/migrations/2025_05_17_103927_create_missions_table.php b/database/migrations/2025_05_17_103927_create_missions_table.php index 385e8a18..adbad8a6 100644 --- a/database/migrations/2025_05_17_103927_create_missions_table.php +++ b/database/migrations/2025_05_17_103927_create_missions_table.php @@ -13,11 +13,15 @@ return new class extends Migration { Schema::create('missions', function (Blueprint $table) { $table->id(); - $table->foreignId('user_id')->constrained('users'); - $table->foreignId('machine_id')->nullable()->constrained('cmms_machines'); - $table->foreignId('rahdar_id')->constrained('rahdaran'); - $table->foreignId('state_id')->constrained('mission_states'); + $table->foreignId('user_id')->constrained('users')->cascadeOnDelete(); + $table->foreignId('machine_id')->nullable()->constrained('cmms_machines')->noActionOnDelete(); + $table->foreignId('rahdar_id')->constrained('rahdaran')->noActionOnDelete(); + $table->foreignId('state_id')->constrained('mission_states')->noActionOnDelete(); $table->string('state_name'); + $table->foreignId('province_id')->constrained('provinces')->noActionOnDelete(); + $table->string('province_name'); + $table->foreignId('edare_shahri_id')->constrained('edarate_shahri')->noActionOnDelete(); + $table->string('edare_shahri_name'); $table->string('requested_machine_type'); $table->integer('requested_machine_numbers'); $table->string('type'); From f6f5bc4aa4f5fd02c7b71130602ffa10fbf24178 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Mon, 19 May 2025 09:23:45 +0330 Subject: [PATCH 08/40] compleate controller --- .../Dashboard/Mission/CartableController.php | 44 ++++++++++++------- app/Http/Requests/V3/Mission/StoreRequest.php | 24 ++++------ .../Requests/V3/Mission/UpdateRequest.php | 14 +++++- app/Services/Mission/CartableService.php | 13 ------ 4 files changed, 48 insertions(+), 47 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php b/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php index 853e91fa..fde01024 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\V3\Dashboard\Mission; use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; use App\Http\Requests\V3\Mission\StoreRequest; +use App\Http\Requests\V3\Mission\UpdateRequest; use App\Http\Traits\ApiResponse; use App\Models\CMMSMachine; use App\Models\Mission; @@ -17,6 +18,7 @@ use Illuminate\Support\Facades\DB; class CartableController extends Controller { use ApiResponse; + public function index(Request $request,CartableService $cartableService): JsonResponse { return response()->json($cartableService->datatable($request)); @@ -40,33 +42,43 @@ class CartableController extends Controller 'end_point' =>$request->end_point, ]); - if ($request->filled('machine_id')) { - $mission->machines()->attach($request->machine_ids); - } - - if ($request->filled('rahdar_id')) { - $mission->rahdars()->attach($request->rahdar_ids); - } + $mission->rahdaran()->attach($request->rahdaran_id); return $this->successResponse(); } - - public function show(Request $request,Mission $mission,CartableService $cartableService): JsonResponse + public function show(Mission $mission): JsonResponse { - return response()->json($cartableService->getMission($request->user(), $mission)); + return $this->successResponse($mission); } - - public function update(Request $request, string $id) + public function update(UpdateRequest $request,Mission $mission) { - // + $mission->update([ + 'state_id' => $request->state_id, + 'state_name' => $request->state_name, + 'requested_machine_type' =>$request->requested_machine_type, + 'requested_machine_numbers' =>$request->requested_machine_numbers, + 'type' =>$request->type, + 'start_date' =>$request->start_date, + 'end_date' =>$request->end_date, + 'request_date' =>$request->request_date, + 'description' =>$request->description, + 'start_point' =>$request->start_point, + 'end_point' =>$request->end_point, + ]); + + $mission->rahdaran()->attach($request->rahdaran_id); + + return $this->successResponse(); + } - - public function destroy(string $id) + public function destroy(Mission $mission) { - // + $mission->delete(); + return $this->successResponse($mission); + } } diff --git a/app/Http/Requests/V3/Mission/StoreRequest.php b/app/Http/Requests/V3/Mission/StoreRequest.php index ceaf036e..ef3a86e3 100644 --- a/app/Http/Requests/V3/Mission/StoreRequest.php +++ b/app/Http/Requests/V3/Mission/StoreRequest.php @@ -11,11 +11,7 @@ class StoreRequest extends FormRequest */ public function authorize(): bool { - $user = $this->user(); - return $user->hasPermissionTo('mission-manage-country') || - ($user->hasPermissionTo('mission-manage-province') && $this->province_id == $user->province_id)|| - ($user->hasPermissionTo('mission-manage-city') && $this->province_id == $user->province_id && $this->city_id == $user->city_id); - + return true; } /** @@ -26,21 +22,17 @@ class StoreRequest extends FormRequest public function rules(): array { return [ - 'machine_id' => 'nullable|exists:cmms_machines|id', - 'machine_id.*' => 'exists:cmms_machines,id', - 'rahdar_id' => 'required|exists:rahdaran|id', - 'rahdar_id.*' => 'exists:rahdaran,id', - 'state_id' => 'required|exists:mission_states|id', - 'state_name' => 'required|string|max:255', + 'rahdaran_id' => 'required|array', + 'rahdaran_id.*' => 'exists:rahdaran,id', 'requested_machine_type' => 'required|string|max:255', - 'requested_machine_numbers'=> 'required|string|max:255', - 'type' => 'required'|'string'|'max:50', + 'requested_machine_numbers'=> 'required|integer|max:255', + 'type' => 'required|string|max:50', 'start_date' => 'required|date', 'end_date' => 'required|date', 'request_date' => 'required|date', - 'description' => 'nullable|string', - 'start_point' => 'required|string|max:255', - 'end_point' => 'required|string|max:255', + 'description' => 'string', + 'start_point' => 'required|string', + 'end_point' => 'required|string', ]; } } diff --git a/app/Http/Requests/V3/Mission/UpdateRequest.php b/app/Http/Requests/V3/Mission/UpdateRequest.php index 59fd052d..fb913c6f 100644 --- a/app/Http/Requests/V3/Mission/UpdateRequest.php +++ b/app/Http/Requests/V3/Mission/UpdateRequest.php @@ -11,7 +11,7 @@ class UpdateRequest extends FormRequest */ public function authorize(): bool { - return false; + return true; } /** @@ -22,7 +22,17 @@ class UpdateRequest extends FormRequest public function rules(): array { return [ - // + 'rahdaran_id' => 'required|array', + 'rahdaran_id.*' => 'exists:rahdaran,id', + 'requested_machine_type' => 'required|string|max:255', + 'requested_machine_numbers'=> 'required|integer|max:255', + 'type' => 'required|string|max:50', + 'start_date' => 'required|date', + 'end_date' => 'required|date', + 'request_date' => 'required|date', + 'description' => 'string', + 'start_point' => 'required|string', + 'end_point' => 'required|string', ]; } } diff --git a/app/Services/Mission/CartableService.php b/app/Services/Mission/CartableService.php index 0cd41492..36c72781 100644 --- a/app/Services/Mission/CartableService.php +++ b/app/Services/Mission/CartableService.php @@ -36,17 +36,4 @@ class CartableService ); } - public function getMission(User $user, Mission $mission): Mission - { - $allowed = - $user->hasPermissionTo('mission-manage-country') || - ($user->hasPermissionTo('mission-manage-province') && - $mission->province_id === $user->province_id) || - ($user->hasPermissionTo('mission-manage-city') && - $mission->city_id === $user->edarate_shahri_id); - - abort_unless($allowed, 403); - - return $mission->load(['machines','rahdars']); - } } \ No newline at end of file From 355941d1e1abb4f2ae40afdda947266f6affab82 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Mon, 19 May 2025 10:31:52 +0330 Subject: [PATCH 09/40] compleate controller and routs --- .../Dashboard/Mission/CartableController.php | 20 +++++++++---------- .../{ => RequestPortal}/StoreRequest.php | 6 +++--- .../{ => RequestPortal}/UpdateRequest.php | 6 +++--- routes/v3.php | 11 ++++++++++ 4 files changed, 26 insertions(+), 17 deletions(-) rename app/Http/Requests/V3/Mission/{ => RequestPortal}/StoreRequest.php (86%) rename app/Http/Requests/V3/Mission/{ => RequestPortal}/UpdateRequest.php (86%) diff --git a/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php b/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php index fde01024..1964af7c 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php @@ -2,18 +2,14 @@ namespace App\Http\Controllers\V3\Dashboard\Mission; -use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; -use App\Http\Requests\V3\Mission\StoreRequest; -use App\Http\Requests\V3\Mission\UpdateRequest; +use App\Http\Requests\V3\Mission\RequestPortal\StoreRequest; +use App\Http\Requests\V3\Mission\RequestPortal\UpdateRequest; use App\Http\Traits\ApiResponse; -use App\Models\CMMSMachine; use App\Models\Mission; -use App\Models\Rahdaran; use App\Services\Missions\CartableService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Support\Facades\DB; class CartableController extends Controller { @@ -42,7 +38,7 @@ class CartableController extends Controller 'end_point' =>$request->end_point, ]); - $mission->rahdaran()->attach($request->rahdaran_id); + $mission->rahdaran()->attach($request->rahdaran); return $this->successResponse(); @@ -53,7 +49,7 @@ class CartableController extends Controller return $this->successResponse($mission); } - public function update(UpdateRequest $request,Mission $mission) + public function update(UpdateRequest $request,Mission $mission): JsonResponse { $mission->update([ 'state_id' => $request->state_id, @@ -67,18 +63,20 @@ class CartableController extends Controller 'description' =>$request->description, 'start_point' =>$request->start_point, 'end_point' =>$request->end_point, + ]); - $mission->rahdaran()->attach($request->rahdaran_id); + $mission->rahdaran()->sync($request->rahdaran); return $this->successResponse(); } - public function destroy(Mission $mission) + public function destroy(Mission $mission): JsonResponse { + $mission->rahdaran()->detach(); $mission->delete(); - return $this->successResponse($mission); + return $this->successResponse(); } } diff --git a/app/Http/Requests/V3/Mission/StoreRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php similarity index 86% rename from app/Http/Requests/V3/Mission/StoreRequest.php rename to app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php index ef3a86e3..62bd1984 100644 --- a/app/Http/Requests/V3/Mission/StoreRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php @@ -1,6 +1,6 @@ 'required|array', - 'rahdaran_id.*' => 'exists:rahdaran,id', + 'rahdaran' => 'required|array', + 'rahdaran.*' => 'exists:rahdaran,id', 'requested_machine_type' => 'required|string|max:255', 'requested_machine_numbers'=> 'required|integer|max:255', 'type' => 'required|string|max:50', diff --git a/app/Http/Requests/V3/Mission/UpdateRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php similarity index 86% rename from app/Http/Requests/V3/Mission/UpdateRequest.php rename to app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php index fb913c6f..c463fc53 100644 --- a/app/Http/Requests/V3/Mission/UpdateRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php @@ -1,6 +1,6 @@ 'required|array', - 'rahdaran_id.*' => 'exists:rahdaran,id', + 'rahdaran' => 'required|array', + 'rahdaran.*' => 'exists:rahdaran,id', 'requested_machine_type' => 'required|string|max:255', 'requested_machine_numbers'=> 'required|integer|max:255', 'type' => 'required|string|max:50', diff --git a/routes/v3.php b/routes/v3.php index 4de8e0bc..5810034a 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -7,6 +7,7 @@ use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshController; use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshSampleController; use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshTypeController; use App\Http\Controllers\V3\Dashboard\ItemsManagementController; +use App\Http\Controllers\V3\Dashboard\Mission\CartableController; use App\Http\Controllers\V3\Dashboard\ObservedItemController; use App\Http\Controllers\V3\Dashboard\AccidentReceiptController; use App\Http\Controllers\V3\Dashboard\OtpManagementController; @@ -424,3 +425,13 @@ Route::prefix('road_maintenance_station') Route::post('/{rahdariPoint}', 'update')->name('update')->middleware('permission:edit-tollhouse|edit-tollhouse-province'); Route::delete('/{rahdariPoint}', 'destroy')->name('destroy')->middleware('permission:delete-tollhouse|delete-tollhouse-province'); }); +Route::prefix('missions') + ->name('missions.') + ->controller(CartableController::class) + ->group(function () { + Route::get('/', 'index')->name('index'); + Route::post('/', 'store')->name('store'); + Route::get('/{mission}', 'show')->name('show'); + Route::post('/{mission}', 'update')->name('update'); + Route::delete('/{mission}', 'destroy')->name('destroy'); + }); From 3ee7a49ce9d3ab27a4de61e90006f59cc0e4536f Mon Sep 17 00:00:00 2001 From: joddyabott Date: Mon, 19 May 2025 11:53:09 +0330 Subject: [PATCH 10/40] improve all of the code --- .../Dashboard/Mission/CartableController.php | 82 ----------------- .../Mission/RequestPortalController.php | 87 +++++++++++++++++++ ...leService.php => RequestPortalService.php} | 19 ++-- routes/v3.php | 4 +- 4 files changed, 96 insertions(+), 96 deletions(-) delete mode 100644 app/Http/Controllers/V3/Dashboard/Mission/CartableController.php create mode 100644 app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php rename app/Services/Mission/{CartableService.php => RequestPortalService.php} (56%) diff --git a/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php b/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php deleted file mode 100644 index 1964af7c..00000000 --- a/app/Http/Controllers/V3/Dashboard/Mission/CartableController.php +++ /dev/null @@ -1,82 +0,0 @@ -json($cartableService->datatable($request)); - } - - public function store(StoreRequest $request): JsonResponse - { - - $mission = Mission::query()->create([ - 'user_id'=> auth()->user()->id(), - 'state_id' => $request->state_id, - 'state_name' => $request->state_name, - 'requested_machine_type' =>$request->requested_machine_type, - 'requested_machine_numbers' =>$request->requested_machine_numbers, - 'type' =>$request->type, - 'start_date' =>$request->start_date, - 'end_date' =>$request->end_date, - 'request_date' =>$request->request_date, - 'description' =>$request->description, - 'start_point' =>$request->start_point, - 'end_point' =>$request->end_point, - ]); - - $mission->rahdaran()->attach($request->rahdaran); - - return $this->successResponse(); - - } - - public function show(Mission $mission): JsonResponse - { - return $this->successResponse($mission); - } - - public function update(UpdateRequest $request,Mission $mission): JsonResponse - { - $mission->update([ - 'state_id' => $request->state_id, - 'state_name' => $request->state_name, - 'requested_machine_type' =>$request->requested_machine_type, - 'requested_machine_numbers' =>$request->requested_machine_numbers, - 'type' =>$request->type, - 'start_date' =>$request->start_date, - 'end_date' =>$request->end_date, - 'request_date' =>$request->request_date, - 'description' =>$request->description, - 'start_point' =>$request->start_point, - 'end_point' =>$request->end_point, - - ]); - - $mission->rahdaran()->sync($request->rahdaran); - - return $this->successResponse(); - - } - - public function destroy(Mission $mission): JsonResponse - { - $mission->rahdaran()->detach(); - $mission->delete(); - return $this->successResponse(); - - } -} diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php new file mode 100644 index 00000000..9405561f --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -0,0 +1,87 @@ +json($requestPortalService->datatable($request)); + } + + public function store(StoreRequest $request): JsonResponse + { + DB::transaction(function () use ($request) { + $state = MissionStates::REQUEST_CREATED->value; + $mission = Mission::query()->create([ + 'user_id'=> auth()->user()->id, + 'state_id' =>$state, + 'state_name' => MissionStates::name($state), + 'requested_machine_type' => $request->requested_machine_type, + 'requested_machine_numbers' => $request->requested_machine_numbers, + 'type' => $request->type, + 'start_date' => $request->start_date, + 'end_date' => $request->end_date, + 'request_date' => $request->request_date, + 'description' => $request->description, + 'start_point' => $request->start_point, + 'end_point' => $request->end_point, + ]); + + $mission->rahdaran()->attach($request->rahdaran); + }); + + return $this->successResponse(); + } + + public function show(Mission $mission): JsonResponse + { + return $this->successResponse($mission); + } + + public function update(UpdateRequest $request,Mission $mission): JsonResponse + { + DB::transaction(function () use ($mission, $request) { + $state = MissionStates::REQUEST_CREATED->value; + $mission->update([ + 'state_id' =>$state, + 'state_name' => MissionStates::name($state), + 'requested_machine_type' => $request->requested_machine_type, + 'requested_machine_numbers' => $request->requested_machine_numbers, + 'type' => $request->type, + 'start_date' => $request->start_date, + 'end_date' => $request->end_date, + 'request_date' => $request->request_date, + 'description' => $request->description, + 'start_point' => $request->start_point, + 'end_point' => $request->end_point, + ]); + + $mission->rahdaran()->sync($request->rahdaran); + }); + + return $this->successResponse(); + } + + public function destroy(Mission $mission): JsonResponse + { + DB::transaction(function () use ($mission) { + $mission->rahdaran()->detach(); + $mission->delete(); + }); + return $this->successResponse(); + } +} diff --git a/app/Services/Mission/CartableService.php b/app/Services/Mission/RequestPortalService.php similarity index 56% rename from app/Services/Mission/CartableService.php rename to app/Services/Mission/RequestPortalService.php index 36c72781..3c5ec2f0 100644 --- a/app/Services/Mission/CartableService.php +++ b/app/Services/Mission/RequestPortalService.php @@ -1,6 +1,6 @@ user(); - $allowedFilters = ['*']; - $allowedSortings = ['*']; - $query = Mission::query(); if ($user->hasPermissionTo('mission-manage-city')) { - $query->where('city_id', $user->edarate_shahri_id); + $query->where('edarate_shahri_id', '=', $user->edarate_shahri_id); } elseif ($user->hasPermissionTo('mission-manage-province')) { - $query->where('province_id', $user->province_id); - } - elseif ($user->hasPermissionTo('mission-manage-country')) { - + $query->where('province_id', '=', $user->province_id); } return DataTableFacade::run( $query, $request, - allowedFilters: $allowedFilters, - allowedSortings: $allowedSortings + allowedFilters: ['*'], + allowedSortings: ['*'] ); } diff --git a/routes/v3.php b/routes/v3.php index 5810034a..ac3f0b46 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -7,7 +7,7 @@ use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshController; use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshSampleController; use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshTypeController; use App\Http\Controllers\V3\Dashboard\ItemsManagementController; -use App\Http\Controllers\V3\Dashboard\Mission\CartableController; +use App\Http\Controllers\V3\Dashboard\Mission\RequestPortalController; use App\Http\Controllers\V3\Dashboard\ObservedItemController; use App\Http\Controllers\V3\Dashboard\AccidentReceiptController; use App\Http\Controllers\V3\Dashboard\OtpManagementController; @@ -427,7 +427,7 @@ Route::prefix('road_maintenance_station') }); Route::prefix('missions') ->name('missions.') - ->controller(CartableController::class) + ->controller(RequestPortalController::class) ->group(function () { Route::get('/', 'index')->name('index'); Route::post('/', 'store')->name('store'); From 186f31de3c2e41cc3b5ff7a0d06e91e8f0fefa4f Mon Sep 17 00:00:00 2001 From: joddyabott Date: Mon, 19 May 2025 13:32:02 +0330 Subject: [PATCH 11/40] improve update request --- app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php index c463fc53..4498ea7b 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php @@ -11,7 +11,7 @@ class UpdateRequest extends FormRequest */ public function authorize(): bool { - return true; + return ($this->route('mission'))->user_id === auth()->id(); } /** From 699dcddcf5589c5e5abf71ab515c0f4a4711846c Mon Sep 17 00:00:00 2001 From: joddyabott Date: Mon, 19 May 2025 14:47:03 +0330 Subject: [PATCH 12/40] change plase mission service --- .../V3/Dashboard/Mission/RequestPortalController.php | 2 +- app/Services/{ => Cartables}/Mission/RequestPortalService.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename app/Services/{ => Cartables}/Mission/RequestPortalService.php (94%) diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index 9405561f..39fb5f36 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -8,7 +8,7 @@ use App\Http\Requests\V3\Mission\RequestPortal\StoreRequest; use App\Http\Requests\V3\Mission\RequestPortal\UpdateRequest; use App\Http\Traits\ApiResponse; use App\Models\Mission; -use App\Services\Mission\RequestPortalService; +use App\Services\Cartables\Mission\RequestPortalService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; diff --git a/app/Services/Mission/RequestPortalService.php b/app/Services/Cartables/Mission/RequestPortalService.php similarity index 94% rename from app/Services/Mission/RequestPortalService.php rename to app/Services/Cartables/Mission/RequestPortalService.php index 3c5ec2f0..c1757019 100644 --- a/app/Services/Mission/RequestPortalService.php +++ b/app/Services/Cartables/Mission/RequestPortalService.php @@ -1,6 +1,6 @@ Date: Mon, 19 May 2025 15:25:40 +0330 Subject: [PATCH 13/40] add mission states to seeder --- .../2025_05_17_103927_create_missions_table.php | 9 ++++++--- ...25_05_18_093843_create_mission_histories_table.php | 3 ++- database/seeders/MissionStateSeeder.php | 11 ++++++++++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/database/migrations/2025_05_17_103927_create_missions_table.php b/database/migrations/2025_05_17_103927_create_missions_table.php index 3d68f8dc..64b8a5c4 100644 --- a/database/migrations/2025_05_17_103927_create_missions_table.php +++ b/database/migrations/2025_05_17_103927_create_missions_table.php @@ -13,15 +13,18 @@ return new class extends Migration { Schema::create('missions', function (Blueprint $table) { $table->id(); - $table->foreignId('user_id')->constrained('users')->cascadeOnDelete(); + $table->unsignedInteger('user_id'); + $table->foreign('user_id')->references('id')->on('users'); $table->string('username'); $table->foreignId('machine_id')->nullable()->constrained('cmms_machines')->noActionOnDelete(); $table->foreignId('rahdar_id')->constrained('rahdaran')->noActionOnDelete(); $table->foreignId('state_id')->constrained('mission_states')->noActionOnDelete(); $table->string('state_name'); - $table->foreignId('province_id')->nullable()->constrained('provinces')->noActionOnDelete(); + $table->unsignedTinyInteger('province_id')->nullable(); + $table->foreign('province_id')->references('id')->on('provinces')->noActionOnDelete(); $table->string('province_name'); - $table->foreignId('edare_shahri_id')->nullable()->constrained('edarate_shahri')->noActionOnDelete(); + $table->unsignedBigInteger('edare_shahri_id')->nullable(); + $table->foreign('edare_shahri_id')->references('id')->on('edarate_shahri')->noActionOnDelete(); $table->string('edare_shahri_name'); $table->string('requested_machine_type'); $table->integer('requested_machine_numbers'); diff --git a/database/migrations/2025_05_18_093843_create_mission_histories_table.php b/database/migrations/2025_05_18_093843_create_mission_histories_table.php index bf084d14..d3a79188 100644 --- a/database/migrations/2025_05_18_093843_create_mission_histories_table.php +++ b/database/migrations/2025_05_18_093843_create_mission_histories_table.php @@ -14,7 +14,8 @@ return new class extends Migration Schema::create('mission_histories', function (Blueprint $table) { $table->id(); $table->foreignId('mission_id')->constrained('missions'); - $table->foreignId('user_id')->constrained('users'); + $table->unsignedInteger('user_id'); + $table->foreign('user_id')->references('id')->on('users'); $table->foreignId('previous_state_id')->constrained('mission_states'); $table->string('previous_state_name'); $table->text('user_description')->nullable(); diff --git a/database/seeders/MissionStateSeeder.php b/database/seeders/MissionStateSeeder.php index 588930c0..585139e5 100644 --- a/database/seeders/MissionStateSeeder.php +++ b/database/seeders/MissionStateSeeder.php @@ -4,6 +4,7 @@ namespace Database\Seeders; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; +use Illuminate\Support\Facades\DB; class MissionStateSeeder extends Seeder { @@ -12,6 +13,14 @@ class MissionStateSeeder extends Seeder */ public function run(): void { - // + DB::table('mission_states')->insert([ + ['name' => 'درخواست ایجاد شد و در حال بررسی در توسط واحد نقلیه است'], + ['name' => 'خودرو اختصاص داده شد و درخواست توسط واحد کنترل در حال بررسی است'], + ['name' => 'درخواست توسط واحد کنترل تایید شد و ماموریت آغاز می شود'], + ['name' => 'اتمام ماموریت'], + ['name' => 'عدم تخصیص خودرو توسط واحد نقلیه و بازگشت درخواست به کارتابل کاربر'], + ['name' => 'عدم تایید توسط واحد کنترل'], + ['name' => 'ماموریت لغو شد'], + ]); } } From 057ed49fd1433314bf59ecc0fe70b836d0b82ade Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 20 May 2025 09:50:10 +0330 Subject: [PATCH 14/40] add transportation routes --- app/Enums/MissionStates.php | 6 ++-- .../Mission/RequestPortalController.php | 20 +++++++------ .../Mission/TransportationUnitController.php | 4 ++- .../V3/Mission/RequestPortal/StoreRequest.php | 3 +- .../Mission/RequestPortal/UpdateRequest.php | 6 ++-- .../TransportaionUnit/AllocateRequest.php | 3 +- .../TransportaionUnit/DeallocateRequest.php | 29 +++++++++++++++++++ .../Mission/RequestPortalService.php | 14 ++++++--- .../Mission/TransportationUnitService.php | 4 +-- ...025_05_17_103927_create_missions_table.php | 6 +--- database/seeders/AxisTypeSeeder.php | 9 +++++- database/seeders/MissionStateSeeder.php | 1 - routes/v3.php | 25 ++++++++++++---- 13 files changed, 91 insertions(+), 39 deletions(-) create mode 100644 app/Http/Requests/V3/Mission/TransportaionUnit/DeallocateRequest.php diff --git a/app/Enums/MissionStates.php b/app/Enums/MissionStates.php index 5be6b18a..77dfaeaf 100644 --- a/app/Enums/MissionStates.php +++ b/app/Enums/MissionStates.php @@ -9,8 +9,7 @@ enum MissionStates: int case START_MISSION = 3; case END_MISSION = 4; case REJECT_BY_TRANSPORTATION = 5; - case REJECT_BY_CONTROL_UNIT = 6; - case CANCELLED = 7; + case CANCELLED = 6; public static function name(int $state): string { @@ -20,8 +19,7 @@ enum MissionStates: int 3 => 'درخواست توسط واحد کنترل تایید شد و ماموریت آغاز می شود', 4 => 'اتمام ماموریت', 5 => 'عدم تخصیص خودرو توسط واحد نقلیه و بازگشت درخواست به کارتابل کاربر', - 6 => 'عدم تایید توسط واحد کنترل', - 7 => 'ماموریت لغو شد', + 6 => 'ماموریت لغو شد', ]; return $mapArray[$state]; diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index 39fb5f36..df45df4c 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -25,19 +25,23 @@ class RequestPortalController extends Controller public function store(StoreRequest $request): JsonResponse { DB::transaction(function () use ($request) { + $user = auth()->user(); $state = MissionStates::REQUEST_CREATED->value; $mission = Mission::query()->create([ - 'user_id'=> auth()->user()->id, + 'user_id'=> $user->id, + 'username'=> $user->username, + 'province_id'=> $user->province_id, + 'province_name'=> $user->province_fa, + 'edare_shahri_id'=> $user->edare_shahri_id ?? null, + 'edare_shahri_name'=> $user->edare_shahri_name ?? null, 'state_id' =>$state, 'state_name' => MissionStates::name($state), - 'requested_machine_type' => $request->requested_machine_type, - 'requested_machine_numbers' => $request->requested_machine_numbers, + 'requested_machines' => $request->requested_machines, 'type' => $request->type, 'start_date' => $request->start_date, 'end_date' => $request->end_date, - 'request_date' => $request->request_date, + 'request_date' => now(), 'description' => $request->description, - 'start_point' => $request->start_point, 'end_point' => $request->end_point, ]); @@ -59,16 +63,14 @@ class RequestPortalController extends Controller $mission->update([ 'state_id' =>$state, 'state_name' => MissionStates::name($state), - 'requested_machine_type' => $request->requested_machine_type, - 'requested_machine_numbers' => $request->requested_machine_numbers, + 'requested_machines' => $request->requested_machines, 'type' => $request->type, 'start_date' => $request->start_date, 'end_date' => $request->end_date, 'request_date' => $request->request_date, 'description' => $request->description, - 'start_point' => $request->start_point, 'end_point' => $request->end_point, - ]); + ]); $mission->rahdaran()->sync($request->rahdaran); }); diff --git a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php index 1262df58..7099551a 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\V3\Dashboard\Mission; use App\Enums\MissionStates; use App\Http\Controllers\Controller; use App\Http\Requests\V3\Mission\TransportaionUnit\AllocateRequest; +use App\Http\Requests\V3\Mission\TransportaionUnit\DeallocateRequest; use App\Http\Traits\ApiResponse; use App\Models\Mission; use App\Services\Cartables\Mission\TransportationUnitService; @@ -33,13 +34,14 @@ class TransportationUnitController extends Controller return $this->successResponse(); } - public function deallocate(Mission $mission): JsonResponse + public function deallocate(DeallocateRequest $request, Mission $mission): JsonResponse { $state = MissionStates::REJECT_BY_TRANSPORTATION->value; $mission->update([ 'state_id' => $state, 'state_name' => MissionStates::name($state), + 'description' => $request->description ]); return $this->successResponse(); diff --git a/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php index 62bd1984..deb92e6f 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php @@ -24,8 +24,7 @@ class StoreRequest extends FormRequest return [ 'rahdaran' => 'required|array', 'rahdaran.*' => 'exists:rahdaran,id', - 'requested_machine_type' => 'required|string|max:255', - 'requested_machine_numbers'=> 'required|integer|max:255', + 'requested_machines' => 'required|array', 'type' => 'required|string|max:50', 'start_date' => 'required|date', 'end_date' => 'required|date', diff --git a/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php index 4498ea7b..8da9a782 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests\V3\Mission\RequestPortal; +use App\Enums\MissionStates; use Illuminate\Foundation\Http\FormRequest; class UpdateRequest extends FormRequest @@ -11,7 +12,7 @@ class UpdateRequest extends FormRequest */ public function authorize(): bool { - return ($this->route('mission'))->user_id === auth()->id(); + return $this->mission->user_id === auth()->user()->id && $this->mission->state_id == MissionStates::REJECT_BY_TRANSPORTATION->value; } /** @@ -24,8 +25,7 @@ class UpdateRequest extends FormRequest return [ 'rahdaran' => 'required|array', 'rahdaran.*' => 'exists:rahdaran,id', - 'requested_machine_type' => 'required|string|max:255', - 'requested_machine_numbers'=> 'required|integer|max:255', + 'requested_machines' => 'required|array', 'type' => 'required|string|max:50', 'start_date' => 'required|date', 'end_date' => 'required|date', diff --git a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php index bac0e6bd..5cff54a5 100644 --- a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php +++ b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests\V3\Mission\TransportaionUnit; +use App\Enums\MissionStates; use Illuminate\Foundation\Http\FormRequest; class AllocateRequest extends FormRequest @@ -11,7 +12,7 @@ class AllocateRequest extends FormRequest */ public function authorize(): bool { - return $this->mission->edare_shahri_id == auth()->user()->edarate_shahri_id; + return $this->mission->edare_shahri_id == auth()->user()->edarate_shahri_id && $this->mission->state_id == MissionStates::REQUEST_CREATED->value; } /** diff --git a/app/Http/Requests/V3/Mission/TransportaionUnit/DeallocateRequest.php b/app/Http/Requests/V3/Mission/TransportaionUnit/DeallocateRequest.php new file mode 100644 index 00000000..28074809 --- /dev/null +++ b/app/Http/Requests/V3/Mission/TransportaionUnit/DeallocateRequest.php @@ -0,0 +1,29 @@ +mission->edare_shahri_id == auth()->user()->edarate_shahri_id && $this->mission->state_id == MissionStates::REQUEST_CREATED->value; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'description' => 'string', + ]; + } +} diff --git a/app/Services/Cartables/Mission/RequestPortalService.php b/app/Services/Cartables/Mission/RequestPortalService.php index c1757019..daac3cdd 100644 --- a/app/Services/Cartables/Mission/RequestPortalService.php +++ b/app/Services/Cartables/Mission/RequestPortalService.php @@ -15,20 +15,26 @@ class RequestPortalService public function datatable(Request $request) { $user = auth()->user(); + $fields = [ + 'id', 'user_id', 'username', 'state_name', 'province_name', 'edare_shahri_name', + 'description', 'requested_machines', 'type', 'start_date', + 'end_date', 'request_date', 'start_point', 'end_point', + ]; $query = Mission::query(); - if ($user->hasPermissionTo('mission-manage-city')) { + if ($user->hasPermissionTo('manage-request-portal-city')) { $query->where('edarate_shahri_id', '=', $user->edarate_shahri_id); } - elseif ($user->hasPermissionTo('mission-manage-province')) { + elseif ($user->hasPermissionTo('manage-request-portal-province')) { $query->where('province_id', '=', $user->province_id); } + return DataTableFacade::run( $query, $request, allowedFilters: ['*'], - allowedSortings: ['*'] + allowedSortings: ['*'], + allowedSelects: $fields ); - } } \ No newline at end of file diff --git a/app/Services/Cartables/Mission/TransportationUnitService.php b/app/Services/Cartables/Mission/TransportationUnitService.php index d4535cad..a8059658 100644 --- a/app/Services/Cartables/Mission/TransportationUnitService.php +++ b/app/Services/Cartables/Mission/TransportationUnitService.php @@ -14,8 +14,8 @@ class TransportationUnitService { $fields = [ 'id', 'user_id', 'username', 'state_name', 'province_name', 'edare_shahri_name', - 'description', 'requested_machine_type', 'requested_machine_numbers', 'type', - 'start_date', 'end_date', 'request_date', 'start_point', 'end_point', + 'description', 'requested_machines', 'type', 'start_date', + 'end_date', 'request_date', 'start_point', 'end_point', ]; $query = Mission::query() diff --git a/database/migrations/2025_05_17_103927_create_missions_table.php b/database/migrations/2025_05_17_103927_create_missions_table.php index 64b8a5c4..6f80171c 100644 --- a/database/migrations/2025_05_17_103927_create_missions_table.php +++ b/database/migrations/2025_05_17_103927_create_missions_table.php @@ -16,8 +16,6 @@ return new class extends Migration $table->unsignedInteger('user_id'); $table->foreign('user_id')->references('id')->on('users'); $table->string('username'); - $table->foreignId('machine_id')->nullable()->constrained('cmms_machines')->noActionOnDelete(); - $table->foreignId('rahdar_id')->constrained('rahdaran')->noActionOnDelete(); $table->foreignId('state_id')->constrained('mission_states')->noActionOnDelete(); $table->string('state_name'); $table->unsignedTinyInteger('province_id')->nullable(); @@ -26,14 +24,12 @@ return new class extends Migration $table->unsignedBigInteger('edare_shahri_id')->nullable(); $table->foreign('edare_shahri_id')->references('id')->on('edarate_shahri')->noActionOnDelete(); $table->string('edare_shahri_name'); - $table->string('requested_machine_type'); - $table->integer('requested_machine_numbers'); + $table->json('requested_machines'); $table->string('type'); $table->dateTime('start_date'); $table->dateTime('end_date'); $table->dateTime('request_date'); $table->text('description')->nullable(); - $table->string('start_point'); $table->string('end_point'); $table->timestamps(); }); diff --git a/database/seeders/AxisTypeSeeder.php b/database/seeders/AxisTypeSeeder.php index f8ae72bc..ea36f145 100644 --- a/database/seeders/AxisTypeSeeder.php +++ b/database/seeders/AxisTypeSeeder.php @@ -4,6 +4,7 @@ namespace Database\Seeders; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; +use Illuminate\Support\Facades\DB; class AxisTypeSeeder extends Seeder { @@ -12,6 +13,12 @@ class AxisTypeSeeder extends Seeder */ public function run(): void { - // + DB::table('axis_types')->insert([ + ['name' => 'آزادراه'], + ['name' => 'بزرگراه'], + ['name' => 'اصلی'], + ['name' => 'فرعی'], + ['name' => 'روستایی'], + ]); } } diff --git a/database/seeders/MissionStateSeeder.php b/database/seeders/MissionStateSeeder.php index 585139e5..a73b3df9 100644 --- a/database/seeders/MissionStateSeeder.php +++ b/database/seeders/MissionStateSeeder.php @@ -19,7 +19,6 @@ class MissionStateSeeder extends Seeder ['name' => 'درخواست توسط واحد کنترل تایید شد و ماموریت آغاز می شود'], ['name' => 'اتمام ماموریت'], ['name' => 'عدم تخصیص خودرو توسط واحد نقلیه و بازگشت درخواست به کارتابل کاربر'], - ['name' => 'عدم تایید توسط واحد کنترل'], ['name' => 'ماموریت لغو شد'], ]); } diff --git a/routes/v3.php b/routes/v3.php index ac3f0b46..e8b552bb 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -8,6 +8,7 @@ use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshSampleController; use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshTypeController; use App\Http\Controllers\V3\Dashboard\ItemsManagementController; use App\Http\Controllers\V3\Dashboard\Mission\RequestPortalController; +use App\Http\Controllers\V3\Dashboard\Mission\TransportationUnitController; use App\Http\Controllers\V3\Dashboard\ObservedItemController; use App\Http\Controllers\V3\Dashboard\AccidentReceiptController; use App\Http\Controllers\V3\Dashboard\OtpManagementController; @@ -425,13 +426,25 @@ Route::prefix('road_maintenance_station') Route::post('/{rahdariPoint}', 'update')->name('update')->middleware('permission:edit-tollhouse|edit-tollhouse-province'); Route::delete('/{rahdariPoint}', 'destroy')->name('destroy')->middleware('permission:delete-tollhouse|delete-tollhouse-province'); }); + Route::prefix('missions') ->name('missions.') - ->controller(RequestPortalController::class) ->group(function () { - Route::get('/', 'index')->name('index'); - Route::post('/', 'store')->name('store'); - Route::get('/{mission}', 'show')->name('show'); - Route::post('/{mission}', 'update')->name('update'); - Route::delete('/{mission}', 'destroy')->name('destroy'); + Route::name('requestPortal.') + ->middleware('permission:manage-request-portal-city|manage-request-portal-province|manage-request-portal-country') + ->controller(RequestPortalController::class) + ->group(function () { + Route::get('/', 'index')->name('index'); + Route::post('/', 'store')->name('store'); + Route::get('/{mission}', 'show')->name('show'); + Route::post('/{mission}', 'update')->name('update'); + Route::delete('/{mission}', 'destroy')->name('destroy'); + }); + Route::name('transportationUnit.') + ->controller(TransportationUnitController::class) + ->group(function () { + Route::get('/', 'index')->name('index'); + Route::post('/allocate/{mission}', 'allocate')->name('allocate'); + Route::post('/deallocate/{mission}', 'deallocate')->name('deallocate'); + }); }); From 5f8c833c83364fc5ec137f0dab4b1f3dccfdee03 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 20 May 2025 09:55:04 +0330 Subject: [PATCH 15/40] remove start point --- app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php | 1 - app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php | 1 - 2 files changed, 2 deletions(-) diff --git a/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php index deb92e6f..d4927d28 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/StoreRequest.php @@ -30,7 +30,6 @@ class StoreRequest extends FormRequest 'end_date' => 'required|date', 'request_date' => 'required|date', 'description' => 'string', - 'start_point' => 'required|string', 'end_point' => 'required|string', ]; } diff --git a/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php index 8da9a782..be6eaee5 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php @@ -31,7 +31,6 @@ class UpdateRequest extends FormRequest 'end_date' => 'required|date', 'request_date' => 'required|date', 'description' => 'string', - 'start_point' => 'required|string', 'end_point' => 'required|string', ]; } From 6c7a969d34576b237c8217ca58ec459dddb83406 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 20 May 2025 10:17:10 +0330 Subject: [PATCH 16/40] remove start point from services --- .../V3/Dashboard/Mission/RequestPortalController.php | 2 +- app/Services/Cartables/Mission/RequestPortalService.php | 4 ++-- app/Services/Cartables/Mission/TransportationUnitService.php | 2 +- routes/v3.php | 2 ++ 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index df45df4c..f93419ae 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -19,7 +19,7 @@ class RequestPortalController extends Controller public function index(Request $request, RequestPortalService $requestPortalService): JsonResponse { - return response()->json($requestPortalService->datatable($request)); + return response()->json($requestPortalService->datatable($request)); } public function store(StoreRequest $request): JsonResponse diff --git a/app/Services/Cartables/Mission/RequestPortalService.php b/app/Services/Cartables/Mission/RequestPortalService.php index daac3cdd..01d7cf76 100644 --- a/app/Services/Cartables/Mission/RequestPortalService.php +++ b/app/Services/Cartables/Mission/RequestPortalService.php @@ -18,12 +18,12 @@ class RequestPortalService $fields = [ 'id', 'user_id', 'username', 'state_name', 'province_name', 'edare_shahri_name', 'description', 'requested_machines', 'type', 'start_date', - 'end_date', 'request_date', 'start_point', 'end_point', + 'end_date', 'request_date', 'end_point', ]; $query = Mission::query(); if ($user->hasPermissionTo('manage-request-portal-city')) { - $query->where('edarate_shahri_id', '=', $user->edarate_shahri_id); + $query->where('edare_shahri_id', '=', $user->edarate_shahri_id); } elseif ($user->hasPermissionTo('manage-request-portal-province')) { $query->where('province_id', '=', $user->province_id); diff --git a/app/Services/Cartables/Mission/TransportationUnitService.php b/app/Services/Cartables/Mission/TransportationUnitService.php index a8059658..3462e2b2 100644 --- a/app/Services/Cartables/Mission/TransportationUnitService.php +++ b/app/Services/Cartables/Mission/TransportationUnitService.php @@ -15,7 +15,7 @@ class TransportationUnitService $fields = [ 'id', 'user_id', 'username', 'state_name', 'province_name', 'edare_shahri_name', 'description', 'requested_machines', 'type', 'start_date', - 'end_date', 'request_date', 'start_point', 'end_point', + 'end_date', 'request_date', 'end_point', ]; $query = Mission::query() diff --git a/routes/v3.php b/routes/v3.php index e8b552bb..72d96e4d 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -431,6 +431,7 @@ Route::prefix('missions') ->name('missions.') ->group(function () { Route::name('requestPortal.') + ->prefix('request_portal') ->middleware('permission:manage-request-portal-city|manage-request-portal-province|manage-request-portal-country') ->controller(RequestPortalController::class) ->group(function () { @@ -441,6 +442,7 @@ Route::prefix('missions') Route::delete('/{mission}', 'destroy')->name('destroy'); }); Route::name('transportationUnit.') + ->prefix('transportation_unit') ->controller(TransportationUnitController::class) ->group(function () { Route::get('/', 'index')->name('index'); From 36ebfdadd42f747b055cdcf5e3c1219d609a7722 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 20 May 2025 10:30:27 +0330 Subject: [PATCH 17/40] add mutator for mission --- app/Enums/MissionStates.php | 2 +- .../V3/Dashboard/Mission/RequestPortalController.php | 4 ++-- app/Models/Mission.php | 8 ++++++++ .../2025_05_17_103927_create_missions_table.php | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/Enums/MissionStates.php b/app/Enums/MissionStates.php index 77dfaeaf..b72a5637 100644 --- a/app/Enums/MissionStates.php +++ b/app/Enums/MissionStates.php @@ -14,7 +14,7 @@ enum MissionStates: int public static function name(int $state): string { $mapArray = [ - 1 => 'درخواست ایجاد شد و در حال بررسی در توسط واحد نقلیه است', + 1 => 'درخواست ایجاد شد و در حال بررسی توسط واحد نقلیه است', 2 => 'خودرو اختصاص داده شد و درخواست توسط واحد کنترل در حال بررسی است', 3 => 'درخواست توسط واحد کنترل تایید شد و ماموریت آغاز می شود', 4 => 'اتمام ماموریت', diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index f93419ae..a1fbd21a 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -36,7 +36,7 @@ class RequestPortalController extends Controller 'edare_shahri_name'=> $user->edare_shahri_name ?? null, 'state_id' =>$state, 'state_name' => MissionStates::name($state), - 'requested_machines' => $request->requested_machines, + 'requested_machines' => json_encode($request->requested_machines), 'type' => $request->type, 'start_date' => $request->start_date, 'end_date' => $request->end_date, @@ -63,7 +63,7 @@ class RequestPortalController extends Controller $mission->update([ 'state_id' =>$state, 'state_name' => MissionStates::name($state), - 'requested_machines' => $request->requested_machines, + 'requested_machines' => json_encode($request->requested_machines), 'type' => $request->type, 'start_date' => $request->start_date, 'end_date' => $request->end_date, diff --git a/app/Models/Mission.php b/app/Models/Mission.php index 28ba82eb..7ff42e75 100644 --- a/app/Models/Mission.php +++ b/app/Models/Mission.php @@ -2,6 +2,7 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\MorphToMany; @@ -12,6 +13,13 @@ class Mission extends Model protected $guarded = []; + protected function requestedMachines(): Attribute + { + return Attribute::make( + get: fn ($value) => json_decode($value) + ); + } + public function roadItems(): MorphToMany { return $this->morphedByMany(RoadItemsProject::class, 'missionable'); diff --git a/database/migrations/2025_05_17_103927_create_missions_table.php b/database/migrations/2025_05_17_103927_create_missions_table.php index 6f80171c..25a60291 100644 --- a/database/migrations/2025_05_17_103927_create_missions_table.php +++ b/database/migrations/2025_05_17_103927_create_missions_table.php @@ -23,7 +23,7 @@ return new class extends Migration $table->string('province_name'); $table->unsignedBigInteger('edare_shahri_id')->nullable(); $table->foreign('edare_shahri_id')->references('id')->on('edarate_shahri')->noActionOnDelete(); - $table->string('edare_shahri_name'); + $table->string('edare_shahri_name')->nullable(); $table->json('requested_machines'); $table->string('type'); $table->dateTime('start_date'); From 0dd94d8a34d494764c1570e3f89cfd2dd9a03592 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Tue, 20 May 2025 11:57:59 +0330 Subject: [PATCH 18/40] add moshine and rahdar in request portal controller and wirte route for them --- .../V3/Dashboard/Mission/RequestPortalController.php | 9 +++++++++ routes/v3.php | 2 ++ 2 files changed, 11 insertions(+) diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index a1fbd21a..10cfc49f 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -86,4 +86,13 @@ class RequestPortalController extends Controller }); return $this->successResponse(); } + public function machines(Mission $mission): JsonResponse + { + return $this->successResponse($mission->machines()->get(['machines.id', 'machines.machine_code', 'machines.car_name', 'machines.plak_number'])); + } + + public function rahdaran(Mission $mission): JsonResponse + { + return $this->successResponse($mission->rahdaran()->get(['rahdaran.id', 'rahdaran.name', 'rahdaran.code'])); + } } diff --git a/routes/v3.php b/routes/v3.php index 72d96e4d..f51ecf99 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -440,6 +440,8 @@ Route::prefix('missions') Route::get('/{mission}', 'show')->name('show'); Route::post('/{mission}', 'update')->name('update'); Route::delete('/{mission}', 'destroy')->name('destroy'); + Route::get('/machine/{mission}','machines')->name('machines'); + Route::get('/rahdar/{mission}','rahdaran')->name('rahdaran'); }); Route::name('transportationUnit.') ->prefix('transportation_unit') From b81d3fc3dd669dc2a643595834dad797a58e02f1 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 20 May 2025 14:16:07 +0330 Subject: [PATCH 19/40] add history logs for missions --- .../Mission/TransportationUnitController.php | 47 ++++++++++++++----- app/Models/Mission.php | 6 +++ 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php index 7099551a..4e14cae4 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php @@ -11,6 +11,7 @@ use App\Models\Mission; use App\Services\Cartables\Mission\TransportationUnitService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; class TransportationUnitController extends Controller { @@ -23,27 +24,49 @@ class TransportationUnitController extends Controller public function allocate(AllocateRequest $request, Mission $mission): JsonResponse { - $mission->machines()->attach($request->machines); + DB::transaction(function () use ($request, $mission) { + $mission->machines()->attach($request->machines); - $state = MissionStates::PENDING_CONFIRMATION->value; - $mission->update([ - 'state_id' => $state, - 'state_name' => MissionStates::name($state), - ]); + $mission->histories()->create([ + 'user_id' => auth()->user()->id, + 'previous_state_id' => $mission->state_id, + 'previous_state_name' => $mission->state_name + ]); + + $state = MissionStates::PENDING_CONFIRMATION->value; + $mission->update([ + 'state_id' => $state, + 'state_name' => MissionStates::name($state), + ]); + }); return $this->successResponse(); } public function deallocate(DeallocateRequest $request, Mission $mission): JsonResponse { - $state = MissionStates::REJECT_BY_TRANSPORTATION->value; + DB::transaction(function () use ($request, $mission) { + $mission->histories()->create([ + 'user_id' => auth()->user()->id, + 'previous_state_id' => $mission->state_id, + 'previous_state_name' => $mission->state_name, + 'user_description' => $request->description + ]); - $mission->update([ - 'state_id' => $state, - 'state_name' => MissionStates::name($state), - 'description' => $request->description - ]); + $state = MissionStates::REJECT_BY_TRANSPORTATION->value; + + $mission->update([ + 'state_id' => $state, + 'state_name' => MissionStates::name($state), + 'description' => $request->description + ]); + }); return $this->successResponse(); } + + public function rahdaran(Mission $mission): JsonResponse + { + return $this->successResponse($mission->rahdaran()->get(['rahdaran.id', 'rahdaran.name', 'rahdaran.code'])); + } } diff --git a/app/Models/Mission.php b/app/Models/Mission.php index 7ff42e75..3f169f16 100644 --- a/app/Models/Mission.php +++ b/app/Models/Mission.php @@ -5,6 +5,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphToMany; class Mission extends Model @@ -20,6 +21,11 @@ class Mission extends Model ); } + public function histories(): HasMany + { + return $this->hasMany(MissionHistory::class); + } + public function roadItems(): MorphToMany { return $this->morphedByMany(RoadItemsProject::class, 'missionable'); From 7309f228966f066dabb49d76dab134a4bd223110 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 20 May 2025 14:18:32 +0330 Subject: [PATCH 20/40] debug the relation --- .../V3/Dashboard/Mission/RequestPortalController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index 10cfc49f..c1dc6650 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -88,7 +88,7 @@ class RequestPortalController extends Controller } public function machines(Mission $mission): JsonResponse { - return $this->successResponse($mission->machines()->get(['machines.id', 'machines.machine_code', 'machines.car_name', 'machines.plak_number'])); + return $this->successResponse($mission->machines()->get(['cmms_machines.id', 'cmms_machines.machine_code', 'cmms_machines.car_name', 'cmms_machines.plak_number'])); } public function rahdaran(Mission $mission): JsonResponse From 94d60fae7e8d0eb186cc013e6f0dc28607b600c8 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sun, 25 May 2025 08:58:30 +0330 Subject: [PATCH 21/40] create control unit cartable --- .../Mission/ControlUnitController.php | 16 ++++++++ .../V3/Dashboard/Mission/DetailController.php | 24 ++++++++++++ .../Mission/RequestPortalController.php | 23 ++++-------- .../Cartables/Mission/ControlUnitService.php | 37 +++++++++++++++++++ routes/v3.php | 17 ++++++++- 5 files changed, 99 insertions(+), 18 deletions(-) create mode 100644 app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php create mode 100644 app/Http/Controllers/V3/Dashboard/Mission/DetailController.php create mode 100644 app/Services/Cartables/Mission/ControlUnitService.php diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php new file mode 100644 index 00000000..4b71192b --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php @@ -0,0 +1,16 @@ +json($controlUnitService->datatable($request)); + } +} diff --git a/app/Http/Controllers/V3/Dashboard/Mission/DetailController.php b/app/Http/Controllers/V3/Dashboard/Mission/DetailController.php new file mode 100644 index 00000000..55ba3c14 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Mission/DetailController.php @@ -0,0 +1,24 @@ +successResponse($mission->machines()->get(['cmms_machines.id', 'cmms_machines.machine_code', 'cmms_machines.car_name', 'cmms_machines.plak_number'])); + } + + public function rahdaran(Mission $mission): JsonResponse + { + return $this->successResponse($mission->rahdaran()->get(['rahdaran.id', 'rahdaran.name', 'rahdaran.code'])); + } +} diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index c1dc6650..f8a1fcef 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -28,13 +28,13 @@ class RequestPortalController extends Controller $user = auth()->user(); $state = MissionStates::REQUEST_CREATED->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->edare_shahri_id ?? null, - 'edare_shahri_name'=> $user->edare_shahri_name ?? null, - 'state_id' =>$state, + 'user_id' => $user->id, + 'username' => $user->username, + 'province_id' => $user->province_id, + 'province_name' => $user->province_fa, + 'edare_shahri_id' => $user->edare_shahri_id ?? null, + 'edare_shahri_name' => $user->edare_shahri_name ?? null, + 'state_id' => $state, 'state_name' => MissionStates::name($state), 'requested_machines' => json_encode($request->requested_machines), 'type' => $request->type, @@ -86,13 +86,4 @@ class RequestPortalController extends Controller }); return $this->successResponse(); } - public function machines(Mission $mission): JsonResponse - { - return $this->successResponse($mission->machines()->get(['cmms_machines.id', 'cmms_machines.machine_code', 'cmms_machines.car_name', 'cmms_machines.plak_number'])); - } - - public function rahdaran(Mission $mission): JsonResponse - { - return $this->successResponse($mission->rahdaran()->get(['rahdaran.id', 'rahdaran.name', 'rahdaran.code'])); - } } diff --git a/app/Services/Cartables/Mission/ControlUnitService.php b/app/Services/Cartables/Mission/ControlUnitService.php new file mode 100644 index 00000000..571d361d --- /dev/null +++ b/app/Services/Cartables/Mission/ControlUnitService.php @@ -0,0 +1,37 @@ +where('state_id', '=', MissionStates::PENDING_CONFIRMATION->value) + ->where('edare_shahri_name', '=', Auth::user()->edarate_shahri_id); + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: $fields + ); + } +} \ No newline at end of file diff --git a/routes/v3.php b/routes/v3.php index f51ecf99..2f92f48c 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -7,6 +7,8 @@ use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshController; use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshSampleController; use App\Http\Controllers\V3\Dashboard\Azmayesh\AzmayeshTypeController; use App\Http\Controllers\V3\Dashboard\ItemsManagementController; +use App\Http\Controllers\V3\Dashboard\Mission\ControlUnitController; +use App\Http\Controllers\V3\Dashboard\Mission\DetailController; use App\Http\Controllers\V3\Dashboard\Mission\RequestPortalController; use App\Http\Controllers\V3\Dashboard\Mission\TransportationUnitController; use App\Http\Controllers\V3\Dashboard\ObservedItemController; @@ -440,8 +442,6 @@ Route::prefix('missions') Route::get('/{mission}', 'show')->name('show'); Route::post('/{mission}', 'update')->name('update'); Route::delete('/{mission}', 'destroy')->name('destroy'); - Route::get('/machine/{mission}','machines')->name('machines'); - Route::get('/rahdar/{mission}','rahdaran')->name('rahdaran'); }); Route::name('transportationUnit.') ->prefix('transportation_unit') @@ -451,4 +451,17 @@ Route::prefix('missions') Route::post('/allocate/{mission}', 'allocate')->name('allocate'); Route::post('/deallocate/{mission}', 'deallocate')->name('deallocate'); }); + Route::name('controlUnit.') + ->prefix('control_unit') + ->controller(ControlUnitController::class) + ->group(function () { + Route::get('/', 'index')->name('index'); + }); + Route::prefix('details') + ->name('details.') + ->controller(DetailController::class) + ->group(function () { + Route::get('/machines/{mission}', 'machines')->name('machines'); + Route::get('/rahdaran/{mission}', 'rahdaran')->name('rahdaran'); + }); }); From 38ce1d760cbbb379087c13e5d7acfde7d8622f7a Mon Sep 17 00:00:00 2001 From: joddyabott Date: Sun, 25 May 2025 15:39:40 +0330 Subject: [PATCH 22/40] create middleware and use in route v3 and ignor one option in v2 route --- app/Http/Kernel.php | 1 + .../Middleware/CheckAxisTypeMiddleware.php | 33 +++++++++++++++++++ routes/v2.php | 3 ++ routes/v3.php | 4 +-- 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 app/Http/Middleware/CheckAxisTypeMiddleware.php diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 04705bf0..756d3797 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -78,6 +78,7 @@ class Kernel extends HttpKernel 'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class, 'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class, 'validate-store-access' => \App\Http\Middleware\ValidateStoreAccess::class, + 'check-axis-type' => \App\Http\Middleware\CheckAxisTypeMiddleware::class, ]; /** diff --git a/app/Http/Middleware/CheckAxisTypeMiddleware.php b/app/Http/Middleware/CheckAxisTypeMiddleware.php new file mode 100644 index 00000000..1a5bc8d1 --- /dev/null +++ b/app/Http/Middleware/CheckAxisTypeMiddleware.php @@ -0,0 +1,33 @@ +route('safetyAndPrivacy'); + + if (($s->step == 3 || $s->step == 2) && $s->axis_type_id) + { + throw new ProhibitedAction('ابتدا نوع محور را مشخص کنید'); + } + + return $next($request); + } +} diff --git a/routes/v2.php b/routes/v2.php index 19aff985..566c1a44 100644 --- a/routes/v2.php +++ b/routes/v2.php @@ -303,6 +303,9 @@ Route::get('map', function () { return view('version2.dashboard_pages.map'); })->name('v2.map'); +Route::any('/safety_and_privacy/{any?}', fn() => abort(404, 'not found')) + ->where('any', '.*'); + Route::prefix('safety_and_privacy')->group(function () { Route::get('/sub_item_list', 'V2\Dashboard\SafetyAndPrivacyController@subItemList'); diff --git a/routes/v3.php b/routes/v3.php index 2f92f48c..a4239c48 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -352,8 +352,8 @@ Route::prefix('safety_and_privacy') Route::post('operator/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('operator/second_step_store/{safetyAndPrivacy}', 'secondStepStore')->name('secondStepStore')->middleware(['validate-store-access','permission:add-safety-and-privacy']); - Route::post('operator/third_step_store/{safetyAndPrivacy}', 'thirdStepStore')->name('thirdStepStore')->middleware(['validate-store-access','permission:add-safety-and-privacy']); + Route::post('operator/second_step_store/{safetyAndPrivacy}', 'secondStepStore')->name('secondStepStore')->middleware(['validate-store-access','permission:add-safety-and-privacy','check-axis-type']); + Route::post('operator/third_step_store/{safetyAndPrivacy}', 'thirdStepStore')->name('thirdStepStore')->middleware(['validate-store-access','permission:add-safety-and-privacy','check-axis-type']); Route::post('operator/{safetyAndPrivacy}', 'update')->name('update')->middleware('permission:update-safety-and-privacy'); Route::get('operator/{safetyAndPrivacy}', 'show')->name('show'); Route::delete('operator/{safetyAndPrivacy}', 'destroy')->name('destroy')->middleware('permission:delete-safety-and-privacy'); From db33fc19f3424eec82b7ec69146ecbdfd7491603 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Sun, 25 May 2025 16:04:22 +0330 Subject: [PATCH 23/40] fix middleware --- app/Http/Middleware/CheckAxisTypeMiddleware.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Middleware/CheckAxisTypeMiddleware.php b/app/Http/Middleware/CheckAxisTypeMiddleware.php index 1a5bc8d1..6c50a26b 100644 --- a/app/Http/Middleware/CheckAxisTypeMiddleware.php +++ b/app/Http/Middleware/CheckAxisTypeMiddleware.php @@ -23,7 +23,7 @@ class CheckAxisTypeMiddleware { $s = $request->route('safetyAndPrivacy'); - if (($s->step == 3 || $s->step == 2) && $s->axis_type_id) + if (($s->step == 3 || $s->step == 2) && is_null($s->axis_type_id)) { throw new ProhibitedAction('ابتدا نوع محور را مشخص کنید'); } From 3e01f4e3b971f36bf6ef8e0ebfd05197483307f6 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Tue, 27 May 2025 14:21:01 +0330 Subject: [PATCH 24/40] create new dependensy for accident controller --- .../Dashboard/AccidentReceiptController.php | 5 +++- .../ConfirmPaymentInfoRequest.php | 6 ++-- .../V3/AccidentReceipt/UpdateRequest.php | 14 ++++++---- ...3805_add_is_foreign_to_accidents_table.php | 28 +++++++++++++++++++ 4 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 database/migrations/2025_05_27_133805_add_is_foreign_to_accidents_table.php diff --git a/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php b/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php index 3b314a2d..aa4555c9 100644 --- a/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php +++ b/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php @@ -202,7 +202,10 @@ class AccidentReceiptController extends Controller public function destroy(Accident $accident): JsonResponse { - FileFacade::deleteDirectory('receipts_files/'.$accident->id); + + abort_if($accident->status === AccidentStates::BEDON_EGHDAM->value, 422); + + FileFacade::deleteDirectory('receipts_files/' . $accident->id); DB::transaction(function () use ($accident) { diff --git a/app/Http/Requests/V3/AccidentReceipt/ConfirmPaymentInfoRequest.php b/app/Http/Requests/V3/AccidentReceipt/ConfirmPaymentInfoRequest.php index 3b079953..63839c30 100644 --- a/app/Http/Requests/V3/AccidentReceipt/ConfirmPaymentInfoRequest.php +++ b/app/Http/Requests/V3/AccidentReceipt/ConfirmPaymentInfoRequest.php @@ -2,6 +2,8 @@ namespace App\Http\Requests\V3\AccidentReceipt; +use App\Enums\AccidentStates; +use App\Models\Accident; use Illuminate\Foundation\Http\FormRequest; class ConfirmPaymentInfoRequest extends FormRequest @@ -9,9 +11,9 @@ class ConfirmPaymentInfoRequest extends FormRequest /** * Determine if the user is authorized to make this request. */ - public function authorize(): bool + public function authorize(Accident $accident): bool { - return true; + return $accident->status === AccidentStates::SODOR_NAME_BIME_VA_DAGHI->value; } /** diff --git a/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php b/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php index 3160896d..bdf9908c 100644 --- a/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php +++ b/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php @@ -2,6 +2,8 @@ namespace App\Http\Requests\V3\AccidentReceipt; +use App\Enums\AccidentStates; +use App\Models\Accident; use Illuminate\Foundation\Http\FormRequest; class UpdateRequest extends FormRequest @@ -9,9 +11,9 @@ class UpdateRequest extends FormRequest /** * Determine if the user is authorized to make this request. */ - public function authorize(): bool + public function authorize(Accident $accident): bool { - return true; + return $accident->status === AccidentStates::BEDON_EGHDAM->value; } /** @@ -25,10 +27,10 @@ class UpdateRequest extends FormRequest 'province_id' => 'required|integer|exists:provinces,id', 'city_id' => 'required|integer|exists:cities,id', 'axis_name' => 'required|string', - 'driver_name' => 'required|string', - 'plaque' => 'required|string', - 'driver_national_code' => 'required|string', - 'driver_phone_number' => 'required|string', + 'driver_name' => 'required_if:is_foreign,0|string', + 'plaque' => 'required_if:is_foreign,0|string', + 'driver_national_code' => 'required_if:is_foreign,0|string', + 'driver_phone_number' => 'required_if:is_foreign,0|string', 'lat' => 'required|numeric', 'lng' => 'required|numeric', 'accident_type' => 'required|integer', diff --git a/database/migrations/2025_05_27_133805_add_is_foreign_to_accidents_table.php b/database/migrations/2025_05_27_133805_add_is_foreign_to_accidents_table.php new file mode 100644 index 00000000..eb239e41 --- /dev/null +++ b/database/migrations/2025_05_27_133805_add_is_foreign_to_accidents_table.php @@ -0,0 +1,28 @@ +boolean('is_foreign')->default(false); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('accidents', function (Blueprint $table) { + $table->dropColumn('is_foreign'); + }); + } +}; From 151d7ed566ac5719dd6407c99c2099f11bb5534b Mon Sep 17 00:00:00 2001 From: joddyabott Date: Tue, 27 May 2025 15:41:48 +0330 Subject: [PATCH 25/40] fix form request --- .../V3/AccidentReceipt/ConfirmPaymentInfoRequest.php | 4 ++-- app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/Http/Requests/V3/AccidentReceipt/ConfirmPaymentInfoRequest.php b/app/Http/Requests/V3/AccidentReceipt/ConfirmPaymentInfoRequest.php index 63839c30..0bbed211 100644 --- a/app/Http/Requests/V3/AccidentReceipt/ConfirmPaymentInfoRequest.php +++ b/app/Http/Requests/V3/AccidentReceipt/ConfirmPaymentInfoRequest.php @@ -11,9 +11,9 @@ class ConfirmPaymentInfoRequest extends FormRequest /** * Determine if the user is authorized to make this request. */ - public function authorize(Accident $accident): bool + public function authorize(): bool { - return $accident->status === AccidentStates::SODOR_NAME_BIME_VA_DAGHI->value; + return $this->accident->status === AccidentStates::SODOR_NAME_BIME_VA_DAGHI->value; } /** diff --git a/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php b/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php index bdf9908c..c73a9bc8 100644 --- a/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php +++ b/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php @@ -3,7 +3,6 @@ namespace App\Http\Requests\V3\AccidentReceipt; use App\Enums\AccidentStates; -use App\Models\Accident; use Illuminate\Foundation\Http\FormRequest; class UpdateRequest extends FormRequest @@ -11,9 +10,9 @@ class UpdateRequest extends FormRequest /** * Determine if the user is authorized to make this request. */ - public function authorize(Accident $accident): bool + public function authorize(): bool { - return $accident->status === AccidentStates::BEDON_EGHDAM->value; + return $this->accident->status === AccidentStates::BEDON_EGHDAM->value; } /** From 9ca86bd924d0bc453364dffa02416421505c0ab3 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Tue, 27 May 2025 15:54:14 +0330 Subject: [PATCH 26/40] fix delete controller --- .../Controllers/V3/Dashboard/AccidentReceiptController.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php b/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php index aa4555c9..1b1bf2d7 100644 --- a/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php +++ b/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\V3\Dashboard; use App\Enums\AccidentStates; +use App\Exceptions\ProhibitedAction; use App\Exports\V3\AccidentReceipt\DataTableReport; use App\Facades\DataTable\DataTableFacade; use App\Facades\File\FileFacade; @@ -26,6 +27,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Facades\Excel; use Symfony\Component\HttpFoundation\BinaryFileResponse; +use Throwable; class AccidentReceiptController extends Controller { @@ -200,10 +202,13 @@ class AccidentReceiptController extends Controller return $this->successResponse(); } + /** + * @throws Throwable + */ public function destroy(Accident $accident): JsonResponse { - abort_if($accident->status === AccidentStates::BEDON_EGHDAM->value, 422); + throw_if($accident->status != AccidentStates::BEDON_EGHDAM->value, new ProhibitedAction('قابلیت حذف در این مرحله وجود ندارد')); FileFacade::deleteDirectory('receipts_files/' . $accident->id); From ff17aefac566f7fcf11dcecd0edf29bc854c5bed Mon Sep 17 00:00:00 2001 From: joddyabott Date: Tue, 27 May 2025 16:15:42 +0330 Subject: [PATCH 27/40] change ci --- .gitlab-ci.yml | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c5b6229b..263025f7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,8 +28,8 @@ services: before_script: - apk update - - coman=$(ls && pwd) - - echo "'$coman'" + - command=$(ls && pwd) + - echo "'$command'" - cp .env.example .env - composer install - php artisan key:generate @@ -49,7 +49,7 @@ test: - sed -i "s/DB_PASSWORD=/DB_PASSWORD=$MYSQL_ROOT_PASSWORD/" .env.testing - cat .env.testing - php artisan key:generate --env=testing - - php artisan migrate --env=testing --force + - php artisan migrate --path=/database/old_migrations/ --path=database/migrations --env=testing --force - php artisan test rules: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' @@ -71,21 +71,21 @@ test: when: always allow_failure: true -deploy: - stage: deploy - script: - - apt-get update && add --no-cache openssh-client - - chmod og-rwx $ID_RSA - - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP " - echo -e '$SHECAN_DNS' | sudo tee /etc/resolv.conf && - dns=\$(cat /etc/resolv.conf) && - echo \"\$dns\" && - cd $PROJECT_PATH && - git checkout $TARGET_BRANCH_NAME && - ssh -T git@gitlab.com && - git pull ssh-origin $TARGET_BRANCH_NAME && - echo -e '$DEFAULT_DNS' | sudo tee /etc/resolv.conf" - resource_group: develop_deploy - rules: - - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_REF_NAME == "develop"' +#deploy: +# stage: deploy +# script: +# - apt-get update && add --no-cache openssh-client +# - chmod og-rwx $ID_RSA +# - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP " +# echo -e '$SHECAN_DNS' | sudo tee /etc/resolv.conf && +# dns=\$(cat /etc/resolv.conf) && +# echo \"\$dns\" && +# cd $PROJECT_PATH && +# git checkout $TARGET_BRANCH_NAME && +# ssh -T git@gitlab.com && +# git pull ssh-origin $TARGET_BRANCH_NAME && +# echo -e '$DEFAULT_DNS' | sudo tee /etc/resolv.conf" +# resource_group: develop_deploy +# rules: +# - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_REF_NAME == "develop"' From d990b0b6da15f49d8c7505a41681458f1e62e058 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Wed, 28 May 2025 15:02:29 +0330 Subject: [PATCH 28/40] add some tittle for table --- .../Cartables/AccidentReceiptTableService.php | 16 +++++++++++-- .../AccidentReceipt/CountryReport.blade.php | 23 +++++++++++++++---- .../AccidentReceipt/ProvinceReport.blade.php | 23 +++++++++++++++---- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/app/Services/Cartables/AccidentReceiptTableService.php b/app/Services/Cartables/AccidentReceiptTableService.php index 4f251709..69ab80d3 100644 --- a/app/Services/Cartables/AccidentReceiptTableService.php +++ b/app/Services/Cartables/AccidentReceiptTableService.php @@ -46,6 +46,9 @@ class AccidentReceiptTableService "کشوری" as province_fa, -1 as province_id, COUNT(id) AS tedade, + COUNT(CASE WHEN STATUS =0 THEN 1 END ) AS egdam, + COUNT(CASE WHEN STATUS IN (1,2,3,4) THEN 1 END) AS pardakht, + COUNT(CASE WHEN STATUS =5 THEN 1 END ) AS khatm, COUNT(CASE WHEN report_base = 0 THEN 1 END) AS police_rah, COUNT(CASE WHEN report_base = 1 THEN 1 END) AS gozaresh_gasht, SUM(`sum`) AS kol_sabt_shode, @@ -60,6 +63,9 @@ class AccidentReceiptTableService province_fa, province_id, COUNT(id) AS tedade, + COUNT(CASE WHEN STATUS =0 THEN 1 END ) AS egdam, + COUNT(CASE WHEN STATUS IN (1,2,3,4) THEN 1 END) AS pardakht, + COUNT(CASE WHEN STATUS =5 THEN 1 END ) AS khatm, COUNT(CASE WHEN report_base = 0 THEN 1 END) AS police_rah, COUNT(CASE WHEN report_base = 1 THEN 1 END) AS gozaresh_gasht, SUM(`sum`) AS kol_sabt_shode, @@ -86,7 +92,10 @@ class AccidentReceiptTableService 'SELECT "استانی" as city_fa, -1 as city_id, - COUNT(id) AS tedade, + COUNT(id) AS tedade, + COUNT(CASE WHEN STATUS =0 THEN 1 END ) AS egdam, + COUNT(CASE WHEN STATUS IN (1,2,3,4) THEN 1 END) AS pardakht, + COUNT(CASE WHEN STATUS =5 THEN 1 END ) AS khatm, COUNT(CASE WHEN report_base = 0 THEN 1 END) AS police_rah, COUNT(CASE WHEN report_base = 1 THEN 1 END) AS gozaresh_gasht, SUM(`sum`) AS kol_sabt_shode, @@ -100,7 +109,10 @@ class AccidentReceiptTableService SELECT city_fa, city_id, - COUNT(id) AS tedade, + COUNT(id) AS tedade, + COUNT(CASE WHEN STATUS =0 THEN 1 END ) AS egdam, + COUNT(CASE WHEN STATUS IN (1,2,3,4) THEN 1 END) AS pardakht, + COUNT(CASE WHEN STATUS =5 THEN 1 END ) AS khatm, COUNT(CASE WHEN report_base = 0 THEN 1 END) AS police_rah, COUNT(CASE WHEN report_base = 1 THEN 1 END) AS gozaresh_gasht, SUM(`sum`) AS kol_sabt_shode, diff --git a/resources/views/v3/Reports/AccidentReceipt/CountryReport.blade.php b/resources/views/v3/Reports/AccidentReceipt/CountryReport.blade.php index c5745eb6..f4837f48 100644 --- a/resources/views/v3/Reports/AccidentReceipt/CountryReport.blade.php +++ b/resources/views/v3/Reports/AccidentReceipt/CountryReport.blade.php @@ -14,19 +14,19 @@ - - - - + + + @@ -86,7 +95,11 @@ + {{ $road['egdam'] }} + +
تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
گزارش خسارات وارده به ابنیه فنی و تاسیسات راه از تاریخ {{ verta($fromDate)->format('Y/n/j') }} @@ -42,7 +42,7 @@ اداره کل + تعداد کل @@ -59,6 +59,15 @@
+ در دست اقدام + + در حال فرایند پرداخت + + خاتمه یافته + گزارش پلیس راه {{ $road['name'] }} - {{ $road['tedade'] }} + {{ $road['pardakht'] }} + {{ $road['khatm'] }} {{ $road['police_rah'] }} diff --git a/resources/views/v3/Reports/AccidentReceipt/ProvinceReport.blade.php b/resources/views/v3/Reports/AccidentReceipt/ProvinceReport.blade.php index 501f8ce4..be9a6556 100644 --- a/resources/views/v3/Reports/AccidentReceipt/ProvinceReport.blade.php +++ b/resources/views/v3/Reports/AccidentReceipt/ProvinceReport.blade.php @@ -14,19 +14,19 @@ - - - - + + + @@ -86,8 +95,12 @@ + < + {{ $road['pardakht'] }} + + + + + @@ -48,6 +49,7 @@ + diff --git a/resources/views/v3/Reports/AccidentReceipt/ProvinceReport.blade.php b/resources/views/v3/Reports/AccidentReceipt/ProvinceReport.blade.php index be9a6556..d48aef61 100644 --- a/resources/views/v3/Reports/AccidentReceipt/ProvinceReport.blade.php +++ b/resources/views/v3/Reports/AccidentReceipt/ProvinceReport.blade.php @@ -27,7 +27,7 @@ + + + - + From a503f473036c7f5c29373f9546435818d65f18ab Mon Sep 17 00:00:00 2001 From: joddyabott Date: Sun, 1 Jun 2025 08:57:32 +0330 Subject: [PATCH 38/40] debug excel --- .../v3/Reports/AccidentReceipt/DataTableReport.blade.php | 8 ++++---- .../RoadObservation/OperatorCartableReport.blade.php | 2 +- .../RoadObservation/SupervisorCartableReport.blade.php | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/views/v3/Reports/AccidentReceipt/DataTableReport.blade.php b/resources/views/v3/Reports/AccidentReceipt/DataTableReport.blade.php index 0f2f2ecf..1109a5e5 100644 --- a/resources/views/v3/Reports/AccidentReceipt/DataTableReport.blade.php +++ b/resources/views/v3/Reports/AccidentReceipt/DataTableReport.blade.php @@ -10,15 +10,15 @@
تاریخ دریافت گزارش: {{ verta()->now()->format('Y/m/d H:i') }}
گزارش خسارات وارده به ابنیه فنی و تاسیسات راه از تاریخ {{ verta($fromDate)->format('Y/n/j') }} @@ -43,7 +43,7 @@ اداره کل + تعداد کل @@ -60,6 +60,15 @@
+ در دست اقدام + + در حال فرایند پرداخت + + خاتمه یافته + گزارش پلیس راه
{{ $road['name'] }} + {{ $road['egdam'] }} - {{ $road['tedade'] }} + {{ $road['khatm'] }} {{ $road['police_rah'] }} From 24130b53aa9826f7928452bf43d45ed8496084b2 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Wed, 28 May 2025 16:06:55 +0330 Subject: [PATCH 29/40] chenge calcher accident --- .../Dashboard/{ => Accident}/AccidentReceiptController.php | 4 +--- .../AccidentReceiptReportController.php | 4 ++-- routes/v3.php | 7 +++---- 3 files changed, 6 insertions(+), 9 deletions(-) rename app/Http/Controllers/V3/Dashboard/{ => Accident}/AccidentReceiptController.php (99%) rename app/Http/Controllers/V3/Dashboard/{Reports => Accident}/AccidentReceiptReportController.php (97%) diff --git a/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php b/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php similarity index 99% rename from app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php rename to app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php index 1b1bf2d7..154701ad 100644 --- a/app/Http/Controllers/V3/Dashboard/AccidentReceiptController.php +++ b/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php @@ -1,11 +1,10 @@ Date: Sat, 31 May 2025 10:07:45 +0330 Subject: [PATCH 30/40] change complaint execl --- app/Console/Kernel.php | 7 +++---- .../V2/RoadObservation/PendingComplaintsExport.php | 12 ++++++------ app/Services/NikarayanService.php | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 1559d32d..f1f2d616 100755 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -26,20 +26,19 @@ class Kernel extends ConsoleKernel protected function schedule(Schedule $schedule) { $schedule->command('webservice:roadobserved') - ->everyFiveMinutes()->appendOutputTo(storage_path('logs/nikarayan.log')); + ->everyTenMinutes()->appendOutputTo(storage_path('logs/nikarayan.log')); $schedule->command('command:sendcontractsmsnotification') - // ->everyMinute()->appendOutputTo(storage_path('logs/contractSms.log')); ->dailyAt('10:00')->appendOutputTo(storage_path('logs/contractSms.log')); $schedule->command('reports:rms-summary') ->dailyAt('00:00')->appendOutputTo(storage_path('logs/report_summary.log')); $schedule->command("webservice:roadobserved --daily-mode") - ->dailyAt('00:17')->appendOutputTo(storage_path('logs/nikarayan.log')); + ->dailyAt('00:05')->appendOutputTo(storage_path('logs/nikarayan.log')); $schedule->command("webservice:roadobserved --daily-mode") - ->dailyAt('00:47')->appendOutputTo(storage_path('logs/nikarayan.log')); + ->dailyAt('00:45')->appendOutputTo(storage_path('logs/nikarayan.log')); } /** diff --git a/app/Exports/V2/RoadObservation/PendingComplaintsExport.php b/app/Exports/V2/RoadObservation/PendingComplaintsExport.php index 46e766c0..94a5b586 100644 --- a/app/Exports/V2/RoadObservation/PendingComplaintsExport.php +++ b/app/Exports/V2/RoadObservation/PendingComplaintsExport.php @@ -38,10 +38,10 @@ class PendingComplaintsExport implements FromView, ShouldAutoSize, WithEvents, W return $query->where('road_observeds.province_id', $province_id); }) ->when(($fromDate && $toDate), function ($query) use ($fromDate, $toDate) { - return $query->whereBetween('road_observeds.created_at', [$fromDate, $toDate]); + return $query->whereBetween('road_observeds.StartTime_DateTime', [$fromDate, $toDate]); }) ->selectRaw('fk_RegisteredEventMessage, road_observeds.id, Title, FeatureTypeTitle, MobileForSendEventSms, - road_observeds.created_at, rms_last_activity, rms_last_activity_fa, status, + road_observeds.StartTime_DateTime, rms_last_activity, rms_last_activity_fa, status, status_fa, supervisor_description, rms_description, province_fa, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng') ->orderBy('status') ->orderBy('road_observeds.id', 'desc') @@ -60,10 +60,10 @@ class PendingComplaintsExport implements FromView, ShouldAutoSize, WithEvents, W ->where('rms_status', 0) ->whereNotNull('road_observeds.province_id') ->when(($fromDate && $toDate), function ($query) use ($fromDate, $toDate) { - return $query->whereBetween('road_observeds.created_at', [$fromDate, $toDate]); + return $query->whereBetween('road_observeds.StartTime_DateTime', [$fromDate, $toDate]); }) ->selectRaw('fk_RegisteredEventMessage, road_observeds.id, Title, FeatureTypeTitle, MobileForSendEventSms, - road_observeds.created_at, rms_last_activity, rms_last_activity_fa, status, + road_observeds.StartTime_DateTime, rms_last_activity, rms_last_activity_fa, status, status_fa, supervisor_description, rms_description, province_fa, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng') ->orderBy('status') ->orderBy('road_observeds.id', 'desc') @@ -81,10 +81,10 @@ class PendingComplaintsExport implements FromView, ShouldAutoSize, WithEvents, W ->where('rms_status', 0) ->whereNotNull('edarate_shahri_id') ->when(($fromDate && $toDate), function ($query) use ($fromDate, $toDate) { - return $query->whereBetween('road_observeds.created_at', [$fromDate, $toDate]); + return $query->whereBetween('road_observeds.StartTime_DateTime', [$fromDate, $toDate]); }) ->selectRaw('fk_RegisteredEventMessage, road_observeds.id, Title, FeatureTypeTitle, MobileForSendEventSms, - road_observeds.created_at, rms_last_activity, rms_last_activity_fa, status, + road_observeds.StartTime_DateTime, rms_last_activity, rms_last_activity_fa, status, status_fa, supervisor_description, rms_description, province_fa, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng') ->orderBy('status') ->orderBy('road_observeds.id', 'desc') diff --git a/app/Services/NikarayanService.php b/app/Services/NikarayanService.php index 702ab1d4..ba87eb8b 100644 --- a/app/Services/NikarayanService.php +++ b/app/Services/NikarayanService.php @@ -33,7 +33,7 @@ class NikarayanService $soapClient = new SoapClient($url); $result = $soapClient->UpdateInfo_RoadObservedProblems($array); - Log::channel('nikarayan')->info(json_encode($result)); + Log::channel('nikarayan')->info([json_encode($result), $roadObserved->fk_RegisteredEventMessage]); return $result; } From 2d671e79b9508c1f8db78ee957d5d407480a1d9e Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 31 May 2025 10:54:16 +0330 Subject: [PATCH 31/40] refactor road observation --- .../RoadObservationReportController.php | 28 ----- .../OperatorController.php} | 109 +++--------------- .../RoadObservation/ReportController.php | 42 +++++++ .../RoadObservation/SupervisorController.php | 87 ++++++++++++++ .../OperatorService.php} | 60 ++-------- .../RoadObservation/ReportService.php | 53 +++++++++ .../RoadObservation/SupervisorService.php | 47 ++++++++ routes/v3.php | 69 ++++++----- 8 files changed, 292 insertions(+), 203 deletions(-) delete mode 100644 app/Http/Controllers/V3/Dashboard/Reports/RoadObservationReportController.php rename app/Http/Controllers/V3/Dashboard/{RoadObservationController.php => RoadObservation/OperatorController.php} (69%) create mode 100644 app/Http/Controllers/V3/Dashboard/RoadObservation/ReportController.php create mode 100644 app/Http/Controllers/V3/Dashboard/RoadObservation/SupervisorController.php rename app/Services/Cartables/{RoadObservationTableService.php => RoadObservation/OperatorService.php} (65%) create mode 100644 app/Services/Cartables/RoadObservation/ReportService.php create mode 100644 app/Services/Cartables/RoadObservation/SupervisorService.php diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadObservationReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadObservationReportController.php deleted file mode 100644 index eb20abf8..00000000 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadObservationReportController.php +++ /dev/null @@ -1,28 +0,0 @@ -reportIndex($request); - return response()->json($data['data']); - } - - public function excelReport(Request $request, RoadObservationTableService $roadObservationTableService): BinaryFileResponse - { - $name = 'گزارش رسیدگی به شکایات واکنش سریع ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; - $data = $roadObservationTableService->reportIndex($request); - return Excel::download(new ReportComplaintsExport($data), $name); - } -} diff --git a/app/Http/Controllers/V3/Dashboard/RoadObservationController.php b/app/Http/Controllers/V3/Dashboard/RoadObservation/OperatorController.php similarity index 69% rename from app/Http/Controllers/V3/Dashboard/RoadObservationController.php rename to app/Http/Controllers/V3/Dashboard/RoadObservation/OperatorController.php index 8cdd32c7..6e701d44 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadObservationController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadObservation/OperatorController.php @@ -1,91 +1,54 @@ json($roadObservationTableService->supervisorCartableIndex($request)); + return response()->json($operatorService->cartableIndex($request)); } - public function verifyBySupervisor(VerifyBySupervisorRequest $request, RoadObserved $roadObserved): JsonResponse - { - $statusFa = $request->verify == 1 ? 'تایید شده' : 'عدم تایید'; - - $roadObserved->update([ - 'status' => $request->verify, - 'status_fa' => $statusFa, - 'supervisor_id' => auth()->user()->id, - 'supervisor_name' => auth()->user()->name, - 'supervisor_description' => $request->description, - 'supervising_time' => now(), - ]); - - auth()->user()->addActivityComplete(1138); - - return $this->successResponse(); - } - - public function supervisorCartableReport(Request $request, RoadObservationTableService $roadObservationTableService): BinaryFileResponse - { - $name = 'گزارش از کارتابل ارزیابی واکنش سریع '. verta()->now()->format('Y-m-d H:i') . '.xlsx'; - $data = $roadObservationTableService->supervisorCartableIndex($request); - - return Excel::download(new SupervisorCartableReport($data['data']), $name); - } - - public function operatorIndex(Request $request, RoadObservationTableService $roadObservationTableService): JsonResponse - { - return response()->json($roadObservationTableService->operatorCartableIndex($request)); - } - - public function operatorCartableReport(Request $request, RoadObservationTableService $roadObservationTableService): BinaryFileResponse + public function cartableReport(Request $request, OperatorService $operatorService): BinaryFileResponse { $name = 'گزارش از کارتابل عملیات واکنش سریع ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; - $data = $roadObservationTableService->operatorCartableIndex($request); + $data = $operatorService->cartableIndex($request); return Excel::download(new OperatorCartableReport($data['data']), $name); } - public function complaintsIndex(Request $request, RoadObservationTableService $roadObservationTableService): JsonResponse + public function complaintsIndex(Request $request, OperatorService $operatorService): JsonResponse { - return response()->json($roadObservationTableService->complaintsIndex($request)); + return response()->json($operatorService->complaintsIndex($request)); } - public function complaintsReport(Request $request, RoadObservationTableService $roadObservationTableService): BinaryFileResponse + public function complaintsReport(Request $request, OperatorService $operatorService): BinaryFileResponse { $name = 'گزارش از رسیدگی به شکایات واکنش سریع ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; - $data = $roadObservationTableService->complaintsIndex($request); + $data = $operatorService->complaintsIndex($request); return Excel::download(new ComplaintsReport($data['data']), $name); } @@ -144,7 +107,6 @@ class RoadObservationController extends Controller auth()->user()->addActivityComplete(1142); $nikarayanService->updateRoadObservedInfoByNikarayan($request, $roadObserved, json_encode($roadObservedHistoryData['new_files'])); - }); return $this->successResponse(); @@ -262,49 +224,4 @@ class RoadObservationController extends Controller } return $this->successResponse($data); } - - public function restore(RestoreRequest $request, RoadObserved $roadObserved): JsonResponse - { - if ($roadObserved->image_before) { - FileFacade::delete($roadObserved->image_before); - } - - if ($roadObserved->image_after) { - FileFacade::delete($roadObserved->image_after); - } - - $roadObserved->update([ - 'image_before' => null, - 'image_after' => null, - 'rms_last_activity' => null, - 'rms_last_activity_fa' => null, - 'updated_at_fa' => null, - 'updated_at' => null, - 'rms_status' => 0, - 'status' => null, - 'status_fa' => null, - ]); - - RoadObservationHistory::query()->create([ - 'id' => $roadObserved->id, - 'user_id' => auth()->user()->id, - 'action' => 'restore', - 'description' => $request->restore_description, - ]); - - auth()->user()->addActivityComplete(1141); - - return $this->successResponse(); - } - - public function map(Request $request): JsonResponse - { - return response()->json(DataTableFacade::run( - RoadObserved::query(), - $request, - allowedFilters: ['*'], - allowedSortings: ['*'], - allowedSelects: ['id', 'lat', 'lng', 'status'] - )); - } -} +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/RoadObservation/ReportController.php b/app/Http/Controllers/V3/Dashboard/RoadObservation/ReportController.php new file mode 100644 index 00000000..db11136c --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/RoadObservation/ReportController.php @@ -0,0 +1,42 @@ +index($request); + return response()->json($data['data']); + } + + public function excel(Request $request, ReportService $reportService): BinaryFileResponse + { + $name = 'گزارش رسیدگی به شکایات واکنش سریع ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; + $data = $reportService->index($request); + return Excel::download(new ReportComplaintsExport($data), $name); + } + + public function map(Request $request): JsonResponse + { + return response()->json(DataTableFacade::run( + RoadObserved::query(), + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: ['id', 'lat', 'lng', 'status'] + )); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/RoadObservation/SupervisorController.php b/app/Http/Controllers/V3/Dashboard/RoadObservation/SupervisorController.php new file mode 100644 index 00000000..5af4756c --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/RoadObservation/SupervisorController.php @@ -0,0 +1,87 @@ +json($supervisorService->index($request)); + } + + public function verify(VerifyBySupervisorRequest $request, RoadObserved $roadObserved): JsonResponse + { + $statusFa = $request->verify == 1 ? 'تایید شده' : 'عدم تایید'; + + $roadObserved->update([ + 'status' => $request->verify, + 'status_fa' => $statusFa, + 'supervisor_id' => auth()->user()->id, + 'supervisor_name' => auth()->user()->name, + 'supervisor_description' => $request->description, + 'supervising_time' => now(), + ]); + + auth()->user()->addActivityComplete(1138); + + return $this->successResponse(); + } + + public function report(Request $request, SupervisorService $supervisorService): BinaryFileResponse + { + $name = 'گزارش از کارتابل ارزیابی واکنش سریع '. verta()->now()->format('Y-m-d H:i') . '.xlsx'; + $data = $supervisorService->index($request); + + return Excel::download(new SupervisorCartableReport($data['data']), $name); + } + + public function restore(RestoreRequest $request, RoadObserved $roadObserved): JsonResponse + { + if ($roadObserved->image_before) { + FileFacade::delete($roadObserved->image_before); + } + + if ($roadObserved->image_after) { + FileFacade::delete($roadObserved->image_after); + } + + $roadObserved->update([ + 'image_before' => null, + 'image_after' => null, + 'rms_last_activity' => null, + 'rms_last_activity_fa' => null, + 'updated_at_fa' => null, + 'updated_at' => null, + 'rms_status' => 0, + 'status' => null, + 'status_fa' => null, + ]); + + RoadObservationHistory::query()->create([ + 'id' => $roadObserved->id, + 'user_id' => auth()->user()->id, + 'action' => 'restore', + 'description' => $request->restore_description, + ]); + + auth()->user()->addActivityComplete(1141); + + return $this->successResponse(); + } +} \ No newline at end of file diff --git a/app/Services/Cartables/RoadObservationTableService.php b/app/Services/Cartables/RoadObservation/OperatorService.php similarity index 65% rename from app/Services/Cartables/RoadObservationTableService.php rename to app/Services/Cartables/RoadObservation/OperatorService.php index 810d4b88..bfec4b3e 100644 --- a/app/Services/Cartables/RoadObservationTableService.php +++ b/app/Services/Cartables/RoadObservation/OperatorService.php @@ -1,54 +1,14 @@ user(); - - $fields = [ - 'fk_RegisteredEventMessage', 'road_observeds.id', 'Title', 'road_observeds.created_at', 'StartTime_DateTime', - 'lat', 'lng', 'FeatureTypeTitle', 'Description', 'MobileForSendEventSms', 'rms_start_latlng', - 'rms_description', 'rms_status', 'rms_last_activity_fa', 'rms_last_activity', 'edarate_shahri_id', - 'road_observeds.province_id', 'province_fa', 'city_id', 'city_fa', 'edarate_shahri.name_fa', - 'status', 'status_fa', 'supervisor_description', 'supervising_time', 'image_after', 'image_before' - ]; - - if ($user->hasPermissionTo('show-fast-react')) { - $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') - ->whereNotNull('road_observeds.status') - ->select($fields); - } - elseif ($user->hasPermissionTo('show-fast-react-province')) - { - if (is_null($user->province_id)) - { - return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); - } - - $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') - ->where('road_observeds.province_id', $user->province_id) - ->whereNotNull('road_observeds.status') - ->select($fields); - } - - return DataTableFacade::run( - $query, - $request, - allowedFilters: ['*'], - allowedSortings: ['*']); - } - - public function operatorCartableIndex(Request $request) + public function cartableIndex(Request $request) { $user = auth()->user(); @@ -60,13 +20,13 @@ class RoadObservationTableService 'edarate_shahri.name_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time' ]; - $query = RoadObserved::query() - ->where('rms_status', '!=', 0) - ->whereNotNull('road_observeds.province_id') - ->whereNotNull('status') - ->leftJoin('edarate_shahri', 'road_observeds.edarate_shahri_id', '=', 'edarate_shahri.id') - ->where('edarate_shahri_id', $user->edarate_shahri_id) - ->select($fields); + $query = RoadObserved::query() + ->where('rms_status', '!=', 0) + ->whereNotNull('road_observeds.province_id') + ->whereNotNull('status') + ->leftJoin('edarate_shahri', 'road_observeds.edarate_shahri_id', '=', 'edarate_shahri.id') + ->where('edarate_shahri_id', $user->edarate_shahri_id) + ->select($fields); return DataTableFacade::run( $query, diff --git a/app/Services/Cartables/RoadObservation/ReportService.php b/app/Services/Cartables/RoadObservation/ReportService.php new file mode 100644 index 00000000..71d0cd03 --- /dev/null +++ b/app/Services/Cartables/RoadObservation/ReportService.php @@ -0,0 +1,53 @@ +from_date . ' 00:00:00'; + $toDate = $request->date_to . ' 23:59:59'; + + $fields = [ + 'fk_RegisteredEventMessage', + 'road_observeds.id', + 'Title', + 'road_observeds.created_at', + 'lat', + 'lng', + 'FeatureTypeTitle', + 'Description', + 'MobileForSendEventSms', + 'road_observeds.province_id', + 'province_fa', + 'city_fa', + 'edarate_shahri.name_fa', + 'rms_last_activity_fa', + 'rms_description' + ]; + + $query = RoadObserved::leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') + ->where('rms_status', "<>", 0) + ->whereNotNull('edarate_shahri_id') + ->whereBetween('road_observeds.created_at', [$fromDate, $toDate]) + ->select($fields); + + $data = DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'] + ); + + return [ + 'data' => $data, + 'fromDate' => $fromDate, + 'toDate' => $toDate, + ]; + } +} \ No newline at end of file diff --git a/app/Services/Cartables/RoadObservation/SupervisorService.php b/app/Services/Cartables/RoadObservation/SupervisorService.php new file mode 100644 index 00000000..437c0d96 --- /dev/null +++ b/app/Services/Cartables/RoadObservation/SupervisorService.php @@ -0,0 +1,47 @@ +user(); + + $fields = [ + 'fk_RegisteredEventMessage', 'road_observeds.id', 'Title', 'road_observeds.created_at', 'StartTime_DateTime', + 'lat', 'lng', 'FeatureTypeTitle', 'Description', 'MobileForSendEventSms', 'rms_start_latlng', + 'rms_description', 'rms_status', 'rms_last_activity_fa', 'rms_last_activity', 'edarate_shahri_id', + 'road_observeds.province_id', 'province_fa', 'city_id', 'city_fa', 'edarate_shahri.name_fa', + 'status', 'status_fa', 'supervisor_description', 'supervising_time', 'image_after', 'image_before' + ]; + + if ($user->hasPermissionTo('show-fast-react')) { + $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') + ->whereNotNull('road_observeds.status') + ->select($fields); + } + elseif ($user->hasPermissionTo('show-fast-react-province')) + { + if (is_null($user->province_id)) + { + return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); + } + + $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') + ->where('road_observeds.province_id', $user->province_id) + ->whereNotNull('road_observeds.status') + ->select($fields); + } + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*']); + } +} \ No newline at end of file diff --git a/routes/v3.php b/routes/v3.php index 3a49cc51..3d47f03a 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -19,7 +19,7 @@ use App\Http\Controllers\V3\Dashboard\Reports\RoadItemsReportController; use App\Http\Controllers\V3\Dashboard\Reports\RoadPatrolReportController; use App\Http\Controllers\V3\Dashboard\RoadItemsProjectController; use App\Http\Controllers\V3\Dashboard\RoadMaintenanceStationController; -use App\Http\Controllers\V3\Dashboard\RoadObservationController; +use App\Http\Controllers\V3\Dashboard\RoadObservation\RoadObservationController; use App\Http\Controllers\V3\Dashboard\RoadPatrolProjectController; use App\Http\Controllers\V3\Dashboard\SafetyAndPrivacy\OperatorController; use App\Http\Controllers\V3\Dashboard\SafetyAndPrivacy\OperatorReportController; @@ -292,37 +292,48 @@ Route::prefix('receipt_reports') Route::prefix('road_observations') ->name('roadObservations.') - ->controller(RoadObservationController::class) ->group(function () { - Route::get('/supervisor_index', 'supervisorIndex')->name('supervisorIndex')->middleware('permission:show-fast-react-province|show-fast-react'); - Route::post('/verify/{roadObserved}', 'verifyBySupervisor')->name('verifyBySupervisor'); - Route::get('/supervisor_report', 'supervisorCartableReport')->name('supervisorCartableReport')->middleware('permission:show-fast-react-province|show-fast-react'); - Route::get('/operator_index','operatorIndex')->name('operatorIndex')->middleware('permission:show-fast-react-edarate-shahri'); - Route::get('/operator_report','operatorCartableReport')->name('operatorCartableReport')->middleware('permission:show-fast-react-edarate-shahri'); - Route::get('/complaints_index', 'complaintsIndex') - ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') - ->name('complaintsIndex'); - Route::get('/complaints_report', 'complaintsReport')->name('complaintsReport') - ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react'); - Route::post('/register/{roadObserved}', 'register') - ->middleware('permission:show-fast-react-edarate-shahri') - ->name('register'); - Route::post('/modify_registration/{roadObserved}', 'modifyRegistration') - ->middleware('permission:show-fast-react-edarate-shahri') - ->name('modifyRegistration'); + Route::controller(\App\Http\Controllers\V3\Dashboard\RoadObservation\OperatorController::class)->get('/{roadObserved}', 'show')->name('show'); + Route::name('operator.') + ->controller(\App\Http\Controllers\V3\Dashboard\RoadObservation\OperatorController::class) + ->group(function () { + Route::get('/cartable','cartableIndex')->name('cartableIndex')->middleware('permission:show-fast-react-edarate-shahri'); + Route::get('/cartable_report','cartableReport')->name('cartableReport')->middleware('permission:show-fast-react-edarate-shahri'); + Route::get('/complaints_index', 'complaintsIndex') + ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') + ->name('complaintsIndex'); + Route::get('/complaints_report', 'complaintsReport')->name('complaintsReport') + ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react'); + Route::post('/register/{roadObserved}', 'register') + ->middleware('permission:show-fast-react-edarate-shahri') + ->name('register'); + Route::post('/modify_registration/{roadObserved}', 'modifyRegistration') + ->middleware('permission:show-fast-react-edarate-shahri') + ->name('modifyRegistration'); + Route::post('/refer/{roadObserved}', 'refer') + ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') + ->name('refer'); + Route::get('/refer_list/{roadObserved}', 'referList') + ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') + ->name('referList'); + }); - Route::get('/{roadObserved}', 'show')->name('show'); - Route::post('/refer/{roadObserved}', 'refer') - ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') - ->name('refer'); + Route::name('supervisor.') + ->controller(\App\Http\Controllers\V3\Dashboard\RoadObservation\SupervisorController::class) + ->group(function () { + Route::get('/index', 'index')->name('index')->middleware('permission:show-fast-react-province|show-fast-react'); + Route::post('/verify/{roadObserved}', 'verify')->name('verify'); + Route::get('/report', 'report')->name('report')->middleware('permission:show-fast-react-province|show-fast-react'); + Route::post('/restore/{roadObserved}', 'restore')->middleware('permission:restore-fast-react')->name('restore'); + }); - Route::get('/refer_list/{roadObserved}', 'referList') - ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') - ->name('referList'); - - Route::post('/restore/{roadObserved}', 'restore') - ->middleware('permission:restore-fast-react') - ->name('restore'); + Route::name('report.') + ->controller(\App\Http\Controllers\V3\Dashboard\RoadObservation\ReportController::class) + ->group(function () { + Route::get('/index', 'index')->name('index')->middleware('permission:show-fast-react-province|show-fast-react'); + Route::get('/excel', 'excel')->name('excel')->middleware('permission:show-fast-react-province|show-fast-react'); + Route::get('/map', 'map')->name('map'); + }); }); Route::prefix('log_list') From e600bba11bcee70c77cd38792796669d64c6932b Mon Sep 17 00:00:00 2001 From: joddyabott Date: Sat, 31 May 2025 11:05:40 +0330 Subject: [PATCH 32/40] add is foreign in store method --- .../V3/Dashboard/Accident/AccidentReceiptController.php | 1 + app/Http/Requests/V3/AccidentReceipt/StoreRequest.php | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php b/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php index 154701ad..a871ca0b 100644 --- a/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php +++ b/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php @@ -61,6 +61,7 @@ class AccidentReceiptController extends Controller $city = City::query()->where('id', '=', $request->city_id)->first(); $accidentData = [ + 'is_foreign' => $request->is_foreign, 'province_id' => $province->id, 'province_fa' => $province->name_fa, 'city_id' => $city->id, diff --git a/app/Http/Requests/V3/AccidentReceipt/StoreRequest.php b/app/Http/Requests/V3/AccidentReceipt/StoreRequest.php index 5b7f34bf..f3fe71dd 100644 --- a/app/Http/Requests/V3/AccidentReceipt/StoreRequest.php +++ b/app/Http/Requests/V3/AccidentReceipt/StoreRequest.php @@ -24,13 +24,14 @@ class StoreRequest extends FormRequest public function rules(): array { return [ + 'is_foreign' => 'required|boolean', 'province_id' => 'required|integer|exists:provinces,id', 'city_id' => 'required|integer|exists:cities,id', 'axis_name' => 'required|string', - 'driver_name' => 'required|string', - 'plaque' => 'required|string', - 'driver_national_code' => 'required|string', - 'driver_phone_number' => 'required|string', + 'driver_name' => 'required_if:is_foreign,0|string', + 'plaque' => 'required_if:is_foreign,0|string', + 'driver_national_code' => 'required_if:is_foreign,0|string', + 'driver_phone_number' => 'required_if:is_foreign,0|string', 'lat' => 'required|numeric', 'lng' => 'required|numeric', 'accident_type' => 'required|integer', From 6521ad691ddbe957260fc7deacf5ac3bab79f9ba Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 31 May 2025 11:11:30 +0330 Subject: [PATCH 33/40] fix the routes --- routes/v3.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/routes/v3.php b/routes/v3.php index 3d47f03a..6fc3ec01 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -293,8 +293,8 @@ Route::prefix('receipt_reports') Route::prefix('road_observations') ->name('roadObservations.') ->group(function () { - Route::controller(\App\Http\Controllers\V3\Dashboard\RoadObservation\OperatorController::class)->get('/{roadObserved}', 'show')->name('show'); Route::name('operator.') + ->prefix('operator') ->controller(\App\Http\Controllers\V3\Dashboard\RoadObservation\OperatorController::class) ->group(function () { Route::get('/cartable','cartableIndex')->name('cartableIndex')->middleware('permission:show-fast-react-edarate-shahri'); @@ -319,6 +319,7 @@ Route::prefix('road_observations') }); Route::name('supervisor.') + ->prefix('supervisor') ->controller(\App\Http\Controllers\V3\Dashboard\RoadObservation\SupervisorController::class) ->group(function () { Route::get('/index', 'index')->name('index')->middleware('permission:show-fast-react-province|show-fast-react'); @@ -328,12 +329,14 @@ Route::prefix('road_observations') }); Route::name('report.') + ->prefix('report') ->controller(\App\Http\Controllers\V3\Dashboard\RoadObservation\ReportController::class) ->group(function () { Route::get('/index', 'index')->name('index')->middleware('permission:show-fast-react-province|show-fast-react'); Route::get('/excel', 'excel')->name('excel')->middleware('permission:show-fast-react-province|show-fast-react'); Route::get('/map', 'map')->name('map'); }); + Route::get('/{roadObserved}', [\App\Http\Controllers\V3\Dashboard\RoadObservation\OperatorController::class, 'show'])->name('show'); }); Route::prefix('log_list') From e85a99d50eef2a07b57f0380ee6a5ce9bd092e29 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 31 May 2025 11:36:18 +0330 Subject: [PATCH 34/40] change the notification service --- .../Controllers/V3/NotificationController.php | 4 +- .../RoadObservation/OperatorService.php | 67 +++---------------- .../RoadObservation/SupervisorService.php | 9 +-- 3 files changed, 19 insertions(+), 61 deletions(-) diff --git a/app/Http/Controllers/V3/NotificationController.php b/app/Http/Controllers/V3/NotificationController.php index f5d3bb82..293a79b3 100644 --- a/app/Http/Controllers/V3/NotificationController.php +++ b/app/Http/Controllers/V3/NotificationController.php @@ -148,7 +148,9 @@ class NotificationController extends Controller ['status', '=', 0] ])->count(); - $road_observations['complaint_cnt'] = RoadObserved::query()->where('rms_status', '=', 0)->count(); + $road_observations['complaint_cnt'] = RoadObserved::query()->where('rms_status', '=', 0) + ->whereNotNull('edarate_shahri_id') + ->count(); } elseif ($user->hasPermissionTo('show-fast-react-province')) { throw_if(is_null($user->province_id), new ProhibitedAction('استانی برای شما در سامانه ثبت نشده است!')); diff --git a/app/Services/Cartables/RoadObservation/OperatorService.php b/app/Services/Cartables/RoadObservation/OperatorService.php index bfec4b3e..49ceb9cb 100644 --- a/app/Services/Cartables/RoadObservation/OperatorService.php +++ b/app/Services/Cartables/RoadObservation/OperatorService.php @@ -2,6 +2,7 @@ namespace App\Services\Cartables\RoadObservation; +use App\Exceptions\ProhibitedAction; use App\Facades\DataTable\DataTableFacade; use App\Models\RoadObserved; use Illuminate\Http\Request; @@ -35,6 +36,9 @@ class OperatorService allowedSortings: ['*']); } + /** + * @throws \Throwable + */ public function complaintsIndex(Request $request) { $user = auth()->user(); @@ -46,33 +50,26 @@ class OperatorService if ($user->hasPermissionTo('show-fast-react')) { $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') ->where('rms_status', '=', 0) - ->whereNotNull('edarate_shahri_id') - ->selectRaw($fields); + ->whereNotNull('edarate_shahri_id'); } elseif ($user->hasPermissionTo('show-fast-react-province')) { - if (is_null($user->province_id)) { - return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); - } + throw_if(is_null($user->province_id), new ProhibitedAction('استانی برای شما در سامانه ثبت نشده است!')); $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') ->where('rms_status', '=', 0) ->whereNotNull('road_observeds.province_id') - ->where('road_observeds.province_id', '=', $user->province_id) - ->selectRaw($fields); + ->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('اداره ای برای شما در سامانه ثبت نشده است!'); - } + throw_if(is_null($user->edarate_shahri_id), new ProhibitedAction('اداره ای برای شما در سامانه ثبت نشده است!')); $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') ->where('rms_status', '=', 0) ->whereNotNull('edarate_shahri_id') - ->where('edarate_shahri_id', '=', $user->edarate_shahri_id) - ->selectRaw($fields); + ->where('edarate_shahri_id', '=', $user->edarate_shahri_id); } @@ -80,50 +77,8 @@ class OperatorService $query, $request, allowedFilters: ['*'], - allowedSortings: ['*'] + allowedSortings: ['*'], + allowedSelects: $fields ); } - - public function reportIndex(Request $request) - { - $fromDate = $request->from_date . ' 00:00:00'; - $toDate = $request->date_to . ' 23:59:59'; - - $fields = [ - 'fk_RegisteredEventMessage', - 'road_observeds.id', - 'Title', - 'road_observeds.created_at', - 'lat', - 'lng', - 'FeatureTypeTitle', - 'Description', - 'MobileForSendEventSms', - 'road_observeds.province_id', - 'province_fa', - 'city_fa', - 'edarate_shahri.name_fa', - 'rms_last_activity_fa', - 'rms_description' - ]; - - $query = RoadObserved::leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') - ->where('rms_status', "<>", 0) - ->whereNotNull('edarate_shahri_id') - ->whereBetween('road_observeds.created_at', [$fromDate, $toDate]) - ->select($fields); - - $data = DataTableFacade::run( - $query, - $request, - allowedFilters: ['*'], - allowedSortings: ['*'] - ); - - return [ - 'data' => $data, - 'fromDate' => $fromDate, - 'toDate' => $toDate, - ]; - } } \ No newline at end of file diff --git a/app/Services/Cartables/RoadObservation/SupervisorService.php b/app/Services/Cartables/RoadObservation/SupervisorService.php index 437c0d96..ade845a0 100644 --- a/app/Services/Cartables/RoadObservation/SupervisorService.php +++ b/app/Services/Cartables/RoadObservation/SupervisorService.php @@ -2,12 +2,16 @@ namespace App\Services\Cartables\RoadObservation; +use App\Exceptions\ProhibitedAction; use App\Facades\DataTable\DataTableFacade; use App\Models\RoadObserved; use Illuminate\Http\Request; class SupervisorService { + /** + * @throws \Throwable + */ public function index(Request $request) { $user = auth()->user(); @@ -27,10 +31,7 @@ class SupervisorService } elseif ($user->hasPermissionTo('show-fast-react-province')) { - if (is_null($user->province_id)) - { - return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); - } + throw_if(is_null($user->province_id), new ProhibitedAction('استانی برای شما در سامانه ثبت نشده است!')); $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') ->where('road_observeds.province_id', $user->province_id) From e50b9e11138decb66fc8aaf16f1cd3c3175a535c Mon Sep 17 00:00:00 2001 From: joddyabott Date: Sat, 31 May 2025 15:16:57 +0330 Subject: [PATCH 35/40] change name one culum name and prefix some item --- .../RoadObservation/OperatorController.php | 7 +++++++ .../Cartables/RoadObservation/OperatorService.php | 7 ++++--- .../AccidentReceipt/CountryReport.blade.php | 14 ++++++++++---- .../AccidentReceipt/DataTableReport.blade.php | 2 ++ .../AccidentReceipt/ProvinceReport.blade.php | 14 ++++++++++---- routes/v3.php | 11 +++++------ 6 files changed, 38 insertions(+), 17 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/RoadObservation/OperatorController.php b/app/Http/Controllers/V3/Dashboard/RoadObservation/OperatorController.php index 6e701d44..684115ae 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadObservation/OperatorController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadObservation/OperatorController.php @@ -23,6 +23,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Facades\Excel; use Symfony\Component\HttpFoundation\BinaryFileResponse; +use Throwable; class OperatorController { @@ -40,11 +41,17 @@ class OperatorController return Excel::download(new OperatorCartableReport($data['data']), $name); } + /** + * @throws Throwable + */ public function complaintsIndex(Request $request, OperatorService $operatorService): JsonResponse { return response()->json($operatorService->complaintsIndex($request)); } + /** + * @throws Throwable + */ public function complaintsReport(Request $request, OperatorService $operatorService): BinaryFileResponse { $name = 'گزارش از رسیدگی به شکایات واکنش سریع ' . verta()->now()->format('Y-m-d H:i') . '.xlsx'; diff --git a/app/Services/Cartables/RoadObservation/OperatorService.php b/app/Services/Cartables/RoadObservation/OperatorService.php index 49ceb9cb..93d689c4 100644 --- a/app/Services/Cartables/RoadObservation/OperatorService.php +++ b/app/Services/Cartables/RoadObservation/OperatorService.php @@ -6,6 +6,7 @@ use App\Exceptions\ProhibitedAction; use App\Facades\DataTable\DataTableFacade; use App\Models\RoadObserved; use Illuminate\Http\Request; +use Throwable; class OperatorService { @@ -37,15 +38,15 @@ class OperatorService } /** - * @throws \Throwable + * @throws Throwable */ public function complaintsIndex(Request $request) { $user = auth()->user(); - $fields = 'fk_RegisteredEventMessage, road_observeds.id, Title, FeatureTypeTitle, MobileForSendEventSms, StartTime_DateTime, + $fields = ['fk_RegisteredEventMessage, road_observeds.id, Title, FeatureTypeTitle, MobileForSendEventSms, StartTime_DateTime, road_observeds.created_at, rms_last_activity, rms_last_activity_fa, status, edarate_shahri_id, - status_fa, supervisor_description, rms_description, province_fa, city_id, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng'; + status_fa, supervisor_description, rms_description, province_fa, city_id, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng']; if ($user->hasPermissionTo('show-fast-react')) { $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') diff --git a/resources/views/v3/Reports/AccidentReceipt/CountryReport.blade.php b/resources/views/v3/Reports/AccidentReceipt/CountryReport.blade.php index f4837f48..6050d470 100644 --- a/resources/views/v3/Reports/AccidentReceipt/CountryReport.blade.php +++ b/resources/views/v3/Reports/AccidentReceipt/CountryReport.blade.php @@ -27,7 +27,7 @@
+ style="background-color: #DAEEF3;text-align: center;border-right:1px solid black;font-weight:bolder;font-size: 13px;"> گزارش خسارات وارده به ابنیه فنی و تاسیسات راه از تاریخ {{ verta($fromDate)->format('Y/n/j') }} تا @@ -43,7 +43,7 @@ اداره کل - تعداد کل + تعداد خسارات ثبت شده نحوه شناسایی خسارت @@ -59,11 +59,14 @@
+ کل + در دست اقدام - در حال فرایند پرداخت + در حال پرداخت خاتمه یافته @@ -76,7 +79,7 @@ گزارش گشت راهداری - فیش + فاکتور بیمه @@ -94,6 +97,9 @@
{{ $road['name'] }} + {{ $road['tedade'] }} {{ $road['egdam'] }} diff --git a/resources/views/v3/Reports/AccidentReceipt/DataTableReport.blade.php b/resources/views/v3/Reports/AccidentReceipt/DataTableReport.blade.php index 134166b1..308f8aa5 100644 --- a/resources/views/v3/Reports/AccidentReceipt/DataTableReport.blade.php +++ b/resources/views/v3/Reports/AccidentReceipt/DataTableReport.blade.php @@ -26,6 +26,7 @@ استان شهرستان نام محورنوع ناوگان نام راننده کد ملی راننده شماره موبایل راننده{{$item->province_fa}} {{$item->city_fa}} {{$item->axis_name}}{{$item->is_foreign ? 'داخلی' : 'خارجی'}} {{$item->driver_name}} {{$item->driver_national_code}} {{$item->driver_phone_number}}
+ style="background-color: #DAEEF3;text-align: center;border-right:1px solid black;font-weight:bolder;font-size: 13px;"> گزارش خسارات وارده به ابنیه فنی و تاسیسات راه از تاریخ {{ verta($fromDate)->format('Y/n/j') }} تا @@ -44,7 +44,7 @@ اداره کل - تعداد کل + تعداد خسارات ثبت شده تعداد نحوه شناسایی خسارت @@ -60,11 +60,14 @@
+ کل + در دست اقدام - در حال فرایند پرداخت + در حال پرداخت خاتمه یافته @@ -77,7 +80,7 @@ گزارش گشت راهداری - فیش + فاکتور بیمه @@ -95,6 +98,9 @@
{{ $road['name'] }} + {{ $road['tedade'] }} < {{ $road['egdam'] }} diff --git a/routes/v3.php b/routes/v3.php index 6fc3ec01..6567212e 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -294,20 +294,19 @@ Route::prefix('road_observations') ->name('roadObservations.') ->group(function () { Route::name('operator.') - ->prefix('operator') ->controller(\App\Http\Controllers\V3\Dashboard\RoadObservation\OperatorController::class) ->group(function () { - Route::get('/cartable','cartableIndex')->name('cartableIndex')->middleware('permission:show-fast-react-edarate-shahri'); - Route::get('/cartable_report','cartableReport')->name('cartableReport')->middleware('permission:show-fast-react-edarate-shahri'); + Route::get('operator/cartable','cartableIndex')->name('cartableIndex')->middleware('permission:show-fast-react-edarate-shahri'); + Route::get('operator/report','cartableReport')->name('cartableReport')->middleware('permission:show-fast-react-edarate-shahri'); Route::get('/complaints_index', 'complaintsIndex') ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') ->name('complaintsIndex'); Route::get('/complaints_report', 'complaintsReport')->name('complaintsReport') ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react'); - Route::post('/register/{roadObserved}', 'register') + Route::post('operator/register/{roadObserved}', 'register') ->middleware('permission:show-fast-react-edarate-shahri') ->name('register'); - Route::post('/modify_registration/{roadObserved}', 'modifyRegistration') + Route::post('operator/modify_registration/{roadObserved}', 'modifyRegistration') ->middleware('permission:show-fast-react-edarate-shahri') ->name('modifyRegistration'); Route::post('/refer/{roadObserved}', 'refer') @@ -316,6 +315,7 @@ Route::prefix('road_observations') Route::get('/refer_list/{roadObserved}', 'referList') ->middleware('permission:show-fast-react-edarate-shahri|show-fast-react-province|show-fast-react') ->name('referList'); + Route::get('/{roadObserved}', 'show')->name('show'); }); Route::name('supervisor.') @@ -336,7 +336,6 @@ Route::prefix('road_observations') Route::get('/excel', 'excel')->name('excel')->middleware('permission:show-fast-react-province|show-fast-react'); Route::get('/map', 'map')->name('map'); }); - Route::get('/{roadObserved}', [\App\Http\Controllers\V3\Dashboard\RoadObservation\OperatorController::class, 'show'])->name('show'); }); Route::prefix('log_list') From da26d283969fe6e9f1010fd37d461babce547ae7 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Sat, 31 May 2025 15:23:37 +0330 Subject: [PATCH 36/40] prefix some item --- .../Cartables/RoadObservation/OperatorService.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/Services/Cartables/RoadObservation/OperatorService.php b/app/Services/Cartables/RoadObservation/OperatorService.php index 93d689c4..7256a92d 100644 --- a/app/Services/Cartables/RoadObservation/OperatorService.php +++ b/app/Services/Cartables/RoadObservation/OperatorService.php @@ -27,14 +27,14 @@ class OperatorService ->whereNotNull('road_observeds.province_id') ->whereNotNull('status') ->leftJoin('edarate_shahri', 'road_observeds.edarate_shahri_id', '=', 'edarate_shahri.id') - ->where('edarate_shahri_id', $user->edarate_shahri_id) - ->select($fields); + ->where('edarate_shahri_id', $user->edarate_shahri_id); return DataTableFacade::run( $query, $request, allowedFilters: ['*'], - allowedSortings: ['*']); + allowedSortings: ['*'], + allowedSelects: $fields); } /** @@ -44,9 +44,10 @@ class OperatorService { $user = auth()->user(); - $fields = ['fk_RegisteredEventMessage, road_observeds.id, Title, FeatureTypeTitle, MobileForSendEventSms, StartTime_DateTime, - road_observeds.created_at, rms_last_activity, rms_last_activity_fa, status, edarate_shahri_id, - status_fa, supervisor_description, rms_description, province_fa, city_id, city_fa, Description, edarate_shahri.name_fa as edarate_shahri_name_fa, lat, lng']; + $fields = ['fk_RegisteredEventMessage', 'road_observeds.id', 'Title', 'FeatureTypeTitle', 'MobileForSendEventSms', 'StartTime_DateTime', + 'road_observeds.created_at', 'rms_last_activity', 'rms_last_activity_fa', 'status', 'edarate_shahri_id', + 'status_fa', 'supervisor_description', 'rms_description', 'province_fa', 'city_id', 'city_fa', 'Description', + 'edarate_shahri.name_fa as edarate_shahri_name_fa', 'lat', 'lng']; if ($user->hasPermissionTo('show-fast-react')) { $query = RoadObserved::query()->leftjoin('edarate_shahri', 'road_observeds.edarate_shahri_id', 'edarate_shahri.id') From 0995b005613c72b0a20a282fbb9383de9f840578 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Sat, 31 May 2025 17:10:55 +0330 Subject: [PATCH 37/40] debog code --- app/Exports/V3/RoadObservation/ComplaintsReport.php | 2 +- .../V3/Dashboard/Accident/AccidentReceiptController.php | 5 +++-- app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php | 1 + .../v3/Reports/AccidentReceipt/DataTableReport.blade.php | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/Exports/V3/RoadObservation/ComplaintsReport.php b/app/Exports/V3/RoadObservation/ComplaintsReport.php index e8012634..4484b4b0 100644 --- a/app/Exports/V3/RoadObservation/ComplaintsReport.php +++ b/app/Exports/V3/RoadObservation/ComplaintsReport.php @@ -61,7 +61,7 @@ class ComplaintsReport implements FromView, WithEvents, ShouldAutoSize, WithDraw $drawing2->setHeight(50); $drawing2->setOffsetX(5); $drawing2->setOffsetY(5); - $drawing2->setCoordinates('q1'); + $drawing2->setCoordinates('J1'); return [$drawing, $drawing2]; } } diff --git a/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php b/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php index a871ca0b..1620ca78 100644 --- a/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php +++ b/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php @@ -131,6 +131,7 @@ class AccidentReceiptController extends Controller $city = City::query()->where('id', '=', $request->city_id)->first(); $accidentData = [ + 'is_foreign' => $request->is_foreign, 'province_id' => $province->id, 'province_fa' => $province->name_fa, 'city_id' => $city->id, @@ -157,8 +158,8 @@ class AccidentReceiptController extends Controller FileFacade::delete($accident->police_file, true); } - if (!$request->report_base && $request->has('police_file')) { - FileFacade::delete($accident->police_file, true); + if ($request->has('police_file')) { + if ($accident->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/Requests/V3/AccidentReceipt/UpdateRequest.php b/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php index c73a9bc8..134bb4a0 100644 --- a/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php +++ b/app/Http/Requests/V3/AccidentReceipt/UpdateRequest.php @@ -23,6 +23,7 @@ class UpdateRequest extends FormRequest public function rules(): array { return [ + 'is_foreign' => 'required|boolean', 'province_id' => 'required|integer|exists:provinces,id', 'city_id' => 'required|integer|exists:cities,id', 'axis_name' => 'required|string', diff --git a/resources/views/v3/Reports/AccidentReceipt/DataTableReport.blade.php b/resources/views/v3/Reports/AccidentReceipt/DataTableReport.blade.php index 308f8aa5..0f2f2ecf 100644 --- a/resources/views/v3/Reports/AccidentReceipt/DataTableReport.blade.php +++ b/resources/views/v3/Reports/AccidentReceipt/DataTableReport.blade.php @@ -49,7 +49,7 @@ {{$item->province_fa}} {{$item->city_fa}} {{$item->axis_name}}{{$item->is_foreign ? 'داخلی' : 'خارجی'}}{{$item->is_foreign ? 'خارجی' : 'داخلی'}} {{$item->driver_name}} {{$item->driver_national_code}} {{$item->driver_phone_number}}
- - + - + @@ -34,7 +34,7 @@ - + diff --git a/resources/views/v3/Reports/RoadObservation/OperatorCartableReport.blade.php b/resources/views/v3/Reports/RoadObservation/OperatorCartableReport.blade.php index 6dd7d746..8fe8cda1 100644 --- a/resources/views/v3/Reports/RoadObservation/OperatorCartableReport.blade.php +++ b/resources/views/v3/Reports/RoadObservation/OperatorCartableReport.blade.php @@ -33,7 +33,7 @@ diff --git a/resources/views/v3/Reports/RoadObservation/SupervisorCartableReport.blade.php b/resources/views/v3/Reports/RoadObservation/SupervisorCartableReport.blade.php index fa412f98..3174ec5c 100644 --- a/resources/views/v3/Reports/RoadObservation/SupervisorCartableReport.blade.php +++ b/resources/views/v3/Reports/RoadObservation/SupervisorCartableReport.blade.php @@ -49,7 +49,7 @@ - + From 14a611ddf7809a5f8dc003708ecc5917d604be50 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Sun, 1 Jun 2025 09:26:06 +0330 Subject: [PATCH 39/40] debug accident controller --- .../Accident/AccidentReceiptController.php | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php b/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php index 1620ca78..f4a5900b 100644 --- a/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php +++ b/app/Http/Controllers/V3/Dashboard/Accident/AccidentReceiptController.php @@ -80,11 +80,8 @@ class AccidentReceiptController extends Controller 'accident_type_fa' => DailyAccidentSettings::query()->where('type', 'accident_type')->where('name', $request->accident_type)->first()->value, 'way_id' => $nominatimService->get_way_id_from_nominatim($request->lat, $request->lng), 'report_base' => $request->report_base, - 'police_file' => $request->report_base ? null : FileFacade::save($request->file('police_file'), 'receipts_files/'), 'police_serial' => $request->police_serial ?? null, 'police_file_date' => $request->police_file_date ?? null, - 'damage_picture1' => FileFacade::save($request->file('damage_picture1'), 'receipts_files/'), - 'damage_picture2' => FileFacade::save($request->file('damage_picture2'), 'receipts_files/'), 'status' => AccidentStates::BEDON_EGHDAM->value, 'status_fa' => AccidentStates::name(AccidentStates::BEDON_EGHDAM->value), ]; @@ -109,6 +106,10 @@ class AccidentReceiptController extends Controller $accidentData['sum'] = $sum; $accident = Accident::query()->create($accidentData); + $accident->damage_picture1 = FileFacade::save($request->file('damage_picture1'), "receipts_files/{$accident->id}"); + $accident->damage_picture2 = FileFacade::save($request->file('damage_picture2'), "receipts_files/{$accident->id}"); + $accident->police_file = $request->report_base ? null : FileFacade::save($request->file('police_file'), "receipts_files/{$accident->id}"); + $accident->save(); $accident->damages()->attach($damageData); @@ -207,10 +208,9 @@ class AccidentReceiptController extends Controller */ public function destroy(Accident $accident): JsonResponse { - throw_if($accident->status != AccidentStates::BEDON_EGHDAM->value, new ProhibitedAction('قابلیت حذف در این مرحله وجود ندارد')); - FileFacade::deleteDirectory('receipts_files/' . $accident->id); + FileFacade::deleteDirectory("receipts_files/{$accident->id}"); DB::transaction(function () use ($accident) { @@ -262,13 +262,14 @@ class AccidentReceiptController extends Controller return $this->successResponse(); } + /** + * @throws Throwable + */ public function submitInvoice(Accident $accident, PaymentService $paymentService): JsonResponse { $final_amount = $accident->sum - ($accident->deposit_insurance_amount + $accident->deposit_daghi_amount); - if ($final_amount < 0) { - return $this->errorResponse('error'); - } + throw_if($final_amount < 0, new ProhibitedAction('مبالغ داغی و بیمه از مبلغ کل بیشتر می باشد.')); $bill_code = $paymentService->invoiceBillApi($accident->driver_national_code, $final_amount); From 847d6cdf7336908b1808325f8fb3fe134838dcc2 Mon Sep 17 00:00:00 2001 From: joddyabott Date: Sun, 1 Jun 2025 09:41:27 +0330 Subject: [PATCH 40/40] debug operator and supervisor --- .../RoadObservation/OperatorController.php | 34 +++++----- .../RoadObservation/SupervisorController.php | 63 ++++++++++--------- 2 files changed, 52 insertions(+), 45 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/RoadObservation/OperatorController.php b/app/Http/Controllers/V3/Dashboard/RoadObservation/OperatorController.php index 684115ae..bd3033ee 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadObservation/OperatorController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadObservation/OperatorController.php @@ -188,24 +188,26 @@ class OperatorController { $province = Province::query()->find($request->province_id); - RoadObservationHistory::query()->create([ - 'id' => $roadObserved->id, - 'user_id' => auth()->user()->id, - 'action' => 'refer', - 'description' => $request->refer_description, - 'from_edareh' => $roadObserved->edarate_shahri_id, - 'to_edareh' => $request->edarate_shahri_id, - 'from_province' => $roadObserved->province_id, - 'to_province' => $province->id - ]); + DB::transaction(function () use ($roadObserved, $request, $province) { + RoadObservationHistory::query()->create([ + 'id' => $roadObserved->id, + 'user_id' => auth()->user()->id, + 'action' => 'refer', + 'description' => $request->refer_description, + 'from_edareh' => $roadObserved->edarate_shahri_id, + 'to_edareh' => $request->edarate_shahri_id, + 'from_province' => $roadObserved->province_id, + 'to_province' => $province->id + ]); - $roadObserved->update([ - 'edarate_shahri_id' => $request->edarate_shahri_id, - 'province_id' => $province->id, - 'province_fa' => $province->name_fa, - ]); + $roadObserved->update([ + 'edarate_shahri_id' => $request->edarate_shahri_id, + 'province_id' => $province->id, + 'province_fa' => $province->name_fa, + ]); - auth()->user()->addActivityComplete(1037); + auth()->user()->addActivityComplete(1037); + }); return $this->successResponse(); } diff --git a/app/Http/Controllers/V3/Dashboard/RoadObservation/SupervisorController.php b/app/Http/Controllers/V3/Dashboard/RoadObservation/SupervisorController.php index 5af4756c..02e48f63 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadObservation/SupervisorController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadObservation/SupervisorController.php @@ -13,6 +13,7 @@ use App\Services\Cartables\RoadObservation\SupervisorService; use App\Services\Cartables\RoadObservationTableService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Facades\Excel; use Symfony\Component\HttpFoundation\BinaryFileResponse; @@ -29,16 +30,18 @@ class SupervisorController { $statusFa = $request->verify == 1 ? 'تایید شده' : 'عدم تایید'; - $roadObserved->update([ - 'status' => $request->verify, - 'status_fa' => $statusFa, - 'supervisor_id' => auth()->user()->id, - 'supervisor_name' => auth()->user()->name, - 'supervisor_description' => $request->description, - 'supervising_time' => now(), - ]); + DB::transaction(function () use ($request, $statusFa, $roadObserved) { + $roadObserved->update([ + 'status' => $request->verify, + 'status_fa' => $statusFa, + 'supervisor_id' => auth()->user()->id, + 'supervisor_name' => auth()->user()->name, + 'supervisor_description' => $request->description, + 'supervising_time' => now(), + ]); - auth()->user()->addActivityComplete(1138); + auth()->user()->addActivityComplete(1138); + }); return $this->successResponse(); } @@ -54,33 +57,35 @@ class SupervisorController public function restore(RestoreRequest $request, RoadObserved $roadObserved): JsonResponse { if ($roadObserved->image_before) { - FileFacade::delete($roadObserved->image_before); + FileFacade::delete($roadObserved->image_before, true); } if ($roadObserved->image_after) { - FileFacade::delete($roadObserved->image_after); + FileFacade::delete($roadObserved->image_after, true); } - $roadObserved->update([ - 'image_before' => null, - 'image_after' => null, - 'rms_last_activity' => null, - 'rms_last_activity_fa' => null, - 'updated_at_fa' => null, - 'updated_at' => null, - 'rms_status' => 0, - 'status' => null, - 'status_fa' => null, - ]); + DB::transaction(function () use ($request, $roadObserved) { + $roadObserved->update([ + 'image_before' => null, + 'image_after' => null, + 'rms_last_activity' => null, + 'rms_last_activity_fa' => null, + 'updated_at_fa' => null, + 'updated_at' => null, + 'rms_status' => 0, + 'status' => null, + 'status_fa' => null, + ]); - RoadObservationHistory::query()->create([ - 'id' => $roadObserved->id, - 'user_id' => auth()->user()->id, - 'action' => 'restore', - 'description' => $request->restore_description, - ]); + RoadObservationHistory::query()->create([ + 'id' => $roadObserved->id, + 'user_id' => auth()->user()->id, + 'action' => 'restore', + 'description' => $request->restore_description, + ]); - auth()->user()->addActivityComplete(1141); + auth()->user()->addActivityComplete(1141); + }); return $this->successResponse(); }
+ تاریخ دریافت گزارش: {{verta()->now()->format('Y/m/d H:i')}}
گزارش کلی خسارات واردهگزارش کلی خسارات وارده
نوع تصادف تاریخ تصادف مبلغ کل خسارتمبلغ فیشمبلغ فاکتور مبلغ بیمه مبلغ داغی تاریخ ثبت
+ style="background-color: #DAEEF3;text-align: center;border-right:1px solid black;font-weight:bolder;font-size: 13px;"> گزارش کارتابل عملیات واکنش سریع
تاریخ ثبت تاریخ اقدام توضیح مامورتوضیح کارشناستوضیح ناظر وضعیت