KGRKJGETMRETU895U-589TY5MIGM5JGB5SDFESFREWTGR54TY
Server : Apache/2.4.41 (Ubuntu)
System : Linux vmi1525618.contaboserver.net 5.4.0-105-generic #119-Ubuntu SMP Mon Mar 7 18:49:24 UTC 2022 x86_64
User : www-data ( 33)
PHP Version : 8.2.12
Disable Function : NONE
Directory :  /var/www/parassaas.edukrypt.in/app/Http/Controllers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //var/www/parassaas.edukrypt.in/app/Http/Controllers/CheckoutController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Redirect;
use Illuminate\Http\Request;
use App\Models\Address;
use App\Models\Product;
use App\Models\Price;
use App\Models\Global_setting;
use App\Models\Billing;
use App\Models\Orderproductgroup;
use App\Models\Webhook;
use App\Models\User;
use App\Mail\InvoiceIn;
use App\Helpers\Frontend;
use Illuminate\Support\Facades\DB;
use App\Models\Email_log;
use Illuminate\Contracts\Session\Session;
use Postal;

class CheckoutController extends Controller
{

    // Checkout Page
    public function checkout(Request $request)
    {
        $admin_id = 2;
        $user_unique_id = $request->session()->get('login_data')['user_unique_id'];
        $data['title'] = 'Checkout';
        $data['frontMenu'] = 'home';
        $data['cartValue'] = session()->get('cart');
        $data['user']  = User::where(['user_unique_id' => $user_unique_id])->first();
        $data['address']  = Address::where(['user_unique_id' => $user_unique_id])->first();

        return view('checkout', $data);
    }

    // Final Payment End Page
    public function checkout_end(Request $request)
    {
        $admin_id = 2;
        $user_unique_id = $request->session()->get('login_data')['user_unique_id'];
        $data['title'] = 'Checkout';
        $data['frontMenu'] = 'home';
        $data['cartValue'] = session()->get('cart');
        $data['user']  = User::where(['user_unique_id' => $user_unique_id])->first();
        // Check in biiling
        $_payment_request_id = $request->_payment_request_id;
        if (!empty($_payment_request_id)) {
            $data['billingData'] = DB::table('billings')->where(['payment_request_id' => $_payment_request_id])->orderBy('id', 'DESC')->first();
        }

        // Make Cart Empty
        Frontend::makeCartEmpty();
        return view('checkout_end', $data);
    }



    // Checkout page
    public function proceedToPayment(Request $request)
    {

        $user_unique_id = $request->session()->get('login_data')['user_unique_id'];

        $request->validate([
            'address' => 'required',
            'city' => 'required',
            'state' => 'required',
            'country' => 'required',
            'pincode' => 'required',
        ]);

        $data = array(
            'user_unique_id' => $user_unique_id,
            'address' => $request->address,
            'city' => $request->city,
            'state' => $request->state,
            'country' => $request->country,
            'pincode' => $request->pincode
        );

        $User = User::where(['user_unique_id' => $user_unique_id])->first();
        $checkUser = Address::where(['user_unique_id' => $user_unique_id])->first();
        if (empty($checkUser)) {
            Address::create($data);
        } else {
            Address::where(['user_unique_id' => $user_unique_id])->update($data);
        }

        // calculate total payemnt
        $grandTotal = 0;
        $mrpTotal = 0;
        $couponApplyName = "";
        $carts = session()->get('cart');
        if (count($carts) > 0) {
            foreach ($carts as $cart) {
                $priceAfterdiscount = ($cart['price'] * $cart['discount_percnt']) / 100;
                $chooseDiscountPrice = ($cart['max_discount'] > $priceAfterdiscount) ? $cart['max_discount'] : $priceAfterdiscount;
                $finalProductPrice = round($cart['price'] - $chooseDiscountPrice);

                if ($cart['coupon_apply_status'] == 'yes') {
                    $finalProductPrice = $finalProductPrice - $cart['coupon_discount_amount'];
                    $couponApplyStatus = "yes";
                    $couponApplyName = $cart['coupon_name'];
                }
                $grandTotal += $finalProductPrice;
                $mrpTotal += $cart['price'];
                if ($mrpTotal > 0)
                    $discountPercent = round(((($mrpTotal - $grandTotal) / $mrpTotal) * 100));
            }
        }

        $InstapayLoad = array(
            'name' => $User->name,
            'phone' => $User->phone,
            'email' => $User->email,
            'user_unique_id' => $User->user_unique_id,
            'address' => $request->address,
            'city' => $request->city,
            'state' => $request->state,
            'country' => $request->country,
            'pincode' => $request->pincode,
            'payment' => $grandTotal
        );


        // Paid Tax Invoice
        if ($grandTotal > 10) {
            $paymentRequest = $this->instaMojoPaymentinitialize($InstapayLoad);
            if ($paymentRequest->success) {
                $flag = $this->orderProductCalculation($carts, $InstapayLoad, $paymentRequest);
                if ($flag) {
                    return Redirect::to($paymentRequest->payment_request->longurl);
                }
                return back()->with('error', 'Something Went Wrong, Please try again');
            }
        }
        // Free Zero Amount Payment
        else if ($grandTotal == 0) {
            $payment_request_id = md5(uniqid());
            $flag = $this->free_orderProductCalculation($carts, $InstapayLoad, $payment_request_id);
            if ($flag) {
                return redirect('complete-payment?payment_request_id=' . $payment_request_id);
            }
        }

        // less then 10 rupees
        return back()->with('error', 'Shopping cart amount must be greater then 10.');
    }

