From 3a8a6e3a70b3e6e28e279588b41fa91323a087b4 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sun, 18 May 2025 13:19:26 +0330 Subject: [PATCH] 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')