voucherRepository = $voucherRepository; } public function check($request) { $phone = $request->phone; $email = $request->email; if ($email) { return $this->findUserByEmail($email); } return $this->findUserByPhone($phone); } function generateUniqueOtp() { if (config('app.env') == 'local'){ return 123456; } do { $otp = rand(100000, 999999); } while (UserOtp::where('otp', $otp)->where("expired_at",">", Carbon::now())->exists()); return $otp; } private function findUserByPhone($phone){ $phone = trim($phone); $phone = substr($phone,0,1) == "0" ? "62".substr($phone,1,strlen($phone)):$phone; $phone = preg_replace("/[^0-9]/", "",$phone); $phone_with_zero = "0" . substr($phone,2,strlen($phone)); $affliator = Affiliator::where('phone', $phone)->orWhere('phone', $phone_with_zero)->first(); $customer = Customer::where('phone', $phone)->orWhere('phone', $phone_with_zero)->first(); $user = $affliator ? $affliator->user : @$customer->user; return $user; } private function findUserByEmail($email) { $email = trim($email); $affliator = Affiliator::where('email', $email)->first(); $customer = Customer::where('email', $email)->first(); $user = $affliator ? $affliator->user : @$customer->user; return $user; } public function findCustomerByEmail($email) { $email = trim($email); $customer = Customer::where('email', $email)->first(); return $customer; } public function findCustomerById($id){ $customer = Customer::where('id', $id)->first(); return $customer; } public function findUserById($id){ $user = User::where('id', $id)->first(); return $user; } public function waOtp($data) { $nextHour = Carbon::now()->addHour(1); // $user = $this->findUserByPhone($data["phone"]); $phone = $data['phone']; $otp = $this->generateUniqueOtp(); $otp = UserOtp::create([ 'otp'=> $otp, 'expired_at'=> $nextHour, 'user_identity'=> $phone, ]); return $otp; } public function waOtpConfirm($data) { // $user = $this->findUserByPhone($data["phone"]); $phone = $data['phone']; if ($phone != "081111111111"){ $otp = UserOtp::where('otp', $data['otp']) ->where("expired_at",">", Carbon::now()) ->where('user_identity', $phone) ->orderBy('id','desc') ->first(); if ($otp == null){ throw ValidationException::withMessages([ "otp" => "Kode otp tidak valid!" ]); } } return $data; } public function emailOtp($data) { $nextHour = Carbon::now()->addHour(1); $email = $data['email']; $otp = $this->generateUniqueOtp(); $otp = UserOtp::create([ 'otp'=> $otp, 'expired_at'=> $nextHour, 'user_identity'=> $email, ]); return $otp; } public function emailOtpConfirm($data) { // $user = $this->findUserByEmail($data["email"]); $email = $data['email']; $otp = UserOtp::where('otp', $data['otp']) ->where("expired_at",">", Carbon::now()) ->where('user_identity', $email) ->orderBy('id','desc') ->first(); if ($otp == null){ throw ValidationException::withMessages([ "otp" => "Kode otp tidak valid!" ]); } return $data; } public function getAuth($data) { $user_id = $data["user_id"] ?? null; $phone = $data["phone"] ?? null; $email = $data["email"] ?? null; $token = $data["token"] ?? null; $user = null; $customer = null; try{ if ($user_id != null){ $user = $this->findUserById($user_id); }else if ($phone != null) { $user = $this->findUserByPhone($data["phone"]); } else if ($email != null) { $user = $this->findUserByEmail($data["email"]); } if ($user != null) { $user->fill([ "fcm_token" => @$data["fcm_token"] ]); $user->save(); $token = $user->createToken("pos"); $customer = Customer::where("user_id", $user->id)->first(); if (!@$customer->verified_at){ $customer->verified_at = Carbon::now(); $customer->save(); } $device = @$data["device"] ?? "default"; $userDevice = UserDevice::where('user_id', $user->id) ->where("device", $device) ->firstOrNew(); $userDevice->fill([ "user_id" => $user->id, "ip_address" => request()->ip(), "user_agent" => request()->userAgent(), "last_login_at" => Carbon::now(), "fcm_token" =>@$data["fcm_token"], "device" => $device ]); $userDevice->save(); } }catch(Exception $e){ } return [ "user" => $user, "token" => $token, "affiliator" => $user != null ? Affiliator::where("user_id", $user->id)->first() : null, "customer" => $customer, ]; } public function otpByUserId($user_id) { $nextHour = Carbon::now()->addHour(1); $user = $this->findUserById($user_id); if ($user == null){ throw ValidationException::withMessages([ "email" => "Email tidak terdaftar" ]); } $otp = $this->generateUniqueOtp(); $otp = UserOtp::create([ 'otp'=> $otp, 'expired_at'=> $nextHour, 'user_id'=> $user->id, ]); return $otp; } public function otpConfirmByUserId($user_id, $otp) { $user = $this->findUserById($user_id); $otp = UserOtp::where('otp', $otp) ->where("expired_at",">", Carbon::now()) ->where('user_id', $user->id) ->first(); if ($otp == null){ throw ValidationException::withMessages([ "otp" => "Kode otp tidak valid!" ]); } return true; } public function register($data) { $user = $this->findUserByPhone($data["phone"]); Log::info(["check user" => (array) $user]); if ($user){ throw ValidationException::withMessages([ "phone" => "Nomor telepon sudah terdaftar" ]); } $phone = $data["phone"]; $phone = trim($phone); $phone = substr($phone,0,1) == "0" ? "62".substr($phone,1,strlen($phone)):$phone; $phone = preg_replace("/[^0-9]/", "",$phone); $phone_with_zero = "0" . substr($phone,2,strlen($phone)); $customer = Customer::where('phone', $phone)->orWhere('phone',$phone_with_zero)->first(); Log::info(["check customer" => (array) $customer]); $email = $data["email"]; if ($email){ $email = trim($email); $email = strtolower($email); $check_email = Customer::where('email', $email)->first(); if ($check_email){ throw ValidationException::withMessages([ "email" => "Email sudah terdaftar" ]); } } try { DB::beginTransaction(); $role = Role::where("name","CUSTOMER")->firstOrCreate([ "name" => "CUSTOMER" ]); if ($customer == null){ $autoNumbering = new AutoNumbering([ "type" => "CUST", "prefix" => "CAPP", "location_id" => 0, "pad" => 9 ]); do{ $number = $autoNumbering->getCurrent(); $count = Customer::where("number",$number)->count(); }while($count > 0); $customer = Customer::create([ 'number' => $number, 'name' => $data['name'], 'phone' => $data['phone'], 'email' => $data['email'] ?? null, 'referal' => $data['referral'] ?? null, 'company' => 'AGI', 'gender' => @$data['gender'], 'date_of_birth' => @$data['date_of_birth'], 'created_at' => now(), 'updated_at' => now() ]); $user = User::create([ 'name'=> $customer->name, 'email'=> $customer->number."@customer.asiagolf.id", 'password'=> "", 'role_id'=> $role->id, ]); if (config('feature.voucher_new_member')){ $voucherEvent = VoucherEvent::where("referral","ilike", "NEW_USER")->first(); if ($voucherEvent){ $this->voucherRepository->createVoucher($voucherEvent, $customer, $user, "FREE VOUCHER NEW USER", Carbon::now()->addDay(7)->endOfDay(), 400000); } } if (@$data['referral']){ $voucherEvent = VoucherEvent::where("referral","ilike", @$data['referral'])->first(); if ($voucherEvent){ $this->voucherRepository->createVoucher($voucherEvent, $customer, $user, "FREE VOUCHER REFERAL", Carbon::now()->addMonth(3)->endOfDay(), 300000); } } $customer->user_id = $user->id; $customer->save(); }else{ $customer->fill([ 'name' => $data['name'], 'phone' => $data['phone'], 'referal' => $data['referal'] ?? null, 'email' => $data['email'] ?? null, 'company' => 'AGI', 'gender' => @$data['gender'], 'date_of_birth' => @$data['date_of_birth'], 'created_at' => now(), 'updated_at' => now() ]); $user = User::find($customer->user_id); if ($user == null){ $user = User::create([ 'name'=> $customer->name, 'email'=> $customer->number."@customer.asiagolf.id", 'password'=> "", 'role_id'=> $role->id, ]); $customer->user_id = $user->id; if (config('feature.voucher_new_member')){ $voucherEvent = VoucherEvent::where("referral","ilike", "NEW_USER")->first(); if ($voucherEvent){ $this->voucherRepository->createVoucher($voucherEvent, $customer, $user, "FREE VOUCHER NEW USER", Carbon::now()->addDay(7)->endOfDay(), 400000); } } } $customer->save(); } DB::commit(); return $customer; } catch (\Exception $e) { DB::rollback(); throw $e; } } }