diff --git a/app/Http/Controllers/admin/Catalog/DirectionController.php b/app/Http/Controllers/admin/Catalog/DirectionController.php index c50c793..9d39d43 100644 --- a/app/Http/Controllers/admin/Catalog/DirectionController.php +++ b/app/Http/Controllers/admin/Catalog/DirectionController.php @@ -7,6 +7,7 @@ use App\Http\Requests\admin\Catalog\StoreDirectionRequest; use App\Http\Requests\admin\Catalog\UpdateDirectionRequest; use App\Models\Department; use App\Models\Direction; +use App\Models\EducationLevel; use App\Models\Faculty; use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\View; @@ -23,8 +24,9 @@ class DirectionController extends Controller public function create(): View|Application|Factory|\Illuminate\Contracts\Foundation\Application { + $levels = EducationLevel::pluck('name', 'id'); $departments = Department::pluck('name', 'id'); - return view('admin.catalog.direction.create', compact('departments')); + return view('admin.catalog.direction.create', compact('departments', 'levels')); } public function store(StoreDirectionRequest $request): RedirectResponse @@ -36,6 +38,8 @@ class DirectionController extends Controller $direction->description = $validated['description']; $direction->position = $validated['position']; $direction->slug = $validated['slug']; + $direction->code = $validated['code']; + $direction->education_level_id = $validated['education_level_id']; $direction->department_id = $validated['department_id']; $direction->save(); @@ -60,18 +64,22 @@ class DirectionController extends Controller public function edit(Direction $direction): View|Application|Factory|\Illuminate\Contracts\Foundation\Application { + $levels = EducationLevel::pluck('name', 'id'); $departments = Department::pluck('name', 'id'); - return view('admin.catalog.direction.edit', compact('direction', 'departments')); + return view('admin.catalog.direction.edit', compact('direction', 'departments', 'levels')); } public function update(UpdateDirectionRequest $request, Direction $direction): RedirectResponse { $validated = $request->validated(); + $direction = new Direction(); $direction->name = $validated['name']; $direction->description = $validated['description']; $direction->position = $validated['position']; $direction->slug = $validated['slug']; + $direction->code = $validated['code']; + $direction->education_level_id = $validated['education_level_id']; $direction->department_id = $validated['department_id']; $direction->save(); diff --git a/app/Http/Requests/admin/Catalog/StoreDirectionRequest.php b/app/Http/Requests/admin/Catalog/StoreDirectionRequest.php index 88abe17..c4e7c82 100644 --- a/app/Http/Requests/admin/Catalog/StoreDirectionRequest.php +++ b/app/Http/Requests/admin/Catalog/StoreDirectionRequest.php @@ -18,6 +18,8 @@ class StoreDirectionRequest extends FormRequest 'name' => 'required|string|max:255|unique:directions,name', 'description' => 'string', 'slug' => 'required|string', + 'code' => 'required|string', + 'education_level_id' => 'required|int', 'department_id' => 'required|int' ]; } diff --git a/app/Http/Requests/admin/Catalog/UpdateDirectionRequest.php b/app/Http/Requests/admin/Catalog/UpdateDirectionRequest.php index 97b190d..4b9e072 100644 --- a/app/Http/Requests/admin/Catalog/UpdateDirectionRequest.php +++ b/app/Http/Requests/admin/Catalog/UpdateDirectionRequest.php @@ -19,6 +19,8 @@ class UpdateDirectionRequest extends FormRequest 'description' => 'string', 'department_id' => 'int|required', 'slug' => 'required|string', + 'code' => 'required|string', + 'education_level_id' => 'required|int', 'name' => [ 'required', 'string', diff --git a/app/Models/Direction.php b/app/Models/Direction.php index 98f8ce7..db3ebc3 100644 --- a/app/Models/Direction.php +++ b/app/Models/Direction.php @@ -15,10 +15,17 @@ class Direction extends Model 'name', 'description', 'position', + 'slug', + 'code', ]; public function department(): BelongsTo { return $this->belongsTo(Department::class); } + + public function educationLevel(): BelongsTo + { + return $this->belongsTo(EducationLevel::class); + } } diff --git a/database/factories/DirectionFactory.php b/database/factories/DirectionFactory.php index 18e5461..c1143c8 100644 --- a/database/factories/DirectionFactory.php +++ b/database/factories/DirectionFactory.php @@ -12,8 +12,10 @@ class DirectionFactory extends Factory 'name' => fake()->name(), 'description' => fake()->text(), 'slug' => fake()->slug(), + 'code' => fake()->text(50), 'position' => fake()->randomDigit(), 'department_id' => 1, + 'education_level_id' => 1 ]; } } diff --git a/database/migrations/2024_02_09_114155_create_directions_table.php b/database/migrations/2024_02_09_114155_create_directions_table.php index 7ba432a..3989716 100644 --- a/database/migrations/2024_02_09_114155_create_directions_table.php +++ b/database/migrations/2024_02_09_114155_create_directions_table.php @@ -15,9 +15,11 @@ return new class extends Migration $table->id(); $table->string('name'); $table->text('description'); + $table->string('code'); $table->integer('position'); $table->string('slug'); $table->foreignId('department_id')->constrained('departments'); + $table->foreignId('education_level_id')->constrained('education_levels'); $table->timestamps(); }); } diff --git a/database/seeders/DirectionSeeder.php b/database/seeders/DirectionSeeder.php index 1b26f73..adf9119 100644 --- a/database/seeders/DirectionSeeder.php +++ b/database/seeders/DirectionSeeder.php @@ -4,11 +4,40 @@ namespace Database\Seeders; use App\Models\Direction; use Illuminate\Database\Seeder; +use Illuminate\Support\Facades\DB; class DirectionSeeder extends Seeder { public function run(): void { - Direction::factory(3)->create(); + DB::table('directions')->insert([ + [ + 'name' => 'Юриспруденция', + 'description' => 'Юриспруденция', + 'slug' => 'jurisprudence', + 'code' => '40.03.01', + 'position' => 1, + 'department_id' => 1, + 'education_level_id' => 1, + ], + [ + 'name' => 'фармация', + 'description' => 'фармация', + 'slug' => 'pharmacy', + 'code' => '33.05.01', + 'position' => 2, + 'department_id' => 1, + 'education_level_id' => 2, + ], + [ + 'name' => 'строительство', + 'description' => 'строительство', + 'slug' => 'construction', + 'code' => '08.04.01', + 'position' => 3, + 'department_id' => 1, + 'education_level_id' => 3, + ], + ]); } } diff --git a/resources/views/admin/catalog/direction/create.blade.php b/resources/views/admin/catalog/direction/create.blade.php index 8d8e121..0f41774 100644 --- a/resources/views/admin/catalog/direction/create.blade.php +++ b/resources/views/admin/catalog/direction/create.blade.php @@ -19,14 +19,14 @@
- {{ Form::label('name', 'Название') }} + {{ Form::label('code', 'Название') }}
- {{ Form::text('name', '', ['class' => 'form-control']) }} + {{ Form::text('code', '', ['class' => 'form-control']) }}
@if ($errors->any()) - {{ $errors->first('name') }} + {{ $errors->first('code') }} @endif
@@ -42,7 +42,7 @@ @endif
- {{ Form::label('department_id', 'Кафедры') }} + {{ Form::label('department_id', 'Кафедра') }}
{{ Form::select('department_id', $departments, null, ['class' => 'form-select']) }} @@ -52,6 +52,19 @@ {{ $errors->first('department_id') }} @endif
+ +
+ {{ Form::label('education_level_id', 'Увовень образования') }} +
+
+ {{ Form::select('education_level_id', $levels, null, ['class' => 'form-select']) }} +
+
+ @if ($errors->any()) + {{ $errors->first('education_level_id') }} + @endif +
+
{{ Form::label('slug', 'URL') }}
diff --git a/resources/views/admin/catalog/direction/edit.blade.php b/resources/views/admin/catalog/direction/edit.blade.php index ea231cd..ceb27e8 100644 --- a/resources/views/admin/catalog/direction/edit.blade.php +++ b/resources/views/admin/catalog/direction/edit.blade.php @@ -4,7 +4,7 @@ @auth()
-

