|
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 : |
<?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);
}
}