• File: UserController.php.save
  • Full Path: /var/www/imaliapi/app/Http/Controllers/UserController.php.save
  • Date Modified: 04/15/2024 8:53 PM
  • File size: 71.63 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

namespace App\Http\Controllers;

use App\AmountGenerate;
use App\Bank\MasterAccount;
use App\Bank\Payment;
use App\Classes\GenerateToken;
use App\Classes\CurrentPassword;
use App\Classes\Kyc;
use App\Classes\AuthPIN;
use App\Classes\Record;
use App\Classes\SendSMS;
use App\Classes\SmsManager;
use App\Classes\TransactionGeneration;
use App\Credelec;
use App\Imali\BankConection;
use App\Imali\ImaliAccount;
use App\Imali\RechargeImaliAccount;
use App\PhoneValidation;
use App\PurchaseVoucher;
use App\ReverteImaliAccount;
use App\SendMoneyB2B;
use App\SendMoneyImaliMpesa;
use App\TransferHistory;
use App\User;
use App\Wallet;
use App\WalletFee;
use App\Water;
use App\WithDrawall;
use App\WithdrawalsRequest;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Hash;
use Webpatser\Uuid\Uuid;
use Paymentsds\MPesa\Client;
use Illuminate\Support\Facades\Storage;
use URL;
use File;
use App\AccountDeletionReason;
use App\AccountDeletionRequest;

class UserController extends Controller
{
   protected SmsManager $smsManager;

    public function __construct()
    {
        $this->smsManager = new SmsManager();

	$this->baseUrl = URL::to("/").'/images/avatar/';
        $this->storagePath=public_path().'/images/avatar';
    }

    public function getAccountDeletionRequests(){
      $deletionRequests=AccountDeletionRequest::query()->select('')->limit(10);
      return response()->json(['data'=>$deletionRequests]);
    }

    public function getAccountDeletionReasons(){
      $reasons=AccountDeletionReason::get();
      return response()->json(['data'=>$reasons]);
    }


    public function makeAccountDeletionRequest(Request $request){

    $this->validate($request,[
        'account_number'=>'required',
        'account_deletion_reason_id'=>'required',
        'pin'=>'required',
    ],[
        'account_number.required'=>'Campo account_number obrigatório',
        'pin.required'=>'Campo pin obrigatório',
        'account_deletion_reason_id'=>'Campo account_deletion_reason_id obrigatório!',
    ]);

    $imaliAccount=ImaliAccount::query()->where('account_number',$request->account_number)->first();
    $user=User::query()->where('id',2)->first();
    if(!$imaliAccount) return response()->json(['message'=>'Conta imali inválida!'],400);

    //Verificando se a conta que esta fazendo o pedido é a mesma que esta loggada
    if($request->account_number != $request->user()->imaliAccount->account_number) return response()->json(['message'=>'Conta imali inválida!'],400);

    //Validar PIN
    if(!AuthPIN::validatePIN($request->user()->id,$request->pin,$request->user()->pin)) return response()->json(['message'=>'PIN incorrecto!'],400);
    // a conta não pode ser cancelada com saldo
    if($imaliAccount->balance > 0) return response()->json(['message'=>'Não é possível cancelar a tua conta imali, pois ainda tem saldo disponível.'],400);
    if($imaliAccount->captive_balance > 0) return response()->json(['message'=>'Não é possível cancelar a tua conta imali, pois tens transaçõs por serem concluídas.'],400);

    $imaliaccount_has_adr=AccountDeletionRequest::query()->where('account_number',$request->account_number)->first();

    if($imaliaccount_has_adr) return response()->json(['message'=>'Esta conta '.$request->account_number.', já efectuou um pedido de cancelamento de conta.'],409);

    if($request->account_deletion_reason_id == 8){
                    $this->validate($request,[
                         'commentary_reason'=>'required|min:15',
                     ],[
                        'commentary_reason.required'=>'Campo commentary_reason obrigatório',
                        'commentary_reason.required'=>'Campo commentary_reason tem que ter no mínimo 15 caracteres',
                     ]);
    }

    AccountDeletionRequest::create([
        'account_number'=>$request->account_number,
        'account_deletion_reason_id'=>$request->account_deletion_reason_id,
        'commentary_reason'=>$request->commentary_reason,
    ]);

    $user->status=0;
    $user->is_online=0;
    $user->update();

    return response()->json(['message'=>'Pedido de encerramento de conta foi enviado com sucesso!'],200);

    }

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

