validate([ 'phone' => ['required', 'regex:/^\+993 [67]\d \d{2} \d{2} \d{2}$/'] ], [ 'phone.regex' => 'The phone number must be in the format: +993 KX XX XX XX (where K is 6 or 7).' ]); $phone = $request->phone; // Generate a 4-digit OTP $otp = (string) rand(1000, 9999); // Log it to simulate SMS Log::info("OTP for {$phone} is {$otp}"); // Store in DB PhoneVerification::updateOrCreate( ['phone' => $phone], [ 'otp' => $otp, 'expires_at' => now()->addMinutes(10), 'verified' => false ] ); // Store phone in session for the next step session()->put('verify_phone', $phone); return redirect()->route('verification.verify.form'); } public function verifyForm() { if (!session()->has('verify_phone')) { return redirect()->route('verification.index'); } return view('verification.verify', [ 'phone' => session()->get('verify_phone') ]); } public function verifyOtp(Request $request) { $request->validate([ 'phone' => 'required', 'otp' => 'required|digits:4' ]); $verification = PhoneVerification::query()->where('phone', $request->phone)->first(); if (!$verification || $verification->otp !== $request->otp) { return back()->withErrors(['otp' => 'Invalid OTP.']); } if ($verification->expires_at < now()) { return back()->withErrors(['otp' => 'OTP has expired.']); } // Mark as verified $verification->update(['verified' => true]); // Generate or get Coupon $coupon = Coupon::firstOrCreate( ['phone' => $request->phone], ['code' => $this->generateCouponCode()] ); // Put coupon code in session for the congratulations page session()->put('coupon_code', $coupon->code); // Clear phone from session as verification is complete session()->forget('verify_phone'); return redirect()->route('verification.congratulations'); } public function congratulations() { if (!session()->has('coupon_code')) { return redirect()->route('verification.index'); } return view('verification.congratulations', [ 'code' => session()->get('coupon_code') ]); } private function generateCouponCode() { // Format X_YYYY (X is integer, Y is capital char) $x = rand(1, 9); $yyyy = substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 4); return "{$x}_{$yyyy}"; } }