['required', 'email', 'max:100', Rule::unique('users', 'email')], 'username' => ['required', 'alpha_num', 'min:5', 'max:20', Rule::unique('users', 'username')], 'password' => [ 'required', 'string', 'min:8', Password::min(8)->letters()->mixedCase() ->numbers() ->symbols() ->uncompromised(), ], ]; } public function rulesStep2(): array { return [ 'name' => ['required', 'string', 'max:50'], 'phone_number' => ['required', 'string', new PhoneNumber, Rule::unique('customers', 'phone_number')], 'gender' => ['required', Rule::in(Gender::values())], 'referral_code' => ['nullable', 'string', Rule::exists('referral_codes', 'code')], ]; } public function validateStep1(): void { $this->validate($this->rulesStep1()); } public function validateStep2(): void { $this->validate($this->rulesStep2()); } public function validateAll(): void { $this->validate(array_merge( $this->rulesStep1(), $this->rulesStep2() )); } public function validationAttributes(): array { return [ 'username' => 'nama pengguna', 'password' => 'kata sandi', 'name' => 'nama', 'phone_number' => 'nomor telepon', 'gender' => 'jenis kelamin', ]; } public function auth(): ?string { $this->validateAll(); $tier = Tier::orderBy('min_spending')->first(); $maxUser = User::max('id') + 1; $referralCode = ReferralCode::where('code', $this->referral_code)->first(); $user = null; try { DB::transaction(function () use ($tier, $maxUser, $referralCode, &$user): void { $user = User::create([ 'email' => $this->email, 'username' => $this->username, 'password' => Hash::make($this->password), 'status' => UserStatus::ACTIVE, ]); Customer::create([ 'user_id' => $user->id, 'name' => $this->name, 'phone_number' => $this->phone_number, 'gender' => $this->gender, ]); Membership::create([ 'user_id' => $user->id, 'tier_id' => $tier->id, 'reward_points' => 10, ]); ReferralCode::create([ 'user_id' => $user->id, 'code' => generateReferralCode($this->username, $maxUser), ]); if ($this->referral_code) { ReferralUsage::create([ 'user_id' => $user->id, 'referral_code_id' => $referralCode->id, ]); $referralCode->increment('uses_count'); } PointRecord::create([ 'user_id' => $user->id, 'description' => 'Pendaftaran', 'change' => 10, 'is_addition' => true, 'type' => PointRecordType::TIER, ]); $user->assignRole('Customer'); Auth::login($user); $user->sendEmailVerificationNotification(); }); return $this->name; } catch (\Exception $e) { Log::error('Registration Error: '.$e->getMessage(), [ 'trace' => $e->getTraceAsString(), 'email' => $this->email, 'username' => $this->username, ]); return null; } } }