Current File : /home/tradevaly/text.tradevaly.com.bd/app/Http/Controllers/SubscriptionController.php
<?php

namespace App\Http\Controllers;

use App\Models\AdvertiserOrder;
use App\Models\Company;
use App\Models\Country;
use App\Models\Income;
use App\Models\Package;
use App\Models\PackageFeature;
use App\Models\Page;
use App\Models\Subscriber;
use App\Models\Transaction;
use App\Models\User;
use Brian2694\Toastr\Facades\Toastr;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Session;
use shurjopayv2\ShurjopayLaravelPackage8\Http\Controllers\ShurjopayController;
use Stripe;


class SubscriptionController extends Controller
{

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Contracts\Support\Renderable
     */

    public function buy(Request $request, $slug)
    {
        $package = Package::where('slug', $slug)->first();
        return view('stripe', compact('package'));
    }


    public function apply(Request $request, $slug)
    {

        $pages = Page::where('slug', 'apply')->firstOrFail();
        $package = Package::where('slug', $slug)->first();
        $features = PackageFeature::where('package_id', $package->id)->where('value', 1)->get();
        return view('frontend.pages.applypackage', compact('package', 'pages', 'features'));
    }


    public function register(Request $request, $id)
    {

        $name = '';
        $email = '';
        $phone = '';

        if (!Auth::check()) {
            $request->validate([
                'name' => 'required',
                'email' => 'required',
                'username' => 'required',
                'company_name' => 'required',
                'ccountry_id' => 'required',
                'phone' => 'required',
                'password' => 'required',
                'company_type' => 'required',
                'g-recaptcha-response' => 'required',
            ]);

            $name = $request->name;
            $email = $request->email;
            $phone = $request->phone;
            $username = $request->username;
            $type = $request->type;
            $country_id = $request->ccountry_id;
            $category_id = $request->company_type;
        }
        if (Auth::check()) {
            $name = Auth::user()->name;
            $email = Auth::user()->email;
            $phone = Auth::user()->company->phone;
            $username = Auth::user()->username;
            $type = Auth::user()->type;
            $country_id = Auth::user()->country_id;
            $category_id = Auth::user()->company_type;
            $user_id = Auth::id();
        }

        $currency = 'usd';
        $total_amount = 0;
        if (User::where('email', $request->email)->first() != null) {
            Toastr::error('Email Already Exists', '', ['progressBar' => true, 'closeButton' => true, 'positionClass' => 'toast-top-right']);
            return redirect()->back();
        }
        if (User::where('username', $request->username)->first() != null) {
            Toastr::error('Username Already Exists', '', ['progressBar' => true, 'closeButton' => true, 'positionClass' => 'toast-top-right']);
            return redirect()->back();
        }

        $package = Package::where('id', $id)->first();


        // extra working
        $order_id = $request->company_type . rand(99999, 9999);

        $main_price = $package->price;
        $discount_price = 0;
        $main_price_usd = 0;

        $disc_percent = $package->discount;
        if ($package->discount) {
            $discount_price = $package->price / 100 * $package->discount;
            //   $main_price = $package->price;
            //   $main_price_usd = $package->price;
            $main_price = $package->price - $discount_price;
            $main_price_usd = $package->price - $discount_price;
        }
        if ($request->currency == 'BDT') {
            $currency = 'BDT';
            $main_price = $main_price * settings()->bdt_rate;

        }
        if (!Auth::check()) {
            $user = new User();
            $user->name = $request->name;
            $user->email = $request->email;
            $user->username = $request->username;
            $user->type = $request->type;
            $user->image = 'image.jpg';
            $user->password = bcrypt($request->password);
            $user->country_id = $request->ccountry_id;
            $user->category_id = $request->company_type;
            $user->package_id = $id;
            $user->next_pay = date('Y-m-d', strtotime("+25000 days"));
            $user->save();
            $user_id = $user->id;

            $company = new Company();
            $company->user_id = $user_id;
            $company->name = $name;
            $company->type = $type;
            $company->main_products = $request->main_products;
            $company->image = 'image.jpg';
            $company->phone = $phone;
            $company->save();
        }
        // if($user->save()){

        $subscriber = new Subscriber();
        $subscriber->order_id = $order_id;
        $subscriber->user_id = $user_id;
        $subscriber->package_id = $id;
        $subscriber->date = date('Y-m-d');;
        $subscriber->amount = $main_price_usd;
        $subscriber->payment_status = 'unpaid';
        $subscriber->currency = $currency;
        $subscriber->status = 'pending';

        if ($subscriber->save()) {
            // $income = Income::where('id', $income->id)->first();
            // dd($currency,number_format($main_price));
            // dd(number_format($main_price));
            // dd($main_price);
            $info = array(
                'currency' => 'BDT',
                'amount' => intval($main_price),
                'order_id' => $order_id,
                'discsount_amount' => 0,
                'disc_percent' => 0,
                'client_ip' => 'N\L',
                'customer_name' => $name,
                'customer_phone' => $phone,
                'email' => $email,
                'customer_address' => "N\L",
                'customer_city' => "N/L",
                'customer_state' => "N/L",
                'customer_postcode' => "N/L",
                'customer_country' => Country::find($country_id)->name
            );
            $order = [
                'order_id' => $subscriber->order_id,
                'order_for' => 'subscription',
                'package_id' => $id,
                'user_id' => $user_id,
            ];
            session(['orderInfo' => $order]);
            $shurjopay_service = new ShurjopayController();
            return $shurjopay_service->checkout($info);
        }
        // }
        return back();
    }


