From 7fa46c0e9b7c11b86eab154a8ede5412370ba8ae Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Wed, 1 Oct 2025 14:40:11 +0700 Subject: [PATCH] fix(user): menambahkan kolom referral_code dan menyesuaikan logika yang ada -mengubah validasi username dari alpha_dash menjad alpha_num -membuat method untuk generate kode nya di string helper --- app/Helpers/StringHelpers.php | 10 ++++++++++ app/Livewire/Datatable/UsersTable.php | 6 ++++++ app/Livewire/Forms/UserForm.php | 3 ++- database/factories/UserFactory.php | 6 +++++- .../0001_01_01_000000_create_users_table.php | 1 + database/seeders/UserSeeder.php | 1 + .../Feature/Livewire/Studio/Master/User/CreateTest.php | 1 + tests/Feature/Livewire/Studio/Master/User/EditTest.php | 1 + 8 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app/Helpers/StringHelpers.php b/app/Helpers/StringHelpers.php index 231cd2a..1554e9d 100644 --- a/app/Helpers/StringHelpers.php +++ b/app/Helpers/StringHelpers.php @@ -41,3 +41,13 @@ function formatDiscount($amount, VoucherType $type, string $currency = 'Rp'): st : currency($amount, $currency); } } + +if (! function_exists('generateReferralCode')) { + function generateReferralCode(string $username, int $unique): string + { + $prefix = Str::substr($username, 0, 6); + $year = date('y'); + + return Str::upper($prefix).$year.$unique; + } +} diff --git a/app/Livewire/Datatable/UsersTable.php b/app/Livewire/Datatable/UsersTable.php index 6e720bf..e20eb97 100644 --- a/app/Livewire/Datatable/UsersTable.php +++ b/app/Livewire/Datatable/UsersTable.php @@ -65,6 +65,12 @@ public function columns(): array )) ->html(), + Column::make('Kode Referral', 'referral_code') + ->format(fn ($value) => Blade::render( + ''.$value.'' + )) + ->html(), + Column::make('Gaji Pokok', 'employee.base_salary') ->searchable() ->sortable() diff --git a/app/Livewire/Forms/UserForm.php b/app/Livewire/Forms/UserForm.php index c74f435..bc92745 100644 --- a/app/Livewire/Forms/UserForm.php +++ b/app/Livewire/Forms/UserForm.php @@ -42,7 +42,7 @@ public function rules(): array { return [ 'full_name' => ['required', 'string', 'max:100'], - 'username' => ['required', 'alpha_dash', 'min:5', 'max:20', Rule::unique('users', 'username')->ignore($this->user)], + 'username' => ['required', 'alpha_num', '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.]+$/', new UnsignedInteger], @@ -101,6 +101,7 @@ public function store() $user = User::create([ ...$data, 'password' => Hash::make(config('myconfig.password_default')), + 'referral_code' => generateReferralCode($data['username'], User::max('id') + 1), 'status' => $data['status'], ]); diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 6ee2e98..74adc56 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -3,6 +3,7 @@ namespace Database\Factories; use App\Enums\UserStatus; +use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Facades\Hash; @@ -10,10 +11,13 @@ class UserFactory extends Factory { public function definition(): array { + $username = $this->faker->unique()->regexify('[A-Za-z0-9]{8}'); + return [ 'email' => $this->faker->unique()->safeEmail(), - 'username' => fake()->unique()->regexify('[A-Za-z0-9]{8}'), + 'username' => $username, 'password' => Hash::make(config('myconfig.password_default')), + 'referral_code' => generateReferralCode($username, User::max('id') + 1), 'status' => $this->faker->randomElement(UserStatus::cases()), ]; } diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php index 4ef026a..0788000 100644 --- a/database/migrations/0001_01_01_000000_create_users_table.php +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -17,6 +17,7 @@ public function up(): void $table->string('email', 100)->unique(); $table->string('username', 20)->unique(); $table->string('password', 97); + $table->string('referral_code', 20)->unique(); $table->enum('status', [UserStatus::values()])->default(UserStatus::ACTIVE)->comment(UserStatus::comment()); $table->timestamp('last_login_at')->nullable(); $table->timestamp('last_password_change_at')->nullable(); diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php index 9dad871..6ec60c3 100644 --- a/database/seeders/UserSeeder.php +++ b/database/seeders/UserSeeder.php @@ -17,6 +17,7 @@ public function run(): void 'email' => 'project.pangestuyoga@gmail.com', 'username' => 'pangestu', 'password' => Hash::make(config('myconfig.password_default')), + 'referral_code' => generateReferralCode('pangestu', 1), ]); Employee::create([ diff --git a/tests/Feature/Livewire/Studio/Master/User/CreateTest.php b/tests/Feature/Livewire/Studio/Master/User/CreateTest.php index e76dcdc..204d847 100644 --- a/tests/Feature/Livewire/Studio/Master/User/CreateTest.php +++ b/tests/Feature/Livewire/Studio/Master/User/CreateTest.php @@ -26,6 +26,7 @@ ->set('form.full_name', $data['full_name']) ->set('form.username', $data['username']) ->set('form.email', $data['email']) + ->set('form.referral_code', $data['referral_code']) ->set('form.phone_number', $data['phone_number']) ->set('form.base_salary', $data['base_salary']) ->set('form.birthdate', $data['birthdate']) diff --git a/tests/Feature/Livewire/Studio/Master/User/EditTest.php b/tests/Feature/Livewire/Studio/Master/User/EditTest.php index f85d93f..c1ff764 100644 --- a/tests/Feature/Livewire/Studio/Master/User/EditTest.php +++ b/tests/Feature/Livewire/Studio/Master/User/EditTest.php @@ -33,6 +33,7 @@ ->set('form.full_name', $data['full_name']) ->set('form.username', $data['username']) ->set('form.email', $data['email']) + ->set('form.referral_code', $data['referral_code']) ->set('form.phone_number', $data['phone_number']) ->set('form.base_salary', $data['base_salary']) ->set('form.birthdate', $data['birthdate'])