        if ($user) {

            if ($user->balance_visibility == false) {
                $user->update(['balance_visibility' => true]);
                return response()->json(['message' => 'Actualizado com Sucesso para Verdadeiro'], 200);
            } else {
                $user->update(['balance_visibility' => false]);
                return response()->json(['message' => 'Actualizado com Sucesso para Falso'], 200);
            }
        } else {

            return response()->json(['message' => 'Utilizador não encontrado'], 400);
        }


    }

    public function validatePin(Request $request)
    {

        $this->validate($request, [
            'pin' => 'required|min:4'
        ]);

        if (Hash::check($request->pin, $request->user()->pin)) {
            return response()->json(['message' => 'ok'], 200);
        } else {
            return response()->json(['message' => 'Pin Incorrecto'], 405);
        }
    }

    public function getMyMonthConsuming(Request $request)
    {
        $currentMonth = date('m');
//        $data = DB::table("items")
//            ->whereRaw('MONTH(created_at) = ?',[$currentMonth])
//            ->get();

//        $data = Item::select('*')
//            ->whereMonth('created_at', Carbon::now()->month)
//            ->get();

        $voucher = PurchaseVoucher::query()
            ->whereRaw('MONTH(created_at) = ?', [$currentMonth])
            ->where('user_id', $request->user()->id)
            ->sum('price');

        $transfer = TransferHistory::query()
            ->whereRaw('MONTH(created_at) = ?', [$currentMonth])
            ->where('user_id', $request->user()->id)
            ->where('user_status', 'payer')
            ->sum('amount');

        $payments = Payment::query()
            ->whereRaw('MONTH(created_at) = ?', [$currentMonth])
            ->where('sender_id', $request->user()->id)
            ->sum('amount');

        $credelec = Credelec::query()
            ->whereRaw('MONTH(created_at) = ?', [$currentMonth])
            ->where('user_id', $request->user()->id)
            ->sum('amount');

        $water = Water::query()
            ->whereRaw('MONTH(created_at) = ?', [$currentMonth])
            ->where('user_id', $request->user()->id)
            ->sum('purchaseValue');


        return response()->json(['water' => $water, 'voucher' => $voucher, 'transfer' => $transfer, 'payments' => $payments, 'credelec' => $credelec]);

    }

    public function getUser()
    {
//        $user = User::query()
//            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'users.id')
//            ->where('users.id', auth()->user()->id)
//            ->select('users.*', 'imali_accounts.account_number', 'imali_accounts.balance', 'imali_accounts.points', 'imali_accounts.account_number', 'imali_accounts.reference')
//            ->first();

        $user = ImaliAccount::query()
            ->join('users', 'imali_accounts.user_id', '=', 'users.id')
            ->join('imali_account_configs', 'imali_accounts.imali_account_config', '=', 'imali_account_configs.id')
            ->where('users.id', auth()->user()->id)
            ->select('users.*', 'imali_accounts.account_number', 'imali_accounts.balance', 'imali_accounts.points', 'imali_accounts.account_number', 'imali_accounts.reference', 'imali_account_configs.nr_transaction', 'imali_account_configs.max_value_operation', 'imali_account_configs.level')
            ->first();

        $user->makeHidden(['id', 'profile', 'password', 'pin', 'firebase_token', 'created_at', 'updated_at'
            , 'phone_reference', 'user_id', 'bi', 'document_id', 'remember_token', 'email_verified_at']);

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

    }

    public function getMyImaliAccount($id)
    {

        $imali = ImaliAccount::query()->where('user_id', $id)->first();
        return response()->json($imali);
    }

    public function rechargeByReference(Request $request)
    {

        $imaliAccount = ImaliAccount::query()->where('reference', $request->reference)->first();
        $transactionString = new TransactionGeneration();

        $user = ImaliAccount::query()->join('users', 'users.id', '=', 'imali_accounts.user_id')
            ->where('users.id', $imaliAccount->user_id)
            ->select('users.*', 'imali_accounts.account_number')
            ->first();

        $kyc = new Kyc();
        $kyckCheck = $kyc->checkRecharge($request);

        if ($kyckCheck) {
            return $kyckCheck;
        } else {
            if ($imaliAccount) {
                $balanceActual = $imaliAccount->balance + $request->amount;

                $masterAccount = MasterAccount::find(2);
                $recharge = RechargeImaliAccount::create([
                    'imali_account_id' => $imaliAccount->id,
                    'transaction_id' => $transactionString->generateTransaction(),
                    'description' => $request->description,
                    'amount' => $request->amount,
                    'last_balance' => $imaliAccount->balance,
                    'balance' => $balanceActual,
                    'recharge_way' => 'Agente i.Mali 0001',
                    'estado' => 'sucesso',
                    'estado_color' => '#388E3C',
                    'master_account_id' => $masterAccount->id
                ]);

                $masterBalance = $masterAccount->balance + $request->amount;

                $masterAccount->update(['balance' => $masterBalance]);

                if ($recharge) {

                    $imaliAccount->update(['balance' => $balanceActual]);

                    $notification = array(
//                        'icon' => 'ic_imali_logo_verde_01',
                        'icon' => 'ic_i_mali_cover',
                        'title' => 'Carregamento ' . $recharge->amount . ' MT',
                        'body' => 'Parabéns, ' . ' carregaste com ' . $recharge->amount . ' MT ' . ' na sua conta ' . $imaliAccount->account_number,
                        'click_action' => 'com.imali.payapp.payment_RECHARGE_DETAILS',
//                            'color' => '#008577'
                        'color' => '#ffffff'
                    );

                    $data = array(
                        'transaction' => $recharge->transaction_id,
                        'name' => $user->name,
                        'description' => $request->description,
                        'amount' => (double)$recharge->amount,
                        'phone' => $user->phone,
                        'reference' => $imaliAccount->reference,
                        'data' => $recharge->created_at,
                        'estado' => $recharge->estado,
			'route' => 'RECHARGE_DETAILS',
                        'recharge_way' => $recharge->recharge_way,
			'account_number' => $user->account_number,
                        'terminal' => 'firebase'
                    );


                    $this->pushNotifification($user->firebase_token, $notification, $data);
                    $this->smsManager->sendSMSForUserRecharge($recharge);
                }

                if ($recharge) {
//                    Mail::to($user->email)->send(new Carregamento($recharge));
                }
                $log = new Record();
                $log->createLog([
                    'description' => $imaliAccount->account_number,
                    'details' => $user->name . ' ' . $user->last_name,
                    'operation' => 'Recharge by Reference',
                    'status' => 'success',
                    'user_id' => $request->user()->id
                ]);

                if ($recharge) {
                    return response()->json(['message' => 'Carregamento, feito com Sucesso'], 200);
                }
            }

            ////////
        }
    }

    public function rechargeByReference2(Request $request)
    {
//        return $request->all();
        foreach ($request->contentData as $requestData) {
            $imaliAccount = ImaliAccount::query()->where('reference', $requestData['payment_reference'])->first();
            $transactionString = new TransactionGeneration();

            if ($imaliAccount) {

                $user = ImaliAccount::query()->join('users', 'users.id', '=', 'imali_accounts.user_id')
                    ->where('users.id', $imaliAccount->user_id)
                    ->select('users.*')
                    ->first();

                $balanceActual = $imaliAccount->balance + $requestData['paid_amount'];

                $masterAccount = MasterAccount::find(2);
                $recharge = RechargeImaliAccount::create([
                    'imali_account_id' => $imaliAccount->id,
                    'transaction_id' => $transactionString->generateTransaction(),
                    'amount' => $requestData['paid_amount'],
                    'bank_date' => $requestData['datetime_of_transaction'],
                    'account_reference' => $requestData['payment_reference'],
                    'last_balance' => $imaliAccount->balance,
                    'balance' => $balanceActual,
                    'recharge_way' => $requestData['terminal_locality'],
                    'estado' => 'sucesso',
                    'estado_color' => '#388E3C',
                    'master_account_id' => $masterAccount->id,
                    'content_id' => $requestData['content_id']
                ]);

                $masterBalance = $masterAccount->balance + $requestData['paid_amount'];

                $masterAccount->update(['balance' => $masterBalance]);

                if ($recharge) {
                    
                    $imaliAccount->update(['balance' => $balanceActual]);

                    $notification = array(
                        'icon' => 'ic_imali_logo_verde_01',
//                        'icon' => 'ic_i_mali_cover',
                        'title' => 'Carregamento ' . $recharge->amount . ' MT',
                        'body' => 'Parabéns, ' . ' carregaste com ' . $recharge->amount . ' MT ' . ' na sua conta ' . $imaliAccount->account_number,
//                        'click_action' => 'com.imali.payapp.payment_TRANSFER_DETAILS',
                        'click_action' => 'com.imali.payapp.payment_RECHARGE_DETAILS',
//                            'color' => '#008577'
                        'color' => '#ffffff'
                    );
                    $data = array(
                        'transaction' => $recharge->transaction_id,
                        'name' => $user->name,
                        'amount' => (double)$recharge->amount,
                        'phone' => $user->phone,
                        'reference' => $imaliAccount->reference,
                        'data' => $recharge->created_at,
                        'estado' => $recharge->estado,
			'route' => 'RECHARGE_DETAILS',
                        'recharge_way' => $recharge->recharge_way,
                        'terminal' => 'firebase'
                    );

                    
		    $this->pushNotifification($user->firebase_token, $notification, $data);
                    $this->smsManager->sendSMSForUserRecharge($recharge);
                    
                }

//                if ($recharge) {
////                    Mail::to($user->email)->send(new Carregamento($recharge));
//                }
//                    $log = new Record();
//                    $log->createLog([
//                        'description' => $imaliAccount->account_number,
//                        'details' => $user->name . ' ' . $user->last_name,
//                        'operation' => 'Recharge by Reference',
//                        'status' => 'success',
//                        'user_id' => $request->user()->id
//                    ]);

                if ($recharge) {
//                    return response()->json(['message' => 'Carregamento, feito com Sucesso'], 200);
                }
            } else {
//                 PendingRecharge::create([
//                     'reference' => $requestData['payment_reference'],
//                     'amount' => $requestData['paid_amount'],
//                     'content_id' => $requestData['content_id']
// //                    'content_id' => $request->content_id
//                 ]);

                $recharge = RechargeImaliAccount::create([
                    'imali_account_id' => 0,
                    'transaction_id' => $transactionString->generateTransaction(),
                    'amount' => $requestData['paid_amount'],
                    'account_reference' => $requestData['payment_reference'],
                    'bank_date' => $requestData['datetime_of_transaction'],
                    'last_balance' => 0,
                    'balance' => 0,
                    'recharge_way' => $requestData['terminal_locality'],
                    'estado' => 'falhou',
                    'estado_color' => '#388E3C',
                    'master_account_id' => 0,
                    'content_id' => $requestData['content_id']
                ]);

//                return response()->json(['message' => 'Referencia inválida'], 400);
            }

//            $kyc = new Kyc();
////            $kyckCheck = $kyc->checkRecharge($request);
//            $kyckCheck = $kyc->checkRechargeByBank($requestData);
//
//            if ($kyckCheck) {
//                return $kyckCheck;
//            } else {
//
//
//            }
        }
        return response()->json(['message' => 'Carregamento, feito com Sucesso'], 200);


    }

    public function rechargeAccount2(Request $request)
    {
        $transactionString = new TransactionGeneration();

        $public_key = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmptSWqV7cGUUJJhUBxsMLonux24u+FoTlrb+4Kgc6092JIszmI1QUoMohaDDXSVueXx6IXwYGsjjWY32HGXj1iQhkALXfObJ4DqXn5h6E8y5/xQYNAyd5bpN5Z8r892B6toGzZQVB7qtebH4apDjmvTi5FGZVjVYxalyyQkj4uQbbRQjgCkubSi45Xl4CGtLqZztsKssWz3mcKncgTnq3DHGYYEYiKq0xIj100LGbnvNz20Sgqmw/cH+Bua4GJsWYLEqf/h/yiMgiBbxFxsnwZl0im5vXDlwKPw+QnO2fscDhxZFAwV06bgG0oEoWm9FnjMsfvwm0rUNYFlZ+TOtCEhmhtFp+Tsx9jPCuOd5h2emGdSKD8A6jtwhNa7oQ8RtLEEqwAn44orENa1ibOkxMiiiFpmmJkwgZPOG/zMCjXIrrhDWTDUOZaPx/lEQoInJoE2i43VN/HTGCCw8dKQAwg0jsEXau5ixD0GUothqvuX3B9taoeoFAIvUPEq35YulprMM7ThdKodSHvhnwKG82dCsodRwY428kg2xM/UjiTENog4B6zzZfPhMxFlOSFX4MnrqkAS+8Jamhy1GgoHkEMrsT5+/ofjCx0HjKbT5NuA2V/lmzgJLl3jIERadLzuTYnKGWxVJcGLkWXlEPYLbiaKzbJb2sYxt+Kt5OxQqC1MCAwEAAQ==";
        $api_host = "api.sandbox.vm.co.mz";
        $api_key = "40dtaa0qj1xcw1rwytyszgq83lp523m0";
        $origin = "*";
        $service_provider_code = "171717";

        $config = new \abdulmueid\mpesa\Config($public_key, $api_host, $api_key, $origin, $service_provider_code, '', '');
        $transaction = new \abdulmueid\mpesa\Transaction($config);
        $msisdn = '258' . $request->phone;
        $amount = $request->amount;
        $reference = 'T12344C';
//        $third_party_reference = '111PA2D';
        $third_party_reference = $transactionString->generateTransaction();

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

        $imaliAccount = ImaliAccount::query()->where('user_id', $user->id)->first();

        if ($imaliAccount) {
            $payment = $transaction->payment($msisdn, $amount, $reference, $third_party_reference);
            if ($payment->getCode() == 'INS-0') {
                if ($imaliAccount) {
                    $balanceActual = $imaliAccount->balance + $request->amount;

                    $masterAccount = MasterAccount::find(1);
                    $recharge = RechargeImaliAccount::create([
                        'imali_account_id' => $imaliAccount->id,
                        'transaction_id' => $transactionString->generateTransaction(),
                        'amount' => $request->amount,
                        'last_balance' => $imaliAccount->balance,
                        'balance' => $balanceActual,
                        'recharge_way' => 'M-pesa' . $request->phone,
                        'estado' => 'sucesso',
                        'estado_color' => '#388E3C',
                        'master_account_id' => $masterAccount->id
                    ]);


                    $masterBalance = $masterAccount->balance + $request->amount;

                    $masterAccount->update(['balance' => $masterBalance]);

                    if ($recharge) {
                        $imaliAccount->update(['balance' => $balanceActual]);

                        $log = new Record();
                        $log->createLog([
                            'description' => $imaliAccount->account_number . '  ' . $user->name . ' ' . $user->last_name,
                            'details' => 'Carregamento, feito com Sucesso',
                            'operation' => 'Recharge by M-pesa',
                            'status' => 'success',
                            'user_id' => $request->user()->id
                        ]);
                        return response()->json(['message' => 'Carregamento, feito com Sucesso', 'code' => ''], 200);
                    }
                }

            }
            if ($payment->getCode() == 'INS-2006') {

                $log = new Record();
                $log->createLog([
                    'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
                    'details' => 'Saldo Insuficiente',
                    'operation' => 'Recharge by M-pesa',
                    'status' => 'Error',
                    'user_id' => $request->user()->id
                ]);

                return response()->json(['message' => 'Saldo Insuficiente'], 422);
            }
            if ($payment->getCode() == 'INS-9') {

                $log = new Record();
                $log->createLog([
                    'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
                    'details' => 'Excedeu o tempo limite de transacção',
                    'operation' => 'Recharge by M-pesa',
                    'status' => 'Error',
                    'user_id' => $request->user()->id
                ]);

                return response()->json(['message' => 'Excedeu o tempo limite de transacção'], 408);
            }
            if ($payment->getCode() == 'INS-9') {

                $log = new Record();
                $log->createLog([
                    'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
                    'details' => 'Valor inválido',
                    'operation' => 'Recharge by M-pesa',
                    'status' => 'Error',
                    'user_id' => $request->user()->id
                ]);

                return response()->json(['message' => 'Valor inválido'], 400);
            }
            if ($payment->getCode() == 'INS-995') {


                $log = new Record();
                $log->createLog([
                    'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
                    'details' => 'Conta Mpesa com Problemas',
                    'operation' => 'Recharge by M-pesa',
                    'status' => 'Error',
                    'user_id' => $request->user()->id
                ]);

                return response()->json(['message' => 'Conta Mpesa com Problemas'], 400);
            }
            if ($payment->getCode() == 'INS-996') {

                $log = new Record();
                $log->createLog([
                    'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
                    'details' => 'Este número nao tem conta Mpesa',
                    'operation' => 'Recharge by M-pesa',
                    'status' => 'Error',
                    'user_id' => $request->user()->id
                ]);

                return response()->json(['message' => 'Este número nao tem conta Mpesa'], 400);
            }
        }


    }

    public function rechargeAccount(Request $request)
    {
        $transactionString = new TransactionGeneration();

        $public_key = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmptSWqV7cGUUJJhUBxsMLonux24u+FoTlrb+4Kgc6092JIszmI1QUoMohaDDXSVueXx6IXwYGsjjWY32HGXj1iQhkALXfObJ4DqXn5h6E8y5/xQYNAyd5bpN5Z8r892B6toGzZQVB7qtebH4apDjmvTi5FGZVjVYxalyyQkj4uQbbRQjgCkubSi45Xl4CGtLqZztsKssWz3mcKncgTnq3DHGYYEYiKq0xIj100LGbnvNz20Sgqmw/cH+Bua4GJsWYLEqf/h/yiMgiBbxFxsnwZl0im5vXDlwKPw+QnO2fscDhxZFAwV06bgG0oEoWm9FnjMsfvwm0rUNYFlZ+TOtCEhmhtFp+Tsx9jPCuOd5h2emGdSKD8A6jtwhNa7oQ8RtLEEqwAn44orENa1ibOkxMiiiFpmmJkwgZPOG/zMCjXIrrhDWTDUOZaPx/lEQoInJoE2i43VN/HTGCCw8dKQAwg0jsEXau5ixD0GUothqvuX3B9taoeoFAIvUPEq35YulprMM7ThdKodSHvhnwKG82dCsodRwY428kg2xM/UjiTENog4B6zzZfPhMxFlOSFX4MnrqkAS+8Jamhy1GgoHkEMrsT5+/ofjCx0HjKbT5NuA2V/lmzgJLl3jIERadLzuTYnKGWxVJcGLkWXlEPYLbiaKzbJb2sYxt+Kt5OxQqC1MCAwEAAQ==";
        $api_host = "api.sandbox.vm.co.mz";
        $api_key = "40dtaa0qj1xcw1rwytyszgq83lp523m0";
        $origin = "*";
        $service_provider_code = "171717";

        $reference = 'T12344C';

        $third_party_reference = $transactionString->generateTransaction();


        $client = new Client([
            'apiKey' => $api_key,             // API Key
            'publicKey' => $public_key,          // Public Key
            'serviceProviderCode' => $service_provider_code // input_ServiceProviderCode
        ]);

        $paymentData = [
//            'from' => '+258845030902',       // input_CustomerMSISDN
            'from' => '258' . $request->phone,       // input_CustomerMSISDN
//            'from' => $request->phone,       // input_CustomerMSISDN
            'reference' => '111PA2D',      // input_ThirdPartyReference
            'transaction' => $third_party_reference, // input_TransactionReference
            'amount' => $request->amount             // input_Amount
        ];


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

        $imaliAccount = ImaliAccount::query()->where('user_id', $user->id)->first();

        if ($imaliAccount) {
//            $payment = $transaction->payment($msisdn, $amount, $reference, $third_party_reference);

//            $results = $client->receive($paymentData);
            $results = $client->receive($paymentData);

            if ($results->success) {
                // Handle success
//                if ($result->getCode() == 'INS-0') {
//                return response()->json($result);
                if ($imaliAccount) {
                    $balanceActual = $imaliAccount->balance + $request->amount;

                    $masterAccount = MasterAccount::find(1);
                    $recharge = RechargeImaliAccount::create([
                        'imali_account_id' => $imaliAccount->id,
                        'transaction_id' => $transactionString->generateTransaction(),
                        'amount' => $request->amount,
                        'last_balance' => $imaliAccount->balance,
                        'balance' => $balanceActual,
                        'recharge_way' => 'M-pesa' . $request->phone,
                        'estado' => 'sucesso',
                        'estado_color' => '#388E3C',
                        'master_account_id' => $masterAccount->id
                    ]);


                    $masterBalance = $masterAccount->balance + $request->amount;

                    $masterAccount->update(['balance' => $masterBalance]);

                    if ($recharge) {
                        $imaliAccount->update(['balance' => $balanceActual]);

                        $log = new Record();
                        $log->createLog([
                            'description' => $imaliAccount->account_number . '  ' . $user->name . ' ' . $user->last_name,
                            'details' => 'Carregamento, feito com Sucesso',
                            'operation' => 'Recharge by M-pesa',
                            'status' => 'success',
                            'user_id' => $request->user()->id
                        ]);

                        return response()->json(['message' => 'Carregamento, feito com Sucesso', 'code' => ''], 200)->header('Content-Type', 'application/json');
                    }
                }

//                }
            } else {
//                return response()->json($result);
                // Handle failure

//                if ($result->getCode() == 'INS-2006') {
//
//                    $log = new Record();
//                    $log->createLog([
//                        'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
//                        'details' => 'Saldo Insuficiente',
//                        'operation' => 'Recharge by M-pesa',
//                        'status' => 'Error',
//                        'user_id' => $request->user()->id
//                    ]);
//
//                    return response()->json(['message' => 'Saldo Insuficiente'], 422);
//                }
//                if ($result->getCode() == 'INS-9') {
//
//                    $log = new Record();
//                    $log->createLog([
//                        'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
//                        'details' => 'Excedeu o tempo limite de transacção',
//                        'operation' => 'Recharge by M-pesa',
//                        'status' => 'Error',
//                        'user_id' => $request->user()->id
//                    ]);
//
//                    return response()->json(['message' => 'Excedeu o tempo limite de transacção'], 408);
//                }
//                if ($result->getCode() == 'INS-9') {
//
//                    $log = new Record();
//                    $log->createLog([
//                        'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
//                        'details' => 'Valor inválido',
//                        'operation' => 'Recharge by M-pesa',
//                        'status' => 'Error',
//                        'user_id' => $request->user()->id
//                    ]);
//
//                    return response()->json(['message' => 'Valor inválido'], 400);
//                }
//                if ($result->getCode() == 'INS-995') {
//
//
//                    $log = new Record();
//                    $log->createLog([
//                        'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
//                        'details' => 'Conta Mpesa com Problemas',
//                        'operation' => 'Recharge by M-pesa',
//                        'status' => 'Error',
//                        'user_id' => $request->user()->id
//                    ]);
//
//                    return response()->json(['message' => 'Conta Mpesa com Problemas'], 400);
//                }
//                if ($result->getCode() == 'INS-996') {
//
//                    $log = new Record();
//                    $log->createLog([
//                        'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
//                        'details' => 'Este número nao tem conta Mpesa',
//                        'operation' => 'Recharge by M-pesa',
//                        'status' => 'Error',
//                        'user_id' => $request->user()->id
//                    ]);
//
//                    return response()->json(['message' => 'Este número nao tem conta Mpesa'], 400);
//                }
            }
        }


    }


    public function bankConnections()
    {
        $banks = BankConection::all();

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

    public function users()
    {
        $users = User::all();
        return response()->json(['data' => $users], 200);
    }



    public function resendCode(Request $request)
    {
        $token = new GenerateToken();

        $data = ['phone' => $request->phone, 'codigo' => $token->generatePhoneNumberCode()];
        
        $this->smsManager->smsVerifyUser($data);
        $validate = PhoneValidation::query()->where('phone', $request->phone)->count();

        if ($validate === 0) {
            $save = PhoneValidation::create([
                'phone' => $request->phone,
                'contry_code' => $request->contry_code,
                'expire_at' => now(),
                'duration' => 5,
                'codigo' => $data['codigo'],
                'is_Validated' => 1
            ]);
            if ($save) {

                $log = new Record();
                $log->createLog([
                    'description' => $request->phone . '  ' . $data['codigo'],
                    'details' => 'Código de Verificação enviado com sucesso!',
                    'operation' => 'Resend Verification code',
                    'status' => 'Success',
                    'user_id' => $request->user()->id
                ]);

                return response()->json(['message' => 'Código de Verificação enviado com sucesso!'], 200);
            }
        } else {
            $validate = PhoneValidation::query()->where('phone', $request->phone)->first();
           $save = $validate->update(['codigo' => $data['codigo']]);
            if ($save) {
                $data = ['phone' => $request->phone, 'codigo' => $validate->codigo];
                return response()->json(['message' => 'Código de Verificação reenviado com sucesso!', 'codigo' => $data['codigo'], 'phone' => $data['phone']], 200);
            }
        }

    }

    public function resendCodeOld(Request $request)
    {
        $token = new GenerateToken();


        $validate = PhoneValidation::query()->where('phone', $request->phone)->count();
        $phoneValidate = PhoneValidation::query()->where('phone', $request->phone)->first();

        if ($validate === 0) {
            $data = ['phone' => $request->phone, 'codigo' => $token->generatePhoneNumberCode()];
            $sms = new  SendSMS();
            $save = PhoneValidation::create([
                'phone' => $request->phone,
                'expire_at' => now(),
                'duration' => 5,
                'codigo' => $data['codigo'],
                'is_Validated' => 1
            ]);
            $sent = $sms->verifyUser($data);
            if ($save) {

                $log = new Record();
                $log->createLog([
                    'description' => $request->phone . '  ' . $data['codigo'],
                    'details' => 'Código de Verificação enviado com sucesso!',
                    'operation' => 'Resend Verification code',
                    'status' => 'Success',
                    'user_id' => $request->user()->id
                ]);

                return response()->json(['message' => 'Código de Verificação enviado com sucesso!'], 200);
            }
        } else {
            $validate = PhoneValidation::query()->where('phone', $request->phone)->first();
//            $save = $validate->update(['codigo' => $data['codigo']]);
            if ($validate) {
                $data = ['phone' => $request->phone, 'codigo' => $validate->phone];
                $sms = new  SendSMS();
                $sms->verifyUser($data);
                return response()->json(['message' => 'Código de Verificação reenviado com sucesso!', 'codigo' => $data['codigo']], 200);
            }
        }

    }


    public function verifyUserNumber(Request $request)
    {
//        $firstReplace= str_replace(' ', '',$request->phone);
//        $request['phone'] = str_replace('-', '',$firstReplace);
        $this->validate($request, [
            'name' => 'required',
            'phone' => 'required|unique:users|min:9',
            'email' => 'required|email|unique:users,email',
            'password' => 'required|min:8|confirmed',
            'bi' => 'required|min:13'
        ], [
            'email.required' => 'O Campo Email é de carácter Obrigatório',
            'email.unique' => 'Este Email já está em uso',
            'phone.required' => 'O Número do celular é obrigatório',
            'phone.unique' => 'O Número do celular já está em uso',
            'phone.min' => 'O Campo Celular deve ter 9 dígitos',
            'name.required' => 'O Campo Nome é obrigatório',
            'bi.required' => 'O campo Bi é Obrigatório',
//            'bi.min'=>'O campo Bi ter 13 dígitos',
            'password.required' => 'O Campo Senha é obrigatório',
            'password.confirmed' => 'Senhas incompatíveis',
            'password.min' => 'A senha deve ter 8 digitos no mínimo'
        ]);

        $token = new GenerateToken();
        $data = ['phone' => $request->phone, 'codigo' => $token->generatePhoneNumberCode()];

        $this->smsManager->smsVerifyUser($data);

        $validate = PhoneValidation::query()->where('phone', '=', $request->phone)->count();

        if ($validate === 0) {
            $save = PhoneValidation::create([
                'phone' => $request->phone,
                'country_code' => $request->country_code,
                'expire_at' => now(),
                'duration' => 2,
                'codigo' => $data['codigo'],
                'is_Validated' => 1
            ]);
            if ($save) {
                return response()->json(['message' => 'Codigo de Verificação enviado com sucesso!'], 200);
            }
        } else {
            $validate = PhoneValidation::query()->where('phone', $request->phone)->first();
            $save = $validate->update(['codigo' => $data['codigo']]);
            if ($save) {
                return response()->json(['message' => 'Codigo de Verificação enviado com sucesso!', 'codigo' => $data['codigo']], 200);
            }
        }
    }

    public function checkCodigo(Request $request)
    {
        try {
            $validate = PhoneValidation::query()->where('phone', $request->phone)->where('codigo', $request->codigo)->count();
            if ($validate > 0) {

                $log = new Record();
                $log->createLog([
                    'description' => $request->phone,
                    'details' => 'Celular Verificado com Successo!',
                    'operation' => 'Check Phone Validation',
                    'status' => 'Success',
                    'user_id' => 1
                ]);
                return response()->json(['message' => 'Celular Verificado com Successo!'], 200);
            } else {

                $log = new Record();
                $log->createLog([
                    'description' => $request->phone,
                    'details' => 'Código inválido',
                    'operation' => 'Check Phone Validation',
                    'status' => 'Error',
                    'user_id' => 1
                ]);

                return response()->json(['message' => 'Código inválido'], 400);
            }
        } catch (Exception $exception) {
            return response()->json($exception);
        }
    }

    public function getUsers()
    {
        return response()->json(['users' => User::all()]);
    }

    public function getImaliAccounts(Request $request)
    {
        $perPage=!!$request->input('per_page')?$request->input('per_page'):10;
        $orderType=$request->input('order_type') === 'ASC'?'ASC':'DESC';
        $orderBy=!!$request->input('order_by') && $request->input('order_by')!=='null'?$request->input('order_by'):'imali_accounts.id';


         $users = User::query()->join('imali_accounts', 'imali_accounts.user_id', '=', 'users.id')
            ->join('imali_account_configs', 'imali_account_configs.id', '=', 'imali_accounts.imali_account_config')
            ->select('imali_accounts.*', 'imali_account_configs.level', 'users.id','users.name','users.last_name','users.name','users.country_code','users.email','users.phone','users.status')
            ->orderBy($orderBy,$orderType)->paginate($perPage);

                $imali = $users->setCollection($users->getCollection()
                    ->transform(function($item) {
                        $item['last_recharge']=$item->imaliAccount->recharges()->orderBy('id','desc')->first();
                        $item['document']= $item->documents()->orderBy('id','desc')->first();
                        return $item;
                }));



            $imali->makeHidden([
               'password',
               'pin',
               'imali_account_config',
               'profile',
               'remember_token',
               'firebase_token'
            ]);

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

    public function updateUserData(Request $request)
    {

        $user = $imali = ImaliAccount::query()
            ->join('users', 'users.id', '=', 'imali_accounts.user_id')
            ->join('imali_account_configs', 'imali_account_configs.id', '=', 'imali_accounts.imali_account_config')
            ->where('users.user_id', $request->user_id)
            ->first();

        if ($user) {

            $u = User::find($user->id);
            $u->update([
                'name' => $request->name,
                'last_name' => $request->last_name,
                'profile' => $request->profile,
                'status' => $request->status,
                'birthday' => $request->birthday,
                'bi' => $request->bi,
            ]);

            $kyc = ImaliAccount::query()->where('user_id', $user->id)->first();
            if ($kyc) {
                $kyc->update([
                    'imali_account_config' => $request->imali_account_config
                ]);
            }
            return response()->json(['message' => 'Dados do Cliente Actualizados com Sucesso!'], 200);
        }
    }

    public function updateUserStatus($account_number)
    {

        $imali = ImaliAccount::query()->where('account_number', $account_number)->first();

	$user = User::findOrFail($imali->user_id);

	$user->status = !$user->status;

	$user->save();

        return response()->json(['message' => 'Estado actualizado com sucesso!'], 200);
    }

    public function updateUserDataMobile(Request $request)
    {
        $user = $request->user();

        if ($user) {

            $update = User::query()
                ->where('id', $user->id)
                ->update([
                    'name' => $request->name,
                    'last_name' => $request->last_name,
                    'bi' => $request->bi,
                    'birthday' => $request->birthday,
                ]);
            if ($update) {
                return response()->json(['message' => 'Dados Actualizados com Sucesso'], 200);
            }
        }
    }

    public function changePassword(Request $request)
    {

        $this->validate($request, [
            'current_password' => ['required', new CurrentPassword()],
//            'new_password' => 'required|min:8|confirmed',
            'new_password' => ['required', 'min:8', 'confirmed'],
            'new_password_confirmation' => 'required|min:8',
        ], [
                'current_password.required' => 'O Campo Senha Actual é Obrigatório',
                'new_password.required' => 'O Campo Nova Senha é Obrigatório',
                'new_password_confirmation.required' => 'O Campo Confirmar Senha é Obrigatório',
                'new_password.confirmed' => 'Senhas incompatíveis',
                'current_password.min' => 'A senha deve ter 8 digitos no mínimo',
                'new_password.min' => 'A senha deve ter 8 digitos no mínimo',
                'new_password_confirmation.min' => 'A senha deve ter 8 digitos no mínimo'
            ]
        );


        if (Hash::check($request->current_password, $request->user()->password)) {

            $request->user()->update([
                'password' => bcrypt($request->new_password)
            ]);

            return response()->json(['message' => 'Senhas Compativeis'], 200);
        } else {
            return response()->json(['message' => 'Senha Antiga Inválida'], 404);
        }

    }

    public function uploadPhoto(Request $request)
    {
        return $request->all();
    }

    public function disableUser($id)
    {
        $user = User::query()->where('user_id', $id)->first();


        if ($user->status === 1) {
            $update = $user->update(['status' => 0]);
            return response()->json(['message' => 'Utilizador Bloqueado com Sucesso'], 200);
        } else {
            return response()->json(['message' => 'Utilizador Activo com Sucesso'], 200);
        }

    }

    public function generateAmount(Request $request)
    {
        $imali = ImaliAccount::query()->where('user_id', $request->user()->id)->first();

        $save = AmountGenerate::create([
            'user_id' => $request->user()->id,
            'transaction' => Uuid::generate()->string,
            'amount' => $request->amount,
            'account_number' => $imali->account_number,
            'qrcode' => '',
            'firebase_token' => $request->firebase_token
        ]);

//        $log = new Record();
//        $log->createLog([
//            'description' => $save->account_number . ' ' . $save->amount . ' ' . $save->transaction,
//            'details' => 'Codigo gerado com Sucesso',
//            'operation' => 'Generate Amount to Receiver By Qrcode',
//            'status' => 'Success',
//            'user_id' => $request->user()->id
//        ]);

        return response()->json(['message' => 'Codigo gerado com Sucesso', 'transaction' => $save->transaction, 'account_number' => $save->account_number, 'amount' => $save->amount], 200);
    }

    public function getClientDataForPayment($transaction)
    {

        $client = AmountGenerate::query()
            ->join('users', 'users.id', '=', 'amount_generates.user_id')
            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'amount_generates.user_id')
            ->where('amount_generates.transaction', $transaction)
//            ->select('amount_generates.amount','amount_generates.transaction', 'users.name', 'imali_accounts.account_number')
            ->select('amount_generates.amount', 'users.name', 'imali_accounts.account_number')
//            ->select('amount_generates.*', 'users.name', 'imali_accounts.account_number')
            ->first();


        if ($client) {
            return response()->json($client, 200);
        } else {

            $user = ImaliAccount::query()
                ->join('users', 'users.id', '=', 'imali_accounts.user_id')
//            ->join('recharge_imali_accounts', 'recharge_imali_accounts.imali_account_id', '=', 'imali_accounts.id')
                ->where('imali_accounts.account_number', $transaction)
                ->select('users.name', 'imali_accounts.account_number')
                ->first();

            return response()->json($user, 200);
        }


    }

    public function getClientAccount($aacount)
    {

        $client = AmountGenerate::query()
            ->join('users', 'users.id', '=', 'amount_generates.user_id')
            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'amount_generates.user_id')
            ->where('amount_generates.transaction', $aacount)
//            ->select('amount_generates.amount','amount_generates.transaction', 'users.name', 'imali_accounts.account_number')
            ->select('amount_generates.amount', 'users.name', 'imali_accounts.account_number')
//            ->select('amount_generates.*', 'users.name', 'imali_accounts.account_number')
            ->first();

        return response()->json($client, 200);

    }

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

        if (Hash::check($request->pin, $user->pin)) {
            return response()->json(['message' => 'Pin Verificado'], 201);
        } else {
            return response()->json(['message' => 'Pin Incorrecto'], 400);
        }

    }

    public function getBalance(Request $request)
    {
//        return $request->all();
        $imali = ImaliAccount::query()
            ->join('users', 'users.id', '=', 'imali_accounts.user_id')
            ->where('users.phone', $request->phone)
            ->first();

        if ($imali) {
            return response()->json($imali);
        } else {
            return response()->json(['message' => 'Conta invalida']);
        }
    }

    public function updateFirebaseToken(Request $request)
    {

    }

    public function reverteTransaction(Request $request)
    {
        $transactionString = new TransactionGeneration();

        $public_key = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmptSWqV7cGUUJJhUBxsMLonux24u+FoTlrb+4Kgc6092JIszmI1QUoMohaDDXSVueXx6IXwYGsjjWY32HGXj1iQhkALXfObJ4DqXn5h6E8y5/xQYNAyd5bpN5Z8r892B6toGzZQVB7qtebH4apDjmvTi5FGZVjVYxalyyQkj4uQbbRQjgCkubSi45Xl4CGtLqZztsKssWz3mcKncgTnq3DHGYYEYiKq0xIj100LGbnvNz20Sgqmw/cH+Bua4GJsWYLEqf/h/yiMgiBbxFxsnwZl0im5vXDlwKPw+QnO2fscDhxZFAwV06bgG0oEoWm9FnjMsfvwm0rUNYFlZ+TOtCEhmhtFp+Tsx9jPCuOd5h2emGdSKD8A6jtwhNa7oQ8RtLEEqwAn44orENa1ibOkxMiiiFpmmJkwgZPOG/zMCjXIrrhDWTDUOZaPx/lEQoInJoE2i43VN/HTGCCw8dKQAwg0jsEXau5ixD0GUothqvuX3B9taoeoFAIvUPEq35YulprMM7ThdKodSHvhnwKG82dCsodRwY428kg2xM/UjiTENog4B6zzZfPhMxFlOSFX4MnrqkAS+8Jamhy1GgoHkEMrsT5+/ofjCx0HjKbT5NuA2V/lmzgJLl3jIERadLzuTYnKGWxVJcGLkWXlEPYLbiaKzbJb2sYxt+Kt5OxQqC1MCAwEAAQ==";
        $api_host = "api.sandbox.vm.co.mz";
        $api_key = "40dtaa0qj1xcw1rwytyszgq83lp523m0";
        $origin = "*";
        $service_provider_code = "171717";
        $reference = 'T12344C';


        $client = new Client([
            'apiKey' => $api_key,             // API Key
            'publicKey' => $public_key,          // Public Key
            'serviceProviderCode' => $service_provider_code // input_ServiceProviderCode
        ]);

        $transaction = RechargeImaliAccount::query()
            ->where('id', $request->id)
            ->where('transaction_id', $request->transaction)
            ->where('imali_account_id', $request->imali_account_id)
            ->first();

        $paymentData = [
            'reference' => 'T12344C',      // input_ThirdPartyReference
            'transaction' => $transaction->transaction_id, // input_TransactionReference
            'amount' => $transaction->amount             // input_Amount
        ];
        $transactionString = new TransactionGeneration();

        if ($transaction) {

            $results = $client->revert($paymentData);

            if ($results->success) {


                ReverteImaliAccount::create([
                    'transaction' => $transactionString->generateTransaction(),
                    'user_id' => $request->user()->id,
                    'imali_account_id' => $transaction->imali_account_id,
                    'recharge_imali_account_id' => $transaction->id
                ]);

                return response()->json(['message' => 'Transacção revertida com Sucesso'], 200);

            }
        }
    }

    public function sendMoneyImaliMpesa(Request $request)
    {
        $transactionString = new TransactionGeneration();

        $public_key = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmptSWqV7cGUUJJhUBxsMLonux24u+FoTlrb+4Kgc6092JIszmI1QUoMohaDDXSVueXx6IXwYGsjjWY32HGXj1iQhkALXfObJ4DqXn5h6E8y5/xQYNAyd5bpN5Z8r892B6toGzZQVB7qtebH4apDjmvTi5FGZVjVYxalyyQkj4uQbbRQjgCkubSi45Xl4CGtLqZztsKssWz3mcKncgTnq3DHGYYEYiKq0xIj100LGbnvNz20Sgqmw/cH+Bua4GJsWYLEqf/h/yiMgiBbxFxsnwZl0im5vXDlwKPw+QnO2fscDhxZFAwV06bgG0oEoWm9FnjMsfvwm0rUNYFlZ+TOtCEhmhtFp+Tsx9jPCuOd5h2emGdSKD8A6jtwhNa7oQ8RtLEEqwAn44orENa1ibOkxMiiiFpmmJkwgZPOG/zMCjXIrrhDWTDUOZaPx/lEQoInJoE2i43VN/HTGCCw8dKQAwg0jsEXau5ixD0GUothqvuX3B9taoeoFAIvUPEq35YulprMM7ThdKodSHvhnwKG82dCsodRwY428kg2xM/UjiTENog4B6zzZfPhMxFlOSFX4MnrqkAS+8Jamhy1GgoHkEMrsT5+/ofjCx0HjKbT5NuA2V/lmzgJLl3jIERadLzuTYnKGWxVJcGLkWXlEPYLbiaKzbJb2sYxt+Kt5OxQqC1MCAwEAAQ==";
        $api_host = "api.sandbox.vm.co.mz";
        $api_key = "40dtaa0qj1xcw1rwytyszgq83lp523m0";
        $origin = "*";
        $service_provider_code = "171717";

        $reference = 'T12344C';

        $third_party_reference = $transactionString->generateTransaction();


        $client = new Client([
            'apiKey' => $api_key,             // API Key
            'publicKey' => $public_key,          // Public Key
            'serviceProviderCode' => $service_provider_code // input_ServiceProviderCode
        ]);


        $paymentData = [
            'to' => '258' . $request->phone,         // input_CustomerMSISDN
            'reference' => 'T12344C',      // input_ThirdPartyReference
            'transaction' => $third_party_reference, // input_TransactionReference
            'amount' => $request->amount             // input_Amount
        ];


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

//        $imaliAccount = ImaliAccount::query()->where('user_id', $user->id)->first();
        $imaliAccount = ImaliAccount::query()->where('user_id', $request->user_id)->first();

        $total = ($request->amount + $request->amount * 0.3);

        if ($imaliAccount->balance >= $total) {

            $results = $client->send($paymentData);

            if ($results->success) {

                SendMoneyImaliMpesa::create([
                    'transaction' => $third_party_reference,
                    'fee' => ($request->amount * 0.3),
                    'fee_type' => '3%',
                    'amount' => $request->amount,
                    'imali_account' => $request->imali_account,
                    'admin_id' => $request->admin_id,
                    'user_id' => $request->user_id,
                    'phone' => $request->phone
                ]);
//                dd($results);

                return response()->json(['message' => 'Transacção ' . $results->data['transaction'] . ' efectuada com Sucesso'], 200);
            }

        }


    }


    public function sendMoneyB2B(Request $request)
    {
        $transactionString = new TransactionGeneration();

        $public_key = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmptSWqV7cGUUJJhUBxsMLonux24u+FoTlrb+4Kgc6092JIszmI1QUoMohaDDXSVueXx6IXwYGsjjWY32HGXj1iQhkALXfObJ4DqXn5h6E8y5/xQYNAyd5bpN5Z8r892B6toGzZQVB7qtebH4apDjmvTi5FGZVjVYxalyyQkj4uQbbRQjgCkubSi45Xl4CGtLqZztsKssWz3mcKncgTnq3DHGYYEYiKq0xIj100LGbnvNz20Sgqmw/cH+Bua4GJsWYLEqf/h/yiMgiBbxFxsnwZl0im5vXDlwKPw+QnO2fscDhxZFAwV06bgG0oEoWm9FnjMsfvwm0rUNYFlZ+TOtCEhmhtFp+Tsx9jPCuOd5h2emGdSKD8A6jtwhNa7oQ8RtLEEqwAn44orENa1ibOkxMiiiFpmmJkwgZPOG/zMCjXIrrhDWTDUOZaPx/lEQoInJoE2i43VN/HTGCCw8dKQAwg0jsEXau5ixD0GUothqvuX3B9taoeoFAIvUPEq35YulprMM7ThdKodSHvhnwKG82dCsodRwY428kg2xM/UjiTENog4B6zzZfPhMxFlOSFX4MnrqkAS+8Jamhy1GgoHkEMrsT5+/ofjCx0HjKbT5NuA2V/lmzgJLl3jIERadLzuTYnKGWxVJcGLkWXlEPYLbiaKzbJb2sYxt+Kt5OxQqC1MCAwEAAQ==";
        $api_host = "api.sandbox.vm.co.mz";
        $api_key = "40dtaa0qj1xcw1rwytyszgq83lp523m0";
        $origin = "*";
        $service_provider_code = "171717";

        $reference = 'T12344C';

        $third_party_reference = $transactionString->generateTransaction();


        $client = new Client([
            'apiKey' => $api_key,             // API Key
            'publicKey' => $public_key,          // Public Key
            'serviceProviderCode' => $service_provider_code // input_ServiceProviderCode
        ]);

//        979797

        $paymentData = [
            'to' => $request->entity,        // input_ReceiverPartyCode
            'reference' => '111PA2D',      // input_ThirdPartyReference
            'transaction' => $third_party_reference, // input_TransactionReference
            'amount' => $request->amount           // input_Amount
        ];


        $results = $client->send($paymentData);

        if ($results->success) {

            SendMoneyB2B::create([
                'entity' => $request->entity,
                'amount' => $request->amount,
                'admin_id' => $request->user()->id,
                'transaction' => $third_party_reference,
            ]);
        }

        return response()->json(['message' => 'Transacção efectuada com Sucesso'], 200);


    }

    public function sendSMS(Request $request)
    {
        $data = [$request->phone];
        $sms = new  SendSMS();
        $sent = $sms->sendMessageTest($data);

        return response($sent);

    }

    public function getContacts()
    {
        $contacts = User::query()->value('phone');
        return response()->json(['data' => $contacts]);
    }

