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,
+ ]);
+ }
}