From eaccd760196fee64279b4ee8aef34cb5e948af0d Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 15 Nov 2025 10:34:56 +0330 Subject: [PATCH] convert many to many to one to many --- .../Mission/ControlUnitController.php | 7 ++- .../V3/Dashboard/Mission/DetailController.php | 2 +- .../Mission/RequestPortalController.php | 44 +++++++++---------- .../Mission/TransportationUnitController.php | 18 +++++++- .../V3/Mission/ControlUnit/StartRequest.php | 1 + .../RequestPortal/ContinueMissionRequest.php | 3 +- .../TransportaionUnit/AllocateRequest.php | 25 +++++++++-- app/Models/Mission.php | 5 +++ .../Mission/TransportationUnitService.php | 2 +- ...15_090251_add_column_to_missions_table.php | 30 +++++++++++++ 10 files changed, 104 insertions(+), 33 deletions(-) create mode 100644 database/migrations/2025_11_15_090251_add_column_to_missions_table.php diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php index afda7a93..306f7243 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php @@ -14,6 +14,7 @@ use App\Services\Cartables\Mission\ControlUnitService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; +use Throwable; class ControlUnitController extends Controller { @@ -24,9 +25,12 @@ class ControlUnitController extends Controller return response()->json($controlUnitService->datatable($request)); } + /** + * @throws Throwable + */ public function start(StartRequest $request, Mission $mission): JsonResponse { - DB::transaction(function () use ($mission) { + DB::transaction(function () use ($mission, $request) { $mission->histories()->create([ 'user_id' => auth()->user()->id, 'previous_state_id' => $mission->state_id, @@ -38,6 +42,7 @@ class ControlUnitController extends Controller 'state_id' => $state, 'state_name' => MissionStates::name($state), 'start_time' => now(), + 'km' => $request->km, ]); }); diff --git a/app/Http/Controllers/V3/Dashboard/Mission/DetailController.php b/app/Http/Controllers/V3/Dashboard/Mission/DetailController.php index cf1b2dd1..cfc53709 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/DetailController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/DetailController.php @@ -13,7 +13,7 @@ class DetailController extends Controller 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'])); + return $this->successResponse($mission->machine()->get(['cmms_machines.id', 'cmms_machines.machine_code', 'cmms_machines.car_name', 'cmms_machines.plak_number'])); } public function rahdaran(Mission $mission): JsonResponse diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index e412de82..3691a8e9 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -13,6 +13,7 @@ use App\Http\Requests\V3\Mission\RequestPortal\NoProcessRequest; 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\RoadObserved; use App\Services\Cartables\Mission\RequestPortalService; @@ -20,6 +21,7 @@ use Carbon\Carbon; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; +use Throwable; class RequestPortalController extends Controller { @@ -30,6 +32,9 @@ class RequestPortalController extends Controller return response()->json($requestPortalService->datatable($request)); } + /** + * @throws Throwable + */ public function store(StoreRequest $request): JsonResponse { DB::transaction(function () use ($request) { @@ -65,13 +70,6 @@ class RequestPortalController extends Controller ]); $mission->rahdaran()->sync($request->rahdaran); - - if ($category == 3) { - RoadObserved::query() - ->find($request->road_observed_id) - ->missions() - ->attach($mission->id); - } }); return $this->successResponse(); @@ -82,6 +80,9 @@ class RequestPortalController extends Controller return $this->successResponse($mission); } + /** + * @throws Throwable + */ public function continueMission(ContinueMissionRequest $request, Mission $mission): JsonResponse { DB::transaction(function () use ($request, $mission) { @@ -95,6 +96,7 @@ class RequestPortalController extends Controller $state = MissionStates::START_MISSION->value; $category = $request->category_id; + $machine = CMMSMachine::query()->find($request->machine_id); $newMission = Mission::query()->create([ 'user_id' => $user->id, @@ -119,23 +121,20 @@ class RequestPortalController extends Controller 'category_name' => MissionCategory::name($category), 'explanation' => $request->explanation, 'start_time' => now(), + 'machine_id' => $machine->id, + 'machine_name' => $machine->car_name, ]); $newMission->rahdaran()->sync($request->rahdaran); - $newMission->machines()->attach($request->machines); $newMission->rahdaran()->attach($request->driver, ['is_driver' => true]); - - if ($category == 3) { - RoadObserved::query() - ->find($request->road_observed_id) - ->missions() - ->attach($newMission->id); - } }); return $this->successResponse(); } + /** + * @throws Throwable + */ public function update(UpdateRequest $request, Mission $mission): JsonResponse { DB::transaction(function () use ($mission, $request) { @@ -159,31 +158,30 @@ class RequestPortalController extends Controller ]); $mission->rahdaran()->sync($request->rahdaran); - if ($request->category_id == 3) { - RoadObserved::query() - ->find($request->road_observed_id) - ->missions() - ->sync($mission->id); - } }); return $this->successResponse(); } + /** + * @throws Throwable + */ public function destroy(Mission $mission): JsonResponse { DB::transaction(function () use ($mission) { - $mission->rahdaran()->detach(); + $mission->rahdaran()->delete(); $mission->delete(); }); return $this->successResponse(); } + /** + * @throws Throwable + */ public function noProcess(NoProcessRequest $request): JsonResponse { DB::transaction(function () use ($request) { - $start = Carbon::parse($request->start_date); $end = Carbon::parse($request->end_date); $type = $start->diffInMinutes($end) > 480 ? MissionTypes::NO_PROCESS_ROZANE->value : MissionTypes::NO_PROCESS_SAATY->value; diff --git a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php index 422aa794..b4eb0e76 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/TransportationUnitController.php @@ -13,6 +13,7 @@ use App\Services\Cartables\Mission\TransportationUnitService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; +use Throwable; class TransportationUnitController extends Controller { @@ -23,10 +24,12 @@ class TransportationUnitController extends Controller return response()->json($transportationUnitService->dataTable($request)); } + /** + * @throws Throwable + */ public function allocate(AllocateRequest $request, Mission $mission): JsonResponse { DB::transaction(function () use ($request, $mission) { - $mission->machines()->attach($request->machines); $mission->rahdaran()->attach($request->driver, ['is_driver' => true]); $mission->histories()->create([ @@ -36,19 +39,27 @@ class TransportationUnitController extends Controller ]); $state = MissionStates::PENDING_CONFIRMATION->value; + $machine = CMMSMachine::query()->find($request->machine_id); + $mission->update([ 'state_id' => $state, 'state_name' => MissionStates::name($state), - 'km' => $request->km, + 'machine_id' => $machine->id, + 'machine_name' => $machine->car_name, ]); }); return $this->successResponse(); } + /** + * @throws Throwable + */ public function deallocate(DeallocateRequest $request, Mission $mission): JsonResponse { DB::transaction(function () use ($request, $mission) { + $mission->rahdaran()->wherePivot('is_driver', '=', true)->delete(); + $mission->histories()->create([ 'user_id' => auth()->user()->id, 'previous_state_id' => $mission->state_id, @@ -62,6 +73,8 @@ class TransportationUnitController extends Controller 'state_id' => $state, 'state_name' => MissionStates::name($state), 'description' => $request->description, + 'machine_id' => null, + 'machine_name' => null, ]); }); @@ -73,6 +86,7 @@ class TransportationUnitController extends Controller return $this->successResponse( CMMSMachine::query() ->where('car_type', '=', $mission->car_type) + ->where('status', '<>', 3) ->get(['machine_code', 'id', 'plak_number', 'car_name']) ); } diff --git a/app/Http/Requests/V3/Mission/ControlUnit/StartRequest.php b/app/Http/Requests/V3/Mission/ControlUnit/StartRequest.php index f19a5067..e5d24b77 100644 --- a/app/Http/Requests/V3/Mission/ControlUnit/StartRequest.php +++ b/app/Http/Requests/V3/Mission/ControlUnit/StartRequest.php @@ -26,6 +26,7 @@ class StartRequest extends FormRequest { return [ 'code' => 'required|string', + 'km' => 'required', ]; } diff --git a/app/Http/Requests/V3/Mission/RequestPortal/ContinueMissionRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/ContinueMissionRequest.php index 905f33ba..bff88565 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/ContinueMissionRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/ContinueMissionRequest.php @@ -28,8 +28,7 @@ class ContinueMissionRequest extends FormRequest return [ 'rahdaran' => 'array', 'rahdaran.*' => 'exists:rahdaran,id', - 'machines' => 'required|array', - 'machines.*' => 'required|integer|exists:cmms_machines,id', + 'machine_id' => 'required|integer|exists:cmms_machines,id', 'driver' => 'required|integer|exists:rahdaran,id', 'type' => 'required|in:1,2', 'zone' => 'required|in:1,2,3', diff --git a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php index 1913dfe7..31ff913d 100644 --- a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php +++ b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php @@ -3,8 +3,10 @@ namespace App\Http\Requests\V3\Mission\TransportaionUnit; use App\Enums\MissionStates; +use App\Models\Mission; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Validator; class AllocateRequest extends FormRequest { @@ -24,10 +26,27 @@ class AllocateRequest extends FormRequest public function rules(): array { return [ - 'machines' => 'required|array', - 'machines.*' => 'required|integer|exists:cmms_machines,id', + 'machine_id' => 'required|integer|exists:cmms_machines,id', 'driver' => 'required|integer|exists:rahdaran,id', - 'km' => 'required', + ]; + } + + public function after(): array + { + return [ + function (Validator $validator) { + $duplicateMission = Mission::query()->where('machine_id', $this->machine_id) + ->whereBetween('start_date', [$this->mission->start_date, $this->mission->end_date]) + ->orWhereBetween('end_date', [$this->mission->start_date, $this->mission->end_date]) + ->exists(); + + if ($duplicateMission) { + $validator->errors()->add( + 'machine', + 'خودروی مورد نظر در این زمان رزرو می باشد' + ); + } + }, ]; } } diff --git a/app/Models/Mission.php b/app/Models/Mission.php index 9d85a9bc..60790c26 100644 --- a/app/Models/Mission.php +++ b/app/Models/Mission.php @@ -84,4 +84,9 @@ class Mission extends Model 'missionable_id' ); } + + public function machine(): HasOne + { + return $this->hasOne(CMMSMachine::class); + } } diff --git a/app/Services/Cartables/Mission/TransportationUnitService.php b/app/Services/Cartables/Mission/TransportationUnitService.php index e0dd71b4..be19780d 100644 --- a/app/Services/Cartables/Mission/TransportationUnitService.php +++ b/app/Services/Cartables/Mission/TransportationUnitService.php @@ -13,7 +13,7 @@ class TransportationUnitService public function dataTable(Request $request) { $query = Mission::query() - ->where('state_id', '=', MissionStates::REQUEST_CREATED->value) + ->whereIn('state_id', [MissionStates::REQUEST_CREATED->value, MissionStates::PENDING_CONFIRMATION->value]) ->where('edare_shahri_id', '=', Auth::user()->edarate_shahri_id); return DataTableFacade::run( diff --git a/database/migrations/2025_11_15_090251_add_column_to_missions_table.php b/database/migrations/2025_11_15_090251_add_column_to_missions_table.php new file mode 100644 index 00000000..ab13ac14 --- /dev/null +++ b/database/migrations/2025_11_15_090251_add_column_to_missions_table.php @@ -0,0 +1,30 @@ +foreignId('machine_id')->nullable()->constrained('cmms_machines'); + $table->string('machine_name')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('missions', function (Blueprint $table) { + $table->dropForeign('missions_machine_id_foreign'); + $table->dropColumn(['machine_id', 'machine_name']); + }); + } +};