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