['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], 'gender' => ['required', Rule::in(Gender::values())], 'referral_code' => ['nullable', 'string', Rule::exists('referral_codes', 'code')], ]; } public function validateStep1() { $this->validate($this->rulesStep1()); } public function validateStep2() { $this->validate($this->rulesStep2()); } public function validateAll() { $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() { $this->validateAll(); $tier = Tier::orderBy('min_points')->first(); $maxUser = User::max('id') + 1; $referralCode = ReferralCode::where('code', $this->referral_code)->first(); DB::transaction(function () use ($tier, $maxUser, $referralCode) { $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, 'tier_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, ]); auth()->login($user); $user->assignRole('Customer'); $user->sendEmailVerificationNotification(); }); } }