// NOVO CODIGO UPLOAD IMAGE
	# actualizar no server
    public function imageCompress($image, $newImageName, $imgDefaultRatio){
        $image = \Image::make(file_get_contents($image));
        $image->save($this->storagePath.'/'.$newImageName, $imgDefaultRatio);
    }

    #actualizar no server
    public function imageUpload($image, $newImageName){
        $image->move($this->storagePath, $newImageName);
    }

    
    # actualizar no server
    public function generateImageUrl(Request $request,$imageAttr){

        if($request->hasFile($imageAttr) && $request->file($imageAttr)->isValid()){

           // Validar imagem
            $this->validate($request, [
                $imageAttr => 'mimes:jpeg,jpg,png|max:4096'
            ],
            [
                'photo.required' => 'O campo photo é Obrigatório',
                'photo.mimes' => 'Formato de imagem invalido, formatos permitidos jpeg,jpg,png',
                'photo.max' => 'O tamanho de imagem permitido somente abaixo de 4 MB',
            ]);

            //fazer o upload
            $image=$request[$imageAttr];

            $newImageName=time().$image->getClientOriginalName();

            //verificar size
            $imageSizeMB = round($request->file($imageAttr)->getSize()/(1024*1024),2);
            
            // Diminuir tamanho..
            if($imageSizeMB >= 1){

                $imgDefaultRatio = 65;

                if($imageSizeMB >= 3){
                    $imgDefaultRatio = 35;
                }

                //comprimir e fazer upload
                $this->imageCompress($image, $newImageName, $imgDefaultRatio);

            } else {
                $this->imageUpload($image, $newImageName);
            }

            return  $this->baseUrl.$newImageName;

        } else {

            $exploded = explode(',', $request[$imageAttr]);
            $decoded = base64_decode($exploded[$this->is_string_encoded($request[$imageAttr])?0:1],True);
    
            $f = finfo_open();
            $mime_type = finfo_buffer($f, $decoded, FILEINFO_MIME_TYPE);
    
            $valiExtension = ['jpeg', 'jpg', 'png'];
            $imageExtention = substr($mime_type, 6, strlen($mime_type));
    
            if(!in_array($imageExtention, $valiExtension)) return response()->json(['message'=>"Formato de imagem invalido, formatos permitidos jpeg,jpg,png"], 400);
    
            if($this->getImageSizeMB($decoded) > 4 ) return response()->json(['message'=>"O tamanho de imagem permitido somente abaixo de 4 MB"], 400);
    
    
//            if (base64_encode($decoded) !== $exploded[$this->is_string_encoded($request[$imageAttr])?0:1]) return response()->json(['message' => 'Imagem invalida.'],400);
    
            //faz o upload temporario no storage - by Rodrigues Mafumo
            $tempFileName = $imageAttr.'.jpg';
    
            if(Storage::put($tempFileName, $decoded)){
                $path  = storage_path('app/').$tempFileName;  
                $tempFile = new \Symfony\Component\HttpFoundation\File\File($path);
                $file = UploadedFile::createFromBase(new  UploadedFile($tempFile->getPathname(),$tempFileName,$tempFile->getMimeType(),null,true));
                $newRequest = new Request();
                $newRequest->files->set($imageAttr,$file);
                return $this->generateImageUrl($newRequest,$imageAttr);
            }
            
        }

    }

    #server
    private function getImageSizeMB($imagebase64){
        $size_in_bytes = (int) (strlen(rtrim($imagebase64, '=')) * 1);
        $size_in_kb    = $size_in_bytes / 1024;
        $size_in_mb    = round($size_in_kb / 1024,2);
        return $size_in_mb;
    }

    #server
    public function updateAvatar(Request $request){

        $user = User::find($request->user()->id);
        
        $posicao = strpos($user->photo, 'avatar') + 7;
        //? Retorna a posicao do avatar
        $imageName = substr($user->photo, $posicao, strlen($user->photo));

        File::delete(public_path('/images/avatar/'.$imageName));

	$photo = $this->generateImageUrl($request,'photo');
        if(!is_string($photo)) return $photo;
        $user->photo = $photo;

        $user->update();

        return response()->json(['message' => 'Avatar Actualizado com Sucesso']);
    }


    #server
   // Check if there are valid base64 characters
    function is_string_encoded($s){
        return !startsWith("data:image/", $s);
    }