Создать кафедру

+

Изменить направление

{{ Form::open(['url' => route('departments.update', $direction), 'method' => 'PATCH', 'class' => '']) }}
@@ -43,16 +43,29 @@ @endif
- {{ Form::label('educational_institution_id', 'Факультет') }} + {{ Form::label('department_id', 'Факультет') }}
- {{ Form::select('faculty_id', $departments, $direction->department->id, ['class' => 'form-select']) }} + {{ Form::select('department_id', $departments, $direction->department->id, ['class' => 'form-select']) }}
@if ($errors->any()) - {{ $errors->first('educational_institution_id') }} + {{ $errors->first('department_id') }} @endif
+ +
+ {{ Form::label('education_level_id', 'Увовень образования') }} +
+
+ {{ Form::select('education_level_id', $levels, $direction->educationLevel->id, ['class' => 'form-select']) }} +
+
+ @if ($errors->any()) + {{ $errors->first('education_level_id') }} + @endif +
+
{{ Form::label('slug', 'URL') }}
diff --git a/resources/views/admin/catalog/direction/index.blade.php b/resources/views/admin/catalog/direction/index.blade.php index 544eff4..588ce04 100644 --- a/resources/views/admin/catalog/direction/index.blade.php +++ b/resources/views/admin/catalog/direction/index.blade.php @@ -15,6 +15,7 @@ Описание URL Кафедра + Уровень образования действия @@ -27,6 +28,7 @@ {{ Str::words($direction->description, 10, '...') }} {{ $direction->slug }} {{ $direction->department->name }} + {{ $direction->educationLevel->name }} редактировать diff --git a/resources/views/admin/catalog/direction/show.blade.php b/resources/views/admin/catalog/direction/show.blade.php index 89d7b05..d79fa1b 100644 --- a/resources/views/admin/catalog/direction/show.blade.php +++ b/resources/views/admin/catalog/direction/show.blade.php @@ -23,6 +23,8 @@

