<?php
namespace App\Http\Controllers;
use Modules\MercadoPago\Http\Controllers\MercadoPagoController;
use Omnipay\Omnipay;
use App\BillingDetails;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Brian2694\Toastr\Facades\Toastr;
use Illuminate\Support\Facades\Auth;
use Unicodeveloper\Paystack\Facades\Paystack;
use Modules\Paytm\Http\Controllers\PaytmController;
use Modules\Wallet\Http\Controllers\WalletController;
use Modules\Razorpay\Http\Controllers\RazorpayController;
use Modules\LmsSaas\Entities\SaasCart;
use Modules\LmsSaas\Entities\SaasPlan;
use Modules\LmsSaas\Entities\SaasCheckout;
use Modules\LmsSaas\Entities\SaasInstitutePlanPurchase;
use Modules\LmsSaas\Entities\SaasInstitutePlanManagement;
use Modules\LmsSaasMD\Entities\SaasCart as SaasCartMD;
use Modules\LmsSaasMD\Entities\SaasPlan as SaasPlanMD;
use Modules\LmsSaasMD\Entities\SaasCheckout as SaasCheckoutMD;
use Modules\LmsSaasMD\Entities\SaasInstitutePlanPurchase as SaasInstitutePlanPurchaseMD;
use Modules\LmsSaasMD\Entities\SaasInstitutePlanManagement as SaasInstitutePlanManagementMD;
class SaasPaymentController extends Controller
{
public $payPalGateway;
public $allow;
public function __construct()
{
$this->middleware('maintenanceMode');
$this->allow = true;
$this->payPalGateway = Omnipay::create('PayPal_Rest');
$this->payPalGateway->setClientId(getMainPaymentEnv('PAYPAL_CLIENT_ID'));
$this->payPalGateway->setSecret(getMainPaymentEnv('PAYPAL_CLIENT_SECRET'));
$this->payPalGateway->setTestMode(getMainPaymentEnv('IS_PAYPAL_LOCALHOST') == 'true'); //set it to 'false' when go live
}
public function payment(Request $request)
{
if (isModuleActive('LmsSaas')) {
$plan = SaasPlan::on('mysql')->where('id', $request->plan_id)->first();
} else {
$plan = SaasPlanMD::on('mysql')->where('id', $request->plan_id)->first();
}
if (!$plan) {
Toastr::error('Invalid Request', 'Error');
return \redirect()->route('saasPackages');
}
if (isModuleActive('LmsSaas')) {
$cart = SaasCart::on('mysql')->where('user_id', Auth::user()->id)->with('plan')->first();
} else {
$cart = SaasCartMD::on('mysql')->where('user_id', Auth::user()->id)->with('plan')->first();
}
if (!$cart) {
Toastr::error('Invalid Request', 'Error');
return \redirect()->route('saasPackages');
}
$rules = [
'old_billing' => 'required_if:billing_address,previous',
'first_name' => 'required_if:billing_address,new',
'last_name' => 'required_if:billing_address,new',
'country' => 'required_if:billing_address,new',
'address1' => 'required_if:billing_address,new',
'city' => 'required_if:billing_address,new',
'phone' => 'required_if:billing_address,new',
'email' => 'required_if:billing_address,new',
];
$this->validate($request, $rules, validationMessage($rules));
try {
// return $request;
if ($request->billing_address == 'new') {
$bill = BillingDetails::where('tracking_id', $request->tracking_id)->first();
if (empty($bill)) {
$bill = new BillingDetails();
$bill->tracking_id = $cart->tracking;
$bill->user_id = Auth::id();
}
$bill->first_name = $request->first_name;
$bill->last_name = $request->last_name;
$bill->company_name = $request->company_name;
$bill->country = $request->country;
$bill->address1 = $request->address1;
$bill->address2 = $request->address2;
$bill->city = $request->city;
$bill->state = $request->state;
$bill->zip_code = $request->zip_code;
$bill->phone = $request->phone;
$bill->email = $request->email;
$bill->details = $request->details;
$bill->payment_method = null;
$bill->save();
} else {
$bill = BillingDetails::on('mysql')->where('id', $request->old_billing)->first();
}
if ($cart->price == 0) {
$this->payWithGateWay(null, "None");
return redirect()->to('home');
}
return view(theme('pages.saasPayment'), compact('plan', 'cart', 'bill'));
} catch (\Exception $e) {
GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
}
}
public function subscriptionSubmit(Request $request)
{
if (!Auth::check()) {
Toastr::error('You must login', 'Failed');
$this->allow = false;
return redirect()->back();
}
if (demoCheck()) {
return redirect()->back();
}
if (!$this->allow) {
return redirect()->back();
}
if (isModuleActive('LmsSaas')) {
$cart = SaasCart::where('user_id', Auth::user()->id)->first();
} else {
$cart = SaasCartMD::where('user_id', Auth::user()->id)->first();
}
if (!$cart) {
Toastr::error('Something went wrong.', 'Failed');
return redirect()->route('saasPackages');
}
try {
if ($request->payment_method == "Sslcommerz") {
} elseif ($request->payment_method == "PayPal") {
try {
$response = $this->payPalGateway->purchase(array(
'amount' => convertCurrency(Settings('currency_code') ?? 'BDT', 'USD', $cart->price),
'currency' => Settings('currency_code'),
'returnUrl' => route('paypalSaasSuccess'),
'cancelUrl' => route('paypalSaasFailed'),
))->send();
if ($response->isRedirect()) {
$response->redirect(); // this will automatically forward the customer
} else {
Toastr::error($response->getMessage(), trans('common.Failed'));
return redirect()->route('saasCheckout');
}
} catch (\Exception $e) {
Toastr::error("Something Went Wrong", 'Failed');
return redirect()->route('saasCheckout');
}
} //paypel payment getaway
elseif ($request->payment_method == "Stripe") {
$request->validate([
'stripeToken' => 'required'
]);
$token = $request->stripeToken ?? '';
$gatewayStripe = Omnipay::create('Stripe');
$gatewayStripe->setApiKey(getPaymentEnv('STRIPE_SECRET'));
$response = $gatewayStripe->purchase(array(
'amount' => convertCurrency(Settings('currency_code') ?? 'BDT', 'USD', $cart->price),
'currency' => Settings('currency_code'),
'token' => $token,
))->send();
if ($response->isRedirect()) {
// redirect to offsite payment gateway
$response->redirect();
} elseif ($response->isSuccessful()) {
// payment was successful: update database
$payWithStripe = $this->payWithGateWay($response->getData(), "Stripe");
if ($payWithStripe) {
Toastr::success('Payment done successfully', 'Success');
return redirect(route('saas.myPlan'));
} else {
Toastr::error('Something Went Wrong', 'Error');
return redirect()->route('saasCheckout');
}
} else {
if ($response->getCode() == "amount_too_small") {
$amount = round(convertCurrency('USD', strtoupper(Settings('currency_code') ?? 'BDT'), 0.5));
$message = "Amount must be at least " . Settings('currency_symbol') . ' ' . $amount;
Toastr::error($message, 'Error');
} else {
Toastr::error($response->getMessage(), 'Error');
}
return redirect()->back();
}
} //payment getway
elseif ($request->payment_method == "RazorPay") {
if (empty($request->razorpay_payment_id)) {
Toastr::error('Something Went Wrong', 'Error');
return redirect()->route('saasCheckout');
}
$payment = new RazorpayController();
$response = $payment->payment($request->razorpay_payment_id);
if ($response['type'] == "error") {
Toastr::error($response['message'], 'Error');
return redirect()->route('saasCheckout');
}
$payWithRazorPay = $this->payWithGateWay($response['response'], "RazorPay");
if ($payWithRazorPay) {
Toastr::success('Payment done successfully', 'Success');
return redirect(route('saas.myPlan'));
} else {
Toastr::error('Something Went Wrong', 'Error');
return redirect()->route('saasCheckout');
}
} //payment getway
elseif ($request->payment_method == "PayTM") {
$userData = [
'user' => Auth::user()->name,
'mobile' => Auth::user()->phone,
'email' => Auth::user()->email,
'amount' => convertCurrency(Settings('currency_code') ?? 'BDT', 'INR', $cart->price),
'order' => uniqid() . "_" . rand(1, 1000),
];
$payment = new PaytmController();
return $payment->subscription($userData);
} //payment getway
elseif ($request->payment_method == "PayStack") {
try {
return Paystack::getAuthorizationUrl()->redirectNow();
} catch (\Exception $e) {
Toastr::error($e->getMessage(), trans('common.Failed'));
return redirect()->route('saasCheckout');
}
} elseif ($request->payment_method == "MercadoPago") {
$mercadoPagoController = new MercadoPagoController();
$response = $mercadoPagoController->payment($request->all());
return response()->json(['target_url' => $response]);
} elseif ($request->payment_method == "Wallet") {
$payment = new WalletController();
$response = $payment->saasPlan($request);
if ($response['type'] == "error") {
Toastr::error($response['message'], 'Error');
return redirect()->route('saasCheckout');
}
$payWithWallet = $this->payWithGateWay($response['response'], "Wallet");
if ($payWithWallet) {
Toastr::success('Payment done successfully', 'Success');
return redirect(route('saas.myPlan'));
} else {
Toastr::error('Something Went Wrong', 'Error');
return redirect()->route('saasCheckout');
}
}
} catch (\Exception $e) {
GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
}
}
public function paypalSubscriptionSuccess(Request $request)
{
if ($request->input('paymentId') && $request->input('PayerID')) {
$transaction = $this->payPalGateway->completePurchase(array(
'payer_id' => $request->input('PayerID'),
'transactionReference' => $request->input('paymentId'),
));
$response = $transaction->send();
if ($response->isSuccessful()) {
// The customer has successfully paid.
$arr_body = $response->getData();
$payWithPapal = $this->payWithGateWay($arr_body, "PayPal");
if ($payWithPapal) {
Toastr::success('Payment done successfully', 'Success');
return redirect(route('saas.myPlan'));
} else {
Toastr::error('Something Went Wrong', 'Error');
return redirect(route('saas.myPlan'));
}
} else {
$msg = str_replace("'", " ", $response->getMessage());
Toastr::error($msg, 'Failed');
return redirect()->back();
}
} else {
Toastr::error('Transaction is declined');
return redirect()->back();
}
}
public function paypalSubscriptionFailed()
{
Toastr::error('User is canceled the payment.', 'Failed');
return redirect()->back();
}
public static function payWithGateWay($response, $gateWayName)
{
try {
if (Auth::check()) {
// dd('coming pay with gateway');
$user = Auth::user();
if (isModuleActive('LmsSaas')) {
$cart = SaasCart::where('user_id', $user->id)->first();
} else {
$cart = SaasCartMD::where('user_id', $user->id)->first();
}
if ($cart) {
if (isModuleActive('LmsSaas')) {
$plan = SaasCart::where('plan_id', $cart->plan_id)->first();
} else {
$plan = SaasCartMD::where('plan_id', $cart->plan_id)->first();
}
$bill = BillingDetails::where('id', $cart->billing_detail_id)->first();
if (!$bill) {
$bill = BillingDetails::where('user_id', Auth::user()->id)->first();;
// Toastr::error('Billing address not found', 'Error');
// return false;
}
if ($plan) {
$start_date = Carbon::now();
$end_date = $start_date->addDays($plan->days);
if (isModuleActive('LmsSaas')) {
$subCheckout = SaasCheckout::where('tracking', $cart->tracking)->first();
} else {
$subCheckout = SaasCheckoutMD::where('tracking', $cart->tracking)->first();
}
if (!$subCheckout) {
if (isModuleActive('LmsSaas')) {
$subCheckout = new SaasCheckout();
} else {
$subCheckout = new SaasCheckoutMD();
}
}
if (isModuleActive('LmsSaas')) {
$user_id = $user->id;
} else {
$user_id = SaasInstitute()->user_id;
}
$subCheckout->user_id = $user_id;
$subCheckout->plan_id = $plan->plan_id;
$subCheckout->price = $plan->price;
$subCheckout->billing_detail_id = $bill->id;
$subCheckout->tracking = $bill->tracking_id;
$subCheckout->start_date = Carbon::now();
$subCheckout->end_date = $end_date;
$subCheckout->days = $plan->days;
$subCheckout->payment_method = $gateWayName;
$subCheckout->status = 1;
$subCheckout->lms_id = Auth::user()->lms_id;
$subCheckout->response = json_encode($response);
$subCheckout->save();
$subscripitonPayment = new SaasPaymentController();
$subscripitonPayment->saasPlanPurchaseRecord($cart->plan_id, $subCheckout);
Toastr::success('Checkout Successfully Done', 'Success');
// $user->save();
$plan->delete();
return true;
} else {
Toastr::error('Something Went Wrong', 'Error');
return false;
}
} else {
Toastr::error('Something Went Wrong', 'Error');
return false;
}
} else {
Toastr::error('You must login', 'Error');
return false;
}
} catch (\Exception $e) {
GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
}
}
public function saasPlanPurchaseRecord($plan_id, $checkout_info, $user = null)
{
if (empty($user)) {
$user = Auth::user();
}
try {
if (isModuleActive('LmsSaas')) {
$plan_info = SaasPlan::find($plan_id);
} else {
$plan_info = SaasPlanMD::find($plan_id);
}
if ($plan_info->days == 0) {
$unlimited = 1;
} else {
$unlimited = 0;
}
if (isModuleActive('LmsSaas')) {
$saas_purchase = new SaasInstitutePlanPurchase();
} else {
$saas_purchase = new SaasInstitutePlanPurchaseMD();
}
$saas_purchase->lms_id = $user->lms_id;
$saas_purchase->plan_id = $checkout_info->plan_id;
$saas_purchase->purchase_price = $checkout_info->price;
$saas_purchase->purchase_date = Carbon::now();
$saas_purchase->save();
if (isModuleActive('LmsSaas')) {
$check_plan = SaasInstitutePlanManagement::where('lms_id', $user->lms_id)->first();
} else {
$check_plan = SaasInstitutePlanManagementMD::where('lms_id', $user->lms_id)->first();
}
$purchase_date = Carbon::now();
if ($check_plan) {
$service_end_date = Carbon::parse($check_plan->service_end_date)->addDays($plan_info->days);
$course = $check_plan->course + $plan_info->course_limit;
$student = $check_plan->student + $plan_info->student_limit;
$instructor = $check_plan->instructor + $plan_info->instructor_limit;
$meeting = $check_plan->meeting + $plan_info->meeting_limit;
$upload_limit = $check_plan->upload_limit + $plan_info->upload_limit;
$quiz = $check_plan->quiz + $plan_info->quiz_question_limit;
$blog_post = $check_plan->blog_post + $plan_info->blog_post_limit;
$newsletter = $check_plan->newsletter + $plan_info->newsletter_limit;
$check_plan->course = $course;
$check_plan->student = $student;
$check_plan->instructor = $instructor;
$check_plan->meeting = $meeting;
$check_plan->upload_limit = $upload_limit;
$check_plan->quiz = $quiz;
$check_plan->blog_post = $blog_post;
$check_plan->newsletter = $newsletter;
$check_plan->purchase_date = $purchase_date;
$check_plan->service_end_date = $service_end_date;
$check_plan->unlimited = $unlimited;
$check_plan->course_access = $plan_info->course_access;
$check_plan->student_access = $plan_info->student_access;
$check_plan->instructor_access = $plan_info->instructor_access;
$check_plan->meeting_access = $plan_info->meeting_access;
$check_plan->quiz_access = $plan_info->quiz_access;
$check_plan->blog_access = $plan_info->blog_access;
$check_plan->update();
} else {
$service_end_date = $purchase_date->addDays($plan_info->days);
if (isModuleActive('LmsSaas')) {
$saas_purchase_management = new SaasInstitutePlanManagement();
} else {
$saas_purchase_management = new SaasInstitutePlanManagementMD();
}
$saas_purchase_management->lms_id = $user->lms_id;
$saas_purchase_management->course = $plan_info->course_limit;
$saas_purchase_management->student = $plan_info->student_limit;
$saas_purchase_management->instructor = $plan_info->instructor_limit;
$saas_purchase_management->meeting = $plan_info->meeting_limit;
$saas_purchase_management->upload_limit = $plan_info->upload_limit;
$saas_purchase_management->quiz = $plan_info->quiz_question_limit;
$saas_purchase_management->blog_post = $plan_info->blog_post_limit;
$saas_purchase_management->newsletter = 0;
$saas_purchase_management->purchase_date = $purchase_date;
$saas_purchase_management->service_end_date = $service_end_date;
$saas_purchase_management->unlimited = $unlimited;
$saas_purchase_management->course_access = $plan_info->course_access;
$saas_purchase_management->student_access = $plan_info->student_access;
$saas_purchase_management->instructor_access = $plan_info->instructor_access;
$saas_purchase_management->meeting_access = $plan_info->meeting_access;
$saas_purchase_management->quiz_access = $plan_info->quiz_access;
$saas_purchase_management->blog_access = $plan_info->blog_access;
$saas_purchase_management->save();
}
} catch (\Exception $e) {
GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
}
}
}