• File: PaymentController.php
  • Full Path: /var/www/imalipartnersapi/app/Http/Controllers/PaymentController.php
  • Date Modified: 03/14/2023 9:25 PM
  • File size: 118.93 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

namespace App\Http\Controllers;

use App\Bank\MasterAccount;
use App\Bank\Payment;
use App\Bank\Profit;
use App\Classes\Kyc;
use App\Classes\FCMNotifcation;
use App\Classes\PaymentKyc;
use App\Classes\Record;
use App\Classes\SendSMS;
use App\Classes\SendSMSSislog;
use App\Classes\SmsManager;
use App\Classes\TransactionGeneration;
use App\Imali\ImaliAccount;
use App\Imali\ImaliAccountConfig;
use App\Imali\MerchantAccount;
use App\Imali\MerchantContract;
use App\Imali\RamoActivity;
use App\Imali\RechargeImaliAccount;
use App\Imali\Transfer;
use App\Mail\Pagamento;
use App\Mail\PagamentoConfirmado;
use App\MoneyRequest;
use App\PurchaseVoucher;
use App\Store;
use App\StoreAmountGeneration;
use App\StoreConfig;
use App\StoreDevice;
use App\TransactionHistory;
use App\TransferHistory;
use App\User;
use Illuminate\Http\Request;
use DB;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use QRCode;

class PaymentController extends Controller
{
    protected $request;
    protected $createTransaction;
    protected $generatedTransaction;
    protected $log;
    protected $trasactionGeneration;

    protected SmsManager $smsManager;


    public function __construct()
    {
        $this->log = new Record();
        $this->trasactionGeneration = new TransactionGeneration();

        $this->smsManager = new SmsManager();
    }

    public function getExtrato()
    {

        $user = User::query()
            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'users.id')
            ->leftJoin('credelecs', 'credelecs.user_id', '=', 'users.id')
            ->leftJoin('payments', 'payments.sender_id', '=', 'users.id')
            ->where('users.id', 1)
            ->select('credelecs.*', 'payments.*')
            ->get();