    // Free Create billing tb & Order Product GP entry 
    public function free_orderProductCalculation($carts, $InstapayLoad, $payment_request_id)
    {
        $admin_id = '2';
        $_billing_data = array();
        $_order_product_array = array();
        // Website Info
        $webInfo = Frontend::getWebsiteInfo($admin_id);
        // dd($webInfo);
        if (empty($webInfo)) {
            return back()->with('error', 'Website information is missing!');
        }
        $_invoice_prefix = (!empty($webInfo->invoice_prefix) ? $webInfo->invoice_prefix : "");
        $_bill_type = ($InstapayLoad['state'] == $webInfo->site_state) ? 'in' : 'out';
        $_tax_percentage = $webInfo->site_tax_percentage;
        $_order_type = $InstapayLoad['payment'] > 0 ? 'paid' : 'free';
        $_transaction_id = $InstapayLoad['payment'] > 0 ? $_invoice_prefix : "FREE";
        $total_taxable_amount = 0;
        $total_tax = 0;
        $_cashback = 0;
        $_total_discount_amount = 0;
        $_promo_code = "";

        foreach ($carts as $cart) {

            // Product & Mode
            $product = Product::where(['id' => $cart['productId'], 'status' => '1'])->first();
            $mode = Price::where(['product_id' => $cart['productId'], 'id' => $cart['price_id']])->first();

            if (!empty($product) && !empty($mode)) {

                // Order Product Calculation
                $_days = $mode->duration;
                $_mode = $mode->mode;
                $_views = $mode->views;

                $priceAfterdiscount = ($cart['price'] * $cart['discount_percnt']) / 100;
                $chooseDiscountPrice = ($cart['max_discount'] > $priceAfterdiscount) ? $cart['max_discount'] : $priceAfterdiscount;
                $finalProductPrice = round($cart['price'] - $chooseDiscountPrice);

                $_total_discount_amount += $chooseDiscountPrice;

                if ($cart['coupon_apply_status'] == 'yes') {
                    $finalProductPrice = $finalProductPrice - $cart['coupon_discount_amount'];
                    $_promo_code = $cart['coupon_name'];
                    $_total_discount_amount += $cart['coupon_discount_amount'];
                    $chooseDiscountPrice = $chooseDiscountPrice + $cart['coupon_discount_amount'];
                }

                $timestamp = date('Y-m-d');
                $expires = strtotime('+' . $_days . ' days', strtotime($timestamp));
                $expire_date = date('Y-m-d', $expires);
                $_tax_amount = 0;
                $_taxable_amount = 0;

                if ($finalProductPrice > 0) {
                    $_taxable_amount = round((($finalProductPrice * 100) / (100 + $_tax_percentage)));
                    $total_taxable_amount += $_taxable_amount;
                    $_tax_amount = round($finalProductPrice - $_taxable_amount);
                    $total_tax += $_tax_amount;
                }

                // Order Product Array
                $order_product_group = array(
                    'product_id'        => $cart['productId'],
                    'quantity'          => 1,
                    'promo_code'        => $cart['coupon_name'],
                    'user_unique_id'    => $InstapayLoad['user_unique_id'],
                    'billing_id'        => "",
                    'tax_invoice_no'    => null,
                    'tax_amount'        => $_tax_amount,
                    'taxable_amount'    => $_taxable_amount,
                    'total_amount'      => $finalProductPrice,
                    'discount'          => $chooseDiscountPrice,
                    'cashback'          => $_cashback,
                    'product_mode'      => $_mode,
                    'product_type'      => $product->type,
                    'product_name'      => $product->name,
                    'days'              => $_days,
                    'views'             => $_views,
                    'start_date'        => date('Y-m-d'),
                    'expire_date'       => $expire_date,
                    'updgrade'          => 'new',
                    'expired'           => '0',
                    'created_at'        => date('Y-m-d H:i:s'),
                );

                array_push($_order_product_array, $order_product_group);
            }
        }

        // Billing Details
        $_billing_data = array(
            'admin_id' => $admin_id,
            'payment_request_id' => $payment_request_id,
            'transaction_id' => ($_transaction_id . uniqid()),
            'tax_invoice_no' => null,
            'serial_no' => 0,
            'user_unique_id' => $InstapayLoad['user_unique_id'],
            'quantity' => 1,
            'taxable_amount' => round($total_taxable_amount),
            'tax_amount' => round($total_tax),
            'total_amount' => $InstapayLoad['payment'],
            'payment_status' => 'Pending',
            'instrument_type' => "Frontend",
            'place_of_supply' => $InstapayLoad['state'],
            'bill_type' => $_bill_type,
            'order_type' => $_order_type,
            'promo_code' => $_promo_code,
            'cashback' => 0,
            'discount' => 0,
            'use_wallet' => 'no',
            'long_url' => null,
            'tracking_no' => null,
            'tracking_status' => null,
            'created_at' => date('Y-m-d H:i:s'),
        );

        $res_billing = Billing::create($_billing_data);
        $billing_id =  $res_billing->id;
        $flag = false;
        foreach ($_order_product_array as $orderProduct) {
            $orderProduct['billing_id'] = $billing_id;
            $result = Orderproductgroup::create($orderProduct);
            $flag = true;
        }
        return $flag;
    }


