diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 43c1298..8625f70 100644 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use DB; use Storage; use App\User; use App\Couple; @@ -106,7 +107,12 @@ class UsersController extends Controller { $this->authorize('edit', $user); - return view('users.edit', compact('user')); + $replacementUsers = []; + if (request('action') == 'delete') { + $replacementUsers = User::where('gender_id', $user->gender_id)->pluck('nickname', 'id'); + } + + return view('users.edit', compact('user', 'replacementUsers')); } /** @@ -170,6 +176,34 @@ class UsersController extends Controller { $this->authorize('delete', $user); + if ($request->has('replace_delete_button')) { + $attributes = $request->validate([ + 'replacement_user_id' => 'required|exists:users,id', + ], [ + 'replacement_user_id.required' => __('validation.user.replacement_user_id.required'), + ]); + + DB::beginTransaction(); + $oldUserId = $user->id; + + DB::table('users')->where('father_id', $oldUserId)->update([ + 'father_id' => $attributes['replacement_user_id'], + ]); + + DB::table('users')->where('mother_id', $oldUserId)->update([ + 'mother_id' => $attributes['replacement_user_id'], + ]); + + DB::table('users')->where('manager_id', $oldUserId)->update([ + 'manager_id' => $attributes['replacement_user_id'], + ]); + + $user->delete(); + DB::commit(); + + return redirect()->route('users.show', $attributes['replacement_user_id']); + } + request()->validate([ 'user_id' => 'required', ]); diff --git a/resources/lang/id/user.php b/resources/lang/id/user.php index 2afa610..f7961d4 100644 --- a/resources/lang/id/user.php +++ b/resources/lang/id/user.php @@ -58,4 +58,8 @@ return [ 'childs_count' => 'Jumlah Anak', 'managed_user' => 'Jumlah User Dikelola', 'managed_couple' => 'Jumlah Pasangan Dikelola', + 'replacement' => 'User Pengganti', + 'replace_confirm' => 'Anda yakin mengganti dan menghapus user ini?', + 'replace_delete_text' => 'Anda memilih user lain sebagai pengganti?', + 'replace_delete_button' => 'Ganti dan Hapus User', ]; diff --git a/resources/lang/id/validation.php b/resources/lang/id/validation.php index 0b825bb..8a0094d 100644 --- a/resources/lang/id/validation.php +++ b/resources/lang/id/validation.php @@ -99,9 +99,9 @@ return [ | */ - 'custom' => [ - 'attribute-name' => [ - 'rule-name' => 'custom-message', + 'user' => [ + 'replacement_user_id' => [ + 'required' => 'Wajib dipilih.', ], ], diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php index 5cfe1fd..956fed8 100644 --- a/resources/views/users/edit.blade.php +++ b/resources/views/users/edit.blade.php @@ -14,21 +14,37 @@ {{ __('user.gender') }}{{ $user->gender }} {{ __('user.father') }}{{ $user->father_id ? $user->father->name : '' }} {{ __('user.mother') }}{{ $user->mother_id ? $user->mother->name : '' }} - {{ __('user.childs_count') }}{{ $user->childs()->count() }} - {{ __('user.spouses_count') }}{{ $user->marriages()->count() }} - {{ __('user.managed_user') }}{{ $user->managedUsers()->count() }} - {{ __('user.managed_couple') }}{{ $user->managedCouples()->count() }} + {{ __('user.childs_count') }}{{ $dependentCount = $user->childs()->count() }} + {{ __('user.spouses_count') }}{{ $dependentCount += $user->marriages()->count() }} + {{ __('user.managed_user') }}{{ $dependentCount += $user->managedUsers()->count() }} + {{ __('user.managed_couple') }}{{ $dependentCount += $user->managedCouples()->count() }} - -
{{ __('user.delete_confirm') }}
- diff --git a/tests/Feature/UsersDeletionTest.php b/tests/Feature/UsersDeletionTest.php index 4ebb7f7..87c49dc 100644 --- a/tests/Feature/UsersDeletionTest.php +++ b/tests/Feature/UsersDeletionTest.php @@ -29,4 +29,121 @@ class UsersDeletionTest extends TestCase 'id' => $user->id, ]); } + + /** @test */ + public function manager_can_delete_a_user_the_replace_childs_father_id() + { + $manager = $this->loginAsUser(); + $oldUser = factory(User::class)->create([ + 'gender_id' => 1, + 'manager_id' => $manager->id, + ]); + $oldUserChild = factory(User::class)->create(['father_id' => $oldUser->id]); + $replacementUser = factory(User::class)->create([ + 'gender_id' => 1, + 'manager_id' => $manager->id, + ]); + + $this->visit(route('users.edit', $oldUser)); + $this->seeElement('a', ['id' => 'del-user-'.$oldUser->id]); + + $this->click('del-user-'.$oldUser->id); + $this->seePageIs(route('users.edit', [$oldUser, 'action' => 'delete'])); + $this->see(__('user.replace_delete_text')); + + $this->submitForm(__('user.replace_delete_button'), [ + 'replacement_user_id' => $replacementUser->id, + ]); + + $this->dontSeeInDatabase('users', [ + 'id' => $oldUser->id, + ]); + + $this->dontSeeInDatabase('users', [ + 'father_id' => $oldUser->id, + ]); + + $this->seeInDatabase('users', [ + 'id' => $oldUserChild->id, + 'father_id' => $replacementUser->id, + ]); + } + + /** @test */ + public function manager_can_delete_a_user_the_replace_childs_mother_id() + { + $manager = $this->loginAsUser(); + $oldUser = factory(User::class)->create([ + 'gender_id' => 2, + 'manager_id' => $manager->id, + ]); + $oldUserChild = factory(User::class)->create(['mother_id' => $oldUser->id]); + $replacementUser = factory(User::class)->create([ + 'gender_id' => 2, + 'manager_id' => $manager->id, + ]); + + $this->visit(route('users.edit', $oldUser)); + $this->seeElement('a', ['id' => 'del-user-'.$oldUser->id]); + + $this->click('del-user-'.$oldUser->id); + $this->seePageIs(route('users.edit', [$oldUser, 'action' => 'delete'])); + $this->see(__('user.replace_delete_text')); + + $this->submitForm(__('user.replace_delete_button'), [ + 'replacement_user_id' => $replacementUser->id, + ]); + + $this->dontSeeInDatabase('users', [ + 'id' => $oldUser->id, + ]); + + $this->dontSeeInDatabase('users', [ + 'mother_id' => $oldUser->id, + ]); + + $this->seeInDatabase('users', [ + 'id' => $oldUserChild->id, + 'mother_id' => $replacementUser->id, + ]); + } + + /** @test */ + public function manager_can_delete_a_user_the_replace_childs_manager_id() + { + $manager = $this->loginAsUser(); + $oldUser = factory(User::class)->create([ + 'gender_id' => 1, + 'manager_id' => $manager->id, + ]); + $oldUserManagedUser = factory(User::class)->create(['manager_id' => $oldUser->id]); + $replacementUser = factory(User::class)->create([ + 'gender_id' => 1, + 'manager_id' => $manager->id, + ]); + + $this->visit(route('users.edit', $oldUser)); + $this->seeElement('a', ['id' => 'del-user-'.$oldUser->id]); + + $this->click('del-user-'.$oldUser->id); + $this->seePageIs(route('users.edit', [$oldUser, 'action' => 'delete'])); + $this->see(__('user.replace_delete_text')); + + $this->submitForm(__('user.replace_delete_button'), [ + 'replacement_user_id' => $replacementUser->id, + ]); + + $this->dontSeeInDatabase('users', [ + 'id' => $oldUser->id, + ]); + + $this->dontSeeInDatabase('users', [ + 'manager_id' => $oldUser->id, + ]); + + $this->seeInDatabase('users', [ + 'id' => $oldUserManagedUser->id, + 'manager_id' => $replacementUser->id, + ]); + } }