{{ $direction->slug }}

Кафедра

{{ $department->name }}

+

Уровень Образования

+

{{ $direction->educationLevel->name }}

@endauth @endsection diff --git a/tests/Feature/admin/catalog/DepartmentTest.php b/tests/Feature/admin/catalog/DepartmentTest.php index c194a04..7a9fbd5 100644 --- a/tests/Feature/admin/catalog/DepartmentTest.php +++ b/tests/Feature/admin/catalog/DepartmentTest.php @@ -5,6 +5,7 @@ namespace Tests\Feature\admin\catalog; use App\Models\Department; use App\Models\Direction; use App\Models\EducationalInstitution; +use App\Models\EducationLevel; use App\Models\Faculty; use App\Models\User; use Tests\TestCase; @@ -19,6 +20,7 @@ class DepartmentTest extends TestCase parent::setUp(); EducationalInstitution::factory()->create(); Faculty::factory()->create(); + EducationLevel::factory()->create(); $this->department = Department::factory()->create(); $this->data = Department::factory()->make()->only([ diff --git a/tests/Feature/admin/catalog/DirectionTest.php b/tests/Feature/admin/catalog/DirectionTest.php index 363e255..791d329 100644 --- a/tests/Feature/admin/catalog/DirectionTest.php +++ b/tests/Feature/admin/catalog/DirectionTest.php @@ -5,6 +5,7 @@ namespace Tests\Feature\admin\catalog; use App\Models\Department; use App\Models\Direction; use App\Models\EducationalInstitution; +use App\Models\EducationLevel; use App\Models\Faculty; use App\Models\User; use Tests\TestCase; @@ -20,13 +21,16 @@ class DirectionTest extends TestCase EducationalInstitution::factory()->create(); Faculty::factory()->create(); Department::factory()->create(); + EducationLevel::factory()->create(); $this->direction = Direction::factory()->create(); $this->data = Direction::factory()->make()->only([ 'position', 'name', 'description', + 'code', 'slug', + 'education_level_id', 'department_id', ]); diff --git a/tests/Feature/admin/catalog/EducationLevelTest.php b/tests/Feature/admin/catalog/EducationLevelTest.php new file mode 100644 index 0000000..4d5ecb5 --- /dev/null +++ b/tests/Feature/admin/catalog/EducationLevelTest.php @@ -0,0 +1,121 @@ +create(); + Faculty::factory()->create(); + Department::factory()->create(); + $this->level = EducationLevel::factory()->create(); + + $this->direction = Direction::factory()->create(); + $this->data = EducationLevel::factory()->make()->only([ + 'name', + 'description', + 'slug', + ]); + + $this->user = User::factory()->create([ + 'name' => 'admin', + 'email' => 'test@example.com', + 'password' => 123456 + ]); + } + + public function testIndexEducationLevelsPage(): void + { + $response = $this->actingAs($this->user) + ->withSession(['banned' => false]) + ->get(route('education_levels.index')); + + $response->assertOk(); + } + + public function testCreateEducationLevelPage(): void + { + $response = $this->actingAs($this->user) + ->withSession(['banned' => false]) + ->get(route('education_levels.create')); + + $response->assertOk(); + } + + public function testStoreEducationLevel(): void + { + $response = $this->actingAs($this->user) + ->withSession(['banned' => false]) + ->post(route('education_levels.store', $this->data)); + + $response->assertRedirect(route('education_levels.index')); + + $this->assertDatabaseHas('education_levels', $this->data); + } + + public function testShowEducationLevelPage(): void + { + $response = $this->actingAs($this->user) + ->withSession(['banned' => false]) + ->get(route('education_levels.show', $this->level)); + + $response->assertOk(); + } + + public function testEditEducationLevelPage(): void + { + $response = $this->actingAs($this->user) + ->withSession(['banned' => false]) + ->get(route('education_levels.edit', $this->level)); + + $response->assertOk(); + } + + public function testUpdateEducationLevel(): void + { + $response = $this->actingAs($this->user) + ->withSession(['banned' => false]) + ->patch(route('education_levels.update', $this->level), $this->data); + + $response->assertRedirect(route('education_levels.index')); + + $this->assertDatabaseHas('education_levels', $this->data); + } + + public function testDestroyEducationLevel(): void + { + $this->direction->delete(); + $response = $this->actingAs($this->user) + ->withSession(['banned' => false]) + ->delete(route('education_levels.destroy', $this->level)); + + $response->assertRedirect(route('education_levels.index')); + + $this->assertDatabaseMissing('education_levels', $this->level->toArray()); + } + + public function testNotDestroyEducationLevel(): void + { + $response = $this->actingAs($this->user) + ->withSession(['banned' => false]) + ->delete(route('education_levels.destroy', $this->level)); + + $response->assertStatus(302); + + $this->assertDatabaseHas('education_levels', $this->level->only(['name', 'slug'])); + } +}