    // Paid Create billing tb & Order Product GP entry
    public function orderProductCalculation($carts, $InstapayLoad, $paymentRequest)
    {
        $admin_id = '2';
        $_billing_data = array();
        $_order_product_array = array();
        // Website Info
        $webInfo = Frontend::getWebsiteInfo($admin_id);
        // dd($webInfo);
        if (empty($webInfo)) {
            return back()->with('error', 'Website information is missing!');
        }
        $_invoice_prefix = (!empty($webInfo->invoice_prefix) ? $webInfo->invoice_prefix : "");
        $_bill_type = ($InstapayLoad['state'] == $webInfo->site_state) ? 'in' : 'out';
        $_tax_percentage = $webInfo->site_tax_percentage;

        $_serialNo = Frontend::getInvoiceSerialNo($admin_id);
        $_financialYear = Frontend::getCurrentFinancialYear();
        $_bill_No = $_invoice_prefix . "/$_financialYear/$_serialNo";

        $_order_type = $InstapayLoad['payment'] > 0 ? 'paid' : 'free';
        $_serial_no = $InstapayLoad['payment'] > 0 ? $_serialNo : 0;
        $_tax_invoice_no = $InstapayLoad['payment'] > 0 ? $_bill_No : null;
        // $_transaction_id = $InstapayLoad['payment'] > 0 ? $_invoice_prefix : "FREE";
        $total_taxable_amount = 0;
        $total_tax = 0;
        $_cashback = 0;
        $_total_discount_amount = 0;
        $_promo_code = "";

        foreach ($carts as $cart) {
            // Product & Mode
            $product = Product::where(['id' => $cart['productId'], 'status' => '1'])->first();
            $mode = Price::where(['id' => $cart['price_id'], 'product_id' => $cart['productId']])->first();
            // dd($product);
            if (!empty($product) && !empty($mode)) {
                // Order Product Calculation
                $_days = $mode->duration;
                $_mode = $mode->mode;
                $_views = $mode->views;

                $priceAfterdiscount = ($cart['price'] * $cart['discount_percnt']) / 100;
                $chooseDiscountPrice = ($cart['max_discount'] > $priceAfterdiscount) ? $cart['max_discount'] : $priceAfterdiscount;
                $finalProductPrice = round($cart['price'] - $chooseDiscountPrice);

                $_total_discount_amount += $chooseDiscountPrice;

                if ($cart['coupon_apply_status'] == 'yes') {
                    $finalProductPrice = $finalProductPrice - $cart['coupon_discount_amount'];
                    $_promo_code = $cart['coupon_name'];
                    $_total_discount_amount += $cart['coupon_discount_amount'];
                    $chooseDiscountPrice = $chooseDiscountPrice + $cart['coupon_discount_amount'];
                }

                $timestamp = date('Y-m-d');
                $expires = strtotime('+' . $_days . ' days', strtotime($timestamp));
                $expire_date = date('Y-m-d', $expires);

                $_tax_amount = 0;
                $_taxable_amount = 0;

                if ($finalProductPrice > 0) {
                    $_taxable_amount = round((($finalProductPrice * 100) / (100 + $_tax_percentage)));
                    $total_taxable_amount += $_taxable_amount;
                    $_tax_amount = round($finalProductPrice - $_taxable_amount);
                    $total_tax += $_tax_amount;
                }

                // Order Product Array
                $order_product_group = array(
                    'product_id'        => $cart['productId'],
                    'quantity'          => 1,
                    'promo_code'        => $cart['coupon_name'],
                    'user_unique_id'    => $InstapayLoad['user_unique_id'],
                    'billing_id'        => "",
                    'tax_invoice_no'    => $_tax_invoice_no,
                    'tax_amount'        => $_tax_amount,
                    'taxable_amount'    => $_taxable_amount,
                    'total_amount'      => $finalProductPrice,
                    'discount'          => $chooseDiscountPrice,
                    'cashback'          => $_cashback,
                    'product_mode'      => $_mode,
                    'product_type'      => $product->type,
                    'product_name'      => $product->name,
                    'days'              => $_days,
                    'views'             => $_views,
                    'start_date'        => date('Y-m-d'),
                    'expire_date'       => $expire_date,
                    'updgrade'          => 'new',
                    'expired'           => '0',
                    'created_at'        => date('Y-m-d H:i:s'),
                );
                array_push($_order_product_array, $order_product_group);
            }
        }

        // Billing Details
        $_billing_data = array(
            'admin_id' => $admin_id,
            'payment_request_id' => $paymentRequest->payment_request->id,
            'transaction_id' => "",
            'tax_invoice_no' => $_tax_invoice_no,
            'serial_no' => $_serial_no,
            'user_unique_id' => $InstapayLoad['user_unique_id'],
            'quantity' => 1,
            'taxable_amount' => round($total_taxable_amount),
            'tax_amount' => round($total_tax),
            'total_amount' => $paymentRequest->payment_request->amount,
            'payment_status' => $paymentRequest->payment_request->status,
            'instrument_type' => "",
            'place_of_supply' => $InstapayLoad['state'],
            'bill_type' => $_bill_type,
            'order_type' => $_order_type,
            'promo_code' => $_promo_code,
            'cashback' => $_cashback,
            'discount' => $_total_discount_amount,
            'use_wallet' => 'no',
            'long_url' => $paymentRequest->payment_request->longurl,
            'tracking_no' => null,
            'tracking_status' => null,
            'created_at' => date('Y-m-d H:i:s'),
        );

        $res_billing = Billing::create($_billing_data);
        $billing_id =  $res_billing->id;
        $flag = false;
        foreach ($_order_product_array as $orderProduct) {
            $orderProduct['billing_id'] = $billing_id;
            $result = Orderproductgroup::create($orderProduct);
            $flag = true;
        }
        return $flag;
    }


