Current File : /home/getxxhzo/app.genicards.com/app/Http/Controllers/UserFlutterwaveController.php
<?php

namespace App\Http\Controllers;

use App\Mail\ProductOrderSendCustomer;
use App\Mail\ProductOrderSendUser;
use App\Models\Appointment;
use App\Models\AppointmentTransaction;
use App\Models\Currency;
use App\Models\Product;
use App\Models\ProductTransaction;
use App\Models\Transaction;
use App\Models\Vcard;
use App\Repositories\AppointmentRepository;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Session;
use KingFlamez\Rave\Facades\Rave as FlutterWave;
use Laracasts\Flash\Flash;

class UserFlutterwaveController extends Controller
{
    public function userOnBoard($userId, $vcard, $input)
    {
        $amount = $input['amount'];
        $currencyCode = $input['currency_code'];

        $clientId = getUserSettingValue('flutterwave_key', $userId);
        $clientSecret = getUserSettingValue('flutterwave_secret', $userId);
        config([
            'flutterwave.publicKey' => $clientId,
            'flutterwave.secretKey' => $clientSecret,
        ]);

        $reference = FlutterWave::generateReference();
        $data = [
            'payment_options' => 'card,banktransfer',
            'amount' => $amount,
            'email' => $vcard->tenant->user->email,
            'tx_ref' => $reference,
            'currency' => $currencyCode,
            'redirect_url' => route('flutterwave.appointment.success'),
            'customer' => [
                'email' => getLogInUser()->email,
            ],
            'customizations' => [
                'title' => 'Appointment Book Payment',
            ],
            'meta' => [
                'vcard_id' =>  $vcard->id,
                'amount' => $amount,
                'payment_mode' => Appointment::FLUTTERWAVE,
            ],
        ];

        $payment = FlutterWave::initializePayment($data);

        if ($payment['status'] !== 'success') {
            return redirect()->route('vcard.show', ['alias' => $vcard->url_alias]);
        }

        session(['vcard_user_id' => $userId, 'tenant_id' => $vcard->tenant->id, 'vcard_id' => $vcard->id, 'appointment_details' => $input]);

        $url = $payment['data']['link'];
        return $url;
    }

    public function flutterwaveAppointmentSuccess(Request $request)
    {
        $input = $request->all();

        $userId = session()->get('vcard_user_id');
        $currencyCode = Currency::whereId(getUserSettingValue('currency_id', $userId))->first();
        $clientId = getUserSettingValue('flutterwave_key', $userId);
        $clientSecret = getUserSettingValue('flutterwave_secret', $userId);
        config([
            'flutterwave.publicKey' => $clientId,
            'flutterwave.secretKey' => $clientSecret,
        ]);
        if ($input['status'] == 'successful') {
            $transactionID = FlutterWave::getTransactionIDFromCallback();
            $flutterWaveData = FlutterWave::verifyTransaction($transactionID);
            $data = $flutterWaveData['data'];
            $amount = $data['amount'];
            $vcardId = $data['meta']['vcard_id'];
            $tenantId = session()->get('tenant_id');
            $transactionId = $input['transaction_id'];
            $currencyCode = $data['currency'];
            $currencyId = Currency::whereCurrencyCode($currencyCode)->first()->id;
            $vcard = Vcard::with('tenant.user')->where('id', $vcardId)->first();

            $transactionDetails = [
                'vcard_id' => $vcardId,
                'transaction_id' => $transactionId,
                'currency_id' => $currencyId,
                'amount' => $amount,
                'tenant_id' => $tenantId,
                'type' => Appointment::FLUTTERWAVE,
                'status' => Transaction::SUCCESS,
                'meta' => json_encode($data),
            ];

            $appointmentTran = AppointmentTransaction::create($transactionDetails);
            $appointmentInput = session()->get('appointment_details');
            session()->forget('appointment_details');
            $appointmentInput['appointment_tran_id'] = $appointmentTran->id;

            /** @var AppointmentRepository $appointmentRepo */
            $appointmentRepo = App::make(AppointmentRepository::class);
            $vcardEmail = is_null($vcard->email) ? $vcard->tenant->user->email : $vcard->email;
            $appointmentRepo->appointmentStoreOrEmail($appointmentInput, $vcardEmail);

            session()->forget(['vcard_user_id', 'tenant_id', 'vcard_id']);

            Flash::success(__('messages.placeholder.payment_done'));
            App::setLocale(Session::get('languageChange_' . $vcard->url_alias));

            return redirect(route('vcard.show', [$vcard->url_alias, __('messages.placeholder.appointment_created')]));
        }
    }

