diff --git a/app/Http/Controllers/V2/Dashboard/RoadItemsProjectController.php b/app/Http/Controllers/V2/Dashboard/RoadItemsProjectController.php index faf9bc38..445db4ad 100644 --- a/app/Http/Controllers/V2/Dashboard/RoadItemsProjectController.php +++ b/app/Http/Controllers/V2/Dashboard/RoadItemsProjectController.php @@ -317,7 +317,7 @@ class RoadItemsProjectController extends Controller $road_item = RoadItemsProject::store(Auth::user(), $attributes, $before_image, $after_image, $request->observed_item_id); - if ($road_item == -1) { + if ($road_item === -1) { return response()->json([ 'message' => 'اقدام مربوطه قبلا رسیدگی شده است.' ], 400); diff --git a/app/Http/Controllers/V2/Dashboard/RoadPatrolProjectController.php b/app/Http/Controllers/V2/Dashboard/RoadPatrolProjectController.php index 19cfdc01..b41e55ab 100644 --- a/app/Http/Controllers/V2/Dashboard/RoadPatrolProjectController.php +++ b/app/Http/Controllers/V2/Dashboard/RoadPatrolProjectController.php @@ -413,7 +413,7 @@ class RoadPatrolProjectController extends Controller $road_item = RoadItemsProject::store(auth()->user(), $attributes, $before_image, $after_image, $observed_item->id); - if ($road_item == -1) { + if ($road_item === -1) { return response()->json([ 'message' => 'اقدام مربوطه قبلا رسیدگی شده است.' ], 400); diff --git a/app/Http/Controllers/V3/CMMSMachinesController.php b/app/Http/Controllers/V3/CMMSMachinesController.php index 73a08bd0..ffba9760 100644 --- a/app/Http/Controllers/V3/CMMSMachinesController.php +++ b/app/Http/Controllers/V3/CMMSMachinesController.php @@ -14,7 +14,7 @@ class CMMSMachinesController extends Controller public function list(): JsonResponse { - $machinesList = CMMSMachine::query()->get(['machine_code']); + $machinesList = CMMSMachine::query()->get(['machine_code', 'id']); return $this->successResponse($machinesList); } @@ -23,7 +23,7 @@ class CMMSMachinesController extends Controller { $matchedSearchedMachines = CMMSMachine::query() ->where('machine_code', 'LIKE', "%{$request->machine_code}%") - ->get(); + ->get(['machine_code', 'id']); return $this->successResponse($matchedSearchedMachines); } diff --git a/app/Http/Controllers/V3/RoadItemsProjectController.php b/app/Http/Controllers/V3/RoadItemsProjectController.php index 93858c95..0c264762 100644 --- a/app/Http/Controllers/V3/RoadItemsProjectController.php +++ b/app/Http/Controllers/V3/RoadItemsProjectController.php @@ -39,7 +39,8 @@ class RoadItemsProjectController extends Controller 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', 'sub_item_data', 'created_at', 'updated_at', 'province_id', 'province_fa', 'unit_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time', - 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time' + 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time', + 'cmms_machine_id', 'cmms_machine_code' ); $allowedFilters = $columns; @@ -49,14 +50,14 @@ class RoadItemsProjectController extends Controller $query = null; if ($user->hasPermissionTo('show-road-item-supervise-cartable')) { - $query = RoadItemsProject::query()->where('is_new', 1)->with('files'); + $query = RoadItemsProject::query()->where('is_new', 1)->with('files', 'rahdaran:id,name,code'); } elseif ($user->hasPermissionTo('show-road-item-supervise-cartable-province')) { if (is_null($user->province_id)) { return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); } $query = RoadItemsProject::query()->where('is_new', 1) - ->with('files')->where('province_id', auth()->user()->province_id); + ->with('files', 'rahdaran:id,name,code')->where('province_id', auth()->user()->province_id); } $data = DataTableFacade::run( @@ -65,6 +66,15 @@ class RoadItemsProjectController extends Controller allowedFilters: $allowedFilters, allowedSortings: $allowedSortings); + + foreach ($data['data'] as $road_item) { + if (Gate::allows('gate-supervise-road-item', $road_item)) { + $road_item['can_supervise'] = 1; + } else { + $road_item['can_supervise'] = 0; + } + } + return response()->json($data); } @@ -137,13 +147,14 @@ class RoadItemsProjectController extends Controller 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', 'sub_item_data', 'created_at', 'updated_at', 'province_id', 'province_fa', 'unit_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time', - 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time' + 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time', + 'cmms_machine_id', 'cmms_machine_code' ); $allowedFilters = $columns; $allowedSortings = $columns; - $query = RoadItemsProject::with('files') + $query = RoadItemsProject::with(['files', 'rahdaran:id,name,code']) ->where('is_new', 1) ->where('user_id', auth()->user()->id); @@ -196,7 +207,6 @@ class RoadItemsProjectController extends Controller $start_coordinates = explode(',', $request->start_point); $end_coordinates = $info_item->needs_end_point ? explode(',', $request->end_point) : null; $cmmsMachine = CMMSMachine::query()->find($request->cmms_machine_id); - $rahdar = Rahdaran::query()->find($request->rahdar_id); $attributes = [ 'start_lat' => $start_coordinates[0], @@ -227,8 +237,6 @@ class RoadItemsProjectController extends Controller 'activity_time' => $request->activity_time, 'cmms_machine_id' => $cmmsMachine->id, 'cmms_machine_code' => $cmmsMachine->machine_code, - 'rahdar_id' => $rahdar->id, - 'rahdar_code' => $rahdar->code, ]; $after_image = ($request->has('after_image') && $info_item->needs_image) ? @@ -241,11 +249,14 @@ class RoadItemsProjectController extends Controller $road_item = RoadItemsProject::store($user, $attributes, $before_image, $after_image, $request->observed_item_id); - if ($road_item == -1) { + if ($road_item === -1) { return response()->json([ 'message' => 'اقدام مربوطه قبلا رسیدگی شده است.' ], 400); } + + $road_item->rahdaran()->attach($request->rahdaran_id); + auth()->user()->addActivityComplete(1154); return $this->successResponse(); @@ -275,7 +286,6 @@ class RoadItemsProjectController extends Controller } $cmmsMachine = CMMSMachine::query()->find($request->cmms_machine_id); - $rahdar = Rahdaran::query()->find($request->rahdar_id); if ($info_item->needs_image) { if ($request->has('after_image')) { @@ -313,10 +323,10 @@ class RoadItemsProjectController extends Controller 'status_fa' => 'در حال بررسی', 'cmms_machine_id' => $cmmsMachine->id, 'cmms_machine_code' => $cmmsMachine->machine_code, - 'rahdar_id' => $rahdar->id, - 'rahdar_code' => $rahdar->code, ]); + $roadItemsProject->rahdaran()->sync($request->rahdaran_id); + auth()->user()->addActivityComplete(1155); diff --git a/app/Http/Requests/V3/RoadItemsProject/StoreRequest.php b/app/Http/Requests/V3/RoadItemsProject/StoreRequest.php index f4d0b688..3a99e8ae 100644 --- a/app/Http/Requests/V3/RoadItemsProject/StoreRequest.php +++ b/app/Http/Requests/V3/RoadItemsProject/StoreRequest.php @@ -33,7 +33,8 @@ class StoreRequest extends FormRequest 'before_image' => 'image|max:4096', 'after_image' => 'image|max:4096', 'cmms_machine_id' => 'required|exists:cmms_machines,id', - 'rahdar_id' => 'required|exists:rahdaran,id', + 'rahdaran_id' => 'required|array', + 'rahdaran_id.*' => 'required|exists:rahdaran,id', ]; } diff --git a/app/Http/Requests/V3/RoadItemsProject/UpdateRequest.php b/app/Http/Requests/V3/RoadItemsProject/UpdateRequest.php index 84a040ab..da9fe59e 100644 --- a/app/Http/Requests/V3/RoadItemsProject/UpdateRequest.php +++ b/app/Http/Requests/V3/RoadItemsProject/UpdateRequest.php @@ -32,7 +32,8 @@ class UpdateRequest extends FormRequest 'before_image' => 'image|max:4096', 'after_image' => 'image|max:4096', 'cmms_machine_id' => 'required|exists:cmms_machines,id', - 'rahdar_id' => 'required|exists:rahdaran,id', + 'rahdaran_id' => 'required|array', + 'rahdaran_id.*' => 'required|exists:rahdaran,id', ]; } } diff --git a/app/Http/Requests/V3/RoadItemsProject/VerifyBySupervisorRequest.php b/app/Http/Requests/V3/RoadItemsProject/VerifyBySupervisorRequest.php index c360df47..6d0a19a3 100644 --- a/app/Http/Requests/V3/RoadItemsProject/VerifyBySupervisorRequest.php +++ b/app/Http/Requests/V3/RoadItemsProject/VerifyBySupervisorRequest.php @@ -17,7 +17,7 @@ class VerifyBySupervisorRequest extends FormRequest */ public function authorize(): bool { - return Gate::allows('gate-supervise-road-item', $this->road_item); + return Gate::allows('gate-supervise-road-item', $this->roadItemsProject); } /** diff --git a/app/Models/Rahdaran.php b/app/Models/Rahdaran.php index 4302de52..a7fb8d73 100644 --- a/app/Models/Rahdaran.php +++ b/app/Models/Rahdaran.php @@ -4,6 +4,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; class Rahdaran extends Model { @@ -11,4 +12,10 @@ class Rahdaran extends Model protected $guarded = []; protected $table = 'rahdaran'; + protected $hidden = ['pivot']; + + public function roadItemsProject(): BelongsToMany + { + return $this->belongsToMany(RoadItemsProject::class,'rahdaran_road_items_project'); + } } diff --git a/app/Models/RoadItemsProject.php b/app/Models/RoadItemsProject.php index a2abfc1b..e09a4bfe 100644 --- a/app/Models/RoadItemsProject.php +++ b/app/Models/RoadItemsProject.php @@ -5,6 +5,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Http\UploadedFile; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; class RoadItemsProject extends Model { @@ -55,8 +56,6 @@ class RoadItemsProject extends Model 'activity_date_time', 'cmms_machine_id', 'cmms_machine_code', - 'rahdar_id', - 'rahdar_code', ]; /** @@ -101,7 +100,6 @@ class RoadItemsProject extends Model { try { $road_item = \DB::transaction(function () use ($user, $attributes, $before_image, $after_image, $observed_item_id) { -// dd($attributes['cmms_machine_id'],$attributes['cmms_machine_code']); $road_item = $user->roadItemsProjects()->create([ 'start_lat' => $attributes['start_lat'], 'start_lng' => $attributes['start_lng'], @@ -132,10 +130,8 @@ class RoadItemsProject extends Model 'activity_time' => $attributes['activity_time'], 'activity_date_time' => $attributes['activity_date']." ".$attributes['activity_time'], 'is_new' => 1, - 'cmms_machine_id' => $attributes['cmms_machine_id'], - 'cmms_machine_code' => $attributes['cmms_machine_code'], - 'rahdar_id' => $attributes['rahdar_id'], - 'rahdar_code' => $attributes['rahdar_code'], + 'cmms_machine_id' => $attributes['cmms_machine_id'] ?? null, + 'cmms_machine_code' => $attributes['cmms_machine_code'] ?? null, ]); // if ($info_item->needs_image) { @@ -165,7 +161,7 @@ class RoadItemsProject extends Model ]); } - return 1; + return $road_item; }); return $road_item; @@ -173,4 +169,9 @@ class RoadItemsProject extends Model throw $th; } } + + public function rahdaran(): BelongsToMany + { + return $this->belongsToMany(Rahdaran::class,'rahdaran_road_items_project'); + } } diff --git a/database/migrations/2024_12_14_133209_add_column_to_road_items_projects_table.php b/database/migrations/2024_12_14_133209_add_column_to_road_items_projects_table.php deleted file mode 100644 index 818de512..00000000 --- a/database/migrations/2024_12_14_133209_add_column_to_road_items_projects_table.php +++ /dev/null @@ -1,31 +0,0 @@ - foreignId('rahdar_id')->nullable()->constrained('rahdaran'); - $table->string('rahdar_code')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('road_items_projects', function (Blueprint $table) { - $table->dropForeign(['rahdar_id']); - $table->dropColumn('rahdar_id'); - $table->dropColumn('rahdar_code'); - }); - } -}; diff --git a/database/migrations/2024_12_19_100450_create_rahdaran_road_items_project_table.php b/database/migrations/2024_12_19_100450_create_rahdaran_road_items_project_table.php new file mode 100644 index 00000000..423c9e52 --- /dev/null +++ b/database/migrations/2024_12_19_100450_create_rahdaran_road_items_project_table.php @@ -0,0 +1,30 @@ +id(); + $table->foreignId('rahdaran_id')->constrained('rahdaran')->onDelete('cascade'); + $table->unsignedBigInteger('road_items_project_id'); + $table->foreign('road_items_project_id')->references('id')->on('road_items_projects')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('rahdaran_road_items_project'); + } +}; diff --git a/routes/v3.php b/routes/v3.php index bc28ba27..dc7f7d9f 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -118,7 +118,7 @@ Route::prefix('road_items') }); Route::prefix('cmms_machines') - ->name('cmms_machines') + ->name('cmms_machines.') ->controller(CMMSMachinesController::class) ->group(function () { Route::get('/list', 'list')->name('list'); @@ -126,7 +126,7 @@ Route::prefix('cmms_machines') }); Route::prefix('rahdaran') - ->name('rahdaran') + ->name('rahdaran.') ->controller(RahdaranController::class) ->group(function () { Route::get('/list', 'list')->name('list'); diff --git a/tests/Feature/V3/CMMSMachine/ListTest.php b/tests/Feature/V3/CMMSMachine/ListTest.php new file mode 100644 index 00000000..05e98ba2 --- /dev/null +++ b/tests/Feature/V3/CMMSMachine/ListTest.php @@ -0,0 +1,36 @@ +create(); + + CMMSMachine::factory(5)->create(); + + $response = $this->actingAs($user)->getJson(route('v3.cmms_machines.list')); + + $response->assertOk(); + + $response->assertJsonStructure([ + 'data' => [ + '*' => [ + "machine_code", + ], + ] + ]); + } +} diff --git a/tests/Feature/V3/CMMSMachine/SearchTest.php b/tests/Feature/V3/CMMSMachine/SearchTest.php new file mode 100644 index 00000000..40da9e7c --- /dev/null +++ b/tests/Feature/V3/CMMSMachine/SearchTest.php @@ -0,0 +1,35 @@ +create(); + + $machine = CMMSMachine::factory()->create(); + + $response = $this->actingAs($user)->getJson(route('v3.cmms_machines.search', [$machine->machine_code])); + + $response->assertOk(); + + $response->assertJsonStructure([ + 'data' => [ + '*' => [ + "machine_code", + ], + ] + ]); + } +} diff --git a/tests/Feature/V3/Rahdaran/ListTest.php b/tests/Feature/V3/Rahdaran/ListTest.php new file mode 100644 index 00000000..eddb11c4 --- /dev/null +++ b/tests/Feature/V3/Rahdaran/ListTest.php @@ -0,0 +1,36 @@ +create(); + + Rahdaran::factory(5)->create(); + + $response = $this->actingAs($user)->getJson(route('v3.rahdaran.list')); + + $response->assertOk(); + + $response->assertJsonStructure([ + 'data' => [ + '*' => [ + "name", + "code", + ], + ] + ]); + } +} diff --git a/tests/Feature/V3/Rahdaran/SearchTest.php b/tests/Feature/V3/Rahdaran/SearchTest.php new file mode 100644 index 00000000..65a0f55a --- /dev/null +++ b/tests/Feature/V3/Rahdaran/SearchTest.php @@ -0,0 +1,36 @@ +create(); + + $rahdar = Rahdaran::factory()->create(); + + $response = $this->actingAs($user)->getJson(route('v3.cmms_machines.search', [$rahdar->code])); + + $response->assertOk(); + + $response->assertJsonStructure([ + 'data' => [ + '*' => [ + "name", + "code", + ], + ] + ]); + } +} diff --git a/tests/Feature/V3/RoadItemsProject/SupervisorIndexTest.php b/tests/Feature/V3/RoadItemsProject/SupervisorIndexTest.php index f7351f52..13a080d4 100644 --- a/tests/Feature/V3/RoadItemsProject/SupervisorIndexTest.php +++ b/tests/Feature/V3/RoadItemsProject/SupervisorIndexTest.php @@ -24,17 +24,17 @@ class SupervisorIndexTest extends TestCase $response->assertForbidden(); } - public function test_operator_can_see_the_data_table(): void + public function test_supervisor_can_see_the_data_table(): void { $user = User::factory() ->has(Permission::factory([ - 'name' => 'create-road-item' + 'name' => 'show-road-item-supervise-cartable' ])) ->create(); RoadItemsProject::factory(10)->create(); - $response = $this->actingAs($user)->getJson(route('v3.road_items.operatorIndex', [ + $response = $this->actingAs($user)->getJson(route('v3.road_items.supervisorIndex', [ 'size' => 10, 'start' => 0, 'sorting' => json_encode([]), @@ -90,6 +90,7 @@ class SupervisorIndexTest extends TestCase "cmms_machine_code", "rahdar_id", "rahdar_code", + "can_supervise", ], ] ]);