    // Create Instamojo Payment Request
    public function instaMojoPaymentinitialize($request)
    {
        $ch = curl_init();
        //curl_setopt($ch, CURLOPT_URL, 'https://test.instamojo.com/api/1.1/payment-requests/');
        curl_setopt($ch, CURLOPT_URL, 'https://www.instamojo.com/api/1.1/payment-requests/');
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

        /** Live Credentials **/
        curl_setopt(
            $ch,
            CURLOPT_HTTPHEADER,
            array(
                "X-Api-Key:57c8e527ac3c79c9f11ba3112c1b2a3e",
                "X-Auth-Token:de93e12a0f3575d724a8ec8018ef1f65"
            )
        );

        /** Testing Credentials **/
        // curl_setopt(
            // $ch,
            // CURLOPT_HTTPHEADER,
            // array(
                // "X-Api-Key:f846fbab891a453152d0db09ceaf08c3",
                // "X-Auth-Token:1cae58b6c0d57b339fe4e1b1dffcb8e7"
            // )
        // );

        $payload = array(
            'purpose' => 'billing',
            'amount' => $request['payment'],
            'buyer_name' =>  $request['name'],
            'phone' =>  $request['phone'],
            'redirect_url' => asset('complete-payment'),
            'send_email' => true,
            //'webhook' => asset('/') . 'webhook/',
            'send_sms' => true,
            'email' =>  $request['email'],
            'allow_repeated_payments' => false
        );

        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payload));
        $response = curl_exec($ch);
        curl_close($ch);

        $res = json_decode($response);

        return $res;
    }


    // Get Payment Request Data
    public function instaMojoGetPaymentDetails($_payment_request_id)
    {

        $_DEV__URL  = "https://test.instamojo.com/api/1.1/payment-requests/" . $_payment_request_id;
        $_PROD__URL = "https://www.instamojo.com/api/1.1/payment-requests/" . $_payment_request_id;

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $_PROD__URL);
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

        curl_setopt(
            $ch,
            CURLOPT_HTTPHEADER,
            // Testing
            array(
                "X-Api-Key:57c8e527ac3c79c9f11ba3112c1b2a3e",
                "X-Auth-Token:de93e12a0f3575d724a8ec8018ef1f65"
            )
            // Live
            // array(
                // "X-Api-Key:f846fbab891a453152d0db09ceaf08c3",
                // "X-Auth-Token:1cae58b6c0d57b339fe4e1b1dffcb8e7"
            // )
        );

        curl_setopt($ch, CURLOPT_POST, true);
        $response = curl_exec($ch);
        curl_close($ch);
        $res = json_decode($response);
        return $res;
    }

    // After Payment gateway redirect
    public function finalize_payment(Request $request)
    {

        $_payment_status = $request->payment_status;
        $_payment_request_id = $request->payment_request_id;

        // Get Instamojo Payment Details
        $_payment_details_from_instamojo = $this->instaMojoGetPaymentDetails($_payment_request_id);

        // Check in biiling
        $_billing_tb = DB::table('billings')->where(['payment_request_id' => $_payment_request_id])->orderBy('id', 'DESC')->get();

        $dataUpdateInBillingTB = array();

        // Payment Status credit
        if (($_payment_details_from_instamojo->success == 1) && (count($_billing_tb) > 0)) {
            if (count($_billing_tb) > 0) {
                $instamojoPay = $_payment_details_from_instamojo->payment_request->payments;
                $dataUpdateInBillingTB = array(
                    'transaction_id' => $instamojoPay[0]->payment_id,
                    'payment_status' => $instamojoPay[0]->status,
                    'instrument_type' => $instamojoPay[0]->instrument_type
                );
            }
        } else if (count($_billing_tb) > 0) {
            // failed
            if ($_billing_tb[0]->total_amount > 0) {
                $dataUpdateInBillingTB = array(
                    'payment_status' => $_payment_status
                );
            }
            // Zero Amount
            else {
                $dataUpdateInBillingTB = array(
                    'payment_status' => 'Credit'
                );
            }
        }


        // Update billing
        if (count($_billing_tb) > 0) {
            $queryBillingUpdate = DB::table('billings')->where(['payment_request_id' => $_payment_request_id])->update($dataUpdateInBillingTB);
            // Paid Tax Invoice
            if ($queryBillingUpdate && ($_payment_details_from_instamojo->success == 1)) {
                $this->SendInvoiceMail($_billing_tb);
            }
            // Free Recipet
            if ($queryBillingUpdate && $_billing_tb[0]->total_amount < 1) {
                $this->SendConfirmMail($_billing_tb);
            }
            return redirect('payment-status?_payment_request_id=' . $_payment_request_id);
        }
        return redirect('payment-status');
    }



    // Send Tax Invoice
    public function SendInvoiceMail($_billing_tb)
    {
        $user_unique_id = $_billing_tb[0]->user_unique_id;
        $users = DB::table('users')->where(['user_unique_id' => $user_unique_id])->first();
        $orders = Orderproductgroup::where(['billing_id' => $_billing_tb[0]->id])->get();

        $data["email"] = $users->email;
        $data["name"] = $users->name;
        $data["phone"] = $users->phone;
        $data["state"] = $_billing_tb[0]->place_of_supply;
        $data["bill_type"] = $_billing_tb[0]->bill_type;
        $data["billno"] = $_billing_tb[0]->tax_invoice_no;
        $data["paymentid"] = $_billing_tb[0]->transaction_id;
        $data["billdate"] = $_billing_tb[0]->created_at;
        $data["total_amount"] = $_billing_tb[0]->total_amount;
        $data["taxable_amount"] = $_billing_tb[0]->taxable_amount;
        $data["tax_amount"] = $_billing_tb[0]->tax_amount;
        $data["amount_in_words"] = Frontend::numberTowords($_billing_tb[0]->total_amount);
        $data['promo_discount'] = 0;
        $data['wallet_discount'] = 0;
        $data['orders'] = $orders;

        $to = $users->email;
        $html = view('emails.invoice', $data)->render();
        $subject = "Navin Classes | Tax Invoice";
        //Frontend::sendMailPostal($to, $subject, $html);
    }

    // Send Confirm Mail
    public function SendConfirmMail($_billing_tb)
    {
        $user_unique_id = $_billing_tb[0]->user_unique_id;
        $users = DB::table('users')->where(['user_unique_id' => $user_unique_id])->first();
        $orders = Orderproductgroup::where(['billing_id' => $_billing_tb[0]->id])->get();

        $data["email"] = $users->email;
        $data["name"] = $users->name;
        $data["phone"] = $users->phone;
        $data["state"] = $_billing_tb[0]->place_of_supply;
        $data["bill_type"] = $_billing_tb[0]->bill_type;
        $data["billno"] = $_billing_tb[0]->tax_invoice_no;
        $data["paymentid"] = $_billing_tb[0]->transaction_id;
        $data["billdate"] = $_billing_tb[0]->created_at;
        $data["total_amount"] = $_billing_tb[0]->total_amount;
        $data["taxable_amount"] = $_billing_tb[0]->taxable_amount;
        $data["tax_amount"] = $_billing_tb[0]->tax_amount;
        $data["amount_in_words"] = Frontend::numberTowords($_billing_tb[0]->total_amount);
        $data['promo_discount'] = 0;
        $data['wallet_discount'] = 0;
        $data['orders'] = $orders;

        $to = $users->email;
        $html = view('emails.invoice', $data)->render();
        $subject = "Navin Classes | Receipt";
        //Frontend::sendMailPostal($to, $subject, $html);
    }
}

Anon7 - 2021