    public function productBuy($input, $product)
    {

        $userId = $product->vcard->user->id;
        $vcard = $product->vcard;
        $clientId = getUserSettingValue('flutterwave_key', $userId);
        $clientSecret = getUserSettingValue('flutterwave_secret', $userId);
        config([
            'flutterwave.publicKey' => $clientId,
            'flutterwave.secretKey' => $clientSecret,
        ]);

        if (empty($product->currency_id)) {
            $product->currency_id = getUserSettingValue('currency_id', $userId);
        }
        $currencyCode = Currency::whereId($product->currency_id)->first()->currency_code;
        $email = $input['email'];
        $productId = $product->id;
        $productAmount = $product->price;


        $reference = FlutterWave::generateReference();
        $data = [
            'payment_options' => 'card,banktransfer',
            'amount' => $productAmount,
            'email' => is_null($vcard->email) ? $vcard->tenant->user->email : $vcard->email,
            'tx_ref' => $reference,
            'currency' => $currencyCode,
            'redirect_url' => route('flutterwave.product.success'),
            'customer' => [
                'email' => $email,
            ],
            'customizations' => [
                'title' => 'Product Buy Payment',
            ],
            'meta' => [
                'product_id' =>  $productId,
                'amount' => $productAmount,
                'payment_mode' => Product::FLUTTERWAVE,
            ],
        ];

        $payment = FlutterWave::initializePayment($data);

        if ($payment['status'] !== 'success') {
            return redirect()->route('showProducts', [$vcard->id, $vcard->url_alias]);
        }
        session()->put(['input' => $input]);
        session()->put(['vcard_user_id' => $userId]);

        $url = $payment['data']['link'];
        return $url;
    }

    public function flutterwaveProductSuccess(Request $request)
    {
        $input = $request->all();

        $userId = session()->get('vcard_user_id');
        $clientId = getUserSettingValue('flutterwave_key', $userId);
        $clientSecret = getUserSettingValue('flutterwave_secret', $userId);
        config([
            'flutterwave.publicKey' => $clientId,
            'flutterwave.secretKey' => $clientSecret,
        ]);

        if ($input['status'] == 'successful') {
            $transactionID = FlutterWave::getTransactionIDFromCallback();
            $flutterWaveData = FlutterWave::verifyTransaction($transactionID);
            $data = $flutterWaveData['data'];
            $amount = $data['amount'];
            $transactionId = $input['transaction_id'];
            $sessionInput = session()->get('input');
            $product = Product::whereId($sessionInput['product_id'])->first();
            if (empty($product->currency_id)) {
                $product->currency_id = getUserSettingValue('currency_id', $userId);
            }
            $currencyId = Currency::whereId($product->currency_id)->first()->id;

            ProductTransaction::create([
                'product_id' => $sessionInput['product_id'],
                'name' => $sessionInput['name'],
                'email' => $sessionInput['email'],
                'phone' => $sessionInput['phone'],
                'address' => $sessionInput['address'],
                'currency_id' => $currencyId,
                'meta' => json_encode($data),
                'type' =>  $sessionInput['payment_method'],
                'transaction_id' => $transactionId,
                'amount' => $amount,
            ]);

            $orderMailData = [
                'user_name' => $product->vcard->user->full_name,
                'customer_name' => $sessionInput['name'],
                'product_name' => $product->name,
                'product_price' => $product->price,
                'phone' => $sessionInput['phone'],
                'address' => $sessionInput['address'],
                'payment_type' => __('messages.flutterwave'),
                'order_date' => Carbon::now()->format('d M Y'),
            ];

            if (getUserSettingValue('product_order_send_mail_customer', $userId)) {
                Mail::to($sessionInput['email'])->send(new ProductOrderSendCustomer($orderMailData));
            }

            if (getUserSettingValue('product_order_send_mail_user', $userId)) {
                Mail::to($product->vcard->user->email)->send(new ProductOrderSendUser($orderMailData));
            }

            $vcard = $product->vcard;
            App::setLocale(Session::get('languageChange_' . $vcard->url_alias));
            session()->forget('input');
            session()->forget('vcard_user_id');
            DB::commit();

            return redirect(route('showProducts', [$vcard->id, $vcard->url_alias, __('messages.placeholder.product_purchase')]));
        }
    }
}