    public function stripePost(Request $request, $slug)
    {
        $amount = 0;
        $package = Income::where('id', $slug)->firstorFail();
        if ($package != null) {
            $amount = round($package->amount * 100);
        }
        Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
        $session = \Stripe\Checkout\Session::create([
            'payment_method_types' => ['card'],
            'line_items' => [
                [
                    'price_data' => [
                        'currency' => 'usd',
                        'product_data' => [
                            'name' => "Payment"
                        ],
                        'unit_amount' => $amount,
                    ],
                    'quantity' => 1,
                ]
            ],
            'mode' => 'payment',
            'success_url' => '' . route('stripe.success', $package->id) . '?session_id={CHECKOUT_SESSION_ID}',
            'cancel_url' => route('packages'),
        ]);
        $package->session = $session->id;
        if ($package->save()) {
            return response()->json(['id' => $session->id, 'status' => 200]);
        }

    }

    public function advertiserstripePost(Request $request, $slug)
    {
        $amount = 0;
        $advertiser = AdvertiserOrder::where('id', $slug)->firstorFail();

        $amount = $advertiser->amount;
        Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
        $session = \Stripe\Checkout\Session::create([
            'payment_method_types' => ['card'],
            'line_items' => [
                [
                    'price_data' => [
                        'currency' => 'usd',
                        'product_data' => [
                            'name' => "Payment"
                        ],
                        'unit_amount' => $amount,
                    ],
                    'quantity' => 1,
                ]
            ],
            'mode' => 'payment',
            'success_url' => '' . route('advertiser.stripe.success', $advertiser->id) . '?session_id={CHECKOUT_SESSION_ID}',
            'cancel_url' => route('packages'),
        ]);
        $advertiser->session = $session->ID;
        if ($advertiser->save()) {
            return response()->json(['id' => $session->id, 'status' => 200]);
        }

    }

    public function stripe_success(Request $request, $id)
    {
        //Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
        //$session = \Stripe\Checkout\Session::retrieve($request->session_id);
        //$paymentIntent = \Stripe\PaymentIntent::retrieve($session->payment_intent);
        //$customer = \Stripe\Customer::retrieve($session->customer);

        // return $paymentIntent;
        $income = Income::where('id', $id)->first();
        $income->status = 1;
        if ($income->save()) {
            $user = User::find($income->user->id);
            $user->next_pay = date('Y-m-d', strtotime("+365 days"));
            if ($user->save()) {
                Auth::loginUsingId($user->id);
                Toastr::success('Registration Successfull', '', ['progressBar' => true, 'closeButton' => true, 'positionClass' => 'toast-top-right']);
                return redirect()->route('user.dashboard');
            }
        }
        return view('frontend.pages.subscribe', compact('income'));
    }

    public function package()
    {
        $data['pages'] = Page::where('slug', 'subscription')->firstOrFail();
        $data['packages'] = Package::where('status', 1)->orderBy('id', 'desc')->latest()->get();
        return view('frontend.pages.package')->with($data);
    }

    public function payment_success(Request $request)
    {
        $tras_id = trim($request->order_id);
        $orderInfo = session('orderInfo');
        // get payment information
        $spayprocess = new SpayPaymentProccess();
        $response_data = json_decode($spayprocess->decrypt_and_validate($tras_id));
        $payment = array_shift($response_data);

        $transaction = new Transaction();

        $transaction->order_id = $orderInfo['order_id'];
        $transaction->discount_amount = $payment->discsount_amount;
        $transaction->total_amount = $payment->received_amount;
        $transaction->transaction_id = $tras_id;
        $transaction->payment_method = $payment->method;
        $transaction->payment_status = 'paid';
        $transaction->payment_type = 'online';

        if ($orderInfo['order_for'] == 'advertiser'){
            $order = AdvertiserOrder::where('order_id', $orderInfo['order_id'])->first();
            if ($payment->sp_code == 1000){
                $order->status = 'success';
                $order->payment_status = 'paid';
                $transaction->order_from = 'advertiser';
                Toastr::success('Payment Successful', '', ['progressBar' => true, 'closeButton' => true, 'positionClass' => 'toast-top-right']);
                $redirect_to = route('user.my.buy.advertiser.money_receipt',$order->id);
            }else{
                $order->status = 'pending';
                $order->payment_status = 'failed';
                Toastr::error('Payment Failed', '', ['progressBar' => true, 'closeButton' => true, 'positionClass' => 'toast-top-right']);
            }
            $order->save();
            $transaction->save();
        }else if ($orderInfo['order_for'] == 'subscription'){
            if (!Auth::check()){
                $user = User::find($orderInfo['user_id']);
                $redirect_to = route('submit.register');
            }else{
                $user = Auth::guard('web')->user();
                $redirect_to = route('user.subs');
            }
            $user->package_id = $orderInfo['package_id'];
            $user->save();
            $subscription = Subscriber::where('order_id',$orderInfo['order_id'])->first();
            $subscription->status = 'success';
            $subscription->payment_status = 'paid';
            $subscription->save();

            $transaction->order_from = $orderInfo['order_for'];
            $transaction->save();
            Toastr::success('Your subscription has been successfully upgraded', '', ['progressBar' => true, 'closeButton' => true, 'positionClass' => 'toast-top-right']);
        }
        return redirect($redirect_to);
    }

    public function payment_cancel(Request $request, $id)
    {
        return $request;
    }

}