        return response()->json($user);

    }

    public function getTesteTransaction($id)
    {
        $u = Payment::query()->where('sender_id', '=', 1)->get();
        $transactons = DB::table('payments')
            ->join('history_payments', 'history_payments.user_id', '=', 'payments.sender_id')
            ->where('payments.sender_id', $id)
            ->where('history_payments.user_id', $id)
            ->select('payments.*', 'history_payments.status_user as type')
            ->orderBy('payments.created_at', 'desc')
            ->get();

        return response()->json($transactons);
    }

    public function getUser($id)
    {
        $user = User::query()->where('user_id', $id)->first();
        return response()->json($user);
    }

    public function getMyTransactions($id)
    {

//        $user = User::query()->where('user_id', $id)->first();
        $transactons = DB::table('users')
            ->join('payments', 'users.id', '=', 'payments.sender_id')
            ->where('user_id', $id)
            ->select('payments.*')
            ->orderBy('created_at', 'desc')
            ->get();

        return response()->json(['data' => $transactons], 200, [], JSON_NUMERIC_CHECK);
    }

    public function makePayment(Request $request)
    {
        $trasactionGeneration = new TransactionGeneration();

        $payerUser = User::query()->where('user_id', $request->user_id)->first();
        $comerciante = MerchantAccount::query()->where('account_number', $request->account_number)->first();
        $payer_id = $payerUser->id;

        $imali = ImaliAccount::query()->where('user_id', $payer_id)->first();
        $kyc = new Kyc();
        $kycCheck = $kyc->checkSenderPayment($request);

        if ($kycCheck) {

            $log = new Record();
            $log->createLog([
                'description' => $imali->account_number . ' ' . $comerciante->name,
                'details' => $kycCheck,
                'operation' => 'Payment',
//                'properties' => $request->all(),
                'properties' => json_encode($request->except(['pin'])),
                'status' => 'Error',
                'user_id' => $request->user()->id
            ]);

            return $kycCheck;
        } else {
            if ($payerUser) {
                if ($imali->balance < $request->amount) {

                    $log = new Record();
                    $log->createLog([
                        'description' => $imali->account_number . ' ' . $comerciante->name,
                        'details' => 'Saldo Insuficiente',
                        'operation' => 'Payment',
//                        'properties' => $request->all(),
                        'properties' => json_encode($request->except(['pin'])),
                        'status' => 'Error',
                        'user_id' => $request->user()->id
                    ]);

                    return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402, [], JSON_NUMERIC_CHECK);
                } else {
                    $valorAPagar = $request->amount;
                    $points = round($valorAPagar);

                    // Payer or Sender Section
                    DB::table('imali_accounts')->where('user_id', $payer_id)->decrement('balance', $valorAPagar);
                    DB::table('imali_accounts')->where('user_id', $payer_id)->increment('points', $points);

                    $contractoComerciante = MerchantContract::query()->where('merchant_account_id', $comerciante->id)->first();

                    $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100;

                    $valorMin = $contractoComerciante->valor_min;
                    $valorMax = $contractoComerciante->valor_max;

                    if ($taxaDesconto < $valorMin) {
                        $taxaDesconto = $valorMin;
                    }
                    if ($taxaDesconto > $valorMax) {
                        $taxaDesconto = $valorMax;
                    }

//                $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100;
                    $valorFinal = $valorAPagar - $taxaDesconto;

                    // Recever User Merchante
                    DB::table('merchant_accounts')->where('account_number', $comerciante->account_number)->increment('balance', $valorFinal);

//                $profit = $valorAPagar*($contractoComerciante->taxa)/100;

                    $transaction = $trasactionGeneration->generateTransaction();

                    $createTransaction = Payment::create([
                        'transaction_id' => $transaction,
                        'sender_id' => $payer_id,
                        'merchant_account_id' => $comerciante->id,
                        'received_points' => $points,
                        'amount' => $valorAPagar,
                        'amount_credited' => $valorFinal,
                        'comissao' => $taxaDesconto,
                        'description' => $request->description,
                        'used_points' => $request->used_points,
                        'estado' => 'pago',
                        'estado_color' => '#388E3C',
                        'created_at' => now(),
                        'updated_at' => now()
                    ]);

                    $actualPoints = $imali->points + $points;
                    $createTransaction->paymentHistoric()->create([
                        'sender_account' => $imali->account_number,
                        'sender_name' => $payerUser->name,
                        'amount_credited' => $valorFinal,
                        'status_user' => 'sender',
                        'status' => 'done',
                        'comissao' => $taxaDesconto,
                        'amount' => $valorAPagar,
                        'user_id' => $payerUser->id,
                        'actual_points' => $actualPoints,
                        'last_points' => $imali->points,
                        'win_points' => $points,
                        'transaction_id' => $transaction
                    ]);

                    $saveProfit = $createTransaction->profit()->create([
                        'payer_id' => $payer_id,
                        'payer_account' => $comerciante->account_number,
                        'amount' => $valorAPagar,
                        'amount_credited' => $valorFinal,
                        'comissao' => $taxaDesconto,
                        'profit_id' => $trasactionGeneration->generateTransaction(),
                        'payment_id' => $createTransaction->id,
                    ]);
                    if ($saveProfit) {

                        $sms = new SendSMS();
                        $sms->sendMessageToClientePayment($createTransaction);
                        $sms->sendMessageToComerciante($createTransaction);
//                    $sms->sendMessageToClientePayment($payerUser);
                        Mail::to($comerciante->email_loja)->send(new PagamentoConfirmado($createTransaction));
                        Mail::to($payerUser->email)->send(new Pagamento($createTransaction));

                        $log = new Record();
                        $log->createLog([
                            'description' => $imali->account_number . ' ' . $comerciante->name,
                            'details' => 'Pagamento Feito com Sucesso',
                            'operation' => 'Payment',
//                            'properties' => $request->all(),
                            'properties' => json_encode($request->except(['pin'])),
                            'status' => 'Success',
                            'user_id' => $request->user()->id
                        ]);

                        return response()->json(['message' => 'Pagamento Feito com Sucesso!',
                            'transaction' => $transaction,
                            'created_at' => $createTransaction->created_at,
                            'duration' => 3000
                        ], 200);
                    }

                }
            }
        }
    }

    public function makePaymentStoreNEW(Request $request)
    {

        DB::transaction(function ($request) {
            $user = User::find($request->user()->id);
//            $user = DB::table('users')->
            if (Hash::check($request->pin, $user->pin)) {
                $trasactionGeneration = new TransactionGeneration();

                $payerUser = User::query()->where('user_id', $request->user()->user_id)->first();
                $store = Store::query()->where('account_number', $request->account_number)->first();
                $payer_id = $payerUser->id;

                $imali = ImaliAccount::query()->where('user_id', $payer_id)->first();
                $kyc = new Kyc();
                $kycCheck = $kyc->checkSenderPayment($request);

                if ($kycCheck) {
                    $log = new Record();
                    $log->createLog([
                        'description' => $imali->account_number . ' ' . $store->name,
                        'details' => $kycCheck,
                        'operation' => 'Payment',
//                        'properties' => $request->all(),
                        'properties' => json_encode($request->except(['pin'])),
                        'status' => 'Error',
                        'user_id' => $request->user()->id
                    ]);

                    return $kycCheck;
                } else {
                    if ($payerUser) {
                        if ($imali->balance < $request->amount) {

                            $log = new Record();
                            $log->createLog([
                                'description' => $imali->account_number . ' ' . $store->name,
                                'details' => 'Saldo Insuficiente',
                                'operation' => 'Payment',
//                                'properties' => $request->all(),
                                'properties' => json_encode($request->except(['pin'])),
                                'status' => 'Error',
                                'user_id' => $request->user()->id
                            ]);

                            return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402, [], JSON_NUMERIC_CHECK);
                        } else {
                            $valorAPagar = $request->amount;
                            $points = round($valorAPagar);

                            // Payer or Sender Section
                            DB::table('imali_accounts')->where('user_id', $payer_id)->decrement('balance', $valorAPagar);
                            DB::table('imali_accounts')->where('user_id', $payer_id)->increment('points', $points);

                            $contractoComerciante = MerchantContract::query()->where('store_id', $store->id)->first();

                            $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100;

                            $valorMin = $contractoComerciante->min_amount;
                            $valorMax = $contractoComerciante->max_amount;

                            if ($taxaDesconto < $valorMin) {
                                $taxaDesconto = $valorMin;
                            }
                            if ($taxaDesconto > $valorMax) {
                                $taxaDesconto = $valorMax;
                            }

//                $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100;
                            $valorFinal = $valorAPagar - $taxaDesconto;

                            // Recever User Merchante
                            DB::table('stores')->where('account_number', $store->account_number)->increment('balance', $valorFinal);
                            $storeT = Store::query()->where('account_number', $store->account_number)->first();
                            DB::table('merchant_accounts')->where('id', $storeT->merchant_account_id)->increment('balance', $valorFinal);

//                $profit = $valorAPagar*($contractoComerciante->taxa)/100;

                            $transaction = $trasactionGeneration->generateTransaction();

                            $createTransaction = Payment::create([
                                'transaction_id' => $transaction,
                                'sender_id' => $payer_id,
                                'store_id' => $store->id,
                                'client_id' => $request->user_client_id,
                                'received_points' => $points,
                                'amount' => $valorAPagar,
                                'amount_credited' => $valorFinal,
                                'comissao' => $taxaDesconto,
                                'description' => $request->description,
                                'used_points' => $request->used_points,
                                'estado' => 'pago',
                                'payment_type' => 'payment',
                                'estado_color' => '#388E3C',
                                'created_at' => now(),
                                'updated_at' => now(),
                                'category_id' => $store->industry_activity
                            ]);

//                        TransactionHistory::create([
//                            'user_id' => $request->user()->id,
//                            'payment_id' => $createTransaction->id,
//                            'category_id' => $createTransaction->category_id,
//                            'transaction_type' => 'payment'
//                        ]);


                            $actualPoints = $imali->points + $points;
                            $re = $createTransaction->paymentHistoric()->create([
                                'sender_account' => $imali->account_number,
                                'sender_name' => $payerUser->name,
                                'amount_credited' => $valorFinal,
                                'status_user' => 'sender',
                                'status' => 'done',
                                'comissao' => $taxaDesconto,
                                'amount' => $valorAPagar,
                                'user_id' => $payerUser->id,
                                'actual_points' => $actualPoints,
                                'last_points' => $imali->points,
                                'win_points' => $points,
                                'transaction_id' => $transaction,
                                'category_id' => $store->industry_activity
                            ]);


                            $saveProfit = $createTransaction->profit()->create([
                                'payer_id' => $payer_id,
                                'payer_account' => $store->account_number,
                                'amount' => $valorAPagar,
                                'amount_credited' => $valorFinal,
                                'comissao' => $taxaDesconto,
                                'profit_id' => $trasactionGeneration->generateTransaction(),
                                'payment_id' => $createTransaction->id,
                                'profit_payer_id' => $createTransaction->store_id
                            ]);
                            if ($saveProfit) {

                                $this->smsManager->sendSMSToComerciante($createTransaction);
//                        $sms = new SendSMS();
//                        $sms->sendMessageToClientePayment($createTransaction);
//                        $sms->sendMessageToComerciante($createTransaction);
//                        $sms->sendMessageToClientePayment($payerUser);
//                        Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction));
//                        Mail::to($payerUser->email)->send(new Pagamento($createTransaction));


                                $generate = StoreAmountGeneration::query()
                                    ->where('id', $request->store_amount_generation_id)
                                    ->first();

                                if ($generate) {

                                    $generate->update([
                                        'status' => 'sucesso'
                                    ]);
                                }


                                $log = new Record();
                                $log->createLog([
                                    'description' => $imali->account_number . ' ' . $store->name,
                                    'details' => 'Pagamento Feito com Sucesso',
                                    'operation' => 'Payment',
//                                    'properties' => $request->all(),
                                    'properties' => json_encode($request->except(['pin'])),
                                    'status' => 'Success',
                                    'user_id' => $request->user()->id
                                ]);

                                $notification = array(
                                    'icon' => 'ic_imali_logo_verde_01',
//                            'icon' => 'ic_i_mali_cover',
                                    'title' => 'Pagemento ' . $request->amount . ' MT',
                                    'body' => 'Parabéns, ' . ' fez o pagamento de ' . $request->amount . ' MT ' . ' na loja ' . $store->name,
                                    'click_action' => 'com.imali.payapp.payment_PAGAR_NOTIFICATION',
//                            'color' => '#008577'
                                    'color' => '#ffffff'
                                );


                                $data = array(
                                    'transaction' => $createTransaction->transaction_id,
                                    'loja' => $store->name,
                                    'loja_account' => $store->account_number,
                                    'pontos' => $createTransaction->received_points,
                                    'pontos_usados' => $createTransaction->used_points,
                                    'amount' => $createTransaction->amount,
                                    'amount_debited' => $createTransaction->amount_credited,
                                    'account_number' => $imali->account_number,
                                    'phone' => $request->user()->phone,
                                    'descricao' => $createTransaction->description,
                                    'data' => $createTransaction->created_at,
                                    'estado' => $createTransaction->estado,
                                    'comissao' => $createTransaction->comissao,
                                    'terminal' => 'firebase'
                                );

                                $this->pushNotifification($user->firebase_token, $notification, $data);

                                return response()->json(['message' => 'Pagamento Feito com Sucesso!',
                                    'transaction' => $transaction,
                                    'created_at' => $createTransaction->created_at,
                                    'duration' => 3000
                                ], 200);
                            }

                        }
                    }
                }
            } else {
                return response()->json(['message' => 'Pin Incorrecto'], 400);
            }
        });

    }

    public function makePaymentStoreAppNew(Request $request)
    {
        $this->validate($request, [
            'account_number' => 'required',
            'amount' => 'required',
            'description' => 'required'
        ]);

        $kyc = new Kyc();
        $kycCheck = $kyc->checkSenderPayment($request);


        if ($kycCheck) {
            $log = new Record();
            $log->createLog([
                'description' => "Payment Fail",
                'details' => $kycCheck,
                'operation' => 'Payment',
                'properties' => json_encode($request->except(['pin'])),
                'status' => 'Error',
                'user_id' => $request->user()->id
            ]);
            return $kycCheck;
        } else {

            $this->request = $request;

            DB::transaction(function () {

                $store = DB::table('stores')->where('account_number', $this->request->account_number)->first();

                $imaliAccount = DB::table('users')
                    ->join('imali_accounts', 'imali_accounts.user_id', '=', 'users.id')
                    ->where('users.user_id', $this->request->user()->user_id)
                    ->select('users.*', 'imali_accounts.account_number', 'imali_accounts.points')
                    ->first();

                $valorAPagar = $this->request->amount;
                $points = round($valorAPagar);

                // Payer or Sender Section
                DB::table('imali_accounts')->where('user_id', $imaliAccount->id)->decrement('balance', $valorAPagar);
                DB::table('imali_accounts')->where('user_id', $imaliAccount->id)->increment('points', $points);

//                            $contractoComerciante = MerchantContract::query()->where('store_id', '=', $store->id)->first();
                $contractoComerciante = DB::table('merchant_contracts')->where('store_id', '=', $store->id)->first();

                $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100;

                $valorMin = $contractoComerciante->min_amount;
                $valorMax = $contractoComerciante->max_amount;

                if ($taxaDesconto < $valorMin) {
                    $taxaDesconto = $valorMin;
                }
                if ($taxaDesconto > $valorMax) {
                    $taxaDesconto = $valorMax;
                }

//                $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100;
                $valorFinal = $valorAPagar - $taxaDesconto;

                // Recever User Merchante
                DB::table('stores')->where('account_number', $store->account_number)->increment('balance', $valorFinal);

                // Add Money to Merchant
//                        $storeT = Store::query()->where('account_number', $store->account_number)->first();
//                        DB::table('merchant_accounts')->where('id', $storeT->merchant_account_id)->increment('balance', $valorFinal);


//                $profit = $valorAPagar*($contractoComerciante->taxa)/100;
                $this->generatedTransaction = $this->trasactionGeneration->generateTransaction();


                $getPayment = DB::table('payments')->where('transaction_id', $this->request->transaction)->first();


                if ($getPayment) {

                    DB::table('payments')
                        ->where('transaction_id', $this->request->transaction)
                        ->update([
                            'received_points' => $points,
                            'amount_credited' => $valorFinal,
                            'comissao' => $taxaDesconto,
                            'description' => $this->request->description,
                            'used_points' => $this->request->used_points,
                            'estado' => 'success',
                            'status' => 'success',
                            'payment_type' => 'directo',
                            'estado_color' => '#388E3C',
                            'sender_id' => $imaliAccount->id,
                            'updated_at' => now(),
                        ]);

                    $this->createTransaction = DB::table('payments')->where('transaction_id', $this->request->transaction)->first();

                } else {

                    DB::table('payments')->insert([
                        'transaction_id' => $this->generatedTransaction,
                        'sender_id' => $imaliAccount->id,
                        'store_id' => $store->id,
                        'client_id' => $this->request->user_client_id,
                        'received_points' => $points,
                        'amount' => $valorAPagar,
                        'amount_credited' => $valorFinal,
                        'comissao' => $taxaDesconto,
                        'description' => $this->request->description,
                        'used_points' => $this->request->used_points,
                        'estado' => 'success',
                        'status' => 'success',
                        'payment_type' => 'directo',
                        'estado_color' => '#388E3C',
                        'created_at' => now(),
                        'updated_at' => now(),
                        'category_id' => $store->industry_activity
                    ]);

                    $this->createTransaction = DB::table('payments')->where('transaction_id', $this->generatedTransaction)->first();
                }


                DB::table('transaction_histories')->insert([
                    'user_id' => $this->request->user()->id,
                    'payment_id' => $this->createTransaction->id,
                    'category_id' => $this->createTransaction->category_id,
                    'transaction_type' => 'payment',
                    'created_at' => now(),
                    'updated_at' => now()
                ]);

                $actualPoints = $imaliAccount->points + $points;

                DB::table('history_payments')->insert([
                    'sender_account' => $imaliAccount->account_number,
                    'sender_name' => $imaliAccount->name,
                    'amount_credited' => $valorFinal,
                    'status_user' => 'sender',
                    'status' => 'done',
                    'comissao' => $taxaDesconto,
                    'amount' => $valorAPagar,
                    'user_id' => $imaliAccount->id,
                    'actual_points' => $actualPoints,
                    'last_points' => $imaliAccount->points,
                    'win_points' => $points,
                    'transaction_id' => $this->generatedTransaction,
                    'category_id' => $store->industry_activity,
                    'payment_id' => $this->createTransaction->id,
                    'created_at' => now(),
                    'updated_at' => now()
                ]);


                DB::table('profits')->insert([
                    'payer_id' => $imaliAccount->id,
                    'payer_account' => $store->account_number,
                    'amount' => $valorAPagar,
                    'amount_credited' => $valorFinal,
                    'comissao' => $taxaDesconto,
                    'profit_id' => $this->trasactionGeneration->generateTransaction(),
                    'payment_id' => $this->createTransaction->id,
                    'profit_payer_id' => $this->createTransaction->store_id,
                    'created_at' => now(),
                    'updated_at' => now()
                ]);


                DB::table('logs')->insert([
                    'description' => $imaliAccount->account_number . ' ' . $store->name,
                    'details' => trans('payment_done'),
                    'operation' => 'Payment',
                    'properties' => json_encode($this->request->except(['pin'])),
                    'status' => 'success',
                    'user_id' => $this->request->user()->id
                ]);

                $notification = array(
//                                'icon' => 'ic_imali_logo_verde_01',
                    'icon' => 'ic_i_mali_cover',
                    'title' => 'Pagamento ' . $this->request->amount . ' MT',
                    'body' => 'Parabéns, ' . ' fez o pagamento de ' . $this->request->amount . ' MT ' . ' na loja ' . $store->name,
                    'click_action' => 'com.imali.payapp.payment_PAGAR_NOTIFICATION',
                    'color' => '#ffffff'
                );

                $notificationStore = array(
                    'icon' => 'ic_imali_logo_verde_01',
                    'image' => 'https://imali.co.mz/wp-content/uploads/2022/04/iMali-Business-Logo.png',
//                            'icon' => 'ic_i_mali_cover',
                    'title' => 'Pagamento ' . $this->request->amount . ' MT',
                    'body' => 'Parabéns, ' . ' recebeu o pagamento de ' . $this->request->amount . ' MT ' . ' do cliente ' . $imaliAccount->name,
                    'click_action' => 'mz.co.imali.business.payment_TARGET_NOTIFICATION',
                    'color' => '#ffffff'
                );


                $store = DB::table('stores')->where('account_number', $this->request->account_number)->first();

                $category = RamoActivity::find($store->industry_activity);

                $data = array(
                    'transaction' => $this->createTransaction->transaction_id,
                    'loja' => $store->name,
                    'name' => $imaliAccount->name,
                    'loja_account' => $store->account_number,
                    'pontos' => $this->createTransaction->received_points,
                    'pontos_usados' => $this->createTransaction->used_points,
                    'amount' => $this->createTransaction->amount,
                    'amount_debited' => $this->createTransaction->amount_credited,
                    'amount_credited' => $this->createTransaction->amount_credited,
                    'account_number' => $imaliAccount->account_number,
                    'phone' => $this->request->user()->phone,
                    'descricao' => $this->createTransaction->description,
                    'data' => $this->createTransaction->created_at,
                    'created_at' => $this->createTransaction->created_at,
                    'estado' => $this->createTransaction->estado,
                    'comissao' => $this->createTransaction->comissao,
                    'message_store' => trans('payment_received'),
                    'message_customer' => trans('payment_done'),
                    'logo_category' => $category->logo,
                    'category' => $category->nome,
                    'terminal' => 'firebase'
                );


                // Notifify customer
                $this->pushNotifification($imaliAccount->firebase_token, $notification, $data);


                $storeConfig = StoreConfig::query()
                    ->where('store_id', '=', $store->id)
                    ->first();

                if ($storeConfig) {

                    if ($storeConfig->notify === 1) {

                        // NOTIFY STORE BY SMS
                        if ($storeConfig->notify_sms === 1) {
                            $sms = new SendSMSSislog();

                            $data = array(
                                "sender_id" => $this->createTransaction->sender_id,
                                "store_id" => $this->createTransaction->store_id,
                                "transaction_id" => $this->createTransaction->transaction_id,
                                "created_at" => $this->createTransaction->created_at,
                                "amount" => $this->createTransaction->amount,
                            );
                            $this->smsManager->sendSMSToComerciante($data);
                        }

                        if ($storeConfig->notify_email == 1) {
                        }

                        // NOTIFY STORE
                        if ($storeConfig->notify_push == 1) {

                            if ($getPayment) {
                                $this->pushNotifification($getPayment->firebase_token, $notificationStore, $data);
                            } else {
                                $device = StoreDevice::query()
                                    ->where('store_id', $store->id)
                                    ->where('status', '=', 1)
                                    ->get();

                                foreach ($device as $d) {
                                    $this->pushNotifification($d->firebase_token, $notificationStore, $data);
                                }
                            }


                        }
                    }
                }

            }, 2);
            return response()->json([
                'message' => trans('payment_done'),
                'transaction' => $this->generatedTransaction,
                'created_at' => $this->createTransaction->created_at,
                'duration' => 3000,
            ]);
        }

    }

    public function makePaymentStore(Request $request)
    {

        $user = User::find($request->user()->id);

        if (Hash::check($request->pin, $user->pin)) {
            $trasactionGeneration = new TransactionGeneration();

            $payerUser = User::query()->where('user_id', '=', $request->user()->user_id)->first();
            $store = Store::query()->where('account_number', '=', $request->account_number)->first();
            $payer_id = $payerUser->id;

            $imali = ImaliAccount::query()->where('user_id', '=', $payer_id)->first();
            $kyc = new Kyc();
            $kycCheck = $kyc->checkSenderPayment($request);

            if ($kycCheck) {
                $log = new Record();
                $log->createLog([
                    'description' => $imali->account_number . ' ' . $store->name,
                    'details' => $kycCheck,
                    'operation' => 'Payment',
//                    'properties' => $request->all(),
                    'properties' => json_encode($request->except(['pin'])),
                    'status' => 'Error',
                    'user_id' => $request->user()->id
                ]);

                return $kycCheck;
            } else {
                if ($payerUser) {
                    if ($imali->balance < $request->amount) {

                        $log = new Record();
                        $log->createLog([
                            'description' => $imali->account_number . ' ' . $store->name,
                            'details' => 'Saldo Insuficiente',
                            'operation' => 'Payment',
//                            'properties' => $request->all(),
                            'properties' => json_encode($request->except(['pin'])),
                            'status' => 'Error',
                            'user_id' => $request->user()->id
                        ]);

                        return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402, [], JSON_NUMERIC_CHECK);
                    } else {
                        $valorAPagar = $request->amount;
                        $points = round($valorAPagar);

                        // Payer or Sender Section
                        DB::table('imali_accounts')->where('user_id', $payer_id)->decrement('balance', $valorAPagar);
                        DB::table('imali_accounts')->where('user_id', $payer_id)->increment('points', $points);

                        $contractoComerciante = MerchantContract::query()->where('store_id', '=', $store->id)->first();

                        $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100;

                        $valorMin = $contractoComerciante->min_amount;
                        $valorMax = $contractoComerciante->max_amount;

                        if ($taxaDesconto < $valorMin) {
                            $taxaDesconto = $valorMin;
                        }
                        if ($taxaDesconto > $valorMax) {
                            $taxaDesconto = $valorMax;
                        }

//                $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100;
                        $valorFinal = $valorAPagar - $taxaDesconto;

                        // Recever User Merchante
                        DB::table('stores')->where('account_number', $store->account_number)->increment('balance', $valorFinal);

                        // Add Money to Merchant
//                        $storeT = Store::query()->where('account_number', $store->account_number)->first();
//                        DB::table('merchant_accounts')->where('id', $storeT->merchant_account_id)->increment('balance', $valorFinal);


//                $profit = $valorAPagar*($contractoComerciante->taxa)/100;

                        $transaction = $trasactionGeneration->generateTransaction();

                        $createTransaction = Payment::create([
                            'transaction_id' => $transaction,
                            'sender_id' => $payer_id,
                            'store_id' => $store->id,
                            'client_id' => $request->user_client_id,
                            'received_points' => $points,
                            'amount' => $valorAPagar,
                            'amount_credited' => $valorFinal,
                            'comissao' => $taxaDesconto,
                            'description' => $request->description,
                            'used_points' => $request->used_points,
                            'estado' => 'pago',
                            'payment_type' => 'directo',
                            'estado_color' => '#388E3C',
                            'created_at' => now(),
                            'updated_at' => now(),
                            'category_id' => $store->industry_activity
                        ]);

                        TransactionHistory::create([
                            'user_id' => $request->user()->id,
                            'payment_id' => $createTransaction->id,
                            'category_id' => $createTransaction->category_id,
                            'transaction_type' => 'payment'
                        ]);


                        $actualPoints = $imali->points + $points;
                        $re = $createTransaction->paymentHistoric()->create([
                            'sender_account' => $imali->account_number,
                            'sender_name' => $payerUser->name,
                            'amount_credited' => $valorFinal,
                            'status_user' => 'sender',
                            'status' => 'done',
                            'comissao' => $taxaDesconto,
                            'amount' => $valorAPagar,
                            'user_id' => $payerUser->id,
                            'actual_points' => $actualPoints,
                            'last_points' => $imali->points,
                            'win_points' => $points,
                            'transaction_id' => $transaction,
                            'category_id' => $store->industry_activity
                        ]);

//                        TransactionHistory::create([
//                            'user_id' => $re->user_id,
//                            'payment_id' => $re->id,
//                            'category_id' => $re->category_id,
//                            'transaction_type' => 'payment'
//                        ]);


                        $saveProfit = $createTransaction->profit()->create([
                            'payer_id' => $payer_id,
                            'payer_account' => $store->account_number,
                            'amount' => $valorAPagar,
                            'amount_credited' => $valorFinal,
                            'comissao' => $taxaDesconto,
                            'profit_id' => $trasactionGeneration->generateTransaction(),
                            'payment_id' => $createTransaction->id,
                            'profit_payer_id' => $createTransaction->store_id
                        ]);
                        if ($saveProfit) {


                            $generate = StoreAmountGeneration::query()
                                ->where('id', '=', $request->store_amount_generation_id)
                                ->first();

                            if ($generate) {

                                $generate->update([
                                    'status' => 'sucesso',
                                    'payment_id' => $createTransaction->id
                                ]);

                                $createTransaction->update([
                                    'store_amount_generation_id' => $generate->id
                                ]);
                            }


                            $log = new Record();
                            $log->createLog([
                                'description' => $imali->account_number . ' ' . $store->name,
                                'details' => 'Pagamento Feito com Sucesso',
                                'operation' => 'Payment',
//                                'properties' => $request->all(),
                                'properties' => json_encode($request->except(['pin'])),
                                'status' => 'Success',
                                'user_id' => $request->user()->id
                            ]);

                            $notification = array(
//                                'icon' => 'ic_imali_logo_verde_01',
                                'icon' => 'ic_i_mali_cover',
                                'title' => 'Pagamento ' . $request->amount . ' MT',
                                'body' => 'Parabéns, ' . ' fez o pagamento de ' . $request->amount . ' MT ' . ' na loja ' . $store->name,
                                'click_action' => 'com.imali.payapp.payment_PAGAR_NOTIFICATION',
//                            'color' => '#008577'
                                'color' => '#ffffff'
                            );

                            $notificationStore = array(
                                'icon' => 'ic_imali_logo_verde_01',
//                                'image' => 'https://paytek-africa.com/image/logo.png',
                                'image' => 'https://imali.co.mz/wp-content/uploads/2022/04/iMali-Business-Logo.png',
//                            'icon' => 'ic_i_mali_cover',
                                'title' => 'Pagamento ' . $request->amount . ' MT',
                                'body' => 'Parabéns, ' . ' recebeu o pagamento de ' . $request->amount . ' MT ' . ' do cliente ' . $user->name,
                                'click_action' => 'mz.co.imali.business.payment_TARGET_NOTIFICATION',
//                            'color' => '#008577'
                                'color' => '#ffffff'
                            );


                            $store = Store::query()->where('account_number', $request->account_number)->first();

                            $category = RamoActivity::find($store->industry_activity);
                            $data = array(
                                'transaction' => $createTransaction->transaction_id,
                                'loja' => $store->name,
                                'name' => $user->name,
                                'loja_account' => $store->account_number,
                                'pontos' => $createTransaction->received_points,
                                'pontos_usados' => $createTransaction->used_points,
                                'amount' => $createTransaction->amount,
                                'amount_debited' => $createTransaction->amount_credited,
                                'amount_credited' => $createTransaction->amount_credited,
                                'account_number' => $imali->account_number,
                                'phone' => $request->user()->phone,
                                'descricao' => $createTransaction->description,
                                'data' => $createTransaction->created_at,
                                'created_at' => $createTransaction->created_at,
                                'estado' => $createTransaction->estado,
                                'comissao' => $createTransaction->comissao,
                                'message_store' => 'Pagamento Recebido Com Sucesso',
                                'message_customer' => 'Pagamento Efectuado Com Sucesso',
                                'logo_category' => $category->logo,
                                'category' => $category->nome,
                                'terminal' => 'firebase'
                            );


                            // Notifify customer
                            $this->pushNotifification($user->firebase_token, $notification, $data);


                            $storeConfig = StoreConfig::query()
                                ->where('store_id', '=', $store->id)
//                                ->where('store_id', '=', $createTransaction->store_id)
                                ->first();

                            if ($storeConfig) {

                                if ($storeConfig->notify === 1) {

                                    // NOTIFICAR POR SMS
                                    if ($storeConfig->notify_sms === 1) {

//                                        $sms = new SendSMS();
//                                        $sms->sendMessageToClientePayment($createTransaction);
//                                        $sms->sendMessageToComerciante($createTransaction);
//                                        $sms->sendMessageToClientePayment($payerUser);

                                        $this->smsManager->sendSMSToComerciante($createTransaction);
                                    }

                                    if ($storeConfig->notify_email == 1) {
//                                        Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction));
//                                        Mail::to($payerUser->email)->send(new Pagamento($createTransaction));
                                    }

                                    // NOTIFY STORE
                                    if ($storeConfig->notify_push == 1) {

                                        if ($generate) {
                                            $this->pushNotifification($generate->firebase_token, $notificationStore, $data);
                                        } else {
                                            $device = StoreDevice::query()
                                                ->where('store_id', $store->id)
                                                ->where('status', '=', 1)
                                                ->get();

                                            foreach ($device as $d) {
                                                $this->pushNotifification($d->firebase_token, $notificationStore, $data);
                                            }
                                        }


                                    }
                                }
                            }

                            return response()->json(['message' => 'Pagamento Efectuado com Sucesso!',
                                'transaction' => $transaction,
                                'created_at' => $createTransaction->created_at,
                                'duration' => 3000
                            ], 200);
                        }

                    }
                }
            }
        } else {
            return response()->json(['message' => 'Pin Incorrecto'], 400);
        }
    }

    public function makePaymentStore2NEW(Request $request)
    {

        DB::transaction(function ($request) {

            $trasactionGeneration = new TransactionGeneration();

            $payerUser = User::query()->where('user_id', $request->user()->user_id)->first();
            $store = Store::query()->where('account_number', $request->account_number)->first();
            $payer_id = $payerUser->id;

            $imali = ImaliAccount::query()->where('user_id', $payer_id)->first();
            $kyc = new Kyc();
            $kycCheck = $kyc->checkSenderPayment($request);

            if ($kycCheck) {

                $log = new Record();
                $log->createLog([
                    'description' => $imali->account_number . ' ' . $store->name,
                    'details' => $kycCheck,
                    'operation' => 'Payment',
                    'status' => 'Error',
//                    'properties' => $request->all(),
                    'properties' => json_encode($request->except(['pin'])),
                    'user_id' => $request->user()->id
                ]);

                return $kycCheck;
            } else {
                if ($payerUser) {
                    if ($imali->balance < $request->amount) {

                        $log = new Record();
                        $log->createLog([
                            'description' => $imali->account_number . ' ' . $store->name,
                            'details' => 'Saldo Insuficiente',
                            'operation' => 'Payment',
                            'status' => 'Error',
//                            'properties' => $request->all(),
                            'properties' => json_encode($request->except(['pin'])),
                            'user_id' => $request->user()->id
                        ]);

                        return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402, [], JSON_NUMERIC_CHECK);
                    } else {
                        $valorAPagar = $request->amount;
                        $points = round($valorAPagar);

                        // Payer or Sender Section
                        DB::table('imali_accounts')->where('user_id', $payer_id)->decrement('balance', $valorAPagar);
                        DB::table('imali_accounts')->where('user_id', $payer_id)->increment('points', $points);

                        $contractoComerciante = MerchantContract::query()->where('store_id', $store->id)->first();

                        $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100;

                        $valorMin = $contractoComerciante->min_amount;
                        $valorMax = $contractoComerciante->max_amount;

                        if ($taxaDesconto < $valorMin) {
                            $taxaDesconto = $valorMin;
                        }
                        if ($taxaDesconto > $valorMax) {
                            $taxaDesconto = $valorMax;
                        }

//                $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100;
                        $valorFinal = $valorAPagar - $taxaDesconto;

                        // Recever User Merchante
                        DB::table('stores')->where('account_number', $store->account_number)->increment('balance', $valorFinal);

//                $profit = $valorAPagar*($contractoComerciante->taxa)/100;

                        $transaction = $trasactionGeneration->generateTransaction();

                        $createTransaction = Payment::create([
                            'transaction_id' => $transaction,
                            'sender_id' => $payer_id,
                            'store_id' => $store->id,
                            'client_id' => $request->user_client_id,
                            'received_points' => $points,
                            'amount' => $valorAPagar,
                            'amount_credited' => $valorFinal,
                            'comissao' => $taxaDesconto,
                            'description' => $request->description,
                            'used_points' => $request->used_points,
                            'estado' => 'pago',
                            'estado_color' => '#388E3C',
                            'created_at' => now(),
                            'updated_at' => now(),
                            'category_id' => $store->industry_activity
                        ]);
//                    TransactionHistory::create([
//                        'user_id' => $request->user()->id,
//                        'payment_id' => $createTransaction->id,
//                        'category_id' => $createTransaction->category_id,
//                        'transaction_type' => 'payment'
//                    ]);

                        $actualPoints = $imali->points + $points;
                        $res = $createTransaction->paymentHistoric()->create([
                            'sender_account' => $imali->account_number,
                            'sender_name' => $payerUser->name,
                            'amount_credited' => $valorFinal,
                            'status_user' => 'sender',
                            'status' => 'done',
                            'comissao' => $taxaDesconto,
                            'amount' => $valorAPagar,
                            'user_id' => $payerUser->id,
                            'actual_points' => $actualPoints,
                            'last_points' => $imali->points,
                            'win_points' => $points,
                            'transaction_id' => $transaction,
                            'category_id' => $createTransaction->category_id
                        ]);
//                    TransactionHistory::create([
//                        'user_id' => $res->user_id,
//                        'payment_id' => $res->id,
//                        'category_id' => $res->category_id,
//                        'transaction_type' => 'payment'
//                    ]);

                        $saveProfit = $createTransaction->profit()->create([
                            'payer_id' => $payer_id,
                            'payer_account' => $store->account_number,
                            'amount' => $valorAPagar,
                            'amount_credited' => $valorFinal,
                            'comissao' => $taxaDesconto,
                            'profit_id' => $trasactionGeneration->generateTransaction(),
                            'payment_id' => $createTransaction->id,
                        ]);
                        if ($saveProfit) {

                            $this->smsManager->sendSMSToComerciante($createTransaction);
//                        $sms = new SendSMS();
//                        $sms->sendMessageToClientePayment($createTransaction);
//                        $sms->sendMessageToComerciante($createTransaction);
//                    $sms->sendMessageToClientePayment($payerUser);
//                        Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction));
//                        Mail::to($payerUser->email)->send(new Pagamento($createTransaction));


                            $generate = StoreAmountGeneration::query()
                                ->where('id', $request->store_amount_generation_id)
                                ->first();

                            if ($generate) {

                                $generate->update([
                                    'status' => 'sucesso'
                                ]);
                            }


                            $log = new Record();
                            $log->createLog([
                                'description' => $imali->account_number . ' ' . $store->name,
                                'details' => 'Pagamento Feito com Sucesso',
                                'operation' => 'Payment',
                                'status' => 'Success',
//                                'properties' => $request->all(),
                                'properties' => json_encode($request->except(['pin'])),
                                'user_id' => $request->user()->id
                            ]);

                            return response()->json(['message' => 'Pagamento Feito com Sucesso!',
                                'transaction' => $transaction,
                                'created_at' => $createTransaction->created_at,
                                'duration' => 3000
                            ], 200);
                        }

                    }
                }
            }

        });

    }

    public function makePaymentStore2(Request $request)
    {
        $trasactionGeneration = new TransactionGeneration();
//        $payerUser = User::query()->where('user_id', $request->user_id)->first();
        $payerUser = User::query()->where('user_id', '=', $request->user()->user_id)->first();
        $user = User::find($request->user()->id);
//        $comerciante = MerchantAccount::query()->where('account_number', $request->account_number)->first();
        $store = Store::query()->where('account_number', '=', $request->account_number)->first();
        $payer_id = $payerUser->id;

        $imali = ImaliAccount::query()->where('user_id', $payer_id)->first();
        $kyc = new Kyc();
        $kycCheck = $kyc->checkSenderPayment($request);

        if ($kycCheck) {

            $log = new Record();
            $log->createLog([
                'description' => $imali->account_number . ' ' . $store->name,
                'details' => $kycCheck,
                'operation' => 'Payment',
                'status' => 'Error',
//                'properties' => $request->all(),
                'properties' => json_encode($request->except(['pin'])),
                'user_id' => $request->user()->id
            ]);

            return $kycCheck;
        } else {
            if ($payerUser) {
                if ($imali->balance < $request->amount) {

                    $log = new Record();
                    $log->createLog([
                        'description' => $imali->account_number . ' ' . $store->name,
                        'details' => 'Saldo Insuficiente',
                        'operation' => 'Payment',
                        'status' => 'Error',
//                        'properties' => $request->all(),
                        'properties' => json_encode($request->except(['pin'])),
                        'user_id' => $request->user()->id
                    ]);

                    return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402, [], JSON_NUMERIC_CHECK);
                } else {
                    $valorAPagar = $request->amount;
                    $points = round($valorAPagar);

                    // Payer or Sender Section
                    DB::table('imali_accounts')->where('user_id', $payer_id)->decrement('balance', $valorAPagar);
                    DB::table('imali_accounts')->where('user_id', $payer_id)->increment('points', $points);

                    $contractoComerciante = MerchantContract::query()->where('store_id', $store->id)->first();

                    $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100;

                    $valorMin = $contractoComerciante->min_amount;
                    $valorMax = $contractoComerciante->max_amount;

                    if ($taxaDesconto < $valorMin) {
                        $taxaDesconto = $valorMin;
                    }
                    if ($taxaDesconto > $valorMax) {
                        $taxaDesconto = $valorMax;
                    }

//                $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100;
                    $valorFinal = $valorAPagar - $taxaDesconto;

                    // Recever User Merchante
                    DB::table('stores')->where('account_number', $store->account_number)->increment('balance', $valorFinal);

                    // Add Money to Merchant
//                    $storeT = Store::query()->where('account_number', $store->account_number)->first();
//                    DB::table('merchant_accounts')->where('id', $storeT->merchant_account_id)->increment('balance', $valorFinal);

//                $profit = $valorAPagar*($contractoComerciante->taxa)/100;

                    $transaction = $trasactionGeneration->generateTransaction();

                    $createTransaction = Payment::create([
                        'transaction_id' => $transaction,
                        'sender_id' => $payer_id,
                        'store_id' => $store->id,
                        'client_id' => $request->user_client_id,
                        'received_points' => $points,
                        'amount' => $valorAPagar,
                        'amount_credited' => $valorFinal,
                        'comissao' => $taxaDesconto,
                        'description' => $request->description,
                        'used_points' => $request->used_points,
                        'estado' => 'pago',
                        'estado_color' => '#388E3C',
                        'payment_type' => 'directo',
                        'created_at' => now(),
                        'updated_at' => now(),
                        'category_id' => $store->industry_activity
                    ]);
                    TransactionHistory::create([
                        'user_id' => $request->user()->id,
                        'payment_id' => $createTransaction->id,
                        'category_id' => $createTransaction->category_id,
                        'transaction_type' => 'payment'
                    ]);

                    $actualPoints = $imali->points + $points;
                    $res = $createTransaction->paymentHistoric()->create([
                        'sender_account' => $imali->account_number,
                        'sender_name' => $payerUser->name,
                        'amount_credited' => $valorFinal,
                        'status_user' => 'sender',
                        'status' => 'done',
                        'comissao' => $taxaDesconto,
                        'amount' => $valorAPagar,
                        'user_id' => $payerUser->id,
                        'actual_points' => $actualPoints,
                        'last_points' => $imali->points,
                        'win_points' => $points,
                        'transaction_id' => $transaction,
                        'category_id' => $createTransaction->category_id
                    ]);
                    TransactionHistory::create([
                        'user_id' => $res->user_id,
                        'payment_id' => $res->id,
                        'category_id' => $res->category_id,
                        'transaction_type' => 'payment'
                    ]);

                    $saveProfit = $createTransaction->profit()->create([
                        'payer_id' => $payer_id,
                        'payer_account' => $store->account_number,
                        'amount' => $valorAPagar,
                        'amount_credited' => $valorFinal,
                        'comissao' => $taxaDesconto,
                        'profit_id' => $trasactionGeneration->generateTransaction(),
                        'payment_id' => $createTransaction->id,
                    ]);
                    if ($saveProfit) {

//                        $sms = new SendSMSSislog();
//                        $sms->sendSMSToComerciante($createTransaction);


//                        $sms = new SendSMS();
//                        $sms->sendMessageToClientePayment($createTransaction);
//                        $sms->sendMessageToComerciante($createTransaction);
//                    $sms->sendMessageToClientePayment($payerUser);
//                        Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction));
//                        Mail::to($payerUser->email)->send(new Pagamento($createTransaction));


                        $generate = StoreAmountGeneration::query()
                            ->where('id', $request->store_amount_generation_id)
                            ->first();

                        if ($generate) {
                            $generate->update([
                                'status' => 'sucesso',
                                'payment_id' => $createTransaction->id
                            ]);

                            $createTransaction->update([
                                'store_amount_generation_id' => $generate->id
                            ]);
                        }


                        $log = new Record();
                        $log->createLog([
                            'description' => $imali->account_number . ' ' . $store->name,
                            'details' => 'Pagamento Feito com Sucesso',
                            'operation' => 'Payment',
                            'status' => 'Success',
//                            'properties' => $request->all(),
                            'properties' => json_encode($request->except(['pin'])),
                            'user_id' => $request->user()->id
                        ]);

                        $notification = array(
//                            'icon' => 'ic_imali_logo_verde_01',
                            'icon' => 'ic_i_mali_cover',
//                            'icon' => 'ic_i_mali_cover',
                            'title' => 'Pagamento ' . $request->amount . ' MT',
                            'body' => 'Parabéns, ' . ' fez o pagamento de ' . $request->amount . ' MT ' . ' na loja ' . $store->name,
                            'click_action' => 'com.imali.payapp.payment_PAGAR_NOTIFICATION',
//                            'color' => '#008577'
                            'color' => '#ffffff'
                        );

                        $notificationStore = array(
                            'icon' => 'ic_imali_logo_verde_01',
//                            'icon' => 'ic_i_mali_cover',
                            'title' => 'Pagamento ' . $request->amount . ' MT',
//                            'image' => 'https://paytek-africa.com/image/logo.png',
                            'image' => 'https://imali.co.mz/wp-content/uploads/2022/04/iMali-Business-Logo.png',
                            'body' => 'Parabéns, ' . ' recebeu o pagamento de ' . $request->amount . ' MT ' . ' do cliente ' . $user->name,
                            'click_action' => 'mz.co.imali.business.payment_TARGET_NOTIFICATION',
//                            'color' => '#008577'
                            'color' => '#ffffff'
                        );

                        $store = Store::query()->where('account_number', $request->account_number)->first();
                        $category = RamoActivity::find($store->industry_activity);
                        $data = array(
                            'transaction' => $createTransaction->transaction_id,
                            'loja' => $store->name,
                            'name' => $user->name,
                            'loja_account' => $store->account_number,
                            'pontos' => $createTransaction->received_points,
                            'pontos_usados' => $createTransaction->used_points,
                            'amount' => $createTransaction->amount,
                            'amount_debited' => $createTransaction->amount_credited,
                            'amount_credited' => $createTransaction->amount_credited,
                            'account_number' => $imali->account_number,
                            'phone' => $request->user()->phone,
                            'descricao' => $createTransaction->description,
                            'data' => $createTransaction->created_at,
                            'created_at' => $createTransaction->created_at,
                            'estado' => $createTransaction->estado,
                            'comissao' => $createTransaction->comissao,
                            'message_store' => 'Pagamento Recebido Com Sucesso',
                            'message_customer' => 'Pagamento Efectuado Com Sucesso',
                            'logo_category' => $category->logo,
                            'category' => $category->nome,
                            'terminal' => 'firebase'
                        );

//                        $this->pushNotifification($user->firebase_token, $notification, $data);
//
//                        if ($generate) {
//                            $this->pushNotifification($generate->firebase_token, $notificationStore, $data);
//                        }
//
//                        $device = StoreDevice::query()
//                            ->where('store_id', $store->id)
//                            ->where('status', '=', 1)
//                            ->get();
//
//                        foreach ($device as $d) {
//                            $this->pushNotifification($d->firebase_token, $notificationStore, $data);
//                        }

                        // NOTIFY CUSTOMER
                        $this->pushNotifification($user->firebase_token, $notification, $data);


                        $storeConfig = StoreConfig::query()
                            ->where('store_id', '=', $store->id)
                            ->first();

                        if ($storeConfig) {

                            if ($storeConfig->notify == 1) {

                                // NOTIFICAR POR SMS
                                if ($storeConfig->notify_sms == 1) {

//                                        $sms = new SendSMS();
//                                        $sms->sendMessageToClientePayment($createTransaction);
//                                        $sms->sendMessageToComerciante($createTransaction);
//                                        $sms->sendMessageToClientePayment($payerUser);

                                    $this->smsManager->sendSMSToComerciante($createTransaction);
                                }

                                if ($storeConfig->notify_email == 1) {
//                                    Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction));
//                                    Mail::to($payerUser->email)->send(new Pagamento($createTransaction));
                                }

                                if ($storeConfig->notify_push == 1) {

                                    if ($generate) {
                                        $this->pushNotifification($generate->firebase_token, $notificationStore, $data);
                                    } else {

                                        $device = StoreDevice::query()
                                            ->where('store_id', $store->id)
                                            ->where('status', '=', 1)
                                            ->get();

                                        foreach ($device as $d) {
                                            $this->pushNotifification($d->firebase_token, $notificationStore, $data);
                                        }
                                    }

                                }


                            }
                        }

                        return response()->json(['message' => 'Pagamento Feito com Sucesso!',
                            'transaction' => $transaction,
                            'created_at' => $createTransaction->created_at,
                            'duration' => 3000
                        ], 200);
                    }

                }
            }
        }
    }

    public function transferMoney(Request $request)
    {
        $user = User::find($request->user()->id);

        if (Hash::check($request->pin, $user->pin)) {
            $random = new TransactionGeneration();

            $senderUser = User::query()->where('user_id', $request->user()->user_id)->first();
            $sender_id = $senderUser->id;

            $imaliAccountSender = ImaliAccount::query()->where('user_id', $senderUser->id)->first();
            $imaliAccountReceiver = ImaliAccount::query()->where('account_number', $request->account_number)->first();
            $imaliAccountReceiverCount = ImaliAccount::query()->where('account_number', $request->account_number)->count();


            $kyc = ImaliAccount::query()
                ->join('imali_account_configs', 'imali_account_configs.id', '=', 'imali_accounts.imali_account_config')
                ->where('user_id', $senderUser->id)
                ->select('imali_account_configs.*')
                ->first();

            $payments = Payment::query()
                ->where(['sender_id' => $senderUser->id])
                ->whereDate('created_at', date('Y-m-d'))
                ->get();


//        $recevier = User::query()->where('id', $imaliAccountReceiver->user_id)->count();

            if ($imaliAccountReceiverCount > 0) {
                $recevier = User::query()->where('id', $imaliAccountReceiver->user_id)->first();

                $kyc = new Kyc();

                $request->request->add(['id' => $senderUser->id, 'receiver_id' => $recevier->id]);
                $result = $kyc->checkSender($request);

                if ($result) {

                    $log = new Record();
                    $log->createLog([
                        'description' => 'Transfer Money',
                        'details' => $result,
                        'operation' => 'Transfer Money',
                        'status' => 'Error',
                        'origin_ip' => $request->ip(),
                        'properties' => json_encode($request->except(['pin'])),
//                        'properties' => json_encode($request->all()),
                        'origin_request' => $request->url(),
                        'user_id' => $request->user()->id
                    ]);


                    return $result;
                } else {
                    if ($imaliAccountSender) {
                        if ($imaliAccountReceiver->user_id === $imaliAccountSender->user_id) {

//                            $log = new Record();
//                            $log->createLog([
//                                'description' => $imaliAccountSender->account_number,
//                                'details' => 'Não pode Transferir para Si mesmo' . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number,
//                                'operation' => 'Transfer Money',
//                                'status' => 'Error',
//                                'user_id' => $request->user()->id
//                            ]);

                            $log = new Record();
                            $log->createLog([
                                'description' => 'Não pode Transferir para Si mesmo',
                                'details' => 'Não pode Transferir para Si mesmo',
                                'operation' => 'Transfer Money',
                                'properties' => json_encode($request->except(['pin'])),
                                'status' => 'Error',
                                'origin_ip' => $request->ip(),
                                'origin_request' => $request->url(),
                                'user_id' => $request->user()->id
                            ]);


                            return response()->json(['message' => 'Não pode Transferir para si mesmo!', 'class' => 'error'], 400);
                        } elseif ($imaliAccountSender->balance < $request->amount) {


                            $log = new Record();
                            $log->createLog([
                                'description' => 'Saldo insuficiente',
                                'details' => 'Saldo Insuficiente',
                                'operation' => 'Transfer Money',
//                                'properties' => $request->all(),
                                'properties' => json_encode($request->except(['pin'])),
                                'status' => 'Error',
                                'origin_ip' => $request->ip(),
                                'origin_request' => $request->url(),
                                'user_id' => $request->user()->id
                            ]);

                            return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402);
                        } else {

                            $valorAPagar = $request->amount;
                            $points = round($valorAPagar);
                            $imaliAccountConfig = ImaliAccountConfig::find(1);


//                $valorTaxadoTotal = $valorAPagar + $valorAPagar*($imaliAccountConfig->taxa)/100;
                            $valorTaxadoTotal = $valorAPagar + $imaliAccountConfig->taxa;
                            // Payer or Sender Section
                            DB::table('imali_accounts')->where('user_id', $sender_id)->decrement('balance', $valorTaxadoTotal);


                            // Recever User
                            DB::table('imali_accounts')->where('account_number', $imaliAccountReceiver->account_number)->increment('balance', $valorAPagar);

//                $profit = $valorAPagar*$valorAPagar*($imaliAccountConfig->taxa)/100;
                            $profit = $imaliAccountConfig->taxa;

                            $transactionReference = $random->generateTransaction();

                            $transferencia = Transfer::create([
                                'transaction_id' => $transactionReference,
                                'sender_id' => $sender_id,
                                'reciever_id' => $recevier->id,
                                'reciever_name' => $recevier->name,
                                'reciever_account' => $imaliAccountReceiver->account_number,
                                'amount' => $valorAPagar,
                                'description' => $request->description,
                                'comissao' => $profit,
                                'estado_color' => '#388E3C',
                                'estado' => 'Pago',
                                'amount_debited' => $valorTaxadoTotal,
                                'created_at' => now(),
                                'updated_at' => now(),
                                'category_id' => 22
                            ]);

                            TransactionHistory::create([
                                'user_id' => $transferencia->sender_id,
                                'transfer_id' => $transferencia->id,
                                'category_id' => $transferencia->category_id,
                                'transaction_type' => 'transfer'
                            ]);

                            $senderHistory = TransferHistory::create([
                                'transaction_id' => $transactionReference,
                                'user_id' => $senderUser->id,
//                            'account_number' =>$imaliAccountReceiver->account_number,
                                'client_id' => $recevier->id,
                                'amount' => $valorAPagar,
                                'description' => $request->description,
                                'comissao' => $profit,
                                'estado_color' => '#388E3C',
                                'estado' => 'Pago',
                                'user_status' => 'payer',
                                'amount_debited' => $valorTaxadoTotal,
                                'created_at' => now(),
                                'updated_at' => now(),
                                'category_id' => $transferencia->category_id
                            ]);

                            TransactionHistory::create([
                                'user_id' => $senderHistory->user_id,
                                'transfer_history_id' => $senderHistory->id,
                                'category_id' => $senderHistory->category_id,
                                'transaction_type' => 'transfer_history'
                            ]);

                            $receiverHistory = TransferHistory::create([
                                'transaction_id' => $transactionReference,
                                'user_id' => $recevier->id,
//                            'account_number' =>$imaliAccountSender->account_number,
                                'client_id' => $senderUser->id,
                                'amount' => $valorAPagar,
                                'description' => $request->description,
                                'comissao' => 0,
                                'estado_color' => '#388E3C',
                                'estado' => 'Recebido',
                                'user_status' => 'receiver',
                                'amount_debited' => 0,
                                'created_at' => now(),
                                'updated_at' => now(),
                                'category_id' => $transferencia->category_id
                            ]);
                            TransactionHistory::create([
                                'user_id' => $receiverHistory->user_id,
                                'transfer_history_id' => $receiverHistory->id,
                                'category_id' => $receiverHistory->category_id,
                                'transaction_type' => 'transfer_history'
                            ]);

//                $transferencia->paymentHistoric()->create([
//                    'sender_account' =>$imaliAccountSender->account_number,
//                    'sender_name' => $senderUser->name,
//                    'amount_credited' => $valorTaxadoTotal,
//                    'status_user' => 'reciever',
//                    'status' => 'done',
//                    'comissao' => $profit,
//                    'amount' =>$valorAPagar,
//                    'sender_id' => $senderUser->id,
//                    'user_id' => $recevier->id,
//                    'actual_points' =>$recevier->points,
//                    'last_points' =>$recevier->points,
//                    'win_points' => 0,
//                    'transaction_id' =>$transferencia->transaction_id
//                ]);


                            $saveProfit = $transferencia->profit()->create([
                                'payer_id' => $senderUser->id,
                                'payer_account' => $imaliAccountSender->account_number,
                                'amount' => $valorAPagar,
                                'amount_credited' => $valorTaxadoTotal,
                                'comissao' => $profit,
                                'profit_id' => $transactionReference,
                                'payment_id' => $transferencia->id,
                                'transfer_id' => $request->user()->id
                            ]);
//                            $sms = new SendSMS();
//                            $sms->sendSMSTransferSender($transferencia);
//                            $sms->sendSMSTranferReceiver($transferencia);
                            $recevier2 = User::query()->where('id', $imaliAccountReceiver->user_id)->first();


                            $notification = array(
//                                'icon' => 'ic_i_mali_cover',
                                'icon' => 'ic_imali_logo_verde_01',
                                'title' => 'Recebeste ' . $request->amount . ' MT',
                                'body' => 'Parabéns, ' . ' recebeste ' . $request->amount . ' MT ' . ' do ' . $request->user()->name,
                                'click_action' => 'com.imali.payapp.payment_TRANSFER_DETAILS',
//                                'color' => '#008577'
                                'color' => '#ffffff'
                            );

                            $data = array(
                                'transaction' => $receiverHistory->transaction_id,
                                'name' => $request->user()->name,
                                'amount' => (double)$senderHistory->amount,
                                'amount_debited' => (double)$receiverHistory->amount_debited,
//                                'amount_credited' => (double)$receiverHistory->amount_credited,
                                'account_number' => (int)$imaliAccountSender->account_number,
                                'phone' => $request->user()->phone,
                                'description' => $request->description,
                                'data' => $receiverHistory->created_at,
                                'estado' => $receiverHistory->estado,
                                'comissao' => (double)$receiverHistory->comissao,
                                'terminal' => 'firebase'
                            );

                            $this->pushNotifification($recevier2->firebase_token, $notification, $data);

                            if ($request->id_request != 0) {

                                $moneyR = MoneyRequest::query()->where('id', $request->id_request)->first();
                                if ($moneyR) {
                                    $moneyR->update([
                                        'status' => 'sucesso'
                                    ]);
                                }
                            }


                            if ($saveProfit) {
                                $log = new Record();
                                $log->createLog([
                                    'description' => 'SenderAccount: ' . $imaliAccountSender->account_number . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number,
                                    'details' => 'Transferência feita com Sucesso',
                                    'operation' => 'Transfer Money',
//                                    'properties' => $request->all(),
                                    'properties' => json_encode($request->except(['pin'])),
                                    'status' => 'Success',
                                    'origin_ip' => $request->ip(),
                                    'origin_request' => $request->url(),
                                    'user_id' => $request->user()->id
                                ]);


                                return response()->json([
                                    'message' => 'Transferência Feita com Sucesso!',
                                    'transaction' => $transactionReference,
                                    'created_at' => $transferencia->created_at
                                ], 200);
                            }
                        }

                    }
                }

            } else {


                $log = new Record();
                $log->createLog([
                    'description' => 'SenderAccount: ' . $imaliAccountSender->account_number . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number,
                    'details' => 'Conta i.Mali inválida',
                    'operation' => 'Transfer Money',
//                    'properties' => $request->all(),
                    'properties' => json_encode($request->except(['pin'])),
                    'status' => 'Error',
                    'origin_ip' => $request->ip(),
                    'origin_request' => $request->url(),
                    'user_id' => $request->user()->id
                ]);

                return response()->json(['message' => 'Conta i.Mali inválida', 'class' => 'error'], 404);
            }

        } else {
            return response()->json(['message' => 'Pin Incorrecto'], 400);
        }
    }

    public function transferMoney2(Request $request)
    {
//        return $request->fullUrl();
//        return $test;
//        return $request->header();
//        return $request->fullUrl();

//        return $request->url();
//        return Request::ip();
//        return $request->ip();
        $random = new TransactionGeneration();

        $senderUser = User::query()->where('user_id', $request->user()->user_id)->first();
        $sender_id = $senderUser->id;

        $imaliAccountSender = ImaliAccount::query()->where('user_id', $senderUser->id)->first();
        $imaliAccountReceiver = ImaliAccount::query()->where('account_number', $request->account_number)->first();
        $imaliAccountReceiverCount = ImaliAccount::query()->where('account_number', $request->account_number)->count();


        $kyc = ImaliAccount::query()
            ->join('imali_account_configs', 'imali_account_configs.id', '=', 'imali_accounts.imali_account_config')
            ->where('user_id', $senderUser->id)
            ->select('imali_account_configs.*')
            ->first();

        $payments = Payment::query()
            ->where(['sender_id' => $senderUser->id])
            ->whereDate('created_at', date('Y-m-d'))
            ->get();

//        $recevier = User::query()->where('id', $imaliAccountReceiver->user_id)->count();

        if ($imaliAccountReceiverCount > 0) {
            $recevier = User::query()->where('id', $imaliAccountReceiver->user_id)->first();

            $kyc = new Kyc();

            $request->request->add(['id' => $senderUser->id, 'receiver_id' => $recevier->id]);
            $result = $kyc->checkSender($request);

            if ($result) {

                $log = new Record();
                $log->createLog([
                    'description' => 'SenderAccount: ' . $imaliAccountSender->account_number . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number,
                    'details' => $result,
                    'operation' => 'Transfer Money',
//                    'properties' => $request->all(),
                    'properties' => json_encode($request->except(['pin'])),
                    'status' => 'Error',
                    'origin_ip' => $request->ip(),
                    'origin_request' => $request->url(),
                    'user_id' => $request->user()->id
                ]);

                return $result;
            } else {
                if ($imaliAccountSender) {
                    if ($imaliAccountReceiver->user_id === $imaliAccountSender->user_id) {

                        $log = new Record();
                        $log->createLog([
                            'description' => $imaliAccountSender->account_number . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number,
                            'details' => 'Não pode Transferir para Si mesmo',
                            'operation' => 'Transfer Money',
//                            'properties' => $request->all(),
                            'properties' => json_encode($request->except(['pin'])),
                            'status' => 'Error',
                            'origin_ip' => $request->ip(),
                            'origin_request' => $request->url(),
                            'user_id' => $request->user()->id
                        ]);

                        return response()->json(['message' => 'Não pode Transferir para si mesmo!', 'class' => 'error'], 400);
                    } elseif ($imaliAccountSender->balance < $request->amount) {
                        $log = new Record();
                        $log->createLog([
                            'description' => $imaliAccountSender->account_number . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number,
                            'details' => 'Saldo insuficiente',
                            'operation' => 'Transfer Money',
//                            'properties' => $request->all(),
                            'properties' => json_encode($request->except(['pin'])),
                            'status' => 'Error',
                            'origin_ip' => $request->ip(),
                            'origin_request' => $request->url(),
                            'user_id' => $request->user()->id
                        ]);

                        return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402);
                    } else {

                        $valorAPagar = $request->amount;
                        $points = round($valorAPagar);
                        $imaliAccountConfig = ImaliAccountConfig::find(1);


//                $valorTaxadoTotal = $valorAPagar + $valorAPagar*($imaliAccountConfig->taxa)/100;
                        $valorTaxadoTotal = $valorAPagar + $imaliAccountConfig->taxa;
                        // Payer or Sender Section
                        DB::table('imali_accounts')->where('user_id', $sender_id)->decrement('balance', $valorTaxadoTotal);


                        // Recever User
                        DB::table('imali_accounts')->where('account_number', $imaliAccountReceiver->account_number)->increment('balance', $valorAPagar);

//                $profit = $valorAPagar*$valorAPagar*($imaliAccountConfig->taxa)/100;
                        $profit = $imaliAccountConfig->taxa;

                        $transactionReference = $random->generateTransaction();

                        $transferencia = Transfer::create([
                            'transaction_id' => $transactionReference,
                            'sender_id' => $sender_id,
                            'reciever_id' => $recevier->id,
                            'reciever_name' => $recevier->name,
                            'reciever_account' => $imaliAccountReceiver->account_number,
                            'amount' => $valorAPagar,
                            'description' => $request->description,
                            'comissao' => $profit,
                            'estado_color' => '#388E3C',
                            'estado' => 'Pago',
                            'amount_debited' => $valorTaxadoTotal,
                            'created_at' => now(),
                            'updated_at' => now(),
                            'category_id' => 22
                        ]);

                        TransactionHistory::create([
                            'user_id' => $transferencia->sender_id,
                            'transfer_id' => $transferencia->id,
                            'category_id' => $transferencia->category_id,
                            'transaction_type' => 'transfer'
                        ]);

                        $senderHistory = TransferHistory::create([
                            'transaction_id' => $transactionReference,
                            'user_id' => $senderUser->id,
//                            'account_number' =>$imaliAccountReceiver->account_number,
                            'client_id' => $recevier->id,
                            'amount' => $valorAPagar,
                            'description' => $request->description,
                            'comissao' => $profit,
                            'estado_color' => '#388E3C',
                            'estado' => 'Pago',
                            'user_status' => 'payer',
                            'amount_debited' => $valorTaxadoTotal,
                            'created_at' => now(),
                            'updated_at' => now(),
                            'category_id' => $transferencia->category_id
                        ]);
                        TransactionHistory::create([
                            'user_id' => $senderHistory->user_id,
                            'transfer_history_id' => $senderHistory->id,
                            'category_id' => $senderHistory->category_id,
                            'transaction_type' => 'transfer'
                        ]);


                        $receiverHistory = TransferHistory::create([
                            'transaction_id' => $transactionReference,
                            'user_id' => $recevier->id,
//                            'account_number' =>$imaliAccountSender->account_number,
                            'client_id' => $senderUser->id,
                            'amount' => $valorAPagar,
                            'description' => $request->description,
                            'comissao' => 0,
                            'estado_color' => '#388E3C',
                            'estado' => 'Recebido',
                            'user_status' => 'receiver',
                            'amount_debited' => 0,
                            'created_at' => now(),
                            'updated_at' => now(),
                            'category_id' => $transferencia->category_id
                        ]);
                        TransactionHistory::create([
                            'user_id' => $receiverHistory->user_id,
                            'transfer_history_id' => $receiverHistory->id,
                            'category_id' => $receiverHistory->category_id,
                            'transaction_type' => 'transfer'
                        ]);


//                $transferencia->paymentHistoric()->create([
//                    'sender_account' =>$imaliAccountSender->account_number,
//                    'sender_name' => $senderUser->name,
//                    'amount_credited' => $valorTaxadoTotal,
//                    'status_user' => 'reciever',
//                    'status' => 'done',
//                    'comissao' => $profit,
//                    'amount' =>$valorAPagar,
//                    'sender_id' => $senderUser->id,
//                    'user_id' => $recevier->id,
//                    'actual_points' =>$recevier->points,
//                    'last_points' =>$recevier->points,
//                    'win_points' => 0,
//                    'transaction_id' =>$transferencia->transaction_id
//                ]);


                        $saveProfit = $transferencia->profit()->create([
                            'payer_id' => $senderUser->id,
                            'payer_account' => $imaliAccountSender->account_number,
                            'amount' => $valorAPagar,
                            'amount_credited' => $valorTaxadoTotal,
                            'comissao' => $profit,
                            'profit_id' => $transactionReference,
                            'payment_id' => $transferencia->id,
                        ]);
//                            $sms = new SendSMS();
//                            $sms->sendSMSTransferSender($transferencia);
//                            $sms->sendSMSTranferReceiver($transferencia);

                        $recevier2 = User::query()->where('id', $imaliAccountReceiver->user_id)->first();
                        $notification = array(
                            'icon' => 'ic_imali_logo_verde_01',
//                            'icon' => 'ic_i_mali_cover',
                            'title' => 'Recebeste ' . $request->amount . ' MT',
                            'body' => 'Parabéns, ' . ' recebeste ' . $request->amount . ' MT ' . ' do ' . $request->user()->name,
                            'click_action' => 'com.imali.payapp.payment_TRANSFER_DETAILS',
//                            'color' => '#008577'
                            'color' => '#ffffff'
                        );

//                        $data = array(
//                            'transaction' => $receiverHistory->transaction_id,
//                            'name' => $request->user()->name,
//                            'amount' => $receiverHistory->amount,
//                            'amount_debited' => $receiverHistory->amount_debited,
//                            'account_number' => $request->account_number,
//                            'phone' => $request->user()->phone,
//                            'description' => $request->description,
//                            'data' => $receiverHistory->created_at,
//                            'estado' => $receiverHistory->estado,
//                            'comissao' => $receiverHistory->comissao,
//                        );

                        $data = array(
                            'transaction' => $receiverHistory->transaction_id,
                            'name' => $request->user()->name,
                            'amount' => (double)$senderHistory->amount,
                            'amount_debited' => (double)$receiverHistory->amount_debited,
                            'account_number' => (int)$imaliAccountSender->account_number,
                            'phone' => $request->user()->phone,
                            'description' => $request->description,
                            'data' => $receiverHistory->created_at,
                            'estado' => $receiverHistory->estado,
                            'comissao' => (double)$receiverHistory->comissao,
                            'terminal' => 'firebase'
                        );

                        $this->pushNotifification($recevier2->firebase_token, $notification, $data);

                        if ($request->id_request != 0) {

                            $moneyR = MoneyRequest::query()->where('id', $request->id_request)->first();
                            if ($moneyR) {
                                $moneyR->update([
                                    'status' => 'sucesso'
                                ]);
                            }
                        }


                        if ($saveProfit) {

                            $log = new Record();
                            $log->createLog([
                                'description' => $imaliAccountSender->account_number,
                                'details' => 'Transferência feita com Sucesso' . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number,
                                'operation' => 'Transfer Money',
                                'status' => 'Success',
                                'properties' => json_encode($request->except(['pin'])),
                                'user_id' => $request->user()->id
                            ]);


                            $log->createLog([
                                'description' => $imaliAccountSender->account_number . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number,
                                'details' => 'Transferência Feita com Sucesso!',
                                'operation' => 'Transfer Money',
//                                'properties' => $request->all(),
                                'properties' => json_encode($request->except(['pin'])),
                                'status' => 'Sucess',
                                'origin_ip' => $request->ip(),
                                'origin_request' => $request->url(),
                                'user_id' => $request->user()->id
                            ]);


                            return response()->json([
                                'message' => 'Transferência Feita com Sucesso!',
                                'transaction' => $transactionReference,
                                'created_at' => $transferencia->created_at
                            ], 200);
                        }
                    }

                }
            }

        } else {

            $log = new Record();
            $log->createLog([
                'description' => $imaliAccountSender->account_number,
                'details' => 'Conta i.Mali inválida' . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number,
                'operation' => 'Transfer Money',
//                'properties' => $request->all(),
                'properties' => json_encode($request->except(['pin'])),
                'status' => 'Error',
                'user_id' => $request->user()->id
            ]);

            return response()->json(['message' => 'Conta i.Mali inválida', 'class' => 'error'], 404);
        }


    }

    public function getPayments()
    {
        $payments = Payment::query()->join('users', 'users.id', '=', 'payments.sender_id')
            ->join('stores', 'stores.id', 'payments.store_id')
            ->join('imali_accounts', 'imali_accounts.user_id', 'payments.sender_id')
            ->orderBy('payments.created_at', 'desc')
            ->select('payments.*', 'users.name as client_name', 'stores.name as merchant_name', 'stores.account_number as merchant_account', 'imali_accounts.account_number as client_account')
            ->get();

        return response()->json(['data' => $payments], 200);
    }

    public function getMyPayments($id)
    {
        $payments = Payment::query()->join('users', 'users.id', '=', 'payments.sender_id')
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->join('imali_accounts', 'imali_accounts.user_id', 'payments.sender_id')
            ->where('payments.sender_id', $id)
            ->orderBy('payments.created_at', 'desc')
            ->select('payments.*', 'users.name as client_name', 'stores.name as merchant_name', 'stores.account_number as merchant_account', 'imali_accounts.account_number as client_account')
            ->get();

        return response()->json(['data' => $payments], 200);
    }

    public function getMyPayments2(Request $request)
    {
//        $payments = Payment::query()->join('users', 'users.id', '=', 'payments.sender_id')
//            ->join('stores', 'stores.id', 'payments.store_id')
//            ->join('imali_accounts', 'imali_accounts.user_id', 'payments.sender_id')
//            ->where('payments.sender_id', $request->user()->id)
//            ->orderBy('payments.created_at', 'desc')
//            ->select('payments.*', 'users.name as client_name', 'merchant_accounts.name as merchant_name', 'merchant_accounts.account_number as merchant_account', 'imali_accounts.account_number as client_account')
//            ->get();

        $payments = Payment::query()
            ->join('users', 'users.id', '=', 'payments.sender_id')
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->join('imali_accounts', 'imali_accounts.user_id', 'payments.sender_id')
//            ->join('ramo_activities', 'ramo_activities.id', 'payments.store_id')
            ->leftJoin('ramo_activities', 'ramo_activities.id', '=', 'payments.category_id')
            ->where('payments.sender_id', $request->user()->id)
            ->orderBy('payments.created_at', 'desc')
            ->select('payments.*', 'users.name as client_name', 'users.last_name', 'stores.name as merchant_name', 'stores.account_number as merchant_account', 'imali_accounts.account_number as client_account',
                'ramo_activities.nome as category', 'ramo_activities.logo as logo_category')
            ->get();

        return response()->json(['data' => $payments], 200);
    }

    public function getMyPayments3(Request $request)
    {

        $payments = Payment::query()
            ->join('users', 'users.id', '=', 'payments.sender_id')
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->join('imali_accounts', 'imali_accounts.user_id', 'payments.sender_id')
//            ->leftJoin('ramo_activities', 'ramo_activities.id','=', 'payments.store_id')
            ->leftJoin('ramo_activities', 'ramo_activities.id', '=', 'payments.category_id')
//            ->where('payments.sender_id', $request->user()->id)
            ->where('payments.sender_id', '=', 1)
            ->orderBy('payments.created_at', 'desc')
            ->select('payments.*', 'users.name as client_name', 'users.last_name', 'stores.name as merchant_name', 'stores.account_number as merchant_account', 'imali_accounts.account_number as client_account',
                'ramo_activities.nome as category', 'ramo_activities.logo as logo_category')
            ->get();

        return response()->json(['data' => $payments], 200);
    }

    public function getTransferencias()
    {
        $transfers = Transfer::query()->join('users', 'users.id', '=', 'transfers.sender_id')
            ->join('imali_accounts', 'imali_accounts.user_id', 'transfers.sender_id')
            ->orderBy('transfers.created_at', 'desc')
            ->select('transfers.*', 'users.name as sender_name', 'imali_accounts.account_number as sender_account')
            ->get();
        return response()->json(['data' => $transfers], 200);
    }

    public function getMyTransferencias($id)
    {
        $transfers = Transfer::query()->join('users', 'users.id', '=', 'transfers.sender_id')
            ->join('imali_accounts', 'imali_accounts.user_id', 'transfers.sender_id')
            ->where('transfers.sender_id', $id)
            ->orderBy('transfers.created_at', 'desc')
            ->select('transfers.*', 'users.name as sender_name', 'imali_accounts.account_number as sender_account')
            ->get();
        return response()->json(['data' => $transfers], 200);
    }

    public function getCarregamentos()
    {
        $carregamento = ImaliAccount::query()
            ->join('users', 'users.id', 'imali_accounts.user_id')
            ->join('recharge_imali_accounts', 'recharge_imali_accounts.imali_account_id', 'imali_accounts.id')
            ->orderBy('recharge_imali_accounts.created_at', 'desc')
            ->select('users.name as user_name', 'imali_accounts.account_number as user_account', 'recharge_imali_accounts.*')->get();
        return response()->json(['data' => $carregamento], 200);
    }

    public function getMyCarregamentos2($id)
    {
        $carregamento = ImaliAccount::query()
            ->join('users', 'users.id', 'imali_accounts.user_id')
            ->join('recharge_imali_accounts', 'recharge_imali_accounts.imali_account_id', 'imali_accounts.id')
            ->where('users.id', $id)
            ->orderBy('recharge_imali_accounts.created_at', 'desc')
            ->select('users.name as user_name', 'imali_accounts.reference', 'imali_accounts.account_number', 'recharge_imali_accounts.*')->get();
        return response()->json(['data' => $carregamento], 200);

    }

    public function getMyCarregamentos(Request $request)
    {
//        $carregamento = ImaliAccount::query()
//            ->join('users', 'users.id', 'imali_accounts.user_id')
//            ->join('recharge_imali_accounts', 'recharge_imali_accounts.imali_account_id', 'imali_accounts.id')
//            ->where('users.id', auth()->user()->id)
//            ->orderBy('recharge_imali_accounts.created_at', 'desc')
//            ->select('users.name as user_name', 'imali_accounts.account_number as user_account', 'recharge_imali_accounts.*')->get();
//        return response()->json(['data' => $carregamento], 200);
        $carregamento = ImaliAccount::query()
            ->join('users', 'users.id', 'imali_accounts.user_id')
            ->join('recharge_imali_accounts', 'recharge_imali_accounts.imali_account_id', 'imali_accounts.id')
            ->where('users.id', $request->user()->id)
            ->orderBy('recharge_imali_accounts.created_at', 'desc')
            ->select('users.name as user_name', 'users.last_name', 'imali_accounts.reference', 'imali_accounts.account_number', 'recharge_imali_accounts.*')->get();
        return response()->json(['data' => $carregamento], 200);


    }

    public function getTransferenciasHistory($id)
    {
//        $transfers = TransferHistory::query()
//            ->join('users', 'users.id', '=', 'transfer_histories.client_id')
//            ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id')
//            ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id')
//            ->join('imali_accounts as imaliSender', 'imaliSender.user_id','=', 'transfer_histories.user_id')
//            ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id','=', 'transfer_histories.user_id')
//            ->join('imali_accounts', 'imali_accounts.user_id','=', 'transfer_histories.client_id')
//            ->where('transfer_histories.user_id', $id)
////            ->where('transfer_histories.receiver_id', $id)
//            ->orderBy('transfer_histories.created_at', 'desc')
//            ->select(
//                'transfer_histories.*',
//                'sender.name as name_sender',
//                'receiver.name as name_receiver',
//                'imaliSender.account_number as account_sender',
//                'imaliReceiver.account_number as account_receiver',
//                'users.name',
//                'imali_accounts.account_number'
//                )
//            ->get();

        $transfers = TransferHistory::query()
            ->join('users', 'users.id', '=', 'transfer_histories.client_id')
            ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id')
            ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id')
            ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id')
            ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id')
            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id')
            ->where('transfer_histories.user_id', $id)
//            ->where('transfer_histories.receiver_id', $id)
            ->orderBy('transfer_histories.created_at', 'desc')
            ->select(
                'transfer_histories.*',
                'users.name',
                'imali_accounts.account_number'
            )
            ->get();
        return response()->json(['data' => $transfers], 200);
    }

    public function getTransferenciasHistoryData(Request $request)
    {
//        $transfers = TransferHistory::query()
//            ->join('users', 'users.id', '=', 'transfer_histories.client_id')
//            ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id')
//            ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id')
//            ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id')
//            ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id')
//            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id')
//            ->where('transfer_histories.user_id', auth()->user()->id)
////            ->where('transfer_histories.receiver_id', $id)
//            ->orderBy('transfer_histories.created_at', 'desc')
//            ->select(
//                'transfer_histories.*',
//                'users.name',
//                'imali_accounts.account_number'
//            )
//            ->get();
//        return response()->json(['data' => $transfers], 200);

        $transfers = TransferHistory::query()
            ->join('users', 'users.id', '=', 'transfer_histories.client_id')
            ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id')
            ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id')
            ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id')
            ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id')
            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id')
            ->where('transfer_histories.user_id', $request->user()->id)
//            ->where('transfer_histories.receiver_id', $id)
            ->orderBy('transfer_histories.created_at', 'desc')
            ->select(
                'transfer_histories.*',
                'users.name',
                'imali_accounts.account_number',
                'imaliSender.account_number as account_number_sender',
                'sender.name as name_sender',
                'sender.last_name as last_name_sender',
                'users.name as name_receiver',
                'users.last_name as last_name_receiver',
            )
            ->get();
        return response()->json(['data' => $transfers], 200);


    }

    public function getMyVouchers(Request $request)
    {
        $voucher = PurchaseVoucher::query()
            ->join('users', 'users.id', '=', 'purchase_vouchers.user_id')
            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'purchase_vouchers.user_id')
            ->leftJoin('transaction_locations', 'transaction_locations.voucher_id', '=', 'purchase_vouchers.id')
            ->leftJoin('ramo_activities', 'ramo_activities.id', '=', 'purchase_vouchers.category_id')
            ->orderByDesc('purchase_vouchers.created_at')
            ->where('purchase_vouchers.user_id', $request->user()->id)
            ->select('purchase_vouchers.*', 'imali_accounts.account_number', 'users.name', 'users.last_name',
                'transaction_locations.longitude', 'transaction_locations.latitude', 'transaction_locations.country_name',
                'transaction_locations.country_code', 'transaction_locations.admin_area', 'transaction_locations.sub_admin_area',
                'ramo_activities.nome as category')
            ->get();

        return response()->json(['data' => $voucher], 200);
    }

    public function checkReceiver(Request $request)
    {
        $imaliAccountReceiver = ImaliAccount::query()->where('account_number', $request->account_number)->first();

        if ($imaliAccountReceiver) {

            $log = new Record();
            $log->createLog([
                'description' => $request->account_number,
                'details' => 'Conta Verificada com sucesso',
                'operation' => 'Check Receiver or Client',
                'properties' => json_encode($request->all()),
                'status' => 'Success',
                'user_id' => $request->user()->id
            ]);

            return response()->json(['message' => 'Conta existente'], 200);
        } else {

            $log = new Record();
            $log->createLog([
                'description' => $request->account_number,
                'details' => 'Conta i.Mali inválida',
                'operation' => 'Check Receiver or Client',
//                'properties' => $request->all(),
                'properties' => json_encode($request->all()),
                'status' => 'Error',
                'user_id' => $request->user()->id
            ]);

            return response()->json(['message' => 'Conta i.Mali inválida'], 404);
        }
    }

    public function pushNotifification($token, $notification = array(), $data = array())
    {
        $apiKey = 'AAAA8zVzEPQ:APA91bHl_DXB6UGb_6gZlmFnaLTQoANtX_OBjvl3nOy2bSlnFhxedvk6EhGj7cZoIvmlbKeCnqGxXbuyMH_rEPuhRXvuitXzo6Pfl2TMXLar1PlifXqEhYq6tS55UMrY2Kffzj-P_UH-';
        $fields = array('to' => $token, 'notification' => $notification, 'data' => $data);
        $headers = array('Authorization: key=' . $apiKey, 'Content-Type: application/json');
        $url = 'https://fcm.googleapis.com/fcm/send';

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($fields));
        $result = curl_exec($curl);
        curl_close($curl);

        return json_decode($result, true);

    }
}