//FIM UPLOAD IMAGE


    public function getMyCredelec(Request $request)
    {

        $credelec = Credelec::query()
            ->where('user_id', $request->user()->id)
            ->orderByDesc('created_at')
            ->get();

        return response()->json(['data' => $credelec]);
    }

    public function getMyWater(Request $request)
    {

        $credelec = Water::query()
            ->where('user_id', $request->user()->id)
            ->orderByDesc('created_at')
            ->get();

        return response()->json(['data' => $credelec]);
    }

    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);

    }


	//? Check User Name
    public function checkUserName(Request $request){

        $regex = "/^[a-zA-Z0-9]+(_{0,1})[a-zA-Z0-9]*$/";

        if(!preg_match($regex, $request->username)) return response()->json(['message'=> 'Username inválido, caracteres permitidos [ a-z ou A-Z ou 0-9 ou _ ]'], 400);

        $user = User::query()->where('username', $request->username)->first();

        if($user) return response()->json(['message'=> 'Username já esta em uso'], 409);
        return response()->json(['message'=> 'Username disponivel'], 200);
    }


	//? Check Phone
    public function checkUserPhone(Request $request){

       // $regex = "/^[0-9]+$/";
	$regex = "/^(82|83|84|85|86|87)+[0-9]{7,7}$/";

        if(!preg_match($regex, $request->phone)) return response()->json(['message'=> 'Numero de telefone inválido'], 400);

        $user = User::query()->where('phone', $request->phone)->first();

        if($user) return response()->json(['message'=> 'Numero de telefone já esta em uso'], 409);
        return response()->json(['message'=> 'Numero de telefone disponivel'], 200);
    }


    //? Check Email
    public function checkUserEmail(Request $request){

	$this->validate($request, [
            'email' => 'required'
        ],
        [
            'email.required' => 'O campo email é Obrigatório',
        ]);

        // $regex = "/^[a-zA-Z0-9]+(_{0,1})[a-zA-Z0-9]*$/";
        // $regex = "/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/";
        $regex = "/^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i";

        if(!preg_match($regex, $request->email)) return response()->json(['message'=> 'Email inválido'], 400);

        $user = User::query()->where('email', $request->email)->first();

        if($user) return response()->json(['message'=> 'Email já esta em uso'], 409);
        return response()->json(['message'=> 'Email disponivel'], 200);
    }



    //? Update Username 
    public function updateUsername(Request $request)
    {
        // Validar imagem
        $this->validate($request, [
            'username' => 'required|max:15'
        ],
        [
            'username.required' => 'O campo username é obrigatório',
        ]);

        $regex = "/^[a-zA-Z0-9]+(_{0,1})[a-zA-Z0-9]*$/";

        if(!preg_match($regex, $request->username)) return response()->json(['message'=> 'Username inválido, caracteres permitidos [ a-z ou A-Z ou 0-9 ou _ ]'], 400);

        $user = User::query()->where('username', $request->username)->first();

        if($user) return response()->json(['message'=> 'Username já esta em uso'], 409);
        // return response()->json(['message'=> 'Username disponivel'], 200);

        $user = $request->user();

        if ($user) {

            $update = User::query()
                ->where('id', $user->id)
                ->update([
                    'username' => $request->username
                ]);
            if ($update) {
                return response()->json(['message' => 'Username actualizado com Sucesso'], 200);
            }
        }
    }

    public function walletCSV(){
        return Excel::download(new Wallet, 'wallet.csv');
    }



    public function createWithDrawalls(Request $request){

        $this->validate($request, [
            'account_type' => 'required',
            'amount' => 'required',
            // 'fee' => 'required',
            'description' => 'required',
            'phone' => 'required',
            // 'nib' => 'required',
            'wallets_id' => 'required',
            // 'total' => 'required',
            'transaction_id' => 'required',
            'commission' => 'required',
        ],
    );
       
       $imali2 = ImaliAccount::query()->where('user_id', auth('api')->user()->id)->first();

        $imali = ImaliAccount::query()->where('user_id', auth('api')->user()->id)->first();

        $wallets = Wallet::query()
            ->select('wallets.*')
            ->get();

        $walletsFee = WalletFee::query()
            ->where('wallets_id', $request->wallets_id)
            ->where('min_amount', '<=', $request->amount)
            ->where('max_amount', '>=', $request->amount)
            ->first();

            if(!$walletsFee) return response()->json(['message' => 'Montante invalido'], 400);

            // return $walletsFee;

        $total = $request->amount + $walletsFee->fee;

        $imali->balance = $imali->balance - $total;

        $imali->captive_balance = $total;

        $imali->update();

        $account_number = 0;

        if($request->account_type === 'client'){
            $account_number = ImaliAccount::query()
            ->where('imali_accounts.user_id', auth('api')->user()->id)
            ->select('imali_accounts.balance', 'imali_accounts.account_number', 'imali_accounts.user_id')
            ->first()->account_number;

        } else {

            $account_number = Store::query()
            ->where('stores.id', auth('store-api')->user()->id)
            ->select('stores.account_number')
            ->first()->account_number;
        }
        

        $withdrawalls = WithdrawalsRequest::create([
            'imali_account' => $account_number,
            // 'account_type' => $request->account_type,
            'amount' => $request->amount,
            'fee' => $walletsFee->fee,
            'description' => $request->description,
            'phone' => $request->phone,
            'nib' => $request->nib,
            'wallets_id' => $request->wallets_id,
            'status' => 'new',

            'old_balance' => $imali2->balance,
            'new_balance' => $imali->balance,

            'total' => $total,
            'transaction_id' => $request->transaction_id,
            'commission' => $request->commission,
            'user_id' => $imali->user_id,
            'imali_account_id' => $imali->id            
        ]);

        //? -----------------INICIO---------------------

        $data = new \App\Exports\WalletExport();

        $date = date('Y') . date('m') . date('d');
        $hours = date('H') . date('i') . date('s');
        $fileName = "Transac_iMali_". $date . "-" . $hours  . '.csv';
    
        file_put_contents(storage_path('/app/template/'.$fileName),file_get_contents(storage_path('/app/template/template.csv')));
    
        $file = fopen(storage_path('/app/template/'.$fileName), 'a') or die('unable to open file');
    
        foreach ($data->collection() as $key => $value) {
            $text = $value['value'.$key]."\n";
            fwrite($file, $text);
        }
    
        fclose($file);
    
        rename(storage_path('/app/template/'.$fileName), storage_path('/app/downloads/'.$fileName));
    
        $filePath = "/downloads/".$fileName;
        $uploadPath = storage_path('app'.$filePath);
    
        if(count($data->collection()) === 0) return print("No data found!");
    
        $filePath=str_replace('\\','/',$uploadPath);

         //ENCRIPTAR FICHEIRO
    $commands = explode(",","gpg --homedir /home/paytek/.gnupg --recipient lourino.junior@mozabanco.co.mz --encrypt ". $filePath. ","."mv ".$filePath.".gpg"." /var/sftp/uploads_mozabanco/imali_transac_files/".$fileName.".gpg");

    foreach($commands AS $command) {
        exec($command,$output,$returnDir);
        if ($returnDir === 0) {
              echo 'Command executed successfully!';
        } else {
              echo 'Command execution failed.';
        }
      }
   
   
       //? actualizar os dados para pending..
       foreach ($data->collection() as $key => $value) {
   
           $transacData = explode(",",$value['value'.$key]);
   
           $phoneOrnib=$transacData[0];
   
           $phoneOrnibLength = strlen($phoneOrnib);
   
           if($phoneOrnibLength == 9){
             \App\WithdrawalsRequest::query()
               ->where('phone', $phoneOrnib)
               ->where('status', 'new')
               ->update(['status'=>'pending']);
           }else if($phoneOrnibLength == 21){
              \App\WithdrawalsRequest::query()
               ->where('nib', $phoneOrnib)
               ->where('status', 'new')
               ->update(['status'=>'pending']);
           }
   
       }
   
    //  return "Done.";

        //? ----------------  -FIM---------------------

        if($withdrawalls){

            return response()->json(['message' => 'Transferencia registada com sucesso!'], 200);

        } 
        
        // else {
            
        //     return response()->json(['message' => 'Erro...'], 400);
        // }

    }

}