diff --git a/app/Livewire/Datatable/UsersTable.php b/app/Livewire/Datatable/UsersTable.php
index 0d8f04f..6e720bf 100644
--- a/app/Livewire/Datatable/UsersTable.php
+++ b/app/Livewire/Datatable/UsersTable.php
@@ -39,12 +39,24 @@ public function columns(): array
});
})
->html(),
+
+ Column::make('Kredensial')
+ ->label(function ($row) {
+ return <<
+
{$row->email}
+ {$row->username}
+
+ HTML;
+ })
+ ->searchable(function ($query, $searchTerm) {
+ $query->where('email', 'like', "%{$searchTerm}%")
+ ->orWhere('username', 'like', "%{$searchTerm}%");
+ })
+ ->html(),
+
Column::make('Nomor Telepon', 'employee.phone_number')->searchable(),
- Column::make('Email', 'email')->searchable(),
-
- Column::make('Nama Pengguna', 'username')->searchable(),
-
Column::make('Jenis Kelamin', 'employee.gender')
->format(fn ($value) => Blade::render(
''
@@ -56,7 +68,7 @@ public function columns(): array
Column::make('Gaji Pokok', 'employee.base_salary')
->searchable()
->sortable()
- ->format(fn ($value) => currency($value)),
+ ->format(fn ($value) => currency($value, 'Rp')),
Column::make('Alamat', 'employee.address')->searchable(),
diff --git a/app/Livewire/Forms/UserForm.php b/app/Livewire/Forms/UserForm.php
index 0cc31b4..c74f435 100644
--- a/app/Livewire/Forms/UserForm.php
+++ b/app/Livewire/Forms/UserForm.php
@@ -7,6 +7,7 @@
use App\Models\Employee;
use App\Models\User;
use App\Rules\PhoneNumber;
+use App\Rules\UnsignedInteger;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
@@ -44,7 +45,7 @@ public function rules(): array
'username' => ['required', 'alpha_dash', 'min:5', 'max:20', Rule::unique('users', 'username')->ignore($this->user)],
'email' => ['required', 'email', 'max:100', Rule::unique('users', 'email')->ignore($this->user)],
'phone_number' => ['required', 'string', new PhoneNumber],
- 'base_salary' => ['required', 'regex:/^[0-9.]+$/', 'max:999999999'],
+ 'base_salary' => ['required', 'regex:/^[0-9.]+$/', new UnsignedInteger],
'birthdate' => ['required', 'date', 'before:'.Carbon::now()->subYears(18)->format('Y-m-d')],
'hire_date' => ['required', 'date'],
'address' => ['required', 'string'],
@@ -77,8 +78,8 @@ public function setUser(User $user)
$this->email = $user->email;
$this->phone_number = $employee->phone_number;
$this->base_salary = $employee->base_salary;
- $this->birthdate = $employee->birthdate->toDateString();
- $this->hire_date = $employee->hire_date->toDateString();
+ $this->birthdate = $employee->birthdate;
+ $this->hire_date = $employee->hire_date;
$this->address = $employee->address;
$this->gender = $employee->gender->value;
$this->status = $user->status->value;
diff --git a/app/Livewire/Studio/Master/User/Create.php b/app/Livewire/Studio/Master/User/Create.php
index 1dfa610..0ab5b69 100644
--- a/app/Livewire/Studio/Master/User/Create.php
+++ b/app/Livewire/Studio/Master/User/Create.php
@@ -19,6 +19,8 @@ public function save()
{
$this->form->store();
+ $this->dispatch('refreshDatatable');
+
Flux::toast(
heading: 'Berhasil',
text: 'Pegawai berhasil ditambahkan.',
diff --git a/database/factories/EmployeeFactory.php b/database/factories/EmployeeFactory.php
new file mode 100644
index 0000000..7fc9f23
--- /dev/null
+++ b/database/factories/EmployeeFactory.php
@@ -0,0 +1,31 @@
+ $this->faker->name(),
+ 'code' => Employee::generateEmployeeCode(),
+ 'phone_number' => fake()->randomElement([
+ fake()->numerify('0812 #### ###'),
+ fake()->numerify('0812 #### ####'),
+ fake()->numerify('0812 #### #####'),
+ ]),
+ 'base_salary' => $this->faker->randomNumber(6),
+ 'gender' => $this->faker->randomElement(Gender::cases()),
+ 'address' => $this->faker->address(),
+ 'birthdate' => $this->faker->dateTimeBetween('-60 years', '-18 years')->format('Y-m-d'),
+ 'hire_date' => $this->faker->date(),
+ 'resign_date' => $this->faker->optional()->date(),
+ 'status' => $this->faker->randomElement(EmploymentStatus::cases()),
+ ];
+ }
+}
diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php
index 584104c..6ee2e98 100644
--- a/database/factories/UserFactory.php
+++ b/database/factories/UserFactory.php
@@ -2,43 +2,19 @@
namespace Database\Factories;
+use App\Enums\UserStatus;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
-use Illuminate\Support\Str;
-/**
- * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
- */
class UserFactory extends Factory
{
- /**
- * The current password being used by the factory.
- */
- protected static ?string $password;
-
- /**
- * Define the model's default state.
- *
- * @return array
- */
public function definition(): array
{
return [
- 'name' => fake()->name(),
- 'email' => fake()->unique()->safeEmail(),
- 'email_verified_at' => now(),
- 'password' => static::$password ??= Hash::make('password'),
- 'remember_token' => Str::random(10),
+ 'email' => $this->faker->unique()->safeEmail(),
+ 'username' => fake()->unique()->regexify('[A-Za-z0-9]{8}'),
+ 'password' => Hash::make(config('myconfig.password_default')),
+ 'status' => $this->faker->randomElement(UserStatus::cases()),
];
}
-
- /**
- * Indicate that the model's email address should be unverified.
- */
- public function unverified(): static
- {
- return $this->state(fn (array $attributes) => [
- 'email_verified_at' => null,
- ]);
- }
}
diff --git a/tests/Feature/Livewire/Studio/Master/User/CreateTest.php b/tests/Feature/Livewire/Studio/Master/User/CreateTest.php
new file mode 100644
index 0000000..e76dcdc
--- /dev/null
+++ b/tests/Feature/Livewire/Studio/Master/User/CreateTest.php
@@ -0,0 +1,45 @@
+assertViewIs('livewire.studio.master.user.form')
+ ->assertViewHas('pageTitle', 'Tambah Pegawai');
+});
+
+it('can create an user', function () {
+ $user = User::factory()->raw();
+
+ $employee = Employee::factory()->raw();
+
+ $data = array_merge($user, $employee);
+
+ Livewire::test(Create::class)
+ ->set('form.full_name', $data['full_name'])
+ ->set('form.username', $data['username'])
+ ->set('form.email', $data['email'])
+ ->set('form.phone_number', $data['phone_number'])
+ ->set('form.base_salary', $data['base_salary'])
+ ->set('form.birthdate', $data['birthdate'])
+ ->set('form.hire_date', $data['hire_date'])
+ ->set('form.address', $data['address'])
+ ->set('form.gender', $data['gender']->value)
+ ->set('form.status', $data['status']->value)
+ ->call('save')
+ ->assertHasNoErrors()
+ ->assertDispatched('refreshDatatable')
+ ->assertRedirect(Index::class);
+
+ $this->assertDatabaseHas('users', [
+ 'email' => $data['email'],
+ 'username' => $data['username'],
+ ]);
+});
diff --git a/tests/Feature/Livewire/Studio/Master/User/EditTest.php b/tests/Feature/Livewire/Studio/Master/User/EditTest.php
new file mode 100644
index 0000000..f85d93f
--- /dev/null
+++ b/tests/Feature/Livewire/Studio/Master/User/EditTest.php
@@ -0,0 +1,53 @@
+has(Employee::factory())
+ ->create();
+
+ Livewire::test(Edit::class, ['user' => $user])
+ ->assertViewIs('livewire.studio.master.user.form')
+ ->assertViewHas('pageTitle', 'Ubah Pegawai');
+});
+
+it('can update an user', function () {
+ $existingUser = User::factory()
+ ->has(Employee::factory())
+ ->create();
+
+ $user = User::factory()->raw();
+ $employee = Employee::factory()->raw();
+
+ $data = array_merge($user, $employee);
+
+ Livewire::test(Edit::class, ['user' => $existingUser])
+ ->set('form.full_name', $data['full_name'])
+ ->set('form.username', $data['username'])
+ ->set('form.email', $data['email'])
+ ->set('form.phone_number', $data['phone_number'])
+ ->set('form.base_salary', $data['base_salary'])
+ ->set('form.birthdate', $data['birthdate'])
+ ->set('form.hire_date', $data['hire_date'])
+ ->set('form.address', $data['address'])
+ ->set('form.gender', $data['gender']->value)
+ ->set('form.status', $data['status']->value)
+ ->call('save')
+ ->assertHasNoErrors()
+ ->assertDispatched('refreshDatatable')
+ ->assertRedirect(Index::class);
+
+ $this->assertDatabaseHas('users', [
+ 'id' => $existingUser->id,
+ 'email' => $data['email'],
+ 'username' => $data['username'],
+ ]);
+});
diff --git a/tests/Feature/Livewire/Studio/Master/User/IndexTest.php b/tests/Feature/Livewire/Studio/Master/User/IndexTest.php
new file mode 100644
index 0000000..ef33b24
--- /dev/null
+++ b/tests/Feature/Livewire/Studio/Master/User/IndexTest.php
@@ -0,0 +1,38 @@
+assertViewIs('livewire.studio.master.user.index')
+ ->assertViewHas('pageTitle', 'Pegawai');
+});
+
+it('displays all users', function () {
+ User::factory()
+ ->count(10)
+ ->has(Employee::factory())
+ ->create();
+
+ $user = User::first();
+
+ Livewire::test(Index::class)->assertSee($user->email);
+});
+
+it('can delete an user', function () {
+ $user = User::factory()
+ ->has(Employee::factory())
+ ->create();
+
+ Livewire::test(Index::class)
+ ->call('delete', $user)
+ ->assertDispatched('refreshDatatable');
+
+ expect(User::count())->toBe(0);
+});