<?php namespace App\Http\Controllers\Admin; use App\Classes\Reply; use App\Http\Controllers\AdminBaseController; use App\Models\Admin; use App\Models\Company; use App\Models\EmailTemplate; use App\Models\Invoice; use App\Models\InvoiceItem; use App\Models\Plan; use App\Models\Setting; use App\Models\StripeInvoice; use App\Models\Subscription; use App\Traits\Settings; use Carbon\Carbon; use Illuminate\Http\Request; use App\Http\Requests\Admin\Billing\StoreRequest; use App\Http\Requests\Admin\Billing\UpdateRequest; use App\Http\Requests; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Redirect; use PayPal\Api\Agreement; use PayPal\Api\AgreementStateDescriptor; use PayPal\Api\Amount; use PayPal\Api\Item; use PayPal\Api\ItemList; use PayPal\Api\Payer; use PayPal\Api\Payment; use PayPal\Api\PaymentExecution; use PayPal\Api\RedirectUrls; use PayPal\Api\Transaction; use PayPal\Auth\OAuthTokenCredential; use PayPal\Exception\PayPalConnectionException; use PayPal\Rest\ApiContext; use Razorpay\Api\Api; use Yajra\DataTables\Facades\DataTables; use App\Http\Requests\Admin\Billing\PaymentRequest; class BillingController extends AdminBaseController { use \App\Traits\Settings; public $currencySymbols = [ "USD" => "$", "GBP" => "£", "EUR" => "€", "INR" => "₹" ]; public function __construct() { parent::__construct(); $this->setStripeConfigs(); $this->pageTitle = "Billing"; $this->csettingOpen = 'active'; $this->billingActive = 'active'; } /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // $this->invoices = (admin()->company->subscriptions->count() > 0) ? admin()->company->invoices() : []; $this->invoices = StripeInvoice::with('plan')->where('company_id', $this->active_company->id)->get(); $this->data["payment"] = request()->get("payment"); $this->stripeSettings = Setting::first(); $this->subscription = Subscription::where('company_id', $this->company->id)->first(); $this->firstInvoice = $this->invoices->sortByDesc(function ($invoice, $key) { return Carbon::parse($invoice->created_at)->getTimestamp(); })->first(); return \View::make('admin.billing.index', $this->data); } // Datatable ajax request public function ajax_billing() { if (admin()->type == "admin") { $result = Invoice::leftJoin("companies", "companies.id", "=", "invoices.company_id") ->select("invoices.id", "companies.company_name", "invoices.license_number", "invoices.invoice_number", "invoices.invoice_date", "invoices.due_date", "invoices.amount", "invoices.currencySymbol", "invoices.currency", "invoices.status", "invoices.transaction_id") ->where("company_id", $this->data["active_company"]->id) ->get(); } else { $result = Invoice::leftJoin("companies", "companies.id", "=", "invoices.company_id") ->select("invoices.id", "companies.company_name", "invoices.license_number", "invoices.invoice_number", "invoices.invoice_date", "invoices.due_date", "invoices.amount", "invoices.currencySymbol", "invoices.status", "invoices.transaction_id") ->get(); } return DataTables::of($result) ->editColumn('invoice_date', function ($row) { if (Carbon::now()->isSameDay($row->invoice_date)) { return $row->invoice_date->format("d-M-y") . "<br/>(Today)"; } else { return $row->invoice_date->format("d-M-y") . "<br/>(" . $row->invoice_date->diffForHumans() . ")"; } })->editColumn('due_date', function ($row) { if (Carbon::now()->isSameDay($row->due_date)) { return $row->due_date->format("d-M-y") . "<br/>(Today)"; } else { return $row->due_date->format("d-M-y") . "<br/>(" . $row->due_date->diffForHumans() . ")"; } })->editColumn('amount', function ($row) { return $row->currencySymbol . number_format($row->amount, 2); })->editColumn('status', function ($row) { if ($row->status == "Paid") { return '<span class="label label-success">' . $row->status . "</span>"; } else if ($row->status == "Unpaid") { return '<span class="label label-danger">' . $row->status . "</span>"; } else if ($row->status == "Cancelled") { return '<span class="label label-default">' . $row->status . "</span>"; } else { return '<span class="label label-warning">' . $row->status . "</span>"; } })->addColumn('edit', function ($row) { $string = ""; if (admin()->type == "admin" && $row->status == "Unpaid") { if ($this->data["active_company"]->country == "India") { $string .= '<a class="btn purple btn-sm margin-bottom-10" href="javascript:;" onclick="payRazor(' . $row->id . ', \'HRM Cloud\', ' . ($row->amount * 100) . ');return false;" > <i class="fa fa-money"></i> Pay</a>'; } else { $string .= '<a class="btn purple btn-sm margin-bottom-10" href="javascript:;" onclick="pay2Checkout(\'' . $row->id . '\', \'HRM Cloud\', ' . ($row->amount) . ', \'' . $row->currency . '\');return false;" > <i class="fa fa-money"></i> Pay</a>'; } } else if (admin()->type == "superadmin") { $string .= '<a class="btn green btn-sm margin-bottom-10" href="javascript:;" onclick="showEdit(' . $row->id . ');return false;" > <i class="fa fa-edit"></i> Edit</a>'; } $string .= '<a class="btn blue btn-sm margin-bottom-10" href="' . route("admin.billing.show", ["id" => $row->id]) . '" > <i class="fa fa-download"></i> PDF</a>'; return $string; }) ->removeColumn("id") ->removeColumn("currencySymbol") ->removeColumn("currency") ->rawColumns(['invoice_date', 'due_date', 'amount', 'status', 'edit']) ->make(); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { $this->authorize(new Invoice()); $id = Invoice::max("id"); $this->data["invoice_number"] = "SNAP" . ($id + 1); return view("admin.billing.create", $this->data); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(StoreRequest $request) { $this->authorize(new Invoice()); $data = \request()->all(); $invoice = new Invoice(); $invoice->invoice_number = $data["invoice_number"]; $invoice->company_id = $data["company_id"]; $invoice->license_number = $data["license_number"]; $invoice->amount = $data["amount"]; $invoice->invoice_date = $data["invoice_date"]; $invoice->due_date = $data["due_date"]; $invoice->status = $data["status"]; $invoice->notes = $data["notes"]; $invoice->currency = $data["currency"]; $invoice->currencySymbol = $this->currencySymbols[$data["currency"]]; $invoice->transaction_id = ($data["transaction_id"] == "") ? null : $data["transaction_id"]; $invoice->save(); for ($i = 0; $i < count($data["item_name"]); $i++) { $item = new InvoiceItem(); $item->invoice_id = $invoice->id; $item->name = $data["item_name"][$i]; $item->type = $data["item_type"][$i]; $item->amount = $data["item_amount"][$i]; $item->save(); } if (isset($data["send_email"]) && $data["send_email"] == "on") { $admins = Admin::company($invoice->company_id) ->where("manager", "0")->pluck("email"); foreach ($admins as $admin) { $active_company = Company::find($invoice->company_id); $emailInfo = ['from_email' => $this->setting->email, 'from_name' => $this->setting->name, 'to' => $admin, 'active_company' => $active_company]; $amount = ($invoice->currencySymbol) . number_format($invoice->amount, 2); $date_generated = $invoice->invoice_date->format("dS M Y"); if (Carbon::now()->isSameDay($invoice->invoice_date)) { $date_generated .= "(Today)"; } else { $date_generated .= "(" . $invoice->invoice_date->diffForHumans() . ")"; } $due_date = $invoice->due_date->format("dS M Y"); if (Carbon::now()->isSameDay($invoice->due_date)) { $due_date .= "(Today)"; } else { $due_date .= "(" . $invoice->due_date->diffForHumans() . ")"; } $fieldValues = ['PRODUCT' => "HRM Cloud", 'AMOUNT' => $amount, 'DATE_GENERATED' => $date_generated, 'DUE_DATE' => $due_date, 'INVOICE_NUMBER' => $invoice->invoice_number]; EmailTemplate::prepareAndSendEmail('NEW_INVOICE_GENERATED', $emailInfo, $fieldValues); } } return [ "status" => "success", "message" => trans("messages.invoiceAddSuccess") ]; } /** * Display the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function show($id) { $invoice = Invoice::find($id); $this->authorize($invoice); // return view("admin.billing.show", ["invoice" => $invoice]); return \PDF::loadView("admin.billing.show", ["invoice" => $invoice]) ->download($invoice->invoice_number . ".pdf"); } /** * Show the form for editing the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { $invoice = Invoice::find($id); $this->authorize($invoice); $this->data["invoice"] = $invoice; return view("admin.billing.edit", $this->data); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(UpdateRequest $request, $id) { $invoice = Invoice::find($id); $this->authorize($invoice); $data = \request()->all(); $invoice->invoice_number = $data["invoice_number"]; $invoice->company_id = $data["company_id"]; $invoice->license_number = $data["license_number"]; $invoice->amount = $data["amount"]; $invoice->invoice_date = $data["invoice_date"]; $invoice->due_date = $data["due_date"]; $invoice->status = $data["status"]; $invoice->notes = $data["notes"]; $invoice->currency = $data["currency"]; $invoice->currencySymbol = $this->currencySymbols[$data["currency"]]; $invoice->transaction_id = ($data["transaction_id"] == "") ? null : $data["transaction_id"]; $invoice->save(); InvoiceItem::where("invoice_id", $invoice->id)->delete(); for ($i = 0; $i < count($data["item_name"]); $i++) { $item = new InvoiceItem(); $item->invoice_id = $invoice->id; $item->name = $data["item_name"][$i]; $item->type = $data["item_type"][$i]; $item->amount = $data["item_amount"][$i]; $item->save(); } if (isset($data["send_email"]) && $data["send_email"] == "on") { $admins = Admin::company($invoice->company_id) ->where("manager", "0")->pluck("email"); foreach ($admins as $admin) { $active_company = Company::find($invoice->company_id); $emailInfo = ['from_email' => $this->setting->email, 'from_name' => $this->setting->name, 'to' => $admin, 'active_company' => $active_company]; $amount = ($invoice->currencySymbol) . number_format($invoice->amount, 2); $date_generated = $invoice->invoice_date->format("dS M Y"); if (Carbon::now()->isSameDay($invoice->invoice_date)) { $date_generated .= "(Today)"; } else { $date_generated .= "(" . $invoice->invoice_date->diffForHumans() . ")"; } $due_date = $invoice->due_date->format("dS M Y"); if (Carbon::now()->isSameDay($invoice->due_date)) { $due_date .= "(Today)"; } else { $due_date .= "(" . $invoice->due_date->diffForHumans() . ")"; } $fieldValues = ['PRODUCT' => "HRM Cloud", 'AMOUNT' => $amount, 'DATE_GENERATED' => $date_generated, 'DUE_DATE' => $due_date, 'INVOICE_NUMBER' => $invoice->invoice_number ]; EmailTemplate::prepareAndSendEmail('NEW_INVOICE_GENERATED', $emailInfo, $fieldValues); } } return [ "status" => "success", "message" => trans("messages.invoiceUpdateSuccess") ]; } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { // } public function ajax_company_name() { $q = request()->get("q"); $result = Company::join("licenses", "licenses.company_id", "=", "companies.id") ->select("id", "company_name as text", "license_number") ->where("company_name", "LIKE", "%" . $q . "%") ->get(); return ["items" => $result]; } public function pay($id) { $invoice = Invoice::find($id); $this->authorize($invoice); $apiContext = new ApiContext(new OAuthTokenCredential(env("PAYPAL_CLIENT_ID"), env("PAYPAL_SECRET"))); $payer = new Payer(); $payer->setPaymentMethod("paypal"); $item1 = new Item(); $item1->setName("HRM Cloud"); $item1->setCurrency($invoice->currency); $item1->setQuantity(1); $item1->setPrice($invoice->amount); $itemList = new ItemList(); $itemList->setItems([$item1]); $amount = new Amount(); $amount->setCurrency($invoice->currency); $amount->setTotal($invoice->amount); $transaction = new Transaction(); $transaction->setAmount($amount); $transaction->setItemList($itemList); $transaction->setDescription("HRM Cloud license payment"); $returnUrlLink = \URL::route('admin.billing.payment.success') . "?item_id=" . $invoice->id; $cancelUrlLink = \URL::route('admin.billing.payment.cancel') . "?item_id=" . $invoice->id; $redirectUrls = new RedirectUrls(); $redirectUrls->setReturnUrl($returnUrlLink); $redirectUrls->setCancelUrl($cancelUrlLink); $payment = new Payment(); $payment->setIntent("sale"); $payment->setPayer($payer); $payment->setRedirectUrls($redirectUrls); $payment->setTransactions([$transaction]); try { $payment->create($apiContext); } catch (PayPalConnectionException $ex) { $errorDetails = json_decode($ex->getData(), true); $errorData = ["status" => "fail", "message" => (!isset($errorDetails["message"]) || $errorDetails["message"] == null) ? "Connection problem. Please try again later" : $errorDetails["message"], "detail" => (!isset($errorDetails["message"]) || $errorDetails["message"] == null) ? "Connection problem. Please try again later" : $errorDetails["name"], "debug_id" => (!isset($errorDetails["message"]) || $errorDetails["message"] == null) ? "Connection problem. Please try again later" : $errorDetails["debug_id"]]; return $errorData; } $approvalUrl = $payment->getApprovalLink(); $payment_id = $payment->getId(); // Save this transaction $saveTransaction = new \App\Models\Transaction(); $saveTransaction->payment_id = $payment_id; $saveTransaction->payment_status = "pending"; $saveTransaction->user_details = json_encode([]); $saveTransaction->save(); return ["status" => "success", "message" => "Redirecting to payment page...", "action" => "redirect", "url" => $approvalUrl]; } public function payRazor($id) { $invoice = Invoice::find($id); $this->authorize($invoice); $inputs = \request()->all(); // Currency Convert try { $price = $invoice->amount; $api = new Api(env("RAZORPAY_CLIENT_ID"), env("RAZORPAY_SECRET")); $payment = $api->payment->fetch($inputs["payment_id"]); $payment->capture(['amount' => $price * 100]); } catch (\Exception $e) { $errorData = ["status" => "fail", "message" => $e->getMessage() ]; return $errorData; } $invoice->status = "Paid"; $invoice->save(); // Save this transaction $saveTransaction = new \App\Models\Transaction(); $saveTransaction->payment_id = $payment->id; $saveTransaction->user_details = json_encode($inputs); $saveTransaction->payer_id = ""; $saveTransaction->transaction_id = ""; $saveTransaction->payer_email = $payment->email; $saveTransaction->payment_method = "Razorpay"; $saveTransaction->payer_fname = $invoice->company->company_name; $saveTransaction->payer_lname = ""; $saveTransaction->amount = $payment->amount / 100; $saveTransaction->currency_code = "INR"; $saveTransaction->license_number = $invoice->license_number; $saveTransaction->create_time = Carbon::createFromTimestamp($payment->created_at); $saveTransaction->update_time = new \DateTime(); $saveTransaction->payment_status = $payment->status; $saveTransaction->user_details = json_encode($inputs); $saveTransaction->save(); $admins = Admin::company($invoice->company_id) ->where("manager", "0")->pluck("email"); $active_company = Company::find($invoice->company_id); $active_company->license_expired = 0; $active_company->save(); foreach ($admins as $admin) { $active_company = Company::find($invoice->company_id); $emailInfo = ['from_email' => $this->setting->email, 'from_name' => $this->setting->name, 'to' => $admin, 'active_company' => $active_company]; $amount = ($invoice->currencySymbol) . number_format($invoice->amount, 2); $fieldValues = ['INVOICE_NUMBER' => $invoice->invoice_number, 'AMOUNT' => $amount, 'TRANSACTION_ID' => $saveTransaction->payment_id]; EmailTemplate::prepareAndSendEmail('PAYMENT_SUCCESS', $emailInfo, $fieldValues); } return ["status" => "success", "message" => trans("messages.invoicePaymentSuccess")]; } public function pay2Checkout() { $order_number = request()->get("order_number"); $amount = request()->get("total"); $key = request()->get("key"); $invoice_id = request()->get("merchant_invoice_id"); // First verify genuine response $calculated_key = strtoupper(md5(env("2CHECKOUT_SECRET_WORD") . env("2CHECKOUT_SELLER_ID") . $order_number . $amount)); if ($key != $calculated_key) { \App::abort(403, "This is not an authorised request"); } $invoice = Invoice::find($invoice_id); if (!$invoice) { \App::abort(500, "Invoice not found"); } $invoice->status = "Paid"; $invoice->save(); $saveTransaction = new \App\Models\Transaction(); $saveTransaction->payment_id = $order_number; $saveTransaction->payer_id = ""; $saveTransaction->transaction_id = request()->get("invoice_id"); $saveTransaction->payer_email = request()->get("email"); $saveTransaction->payment_method = "2Checkout"; $saveTransaction->payer_fname = request()->get("first_name"); $saveTransaction->payer_lname = $saveTransaction->amount = $amount; $saveTransaction->currency_code = request()->get("currency_code"); $saveTransaction->license_number = $invoice->license_number; $saveTransaction->create_time = Carbon::now(); $saveTransaction->update_time = new \DateTime(); $saveTransaction->payment_status = "success"; $saveTransaction->user_details = json_encode(\request()->all()); $saveTransaction->save(); $admins = Admin::company($invoice->company_id) ->where("manager", "0")->pluck("email"); $active_company = Company::find($invoice->company_id); $active_company->license_expired = 0; $active_company->save(); foreach ($admins as $admin) { $active_company = Company::find($invoice->company_id); $emailInfo = ['from_email' => $this->setting->email, 'from_name' => $this->setting->name, 'to' => $admin, 'active_company' => $active_company]; $amount = ($invoice->currencySymbol) . number_format($invoice->amount, 2); $fieldValues = ['INVOICE_NUMBER' => $invoice->invoice_number, 'AMOUNT' => $amount, 'TRANSACTION_ID' => $saveTransaction->payment_id]; EmailTemplate::prepareAndSendEmail('PAYMENT_SUCCESS', $emailInfo, $fieldValues); } return \Redirect::to(route("admin.billing.index") . "?payment=success"); } public function paymentSuccess() { $itemID = request()->get('item_id'); $paymentId = request()->get('paymentId'); $payerID = request()->get('PayerID'); $invoice = Invoice::find($itemID); $apiContext = new ApiContext(new OAuthTokenCredential(env("PAYPAL_CLIENT_ID"), env("PAYPAL_SECRET"))); $execution = new PaymentExecution(); $execution->setPayerId($payerID); try { $payment = Payment::get($paymentId, $apiContext); $payment->execute($execution, $apiContext); } catch (PayPalConnectionException $ex) { $errorDetails = json_decode($ex->getData(), true); $errorData = ["status" => "fail", "message" => $errorDetails["message"], "detail" => $errorDetails["name"], "debug_id" => $errorDetails["debug_id"]]; $txn = \App\Models\Transaction::where("payment_id", $paymentId)->first(); if ($txn && $txn->payment_status != "approved") { $txn->payment_status = "failed"; $txn->payer_id = $payerID; $txn->failure_data = $ex->getData(); $txn->save(); } return \Redirect::to(route("admin.billing.index") . "?payment=fail"); } $payment_id = $payment->id; $payment_create = $payment->create_time; $payment_update = $payment->update_time; $payment_status = $payment->state; $payment_method = $payment->payer->payment_method; $payer_email = $payment->payer->payer_info->email; $payer_fname = $payment->payer->payer_info->first_name; $payer_lname = $payment->payer->payer_info->last_name; $payer_id = $payment->payer->payer_info->payer_id; $trans_id = ""; $total_amount = 0.0; $currency_code = "USD"; foreach ($payment->transactions as $trans) { $total_amount = $trans->amount->total; $currency_code = $trans->amount->currency; foreach ($trans->related_resources as $resources) { $trans_id = $resources->sale->id; } } if ($payment) { $invoice->status = "Paid"; $invoice->save(); $data = ['payer_id' => $payer_id, 'transaction_id' => $trans_id, 'payer_email' => $payer_email, 'payment_method' => $payment_method, 'payer_fname' => $payer_fname, 'payer_lname' => $payer_lname, 'amount' => $total_amount, 'currency_code' => $currency_code, 'create_time' => $payment_create, 'update_time' => $payment_update, 'license_number' => $invoice->license_number, 'payment_status' => $payment_status]; $userTransaction = \App\Models\Transaction::where("payment_id", $payment_id)->first(); $userTransaction->update($data); $inputs = json_decode($userTransaction->user_details, true); $admins = Admin::company($invoice->company_id) ->where("manager", "0")->pluck("email"); $active_company = Company::find($invoice->company_id); $active_company->license_expired = 0; $active_company->save(); foreach ($admins as $admin) { $emailInfo = ['from_email' => $this->setting->email, 'from_name' => $this->setting->name, 'to' => $admin, 'active_company' => $active_company]; $amount = ($invoice->currencySymbol) . number_format($invoice->amount, 2); $fieldValues = ['INVOICE_NUMBER' => $invoice->invoice_number, 'AMOUNT' => $amount, 'TRANSACTION_ID' => $userTransaction->payment_id]; EmailTemplate::prepareAndSendEmail('PAYMENT_SUCCESS', $emailInfo, $fieldValues); } return \Redirect::to(route("admin.billing.index") . "?payment=success"); } else { return \Redirect::to(route("admin.billing.index") . "?payment=fail"); } } public function paymentCancel() { $paymentId = request()->get('paymentId'); $payerID = request()->get('PayerID'); $txn = \App\Models\Transaction::where("payment_id", $paymentId)->first(); if ($txn && $txn->payment_status != "approved") { $txn->payment_status = "failed"; $txn->payer_id = $payerID; $txn->failure_data = "Payment Cancel"; $txn->save(); } return \Redirect::to(route("admin.billing.index") . "?payment=cancel"); } public function changePlan() { $this->plans = Plan::all(); return view("admin.billing.change_plan", $this->data); } public function selectPackage(Request $request, $packageID) { $this->package = Plan::findOrFail($packageID); $this->type = $request->type; $this->logo = asset('uploads/company_logo/'.$this->company->logo); return view('admin.billing.payment-method-show', $this->data); } public function stripePayment(PaymentRequest $request) { $token = $request->payment_method; $email = $request->stripeEmail; $plan = Plan::find($request->plan_id); $this->setStripeConfigs(); if ($plan->end_user_count < admin()->company->users->count()) { return back()->withError('You can\'t downgrade package because your users length is ' . admin()->company->users->count() . ' and package max users length is ' . $plan->end_user_count)->withInput(); } $company = admin()->company; $subscription = $company->subscriptions; try { if ($subscription->count() > 0) { $company->subscription('main')->swap($plan->{'stripe_' . $request->type . '_plan_id'}); } else { $company->newSubscription('main', $plan->{'stripe_' . $request->type . '_plan_id'})->create($token, [ 'email' => $email, ]); } $company = Company::find(admin()->company->id); $company->subscription_plan_id = $plan->id; $company->package_type = $request->type; // Set company status active $company->status = 'active'; $company->save(); \Session::flash('message', 'Payment successfully done.'); return Reply::redirect(route('admin.billing.index'), 'Payment successfully done.'); // return redirect(route('admin.billing.index')); } catch (\Exception $e) { return Reply::error($e->getMessage()); // return back()->withError($e->getMessage())->withInput(); } } public function cancelSubscription(Request $request) { $type = $request->type; if($type == 'paypal') { config(['paypal.settings.mode' => $this->setting->paypal_mode]); $paypal_conf = Config::get('paypal'); $api_context = new ApiContext(new OAuthTokenCredential($this->setting->paypal_client_id, $this->setting->paypal_secret)); $api_context->setConfig($paypal_conf['settings']); $paypalInvoice = StripeInvoice::whereNotNull('transaction_id') ->where('company_id', $this->company->id)->where('payment_method', 'paypal')->latest()->first(); if($paypalInvoice){ $agreementId = $paypalInvoice->transaction_id; $agreement = new Agreement(); $agreement->setId($agreementId); $agreementStateDescriptor = new AgreementStateDescriptor(); $agreementStateDescriptor->setNote("Cancel the agreement"); try { $agreement->cancel($agreementStateDescriptor, $api_context); $cancelAgreementDetails = Agreement::get($agreement->getId(), $api_context); // Set subscription end date $paypalInvoice->end_on = $paypalInvoice->next_pay_date->format('Y-m-d'); $paypalInvoice->save(); } catch (\Exception $ex) { \Session::put('error','Some error occur, sorry for inconvenient'); return Redirect::route('admin.billing.change_plan'); } } } else { $this->setStripeConfigs(); $company = $this->company; $subscription = Subscription::where('company_id', $this->company->id)->whereNull('ends_at')->first(); if($subscription){ try { $company->subscription('main')->cancel(); } catch (\Exception $ex) { \Session::put('error','Some error occur, sorry for inconvenient'); return Redirect::route('admin.billing.change_plan'); } } } return Reply::redirect(route('admin.billing.index'), __('messages.unsubscribeSuccess')); } }