• File: TopUpController.php
  • Full Path: /var/www/imaliapi/app/Http/Controllers/TopUpController.php
  • Date Modified: 12/19/2025 4:06 PM
  • File size: 184.78 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

namespace App\Http\Controllers;

use App\Classes\Kyc;
use App\Classes\Record;
use App\Classes\SendSMS;
use App\Classes\SendSMSSislog;
use App\Classes\SmsManager;
use App\Classes\TransactionGeneration;
use App\CloseTopUp;
use App\Contador;
use App\ContaWater;
use App\Credelec;
use App\GeneralAdvice;
use App\Imali\ImaliAccount;
use App\Imali\RamoActivity;
use App\PurchaseVoucher;
use App\TransactionHistory;
use App\TransactionLocation;
use App\User;
use App\VoucherHistory;
use App\VoucherList;
use App\VoucherType;
use App\Water;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use SoapClient;
use SoapFault;
use DB;
use Illuminate\Support\Facades\Log;

class TopUpController extends Controller
{

    protected $username;
    protected $password;
    protected $topUpUrl;
    protected $isTest;
    protected $terminalChannel;
    protected $terminalCompanyName;
    protected $terminalCompanyOprator;
    protected $terminalCityName;
    protected $msid;

    protected $client;
    protected SmsManager $smsManager;

    public function __construct()
    {

        if (env('APP_ENV') == 'production') {
            //         PRODUCTION
            $this->username = env('TOPUP_USERNAME');
            $this->password = env('TOPUP_PASSWORD');
            $this->topUpUrl = env('TOPUP_URL');
            $this->isTest = env('IS_TEST');
        } else {
            //         DEV | Staging
            $this->username = env('TOPUP_TEST_USERNAME');
            $this->password = env('TOPUP_TEST_PASSWORD');
            $this->topUpUrl = env('TOPUP_TEST_URL');
            $this->isTest = env('IS_TEST');
        }

        $this->terminalChannel = env('TOPUP_TERMINAL_CHANNEL');
        $this->terminalCompanyName = env('TOPUP_TERMINAL_COMPANY_NAME');
        $this->terminalCompanyOprator = env('TOPUP_TERMINAL_COMPANY_OPERATOR');
        $this->terminalCityName = env('TOPUP_TERMINAL_CITY_NAME');


        $options = array(
            'cache_wsdl' => 0,
            'trace' => 1,
            'exceptions' => 1,
            'stream_context' => stream_context_create(array(
                'ssl' => array(
                    'verify_peer' => true,
                    'verify_peer_name' => true,
                    'allow_self_signed' => true,
                    //                    'ciphers'=>'RC4-SHA'
                )
            ))
        );


        Log::info('Init TopUp', [
            'topUp_url' => $this->topUpUrl,
            'topUp_username' => $this->username
        ]);

        $this->client = new SoapClient($this->topUpUrl, $options);

        $this->msid = new TransactionGeneration();


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

    public function getVoucherTypes()
    {
        $data = VoucherType::query()
            ->where('status', 'disponivel')
            ->where('type', 'recarga')->get();
        return response()->json(['data' => $data], 200);
    }

    public function topUpClose()
    {

        $closes = CloseTopUp::query()
            ->orderByDesc('created_at')
            ->get();

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

    public function getVoucherListLocal($id)
    {
        $data = VoucherList::query()
            ->join('voucher_types', 'voucher_types.id', '=', 'voucher_lists.voucher_type_id')
            ->select('voucher_lists.*', 'voucher_types.logo')
            ->where('voucher_lists.voucher_type_id', $id)
            ->get();
        return response()->json(['data' => $data], 200);
    }

    public function getVoucherTv()
    {
        $data = VoucherType::query()
            ->where('status', 'disponivel')
            ->where('type', 'tv')->get();
        return response()->json(['data' => $data], 200);
    }

    public function saveVoucherType(Request $request)
    {
        $this->validate($request, [
            'name' => 'required',
            'code' => 'required',
            'logo' => 'required'
        ], [
            'name.required' => 'O Campo nome é de carácter Obrigatório',
            'code.required' => 'O Campo Código é obrigatório',
            'logo.required' => 'Obrigatória',
        ]);

        $save = VoucherType::create($request->all());

        if ($save) {
            return response()->json(['message' => 'Voucher Type Saved com Sucesso']);
        }
    }

    public function getBalance()
    {

        try {
            $msid = new TransactionGeneration();

            $params2 = array(
                'req' => array(
                    'authCred' => array(
                        'opName' => $this->username,
                        'password' => $this->password
                    ),
                    'terminalMsgID' => '202001070006',
                    'msgID' => $msid->generateMSID(),
                    'terminalID' => 'APP'
                )
            );
            $data = json_decode(json_encode($params2), true);
            $client = new SoapClient($this->topUpUrl, ['trace' => true]);
            $response = $client->Balance($data);

            return response()->json($response->BalanceResult);
        } catch (SoapFault $fault) {
            echo '<br>' . $fault;
        }
    }

    public function getVoucherList()
    {
        //        $topupUrl = 'https://topupretail.com:18880/Service.asmx?wsdl';
        //        $topupUrl = 'https://topupretail.com:18873/Service.asmx?wsdl';

        try {
            $msid = new TransactionGeneration();

            $params2 = array(
                'req' => array(
                    'authCred' => array(
                        'opName' => $this->username,
                        'password' => $this->password
                    ),
                    'terminalMsgID' => '202001070006',
                    'msgID' => $msid->generateMSID(),
                    'terminalID' => 'APP'
                )
            );
            $data = json_decode(json_encode($params2), true);

            $options = array(
                'cache_wsdl' => 0,
                'trace' => 1,
                'stream_context' => stream_context_create(array(
                    'ssl' => array(
                        'verify_peer' => false,
                        'verify_peer_name' => false,
                        'allow_self_signed' => true
                    )
                ))
            );

            //            $client = new SoapClient($this->topUpUrl, ['trace' => true]);
            $client = new SoapClient($this->topUpUrl, $options);
            //            $client->__setLocation($this->topUpUrl);
            $response = $client->VoucherList($data);

            return response()->json(['data' => $response->VoucherListResult->voucherlist->VoucherInfo]);
        } catch (SoapFault $fault) {
            echo '<br>' . $fault;
        }
    }

    public function buyVoucher(Request $request)
    {

        // return $request->all();

        //        $int = intval(preg_replace('/[^0-9]+/', '', $request->voucher), 10);
        //        return response()->json($int);
        $this->validate($request, [
            'voucher' => 'required',
            //            'pin' => 'required'
        ]);
        $voucherAmount = intval(preg_replace('/[^0-9]+/', '', $request->voucher), 10);
        try {
            $kyc = new Kyc();

            $result = $kyc->checkUserForAirTime($request);

            if ($result) {

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

                return $result;
            } else {

                $msid = new TransactionGeneration();

                $transaction = $msid->generateMSID();

                $params = array(
                    'req' => array(
                        'authCred' => array(
                            'opName' => $this->username,
                            'password' => $this->password
                        ),
                        'terminalMsgID' => '202001070006',
                        'msgID' => $transaction,
                        'terminalID' => 'APP',
                        'test' => $this->isTest,
                        'order' => array(
                            'VoucherOrder' => array(
                                'vouchercode' => $request->voucher,
                                'qty' => 1
                            )
                        ),
                        'receiptFormat' => 'POR_FORMATED_50',
                        'terminalChannel' => 'ÁPP',
                        'terminalCompanyName' => 'Paytek',
                        'terminalOperator' => 'Operator'
                    )
                );

                $data = json_decode(json_encode($params), true);

                //
                $response = $this->client->PurchaseVoucher($data);

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

                $result = $response->PurchaseVoucherResult;

                if ($response->PurchaseVoucherResult->hasFault === false) {

                    $voucher = $response->PurchaseVoucherResult->vouchers->Voucher;
                    $voucherInfo = $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo;

                    $category = RamoActivity::find(23);

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

                    $totalAmount = $voucherInfo->vouchervalue + $imaliUser->taxa;

                    DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

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

                    $recarga = PurchaseVoucher::create([
                        'vouchername' => $voucherInfo->vouchername,
                        'vouchercode' => $voucherInfo->vouchercode,
                        'vouchervalue' => $voucherInfo->vouchervalue,
                        'price' => $voucherInfo->price,
                        'comissao' => $voucherInfo->vouchervalue - $voucherInfo->price,
                        'barcode' => $voucherInfo->barcode,
                        'reqterminalMsgID' => $result->reqterminalMsgID,
                        'reqterminalID' => $result->reqterminalID,
                        'reqMsgID' => $result->reqMsgID,
                        'respDateTime' => $result->respDateTime,
                        'serial' => $voucher->serial,
                        'pin' => $voucher->pin,
                        'datepurchased' => $voucher->datepurchased,
                        'receiptFormat' => $voucher->receiptFormat,
                        'receipt' => $voucher->receipt,
                        'smsreceipt' => $voucher->smsreceipt,
                        'user_id' => $request->user()->id,
                        'voucher_list_id' => null,
                        'type' => $request->type,
                        'category_id' => $category->id,

                        'old_balance' => $imaliUser->balance,
                        'new_balance' => $imaliUser2->balance
                    ]);


                    //                    $sms = new SendSMS();
                    //                    $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone);


                    TransactionHistory::create([
                        'user_id' => $recarga->user_id,
                        'voucher_id' => $recarga->id,
                        'category_id' => $recarga->category_id,
                        'transaction_type' => 'voucher'
                    ]);

                    VoucherHistory::create([
                        'user_id' => $recarga->user_id,
                        'voucher_id' => $recarga->id,
                        'transaction_type' => 'voucher'
                    ]);

                    $notification = array(
                        'icon' => 'ic_i_mali_cover',
                        'title' => 'i.Mali recargas',
                        'body' => 'Parabéns, ' . ' comprou recarga ' . $recarga->vouchername . '.' . ' i.Mali é o Futuro',
                        'click_action' => 'com.imali.payapp.payment_RECARGA_NOTIFICATION',
                        'color' => '#ffffff'
                    );

                    $data = array(
                        'reqMsgID' => $recarga->reqMsgID,
                        'vouchername' => $recarga->vouchername,
                        'vouchercode' => (float)$recarga->vouchercode,
                        'data' => $recarga->created_at,
                        'pin' => $recarga->pin,
                        'serial' => $recarga->serial,
                        'price' => $recarga->vouchervalue,
                        'vouchervalue' => $recarga->vouchervalue,
                        'sms' => $recarga->receipt,
                        'route' => 'RECARGA_NOTIFICATION',
                        'terminal' => 'firebase'
                    );
                    $this->pushNotifification($request->user()->firebase_token, $notification, $data);

                    $log = new Record();
                    $log->createLog([
                        'description' => 'Transaction ' . $recarga->reqMsgID . ' Voucher: ' . $request->voucher,
                        'details' => 'Compra Feita com Sucesso!',
                        'operation' => 'Buy Voucher',
                        'status' => 'Success',
                        'properties' => $recarga,
                        'origin_ip' => $request->ip(),
                        'origin_request' => $request->url(),
                        'user_id' => $request->user()->id
                    ]);

                    return response()->json([
                        'message' => 'Compra Feita com Sucesso!',
                        'transaction' => $transaction,
                        //                        'data' => $response,
                    ], 200);
                } else {

                    if ($response->PurchaseVoucherResult->fault->mustALR === true) {

                        $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                        $totalAmount = $request->amount + $imaliUser->taxa;
                        DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);

                        $g = GeneralAdvice::create([
                            'reqMsgID' => $response->PurchaseVoucherResult->reqMsgID,
                            'reqterminalID' => $response->PurchaseVoucherResult->reqterminalID,
                            //                            'receiptFormat' => $response->PurchaseVoucherResult->receiptFormat,
                            'respDateTime' => $response->PurchaseVoucherResult->respDateTime,
                            'faultNumber' => $response->PurchaseVoucherResult->fault->faultnumber,
                            'message' => $response->PurchaseVoucherResult->fault->POR_operatorMsg,
                            'user_id' => $request->user()->id,
                            'type' => 'direct',
                            //                            'amount' => $request->voucher . substr(4, 4),
                            'amount' => $voucherAmount,
                            'msno' => $request->voucher,
                            'description' => $request->voucher
                        ]);

                        $log = new Record();
                        $log->createLog([
                            'description' => 'Transaction ' . $g->reqMsgID . ' Voucher: ' . $request->voucher,
                            'details' => $response->PurchaseVoucherResult->fault->POR_operatorMsg,
                            'operation' => 'Buy Voucher',
                            'status' => 'Error',
                            //                            'properties' => $request->all(),
                            'properties' => json_encode($request->except(['pin'])),
                            'origin_ip' => $request->ip(),
                            'origin_request' => $request->url(),
                            'user_id' => $request->user()->id
                        ]);

                        return response()->json(['message' => $response->PurchaseVoucherResult->fault->POR_operatorMsg], 400);
                    } else {
                        //return $response->PurchaseVoucherResult;
                        $log = new Record();
                        $log->createLog([
                            'description' => 'Transaction: ' . $transaction . ' Voucher: ' . $request->voucher,
                            'details' => $response->PurchaseVoucherResult->fault->POR_operatorMsg,
                            'operation' => 'Buy Voucher',
                            'status' => 'Error',
                            //                            'properties' => $request->all(),
                            'properties' => json_encode($request->except(['pin'])),
                            'origin_ip' => $request->ip(),
                            'origin_request' => $request->url(),
                            'user_id' => $request->user()->id
                        ]);

                        if ($response->PurchaseVoucherResult->fault) {

                            return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                        } //else {
                        // return response()->json(['message' => $response->PurchaseVoucherResult->fault->POR_operatorMsg], 400);
                        //    return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                        //}


                    }
                }
            }
        } catch (SoapFault $fault) {
            echo '<br>' . $fault;
        }
    }


    public function buyVoucherPin(Request $request)
    {

        //        return $request->all();

        //        $string = "Hello! 123 How Are You? 456";
        //        $int = intval(preg_replace('/[^0-9]+/', '', $request->voucher), 10);
        //        return response()->json($int);
        $user = User::find($request->user()->id);

        $this->validate($request, [
            'pin' => 'required',
            'voucher' => 'required'
        ], [
            'pin.required' => 'O Pin é necessário',
        ]);

        $voucherAmount = intval(preg_replace('/[^0-9]+/', '', $request->voucher), 10);

        try {

            $kyc = new Kyc();

            $result = $kyc->checkUserForAirTime($request);

            if ($result) {

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

                return $result;
            } else {

                $msid = new TransactionGeneration();

                $transaction = $msid->generateMSID();

                $params = array(
                    'req' => array(
                        'authCred' => array(
                            'opName' => $this->username,
                            'password' => $this->password
                        ),
                        'terminalMsgID' => '202001070006',
                        'msgID' => $transaction,
                        'terminalID' => 'APP',
                        'test' => $this->isTest,
                        'order' => array(
                            'VoucherOrder' => array(
                                'vouchercode' => $request->voucher,
                                //                                    'vouchercode' => 'VOM000010',
                                'qty' => 1
                            )
                        ),
                        'receiptFormat' => 'POR_FORMATED_50',
                        'terminalChannel' => 'ÁPP i.Mali',
                        'terminalCompanyName' => 'Paytek',
                        'terminalOperator' => 'Operator'
                    )
                );
                $data = json_decode(json_encode($params), true);
                $response = $this->client->PurchaseVoucher($data);
                $result = $response->PurchaseVoucherResult;


                if ($response->PurchaseVoucherResult->hasFault === false) {
                    $voucher = $response->PurchaseVoucherResult->vouchers->Voucher;
                    $voucherInfo = $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo;

                    $category = RamoActivity::find(23);

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

                    $totalAmount = $voucherInfo->vouchervalue + $imaliUser->taxa;

                    DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

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

                    $recarga = PurchaseVoucher::create([
                        'vouchername' => $voucherInfo->vouchername,
                        'vouchercode' => $voucherInfo->vouchercode,
                        'vouchervalue' => $voucherInfo->vouchervalue,
                        'barcode' => $voucherInfo->barcode,
                        'price' => $voucherInfo->vouchervalue,
                        'comissao' => $voucherInfo->vouchervalue - $voucherInfo->price,
                        'reqterminalMsgID' => $result->reqterminalMsgID,
                        'reqterminalID' => $result->reqterminalID,
                        'reqMsgID' => $result->reqMsgID,
                        'respDateTime' => $result->respDateTime,
                        'serial' => $voucher->serial,
                        'pin' => $voucher->pin,
                        'datepurchased' => $voucher->datepurchased,
                        'receiptFormat' => $voucher->receiptFormat,
                        'receipt' => $voucher->receipt,
                        'smsreceipt' => $voucher->smsreceipt,
                        'user_id' => $request->user()->id,
                        'voucher_list_id' => null,
                        'type' => $request->type,
                        'category_id' => $category->id,

                        'old_balance' => $imaliUser->balance,
                        'new_balance' => $imaliUser2->balance
                    ]);

                    //                        $sms = new SendSMS();
                    //                        $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone);


                    TransactionHistory::create([
                        'user_id' => $recarga->user_id,
                        'voucher_id' => $recarga->id,
                        'category_id' => $recarga->category_id,
                        'transaction_type' => 'voucher'
                    ]);

                    VoucherHistory::create([
                        'user_id' => $recarga->user_id,
                        'voucher_id' => $recarga->id,
                        'transaction_type' => 'voucher'
                    ]);

                    $resultLoc = TransactionLocation::create($request->location);

                    $resultLoc->update(['voucher_id' => $recarga->id, 'user_id' => $recarga->user_id]);

                    //                    TransactionLocation::create([
                    //                        'longitude' => $request->location['longitude'],
                    //                        'latitude' => $request->location['latitude'],
                    //                        'country_name' => $request->location['country_name'],
                    //                        'country_code' => $request->location['country_code'],
                    //                        'feature_name' => $request->location['feature_name'],
                    //                        'admin_area' => $request->location['admin_area'],
                    ////                        'sub_admin_area' => $request->location['sub_admin_area'],
                    ////                        'postal_code' => $request->location['postal_code'],
                    //                        'max_address_line' => $request->location['max_address_line'],
                    //                        'address_line' => $request->location['address_line'],
                    ////                        'sub_locality' => $request->location['sub_locality'],
                    ////                        'phone' => $request->location['phone'],
                    ////                        'url' => $request->location['url'],
                    //                        'thoroughfare' => $request->location['sub_thoroughfare'],
                    //                        'sub_thoroughfare' => $request->location['sub_thoroughfare'],
                    ////                        'premises' => $request->location['premises'],
                    //                        'voucher_id' => $recarga->id
                    //                    ]);
                    ////
                    //                    TransactionLocation::create([
                    //                        'longitude' => $request->location->longitude,
                    //                        'latitude' => $request->location->latitude,
                    //                        'country_name' => $request->location->country_name,
                    //                        'country_code' => $request->location->country_code,
                    //                        'feature_name' => $request->location->feature_name,
                    //                        'admin_area' => $request->location->admin_area,
                    //                        'sub_admin_area' => $request->location->sub_admin_area,
                    //                        'postal_code' => $request->location->postal_code,
                    //                        'max_address_line' => $request->location->max_address_line,
                    //                        'address_line' => $request->location->address_line,
                    //                        'sub_locality' => $request->location->sub_locality,
                    //                        'phone' => $request->location->phone,
                    //                        'url' => $request->location->url,
                    //                        'thoroughfare' => $request->location->sub_thoroughfare,
                    //                        'sub_thoroughfare' => $request->location->sub_thoroughfare,
                    //                        'premises' => $request->location->premises,
                    //                        'voucher_id' => $recarga->id
                    //                    ]);


                    $notification = array(
                        'icon' => 'ic_i_mali_cover',
                        'title' => 'i.Mali recargas',
                        'body' => 'Parabéns, ' . ' comprou recarga ' . $recarga->vouchername . '.' . ' i.Mali é o Futuro',
                        'click_action' => 'com.imali.payapp.payment_RECARGA_NOTIFICATION',
                        'color' => '#ffffff'
                    );

                    $data = array(
                        'reqMsgID' => $recarga->reqMsgID,
                        'vouchername' => $recarga->vouchername,
                        'vouchercode' => (float)$recarga->vouchercode,
                        'data' => $recarga->created_at,
                        'pin' => $recarga->pin,
                        'serial' => $recarga->serial,
                        'price' => $recarga->vouchervalue,
                        'vouchervalue' => $recarga->vouchervalue,
                        'sms' => $recarga->receipt,
                        'route' => 'RECARGA_NOTIFICATION',
                        'terminal' => 'firebase'
                    );
                    $this->pushNotifification($request->user()->firebase_token, $notification, $data);

                    $log = new Record();
                    $log->createLog([
                        'description' => ' Voucher: ' . $request->voucher,
                        'details' => 'Compra Feita com Sucesso!',
                        'operation' => 'Buy Voucher',
                        'status' => 'Success',
                        'properties' => $recarga,
                        'origin_ip' => $request->ip(),
                        'origin_request' => $request->url(),
                        'user_id' => $request->user()->id
                    ]);

                    return response()->json([
                        'message' => 'Compra Feita com Sucesso!',
                        'transaction' => $transaction,
                        //                        'data' => $response,
                    ], 200);
                } else {

                    if ($response->PurchaseVoucherResult->fault->mustALR === true) {

                        $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                        $totalAmount = $request->amount + $imaliUser->taxa;
                        DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);

                        $g = GeneralAdvice::create([
                            'reqMsgID' => $response->PurchaseVoucherResult->reqMsgID,
                            'reqterminalID' => $response->PurchaseVoucherResult->reqterminalID,
                            //                                'receiptFormat' => $response->PurchaseVoucherResult->receiptFormat,
                            'respDateTime' => $response->PurchaseVoucherResult->respDateTime,
                            'faultNumber' => $response->PurchaseVoucherResult->fault->faultnumber,
                            'message' => $response->PurchaseVoucherResult->fault->POR_operatorMsg,
                            'user_id' => $request->user()->id,
                            'type' => 'direct',
                            //                            'amount' => $request->voucher . substr(4, 4),
                            'amount' => $voucherAmount,
                            'msno' => $request->voucher,
                            'description' => $request->voucher
                        ]);

                        $log = new Record();
                        $log->createLog([
                            'description' => 'Advice: ' . $g->reqMsgID . ' Voucher: ' . $request->voucher,
                            'details' => $response->PurchaseVoucherResult->fault->POR_operatorMsg,
                            'operation' => 'Buy Voucher',
                            'status' => 'Error',
                            //                            'properties' => $request->all(),
                            'properties' => json_encode($request->except(['pin'])),
                            'origin_ip' => $request->ip(),
                            'origin_request' => $request->url(),
                            'user_id' => $request->user()->id
                        ]);


                        return response()->json(['message' => $response->PurchaseVoucherResult->fault->POR_operatorMsg], 400);
                    } else {

                        $log = new Record();
                        $log->createLog([
                            'description' => ' Voucher: ' . $request->voucher,
                            'details' => $response->PurchaseVoucherResult->fault->POR_operatorMsg,
                            'operation' => 'Buy Voucher',
                            'status' => 'Error',
                            //                            'properties' => $request->all(),
                            'properties' => json_encode($request->except(['pin'])),
                            'origin_ip' => $request->ip(),
                            'origin_request' => $request->url(),
                            'user_id' => $request->user()->id
                        ]);

                        if ($response->PurchaseVoucherResult->fault->faultnumber == "35") {

                            return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                        } else {
                            return response()->json(['message' => $response->PurchaseVoucherResult->fault->POR_operatorMsg], 400);
                        }
                    }
                }
            }
        } catch (SoapFault $fault) {
            echo '<br>' . $fault;
        }
    }

    public function runAdvice(Request $request)
    {
        //        $topupUrl = 'https://topupretail.com:18880/Service.asmx?wsdl';

        $msid = new TransactionGeneration();

        $params = array(
            'req' => array(
                'authCred' => array(
                    'opName' => $this->username,
                    'password' => $this->password
                ),
                'terminalMsgID' => '202001070006',
                'msgID' => $msid->generateMSID(),
                'terminalID' => 'APP',
                'test' => $this->isTest,
                //                'adviceReqMsgID' => '20216522449970315665', // C REDELEC
                //                'adviceReqMsgID' => '20215462068762388612', // ZAP
                //                'adviceReqMsgID' => '20215972186596705630', // MCL
                //                'adviceReqMsgID' => '20217028157282941592', // Agua
                //                'adviceReqMsgID' => '20214643983168827472', // real
                'adviceReqMsgID' => '20217333024565608663', // real
            )
        );

        $data = json_decode(json_encode($params), true);

        $response = $this->client->Advice($data);

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

    public function buyCredelec(Request $request)
    {
        $kyc = new Kyc();
        $result = $kyc->checkUserBuyCredelec($request);
        if ($result) {

            $log = new Record();
            $log->createLog([
                'description' => 'Nr Contador: ' . $request->credelec_number,
                ' Montante: ' . $request->amount,
                //                'description' => $request,
                'details' => $result,
                'operation' => 'Buy Credelec',
                'status' => 'Error',
                //                'properties' => $request->all(),
                'properties' => json_encode($request->except(['pin'])),
                'origin_ip' => $request->ip(),
                'origin_request' => $request->url(),
                'user_id' => $request->user()->id
            ]);

            return $result;
        } else {
            try {
                $msid = new TransactionGeneration();

                $params = array(
                    'req' => array(
                        'authCred' => array(
                            'opName' => $this->username,
                            'password' => $this->password
                        ),
                        'terminalMsgID' => '202001070006',
                        'msgID' => $msid->generateMSID(),
                        'terminalID' => 'APP',
                        'test' => $this->isTest,
                        'meterIdentifier' => array(
                            'msno' => $request->credelec_number,
                            'track2Data' => ''
                        ),
                        'purchaseValue' => $request->amount,
                        'receiptFormat' => 'POR_FORMATED_50',
                        'terminalLocation' => $this->terminalCityName,
                        'terminalChannel' => $this->terminalChannel,
                        'terminalCompanyName' => $this->terminalCompanyName,
                        'terminalOperator' => $this->terminalCompanyOprator
                    )
                );

                $data = json_decode(json_encode($params), true);


                $response = $this->client->CreditVend($data);


                // MUSTALR
                if ($response->CreditVendResult->hasFault == true) {

                    if ($response->CreditVendResult->fault->mustALR === true) {

                        $g = GeneralAdvice::create([
                            'reqMsgID' => $response->CreditVendResult->reqMsgID,
                            'reqterminalID' => $response->CreditVendResult->reqterminalID,
                            'receiptFormat' => $response->CreditVendResult->receiptFormat,
                            'respDateTime' => $response->CreditVendResult->respDateTime,
                            'faultnumber' => $response->CreditVendResult->fault->faultnumber,
                            'user_id' => $request->user()->id,
                            'type' => 'credelec',
                            'amount' => $request->amount,
                            'msno' => $request->credelec_number
                        ]);

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

                        $totalAmount = $request->amount + $imaliUser->taxa;
                        DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);
                        //                        DB::table('users')->increment('votes', 5);


                        $log = new Record();
                        $log->createLog([
                            'description' => 'reqMsgID: ' . $g . 'Nr Contador: ' . $request->credelec_number,
                            ' Montante: ' . $request->amount,
                            'details' => $response->CreditVendResult->fault->POR_operatorMsg . " Topup Fault: " . $g->faultnumber,
                            'operation' => 'Buy Credelec',
                            'status' => 'Error',
                            //                            'properties' => $request->all(),
                            'properties' => json_encode($request->except(['pin'])),
                            'origin_ip' => $request->ip(),
                            'origin_request' => $request->url(),
                            'user_id' => $request->user()->id
                        ]);
                    }

                    $log = new Record();
                    $log->createLog([
                        'description' => 'Nr Contador: ' . $request->credelec_number,
                        ' Montante: ' . $request->amount,
                        'details' => $response->CreditVendResult->fault->POR_operatorMsg,
                        'operation' => 'Buy Credelec',
                        'status' => 'Error',
                        //                        'properties' => $request->all(),
                        'properties' => json_encode($request->except(['pin'])),
                        'origin_ip' => $request->ip(),
                        'origin_request' => $request->url(),
                        'user_id' => $request->user()->id
                    ]);

                    if ($response->CreditVendResult->fault->faultnumber == "35") {

                        return response()->json(['message' => "Serviço de Credelec indisponível"], 400);
                    } else {
                        return response()->json(['message' => $response->CreditVendResult->fault->POR_operatorMsg], 400);
                    }

                    //                    return response()->json(['faultnumber' => $response->CreditVendResult->fault->faultnumber, 'message' => $response->CreditVendResult->fault->POR_operatorMsg, 'data' => $response->CreditVendResult], 400);
                } else {

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

                    $totalAmount = $request->amount + $imaliUser->taxa;

                    DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

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

                    $category = RamoActivity::find(23);

                    $credelec = Credelec::create([
                        'reqMsgID' => $response->CreditVendResult->reqMsgID,
                        'receipt' => $response->CreditVendResult->receipt,
                        'reqterminalID' => $response->CreditVendResult->reqterminalID,
                        'receiptFormat' => $response->CreditVendResult->receiptFormat,
                        'respDateTime' => $response->CreditVendResult->respDateTime,
                        'smsreceipt' => $response->CreditVendResult->smsreceipt,
                        'reqterminalMsgID' => $response->CreditVendResult->reqterminalMsgID,
                        'customerMsg' => $response->CreditVendResult->customerMsg,
                        'TransactionCost' => $response->CreditVendResult->TransactionCost,
                        'utility_address' => $response->CreditVendResult->utility->address,
                        'utility_name' => $response->CreditVendResult->utility->name,
                        'utility_taxRef' => $response->CreditVendResult->utility->taxRef,
                        'StandardTokenTx_amount' => $response->CreditVendResult->standardTokenTx->StandardTokenTx->amount,
                        'StandardTokenTx_desc' => $response->CreditVendResult->standardTokenTx->StandardTokenTx->desc,
                        'StandardTokenTx_receiptNumber' => $response->CreditVendResult->standardTokenTx->StandardTokenTx->receiptNumber,
                        'StandardTokenTx_tarriff' => $response->CreditVendResult->standardTokenTx->StandardTokenTx->tarriff,
                        'StandardTokenTx_tax' => $response->CreditVendResult->standardTokenTx->StandardTokenTx->tax,
                        'StandardTokenTx_token' => $response->CreditVendResult->standardTokenTx->StandardTokenTx->token,
                        'StandardTokenTx_units' => $response->CreditVendResult->standardTokenTx->StandardTokenTx->units,
                        //                        'DebtPaymentTx_amount' => $response->CreditVendResult->debtPaymentTx->DebtPaymentTx->amount,
                        //                        'DebtPaymentTx_desc' => $response->CreditVendResult->debtPaymentTx->DebtPaymentTx->desc,
                        //                        'DebtPaymentTx_open' => $response->CreditVendResult->debtPaymentTx->DebtPaymentTx->open,
                        //                        'DebtPaymentTx_receiptNumber' => $response->CreditVendResult->debtPaymentTx->DebtPaymentTx->receiptNumber,
                        //                        'DebtPaymentTx_remainder' => $response->CreditVendResult->debtPaymentTx->DebtPaymentTx->remainder,
                        //                        'DebtPaymentTx_tax' => $response->CreditVendResult->debtPaymentTx->DebtPaymentTx->tax,
                        'user_id' => $request->user()->id,
                        'contador' => $request->credelec_number,
                        'amount' => $request->amount,
                        'category_id' => $category->id,

                        'old_balance' => $imaliUser->balance,
                        'new_balance' => $imaliUser2->balance
                    ]);

                    TransactionHistory::create([
                        'transaction_type' => 'credelec',
                        'credelec_id' => $credelec->id,
                        'user_id' => $credelec->user_id,
                        'category_id' => $category->id
                    ]);

                    VoucherHistory::create([
                        'user_id' => $credelec->user_id,
                        'credelec_id' => $credelec->id,
                        'transaction_type' => 'credelec'
                    ]);

                    $log = new Record();
                    $log->createLog([
                        'description' => 'reqMsgID: ' . $credelec->reqMsgID . 'Nr Contador: ' . $request->credelec_number,
                        ' Montante: ' . $request->amount,
                        'details' => "Credelec comprado com Sucesso",
                        'operation' => 'Buy Credelec',
                        'status' => 'Success',
                        'properties' => $credelec,
                        'origin_ip' => $request->ip(),
                        'origin_request' => $request->url(),
                        'user_id' => $request->user()->id
                    ]);

                    //$this->smsManager->sendSMSPurchaseCredelec($response->CreditVendResult->smsreceipt, auth()->user()->phone);
                    $this->smsManager->sendSMSPurchaseCredelec($this->getFormatedCredelecMessage($response->CreditVendResult->smsreceipt), auth()->user()->phone);

                    return response()->json(['message' => 'Credelec comprado com Sucesso', 'data' => $response, 'amount' => $credelec->amount, 'reqMsgID' => $credelec->reqMsgID, 'sms' => $credelec->smsreceipt], 200);
                }
            } catch (SoapFault $fault) {
                echo '<br>' . $fault;
            }
        }
    }



    //? Credelec Message
    public function getFormatedCredelecMessage($message)
    {
        $arr = explode("\n", $message);

        $recarga = 'Recarga: ' . $arr[9] . ' ' . $arr[10];
        $contador = str_replace(":", ": ", $arr[1]);
        $total = str_replace(":", ": ", $arr[3]) . 'MT';
        $energia = 'Energia: ' . $arr[8];
        $iva = str_replace(":", ": ", $arr[4]) . 'MT';
        $lixo = 'Tx ' . str_replace(":", ": ", $arr[7]) . 'MT';
        $radio = 'Tx ' . str_replace(":", ": ", $arr[6]) . 'MT';
        $divida = 'Divida: ' . explode(":", $arr[5])[1] . 'MT';

        $newMsg = "Credelec\n" . $recarga . "\n" . $contador . "\n" . $total . "\n" . $energia . "\n" . $iva . "\n" . $lixo . "\n" . $radio . "\n" . $divida;

        return $newMsg;
    }

    //? Credelec Message


    public function buyVoucherWithAdvice(Request $request)
    {
        //        $topupUrl = 'https://topupretail.com:18880/Service.asmx?wsdl';
        try {
            $msidGeneration2 = new TransactionGeneration();

            $transaction = $msidGeneration2->generateMSID();

            $params = array(
                'req' => array(
                    'authCred' => array(
                        'opName' => $this->username,
                        'password' => $this->password
                    ),
                    'terminalMsgID' => '2020010700044',
                    'msgID' => $transaction,
                    'terminalID' => 'APP',
                    'test' => $this->isTest,
                    'order' => array(
                        'VoucherOrder' => array(
                            'vouchercode' => $request->voucher,
                            'qty' => 1
                        )
                    ),
                    'receiptFormat' => 'POR_FORMATED_50',
                    'terminalChannel' => 'ÁPP',
                    'terminalCompanyName' => 'Paytek',
                    'terminalOperator' => 'Operator'
                )
            );


            $data2 = json_decode(json_encode($params), true);

            $response = $this->client->PurchaseVoucher($data2);

            if ($response->PurchaseVoucherResult->hasFault === true) {

                if ($response->PurchaseVoucherResult->fault->mustALR === true) {

                    GeneralAdvice::create([
                        'reqMsgID' => $response->CreditVendResult->reqMsgID,
                        'reqterminalID' => $response->CreditVendResult->reqterminalID,
                        'receiptFormat' => $response->CreditVendResult->receiptFormat,
                        'respDateTime' => $response->CreditVendResult->respDateTime,
                        'faultnumber' => $response->CreditVendResult->fault->faultnumber,
                        'user_id' => $request->user()->id,
                        'type' => 'recargas',
                        'amount' => $request->amount,
                        'msno' => $request->credelec_number
                    ]);
                    $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();

                    $totalAmount = $request->amount + $imaliUser->taxa;
                    DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);
                }

                $paramsAdvice = array(
                    'req' => array(
                        'authCred' => array(
                            'opName' => $this->username,
                            'password' => $this->password
                        ),
                        'adviceReqMsgID' => $transaction,
                        'terminalID' => 'i.Mali',
                        'terminalMsgID' => '2020010700060',
                        'msgID' => $msidGeneration2->generateMSID(),
                    )
                );
                $data = json_decode(json_encode($paramsAdvice), true);
                $client = new SoapClient($this->topUpUrl, ['trace' => true]);
                $response = $client->Advice($data);


                return response()->json(['message' => 'Houve Bug de timeout', $response], 200);
            } else {

                $paramsAdvice = array(
                    'req' => array(
                        'authCred' => array(
                            'opName' => $this->username,
                            'password' => $this->password
                        ),
                        'adviceReqMsgID' => $transaction,
                        'terminalID' => 'i.Mali',
                        'terminalMsgID' => '2020010700060',
                        'msgID' => $msidGeneration2->generateMSID(),
                    )
                );
                $data = json_decode(json_encode($paramsAdvice), true);

                $responseAdvice = $this->client->Advice($data);

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

            $sms = new SendSMS();

            $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone);

            return response()->json($response, 200);
        } catch (SoapFault $fault) {
            echo '<br>' . $fault;
        }
    }

    public function buyVoucherDirectRecharge(Request $request)
    {

        // return response()->json(['message' => 'Serviço indisponivel'], 404);

        //return response()->json(['message' => $this->getBalance(['balance'])], 404);

        $this->validate($request, [
            'phone' => 'required',
            'amount' => 'required',
            'vouchercode' => 'required',
        ]);

        $msid = new TransactionGeneration();
        $transaction = $msid->generateMSID();

        try {
            // Com PIN
            if ($request->pin != 'vazio') {

                //                if (Hash::check($request->pin, $request->user()->pin)) {
                $kyc = new Kyc();

                $result = $kyc->checkUserForAirTime($request);

                if ($result) {

                    $log = new Record();
                    $log->createLog([
                        'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                        'details' => $result,
                        'operation' => 'Buy Voucher',
                        'status' => 'Error',
                        //                        'properties' => $request->all(),
                        'properties' => json_encode($request->except(['pin'])),
                        'origin_ip' => $request->ip(),
                        'origin_request' => $request->url(),
                        'user_id' => $request->user()->id
                    ]);

                    return $result;
                } else {

                    if ($request->vouchercode == 'MCL') {

                        $directRecharge = array(
                            'req' => array(
                                'authCred' => array(
                                    'opName' => $this->username,
                                    'password' => $this->password
                                ),
                                'adviceReqMsgID' => $transaction,
                                'terminalID' => 'i.Mali',
                                'terminalChannel' => 'i.Mali App',
                                'terminalMsgID' => '2020010700060',
                                'msgID' => $msid->generateMSID(),
                                'msisdn' => $request->phone,
                                //                                    'msisdn' => '100000004',
                                'purchaseValue' => $request->amount,
                                'receiptFormat' => 'POR_FORMATED_50',
                                'terminalCompanyName' => 'Paytek',
                                'terminalOperator' => 'Operator',
                                'test' => $this->isTest,
                            )
                        );
                        $data = json_decode(json_encode($directRecharge), true);

                        $response = $this->client->MCelRecharge($data);

                        if ($response->MCelRechargeResult->hasFault === true) {

                            if ($response->MCelRechargeResult->fault->mustALR === true) {
                                GeneralAdvice::create([
                                    'reqMsgID' => $response->MCelRechargeResult->reqMsgID,
                                    'reqterminalID' => $response->MCelRechargeResult->reqterminalID,
                                    'receiptFormat' => $response->MCelRechargeResult->receiptFormat,
                                    'respDateTime' => $response->MCelRechargeResult->respDateTime,
                                    'faultnumber' => $response->MCelRechargeResult->fault->faultnumber,
                                    'user_id' => $request->user()->id,
                                    'type' => 'direct',
                                    'amount' => $request->amount,
                                    'msno' => $request->phone,
                                    'description' => $request->description
                                ]);

                                $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                                $totalAmount = $request->amount + $imaliUser->taxa;
                                DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);

                                $log = new Record();
                                $log->createLog([
                                    'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                    'details' => $response->MCelRechargeResult->fault->POR_operatorMsg,
                                    'operation' => 'Buy Voucher',
                                    //                                    'properties' => $request->all(),
                                    'properties' => json_encode($request->except(['pin'])),
                                    'status' => 'Error',
                                    'origin_ip' => $request->ip(),
                                    'origin_request' => $request->url(),
                                    'user_id' => $request->user()->id
                                ]);


                                if ($response->MCelRechargeResult->fault->faultnumber == "35") {

                                    return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                                } else {
                                    return response()->json(['message' => $response->MCelRechargeResult->fault->POR_operatorMsg], 400);
                                }


                                //                                    return response()->json(['message' => $response->MCelRechargeResult->fault->POR_operatorMsg], 400);

                            } else {

                                if ($response->MCelRechargeResult->fault->faultnumber == "35") {

                                    return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                                } else {
                                    return response()->json(['message' => $response->MCelRechargeResult->fault->POR_operatorMsg], 400);
                                }

                                //                                    return response()->json(['message' => $response->MCelRechargeResult->fault->POR_operatorMsg], 400);
                            }
                        } else {

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

                            $totalAmount = $request->amount + $imaliUser->taxa;

                            DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

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

                            $resultVoucher = $response->MCelRechargeResult;
                            $recarga = PurchaseVoucher::create([
                                'vouchername' => $request->description,
                                'vouchercode' => $request->phone,
                                'vouchervalue' => $request->amount,
                                'price' => $request->amount,
                                'comissao' => $request->amount - $request->price,
                                'reqterminalMsgID' => $resultVoucher->reqterminalMsgID,
                                'reqterminalID' => $resultVoucher->reqterminalID,
                                'reqMsgID' => $resultVoucher->reqMsgID,
                                'respDateTime' => $resultVoucher->respDateTime,
                                'receiptFormat' => $resultVoucher->receiptFormat,
                                'receipt' => $resultVoucher->receipt,
                                'smsreceipt' => $resultVoucher->smsreceipt,
                                'user_id' => $request->user()->id,
                                'voucher_list_id' => null,
                                'datepurchased' => now(),
                                'type' => 'recarga',
                                'category_id' => 23,

                                'old_balance' => $imaliUser->balance,
                                'new_balance' => $imaliUser2->balance
                            ]);


                            $sms = new SendSMS();

                            //            $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone);

                            TransactionHistory::create([
                                'user_id' => $recarga->user_id,
                                'voucher_id' => $recarga->id,
                                'category_id' => $recarga->category_id,
                                'transaction_type' => 'voucher'
                            ]);

                            VoucherHistory::create([
                                'user_id' => $recarga->user_id,
                                'voucher_id' => $recarga->id,
                                'transaction_type' => 'voucher'
                            ]);

                            $log = new Record();
                            $log->createLog([
                                'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                'details' => 'Compra Feita com Sucesso!',
                                'operation' => 'Buy Voucher',
                                'status' => 'Success',
                                //                                'properties' => $request->all(),
                                'properties' => json_encode($request->except(['pin'])),
                                'origin_ip' => $request->ip(),
                                'origin_request' => $request->url(),
                                'user_id' => $request->user()->id
                            ]);

                            return response()->json([
                                'message' => 'Compra Feita com Sucesso!',
                                'transaction' => $transaction,
                                //                                'data' => $response,
                            ], 200);
                        }
                    }

                    if ($request->vouchercode == 'VOM') {
                        $directRecharge = array(
                            'req' => array(
                                'authCred' => array(
                                    'opName' => $this->username,
                                    'password' => $this->password
                                ),
                                'adviceReqMsgID' => $transaction,
                                'terminalID' => 'i.Mali',
                                'msgID' => $msid->generateMSID(),
                                'test' => $this->isTest,
                                'msisdn' => $request->phone,
                                'purchaseValue' => $request->amount,
                                //                                    'purchaseValue' => '200000005',
                                'receiptFormat' => 'POR_FORMATED_50',
                                'terminalChannel' => 'i.Mali App',
                                'terminalCompanyName' => 'Paytek',
                                'terminalOperator' => 'Operator',
                                'terminalMsgID' => '2020010700060'
                            )
                        );


                        $data = json_decode(json_encode($directRecharge), true);
                        $response = $this->client->VodacomRecharge($data);

                        if ($response->VodacomRechargeResult->hasFault === true) {

                            if ($response->VodacomRechargeResult->fault->mustALR === true) {

                                GeneralAdvice::create([
                                    'reqMsgID' => $response->VodacomRechargeResult->reqMsgID,
                                    'reqterminalID' => $response->VodacomRechargeResult->reqterminalID,
                                    'receiptFormat' => $response->VodacomRechargeResult->receiptFormat,
                                    'respDateTime' => $response->VodacomRechargeResult->respDateTime,
                                    'faultnumber' => $response->VodacomRechargeResult->fault->faultnumber,
                                    'user_id' => $request->user()->id,
                                    'type' => 'direct',
                                    'amount' => $request->amount,
                                    'msno' => $request->phone,
                                    'description' => $request->description
                                ]);

                                $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                                $totalAmount = $request->amount + $imaliUser->taxa;
                                DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);

                                $log = new Record();
                                $log->createLog([
                                    'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                    'details' => $response->VodacomRechargeResult->fault->POR_operatorMsg,
                                    'operation' => 'Buy Voucher',
                                    'status' => 'Error',
                                    //                                    'properties' => $request->all(),
                                    'properties' => json_encode($request->except(['pin'])),
                                    'origin_ip' => $request->ip(),
                                    'origin_request' => $request->url(),
                                    'user_id' => $request->user()->id
                                ]);

                                if ($response->VodacomRechargeResult->fault->faultnumber == "35") {

                                    return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                                } else {
                                    return response()->json(['message' => $response->VodacomRechargeResult->fault->POR_operatorMsg], 400);
                                }
                                //                                    return response()->json(['message' => $response->VodacomRechargeResult->fault->POR_operatorMsg], 400);

                            } else {

                                $log = new Record();
                                $log->createLog([
                                    'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                    'details' => $response->VodacomRechargeResult->fault->POR_operatorMsg,
                                    'operation' => 'Buy Voucher',
                                    'status' => 'Error',
                                    //                                    'properties' => $request->all(),
                                    'properties' => json_encode($request->except(['pin'])),
                                    'origin_ip' => $request->ip(),
                                    'origin_request' => $request->url(),
                                    'user_id' => $request->user()->id
                                ]);

                                if ($response->VodacomRechargeResult->fault->faultnumber == "35") {

                                    return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                                } else {
                                    return response()->json(['message' => $response->VodacomRechargeResult->fault->POR_operatorMsg], 400);
                                }

                                //                                    return response()->json(['message' => $response->VodacomRechargeResult->fault->POR_operatorMsg], 400);
                            }
                        } else {

                            $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                            $totalAmount = $request->amount + $imaliUser->taxa;
                            DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

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

                            $resultVoucher = $response->VodacomRechargeResult;
                            $vou = PurchaseVoucher::create([
                                'vouchername' => $request->description,
                                'vouchercode' => $request->phone,
                                'vouchervalue' => $request->amount,
                                'price' => $request->amount,
                                'comissao' => $request->amount - $request->price,
                                'reqterminalMsgID' => $resultVoucher->reqterminalMsgID,
                                'reqterminalID' => $resultVoucher->reqterminalID,
                                'reqMsgID' => $resultVoucher->reqMsgID,
                                'respDateTime' => $resultVoucher->respDateTime,
                                'receiptFormat' => $resultVoucher->receiptFormat,
                                'receipt' => $resultVoucher->receipt,
                                'smsreceipt' => $resultVoucher->smsreceipt,
                                'user_id' => $request->user()->id,
                                'voucher_list_id' => null,
                                'datepurchased' => now(),
                                'type' => 'recarga',
                                'category_id' => 23,

                                'old_balance' => $imaliUser->balance,
                                'new_balance' => $imaliUser2->balance
                            ]);

                            $sms = new SendSMS();

                            //            $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone);

                            TransactionHistory::create([
                                'user_id' => $vou->user_id,
                                'voucher_id' => $vou->id,
                                'category_id' => $vou->category_id,
                                'transaction_type' => 'voucher'
                            ]);

                            VoucherHistory::create([
                                'user_id' => $vou->user_id,
                                'voucher_id' => $vou->id,
                                'transaction_type' => 'voucher'
                            ]);

                            $log = new Record();
                            $log->createLog([
                                'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                'details' => 'Compra Feita com Sucesso',
                                'operation' => 'Buy Voucher',
                                'status' => 'Success',
                                'properties' => $vou,
                                'origin_ip' => $request->ip(),
                                'origin_request' => $request->url(),
                                'user_id' => $request->user()->id
                            ]);

                            return response()->json([
                                'message' => 'Compra Feita com Sucesso!',
                                'transaction' => $transaction,
                                //                                    'data' => $response,
                            ], 200);
                        }
                    }

                    if ($request->vouchercode == 'MOV') {

                        $directRecharge = array(
                            'req' => array(
                                'authCred' => array(
                                    'opName' => $this->username,
                                    'password' => $this->password
                                ),
                                'adviceReqMsgID' => $transaction,
                                'terminalID' => 'i.Mali',
                                'terminalChannel' => 'i.Mali App',
                                'terminalMsgID' => '2020010700060',
                                'msgID' => $msid->generateMSID(),
                                'msisdn' => $request->phone,
                                //                                    'msisdn' => '200000005',
                                'purchaseValue' => $request->amount,
                                'receiptFormat' => 'POR_FORMATED_50',
                                'terminalCompanyName' => 'Paytek',
                                'terminalOperator' => 'Operator',
                                'test' => $this->isTest,
                            )
                        );


                        $data = json_decode(json_encode($directRecharge), true);

                        $response = $this->client->MovitelRecharge($data);

                        if ($response->MovitelRechargeResult->hasFault === true) {

                            if ($response->MovitelRechargeResult->fault->mustALR === true) {

                                GeneralAdvice::create([
                                    'reqMsgID' => $response->MovitelRechargeResult->reqMsgID,
                                    'reqterminalID' => $response->MovitelRechargeResult->reqterminalID,
                                    'receiptFormat' => $response->MovitelRechargeResult->receiptFormat,
                                    'respDateTime' => $response->MovitelRechargeResult->respDateTime,
                                    'faultnumber' => $response->MovitelRechargeResult->fault->faultnumber,
                                    'user_id' => $request->user()->id,
                                    'type' => 'direct',
                                    'amount' => $request->amount,
                                    'msno' => $request->phone,
                                    'description' => $request->description
                                ]);

                                $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                                $totalAmount = $request->amount + $imaliUser->taxa;
                                DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);

                                $log = new Record();
                                $log->createLog([
                                    'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                    'details' => $response->MovitelRechargeResult->fault->POR_operatorMsg,
                                    'operation' => 'Buy Voucher',
                                    'status' => 'Error',
                                    //                                    'properties' => $request->all(),
                                    'properties' => json_encode($request->except(['pin'])),
                                    'origin_ip' => $request->ip(),
                                    'origin_request' => $request->url(),
                                    'user_id' => $request->user()->id
                                ]);

                                return response()->json(['message' => $response->MovitelRechargeResult->fault->POR_operatorMsg, 'data' => $response->MovitelRechargeResult], 400);
                            } else {

                                $log = new Record();
                                $log->createLog([
                                    'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                    'details' => $response->MovitelRechargeResult->fault->POR_operatorMsg,
                                    'operation' => 'Buy Voucher',
                                    'status' => 'Error',
                                    //                                    'properties' => $request->all(),
                                    'properties' => json_encode($request->except(['pin'])),
                                    'origin_ip' => $request->ip(),
                                    'origin_request' => $request->url(),
                                    'user_id' => $request->user()->id
                                ]);
                                if ($response->MovitelRechargeResult->fault->faultnumber == "35") {

                                    return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                                } else {
                                    return response()->json(['message' => $response->MovitelRechargeResult->fault->POR_operatorMsg], 400);
                                }

                                //                                    return response()->json(['message' => $response->MovitelRechargeResult->fault->POR_operatorMsg], 400);
                            }
                        } else {

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

                            $totalAmount = $request->amount + $imaliUser->taxa;

                            DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

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

                            $resultVoucher = $response->MovitelRechargeResult;
                            $vou = PurchaseVoucher::create([
                                'vouchername' => $request->description,
                                'vouchercode' => $request->phone,
                                'vouchervalue' => $request->amount,
                                'price' => $request->amount,
                                //                                    'price' => $request->price,
                                'comissao' => $request->amount - $request->price,
                                'reqterminalMsgID' => $resultVoucher->reqterminalMsgID,
                                'reqterminalID' => $resultVoucher->reqterminalID,
                                'reqMsgID' => $resultVoucher->reqMsgID,
                                'respDateTime' => $resultVoucher->respDateTime,
                                'receiptFormat' => $resultVoucher->receiptFormat,
                                'receipt' => $resultVoucher->receipt,
                                'smsreceipt' => $resultVoucher->smsreceipt,
                                'user_id' => $request->user()->id,
                                'voucher_list_id' => null,
                                'type' => 'recarga',
                                'category_id' => 23,

                                'old_balance' => $imaliUser->balance,
                                'new_balance' => $imaliUser2->balance
                            ]);


                            $sms = new SendSMS();
                            //            $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone);


                            TransactionHistory::create([
                                'user_id' => $vou->user_id,
                                'voucher_id' => $vou->id,
                                'category_id' => $vou->category_id,
                                'transaction_type' => 'voucher'
                            ]);

                            VoucherHistory::create([
                                'user_id' => $vou->user_id,
                                'voucher_id' => $vou->id,
                                'transaction_type' => 'voucher'
                            ]);

                            $log = new Record();
                            $log->createLog([
                                'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                'details' => 'Compra Feita com Sucesso!',
                                'operation' => 'Buy Voucher',
                                'status' => 'Success',
                                //                                'properties' => $request->all(),
                                'properties' => json_encode($request->except(['pin'])),
                                'origin_ip' => $request->ip(),
                                'origin_request' => $request->url(),
                                'user_id' => $request->user()->id
                            ]);
                            return response()->json([
                                'message' => 'Compra Feita com Sucesso!',
                                'transaction' => $transaction,
                                //                                'data' => $response,
                                //                                'data2' => $resultVoucher
                            ], 200);
                        }
                    }
                }

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

                $kyc = new Kyc();

                $result = $kyc->checkUserForAirTime($request);

                if ($result) {

                    $log = new Record();
                    $log->createLog([
                        'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                        'details' => $result,
                        'operation' => 'Buy Voucher',
                        'status' => 'Error',
                        //                        'properties' => $request->all(),
                        'properties' => json_encode($request->except(['pin'])),
                        'origin_ip' => $request->ip(),
                        'origin_request' => $request->url(),
                        'user_id' => $request->user()->id
                    ]);

                    return $result;
                } else {

                    if ($request->vouchercode == 'MCL') {

                        $directRecharge = array(
                            'req' => array(
                                'authCred' => array(
                                    'opName' => $this->username,
                                    'password' => $this->password
                                ),
                                'adviceReqMsgID' => $transaction,
                                'terminalID' => 'i.Mali',
                                'terminalChannel' => 'i.Mali App',
                                'terminalMsgID' => '2020010700060',
                                'msgID' => $msid->generateMSID(),
                                'msisdn' => $request->phone,
                                'purchaseValue' => $request->amount,
                                'receiptFormat' => 'POR_FORMATED_50',
                                'terminalCompanyName' => 'Paytek',
                                'terminalOperator' => 'Operator',
                                'test' => $this->isTest,
                            )
                        );


                        $data = json_decode(json_encode($directRecharge), true);

                        $response = $this->client->MCelRecharge($data);

                        if ($response->MCelRechargeResult->hasFault === true) {

                            if ($response->MCelRechargeResult->fault->mustALR === true) {
                                GeneralAdvice::create([
                                    'reqMsgID' => $response->MCelRechargeResult->reqMsgID,
                                    'reqterminalID' => $response->MCelRechargeResult->reqterminalID,
                                    'receiptFormat' => $response->MCelRechargeResult->receiptFormat,
                                    'respDateTime' => $response->MCelRechargeResult->respDateTime,
                                    'faultnumber' => $response->MCelRechargeResult->fault->faultnumber,
                                    'user_id' => $request->user()->id,
                                    'type' => 'direct',
                                    'amount' => $request->amount,
                                    'msno' => $request->phone,
                                    'description' => $request->description
                                ]);

                                $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                                $totalAmount = $request->amount + $imaliUser->taxa;
                                DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);

                                $log = new Record();
                                $log->createLog([
                                    'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                    'details' => $response->MCelRechargeResult->fault->POR_operatorMsg,
                                    'operation' => 'Buy Voucher',
                                    'status' => 'Error',
                                    //                                    'properties' => $request->all(),
                                    'properties' => json_encode($request->except(['pin'])),
                                    'origin_ip' => $request->ip(),
                                    'origin_request' => $request->url(),
                                    'user_id' => $request->user()->id
                                ]);

                                return response()->json(['message' => $response->MCelRechargeResult->fault->POR_operatorMsg], 400);
                            } else {

                                $log = new Record();
                                $log->createLog([
                                    'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                    'details' => $response->MCelRechargeResult->fault->POR_operatorMsg,
                                    'operation' => 'Buy Voucher',
                                    'status' => 'Error',
                                    //                                    'properties' => $request->all(),
                                    'properties' => json_encode($request->except(['pin'])),
                                    'origin_ip' => $request->ip(),
                                    'origin_request' => $request->url(),
                                    'user_id' => $request->user()->id
                                ]);


                                if ($response->MCelRechargeResult->fault->faultnumber == "35") {

                                    return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                                } else {
                                    return response()->json(['message' => $response->MCelRechargeResult->fault->POR_operatorMsg], 400);
                                }

                                //                                return response()->json(['message' => $response->MCelRechargeResult->fault->POR_operatorMsg], 400);
                            }
                        } else {

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

                            $totalAmount = $request->amount + $imaliUser->taxa;

                            DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

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

                            $resultVoucher = $response->MCelRechargeResult;
                            $resu = PurchaseVoucher::create([
                                'vouchername' => $request->description,
                                'vouchercode' => $request->phone,
                                'vouchervalue' => $request->amount,
                                'price' => $request->amount,
                                //                                'price' => $request->price,
                                'comissao' => $request->amount - $request->price,
                                'reqterminalMsgID' => $resultVoucher->reqterminalMsgID,
                                'reqterminalID' => $resultVoucher->reqterminalID,
                                'reqMsgID' => $resultVoucher->reqMsgID,
                                'respDateTime' => $resultVoucher->respDateTime,
                                'receiptFormat' => $resultVoucher->receiptFormat,
                                'receipt' => $resultVoucher->receipt,
                                'smsreceipt' => $resultVoucher->smsreceipt,
                                'user_id' => $request->user()->id,
                                'voucher_list_id' => null,
                                'type' => 'recarga',
                                'category_id' => 23,

                                'old_balance' => $imaliUser->balance,
                                'new_balance' => $imaliUser2->balance
                            ]);


                            $sms = new SendSMS();

                            //            $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone);

                            TransactionHistory::create([
                                'user_id' => $resu->user_id,
                                'voucher_id' => $resu->id,
                                'category_id' => $resu->category_id,
                                'transaction_type' => 'voucher'
                            ]);


                            VoucherHistory::create([
                                'user_id' => $resu->user_id,
                                'voucher_id' => $resu->id,
                                'transaction_type' => 'voucher'
                            ]);

                            $log = new Record();
                            $log->createLog([
                                'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                'details' => 'Compra Feita com Sucesso!',
                                'operation' => 'Buy Voucher',
                                'status' => 'Success',
                                'properties' => $resu,
                                'origin_ip' => $request->ip(),
                                'origin_request' => $request->url(),
                                'user_id' => $request->user()->id
                            ]);

                            return response()->json([
                                'message' => 'Compra Feita com Sucesso!',
                                'transaction' => $transaction,
                                //                                'data' => $response,
                            ], 200);
                        }


                        //                        $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                        //
                        //                        $totalAmount = $request->amount + $imaliUser->taxa;
                        //
                        //                        DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);
                        //
                        //
                        //                        $sms = new SendSMS();
                        //
                        ////            $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone);
                        //
                        //                        return response()->json([
                        //                            'message' => 'Compra Feita com Sucesso!',
                        //                            'transaction' => $transaction,
                        //                            'data' => $response,
                        //                        ], 200);
                    }

                    if ($request->vouchercode == 'VOM') {
                        $directRecharge = array(
                            'req' => array(
                                'authCred' => array(
                                    'opName' => $this->username,
                                    'password' => $this->password
                                ),
                                'adviceReqMsgID' => $transaction,
                                'terminalID' => 'i.Mali',
                                'msgID' => $msid->generateMSID(),
                                'test' => $this->isTest,
                                'msisdn' => $request->phone,
                                'purchaseValue' => $request->amount,
                                'receiptFormat' => 'POR_FORMATED_50',
                                'terminalChannel' => 'i.Mali App',
                                'terminalCompanyName' => 'Paytek',
                                'terminalOperator' => 'Operator',
                                'terminalMsgID' => '2020010700060'
                            )
                        );


                        $data = json_decode(json_encode($directRecharge), true);

                        $response = $this->client->VodacomRecharge($data);


                        if ($response->VodacomRechargeResult->hasFault === true) {

                            if ($response->VodacomRechargeResult->fault->mustALR === true) {

                                GeneralAdvice::create([
                                    'reqMsgID' => $response->VodacomRechargeResult->reqMsgID,
                                    'reqterminalID' => $response->VodacomRechargeResult->reqterminalID,
                                    'receiptFormat' => $response->VodacomRechargeResult->receiptFormat,
                                    'respDateTime' => $response->VodacomRechargeResult->respDateTime,
                                    'faultnumber' => $response->VodacomRechargeResult->fault->faultnumber,
                                    'user_id' => $request->user()->id,
                                    'type' => 'direct',
                                    'amount' => $request->amount,
                                    'msno' => $request->phone,
                                    'description' => $request->description
                                ]);

                                $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                                $totalAmount = $request->amount + $imaliUser->taxa;
                                DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);

                                $log = new Record();
                                $log->createLog([
                                    'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                    'details' => $response->VodacomRechargeResult->fault->POR_operatorMsg,
                                    'operation' => 'Buy Voucher',
                                    'status' => 'Error',
                                    'properties' => json_encode($request->except(['pin'])),
                                    //                                    'properties' => $request->all(),
                                    'origin_ip' => $request->ip(),
                                    'origin_request' => $request->url(),
                                    'user_id' => $request->user()->id
                                ]);

                                return response()->json(['message' => $response->VodacomRechargeResult->fault->POR_operatorMsg], 400);
                            } else {

                                $log = new Record();
                                $log->createLog([
                                    'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                    'details' => $response->VodacomRechargeResult->fault->POR_operatorMsg,
                                    'operation' => 'Buy Voucher',
                                    'status' => 'Error',
                                    //                                    'properties' => $request->all(),
                                    'properties' => json_encode($request->except(['pin'])),
                                    'origin_ip' => $request->ip(),
                                    'origin_request' => $request->url(),
                                    'user_id' => $request->user()->id
                                ]);

                                if ($response->VodacomRechargeResult->fault->faultnumber == "35") {

                                    return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                                } else {
                                    return response()->json(['message' => $response->VodacomRechargeResult->fault->POR_operatorMsg], 400);
                                }

                                //                                return response()->json(['message' => $response->VodacomRechargeResult->fault->POR_operatorMsg], 400);
                            }
                        } else {


                            $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                            $totalAmount = $request->amount + $imaliUser->taxa;
                            DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

                            $sms = new SendSMS();

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

                            $resultVoucher = $response->VodacomRechargeResult;
                            $su = PurchaseVoucher::create([
                                'vouchername' => $request->description,
                                'vouchercode' => $request->phone,
                                'vouchervalue' => $request->amount,
                                'price' => $request->amount,
                                'comissao' => $request->amount - $request->price,
                                'reqterminalMsgID' => $resultVoucher->reqterminalMsgID,
                                'reqterminalID' => $resultVoucher->reqterminalID,
                                'reqMsgID' => $resultVoucher->reqMsgID,
                                'respDateTime' => $resultVoucher->respDateTime,
                                'receiptFormat' => $resultVoucher->receiptFormat,
                                'receipt' => $resultVoucher->receipt,
                                'smsreceipt' => $resultVoucher->smsreceipt,
                                'user_id' => $request->user()->id,
                                'voucher_list_id' => null,
                                'type' => 'recarga',
                                'datepurchased' => now(),
                                'category_id' => 23,

                                'old_balance' => $imaliUser->balance,
                                'new_balance' => $imaliUser2->balance
                            ]);

                            //            $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone);

                            TransactionHistory::create([
                                'user_id' => $su->user_id,
                                'voucher_id' => $su->id,
                                'category_id' => $su->category_id,
                                'transaction_type' => 'voucher'
                            ]);

                            VoucherHistory::create([
                                'user_id' => $su->user_id,
                                'voucher_id' => $su->id,
                                'transaction_type' => 'voucher'
                            ]);

                            $log = new Record();
                            $log->createLog([
                                'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                'details' => 'Compra Feita com Sucesso!',
                                'operation' => 'Buy Voucher',
                                'status' => 'Success',
                                'properties' => $su,
                                'origin_ip' => $request->ip(),
                                'origin_request' => $request->url(),
                                'user_id' => $request->user()->id
                            ]);

                            return response()->json([
                                'message' => 'Compra Feita com Sucesso!',
                                'transaction' => $transaction,
                                //                                'data' => $response,
                            ], 200);
                        }

                        //                        $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                        //
                        //                        $totalAmount = $request->amount + $imaliUser->taxa;
                        //
                        //                        DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);
                        //
                        //
                        //                        $sms = new SendSMS();
                        //
                        ////            $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone);
                        //
                        //                        return response()->json([
                        //                            'message' => 'Compra Feita com Sucesso!',
                        //                            'transaction' => $transaction,
                        //                            'data' => $response,
                        //                        ], 200);
                    }

                    if ($request->vouchercode == 'MOV') {

                        $directRecharge = array(
                            'req' => array(
                                'authCred' => array(
                                    'opName' => $this->username,
                                    'password' => $this->password
                                ),
                                'adviceReqMsgID' => $transaction,
                                'terminalID' => 'i.Mali',
                                'terminalChannel' => 'i.Mali App',
                                'terminalMsgID' => '2020010700060',
                                'msgID' => $msid->generateMSID(),
                                'msisdn' => $request->phone,
                                'purchaseValue' => $request->amount,
                                'receiptFormat' => 'POR_FORMATED_50',
                                'terminalCompanyName' => 'Paytek',
                                'terminalOperator' => 'Operator',
                                'test' => $this->isTest,
                            )
                        );


                        $data = json_decode(json_encode($directRecharge), true);
                        $response = $this->client->MovitelRecharge($data);


                        if ($response->MovitelRechargeResult->hasFault === true) {

                            if ($response->MovitelRechargeResult->fault->mustALR === true) {

                                GeneralAdvice::create([
                                    'reqMsgID' => $response->MovitelRechargeResult->reqMsgID,
                                    'reqterminalID' => $response->MovitelRechargeResult->reqterminalID,
                                    'receiptFormat' => $response->MovitelRechargeResult->receiptFormat,
                                    'respDateTime' => $response->MovitelRechargeResult->respDateTime,
                                    'faultnumber' => $response->MovitelRechargeResult->fault->faultnumber,
                                    'user_id' => $request->user()->id,
                                    'type' => 'direct',
                                    'amount' => $request->amount,
                                    'msno' => $request->phone,
                                    'description' => $request->description
                                ]);

                                $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                                $totalAmount = $request->amount + $imaliUser->taxa;
                                DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);

                                $log = new Record();
                                $log->createLog([
                                    'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                    'details' => $response->MovitelRechargeResult->fault->POR_operatorMsg,
                                    'operation' => 'Buy Voucher',
                                    'status' => 'Error',
                                    //                                    'properties' => $request->all(),
                                    'properties' => json_encode($request->except(['pin'])),
                                    'origin_ip' => $request->ip(),
                                    'origin_request' => $request->url(),
                                    'user_id' => $request->user()->id
                                ]);

                                return response()->json(['message' => $response->MovitelRechargeResult->fault->POR_operatorMsg, 'data' => $response->MovitelRechargeResult], 400);
                            } else {

                                $log = new Record();
                                $log->createLog([
                                    'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                    'details' => $response->MovitelRechargeResult->fault->POR_operatorMsg,
                                    'operation' => 'Buy Voucher',
                                    'status' => 'Error',
                                    //                                    'properties' => $request->all(),
                                    'properties' => json_encode($request->except(['pin'])),
                                    'origin_ip' => $request->ip(),
                                    'origin_request' => $request->url(),
                                    'user_id' => $request->user()->id
                                ]);

                                if ($response->MovitelRechargeResult->fault->faultnumber == "35") {

                                    return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                                } else {
                                    return response()->json(['message' => $response->MovitelRechargeResult->fault->POR_operatorMsg], 400);
                                }
                            }
                        } else {

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

                            $totalAmount = $request->amount + $imaliUser->taxa;

                            DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

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

                            $resultVoucher = $response->MovitelRechargeResult;
                            $vouch = PurchaseVoucher::create([
                                'vouchername' => $request->description,
                                'vouchercode' => $request->phone,
                                'vouchervalue' => $request->amount,
                                //                                'price' => $request->price,
                                'price' => $request->amount,
                                'comissao' => $request->amount - $request->price,
                                'reqterminalMsgID' => $resultVoucher->reqterminalMsgID,
                                'reqterminalID' => $resultVoucher->reqterminalID,
                                'reqMsgID' => $resultVoucher->reqMsgID,
                                'respDateTime' => $resultVoucher->respDateTime,
                                'receiptFormat' => $resultVoucher->receiptFormat,
                                'receipt' => $resultVoucher->receipt,
                                'smsreceipt' => $resultVoucher->smsreceipt,
                                'user_id' => $request->user()->id,
                                'voucher_list_id' => null,
                                'type' => 'recarga',
                                'category_id' => 23,

                                'old_balance' => $imaliUser->balance,
                                'new_balance' => $imaliUser2->balance
                            ]);

                            $sms = new SendSMS();

                            //            $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone);


                            TransactionHistory::create([
                                'user_id' => $vouch->user_id,
                                'voucher_id' => $vouch->id,
                                'category_id' => $vouch->category_id,
                                'transaction_type' => 'voucher'
                            ]);


                            VoucherHistory::create([
                                'user_id' => $vouch->user_id,
                                'voucher_id' => $vouch->id,
                                'transaction_type' => 'voucher'
                            ]);


                            $log = new Record();
                            $log->createLog([
                                'description' => 'Celular: ' . $request->phone . ' Montante: ' . $request->amount,
                                'details' => 'Compra Feita com Sucesso!',
                                'operation' => 'Buy Voucher',
                                'status' => 'Success',
                                'properties' => $vouch,
                                'origin_ip' => $request->ip(),
                                'origin_request' => $request->url(),
                                'user_id' => $request->user()->id
                            ]);

                            return response()->json([
                                'message' => 'Compra Feita com Sucesso!',
                                'transaction' => $transaction,
                                //                                'data' => $response,
                            ], 200);
                        }

                        //
                        //                        $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                        //
                        //                        $totalAmount = $request->amount + $imaliUser->taxa;
                        //
                        //                        DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);
                        //
                        //
                        //                        $sms = new SendSMS();
                        //
                        ////            $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone);
                        //
                        //                        return response()->json([
                        //                            'message' => 'Compra Feita com Sucesso!',
                        //                            'transaction' => $transaction,
                        //                            'data' => $response,
                        //                        ], 200);

                    }
                }
            }
        } catch (SoapFault $fault) {
            echo '<br>' . $fault;
        }
    }

    public function checkContador(Request $request)
    {

        $msidGeneration2 = new TransactionGeneration();

        $transaction = $msidGeneration2->generateMSID();

        //        07063184670
        //        84626671881

        $directRecharge = array(
            'req' => array(
                'authCred' => array(
                    'opName' => $this->username,
                    'password' => $this->password
                ),
                'adviceReqMsgID' => $transaction,
                'terminalID' => '1',
                'terminalMsgID' => '2020010700060',
                'msgID' => $msidGeneration2->generateMSID(),
                'meterIdentifier' => array(
                    //                    'msno' => '00008',
                    'msno' => $request->msno,
                    'track2Data' => '',
                ),
                'test' => $this->isTest,
            )
        );

        $data = json_decode(json_encode($directRecharge), true);

        $response = $this->client->ConfirmCustomer($data);

        if ($response->ConfirmCustomerResult->hasFault == false) {

            $contador = Contador::query()
                ->where('msno', $request->msno)
                ->where('user_id', $request->user()->id)
                ->first();

            if ($contador) {
                $log = new Record();
                $log->createLog([
                    'description' => 'Contador: ' . $request->msno . ' msgID: ' . $msidGeneration2->generateMSID(),
                    'details' => 'Este contador já foi adicionado',
                    'operation' => 'Check Contador EDM',
                    'status' => 'Error',
                    //                    'properties' => $request->all(),
                    'properties' => json_encode($request->except(['pin'])),
                    'origin_ip' => $request->ip(),
                    'origin_request' => $request->url(),
                    'user_id' => $request->user()->id
                ]);

                return response()->json(['message' => 'Este contador já foi adicionado'], 400);
            } else {

                $contador = Contador::create([
                    'contador_name' => $request->contador_name,
                    'reqterminalMsgID' => $response->ConfirmCustomerResult->reqterminalMsgID,
                    'reqterminalID' => $response->ConfirmCustomerResult->reqterminalID,
                    'reqMsgID' => $response->ConfirmCustomerResult->reqMsgID,
                    'respDateTime' => $response->ConfirmCustomerResult->respDateTime,
                    'customerAddr' => $response->ConfirmCustomerResult->confirmCustResult->customerAddr,
                    'customerName' => $response->ConfirmCustomerResult->confirmCustResult->customerName,
                    'customerType' => $response->ConfirmCustomerResult->confirmCustResult->customerType,
                    'idNo' => $response->ConfirmCustomerResult->confirmCustResult->idNo,
                    'leRefNo' => $response->ConfirmCustomerResult->confirmCustResult->leRefNo,
                    'agrRef' => $response->ConfirmCustomerResult->confirmCustResult->agrRef,
                    'locRef' => $response->ConfirmCustomerResult->confirmCustResult->locRef,
                    //                    'taxRef' => $response->ConfirmCustomerResult->confirmCustResult->taxRef,
                    'utilName' => $response->ConfirmCustomerResult->confirmCustResult->utilName,
                    'SGC' => $response->ConfirmCustomerResult->confirmCustResult->SGC,
                    'TT' => $response->ConfirmCustomerResult->confirmCustResult->TT,
                    'ALG' => $response->ConfirmCustomerResult->confirmCustResult->ALG,
                    'TI' => $response->ConfirmCustomerResult->confirmCustResult->TI,
                    'KRN' => $response->ConfirmCustomerResult->confirmCustResult->KRN,
                    'msno' => $response->ConfirmCustomerResult->confirmCustResult->msno,
                    'user_id' => $request->user()->id
                ]);

                $log = new Record();
                $log->createLog([
                    'description' => 'Contador: ' . $request->msno . ' msgID: ' . $msidGeneration2->generateMSID(),
                    'details' => 'Contador Adicionado com Sucesso',
                    'operation' => 'Check Contador EDM',
                    'status' => 'Success',
                    //                    'properties' => $request->all(),
                    'properties' => json_encode($request->except(['pin'])),
                    'origin_ip' => $request->ip(),
                    'origin_request' => $request->url(),
                    'user_id' => $request->user()->id
                ]);

                return response()->json(['message' => 'Contador Adicionado com Sucesso', 'data' => $contador], 200);
            }
        } else {

            $log = new Record();
            $log->createLog([
                'description' => 'Contador: ' . $request->msno . ' msgID: ' . $msidGeneration2->generateMSID(),
                'details' => $response->ConfirmCustomerResult->fault->POR_operatorMsg,
                'operation' => 'Check Contador EDM',
                'status' => 'Error',
                //                'properties' => $request->all(),
                'properties' => json_encode($request->except(['pin'])),
                'origin_ip' => $request->ip(),
                'origin_request' => $request->url(),
                'user_id' => $request->user()->id
            ]);

            //            if ($response->MovitelRechargeResult->fault->faultnumber == "35") {
            //
            //                return response()->json(['message' => "Serviço de recargas indisponível"], 400);
            //
            //            } else {
            //                return response()->json(['message' => $response->MovitelRechargeResult->fault->POR_operatorMsg], 400);
            //            }

            return response()->json(['message' => $response->ConfirmCustomerResult->fault->POR_operatorMsg], 404);
        }
    }

    public function getMyContador(Request $request)
    {
        $contadores = Contador::query()
            ->where('user_id', $request->user()->id)
            ->orderByDesc('created_at')
            ->get();

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

    function sendSMSCredelec() {}

    public function getZapPacotes(Request $request)
    {

        //        $topupUrl = 'https://topupretail.com:18880/Service.asmx?wsdl';
        $msidGeneration = new TransactionGeneration();
        $transaction = $msidGeneration->generateMSID();

        $directRecharge = array(
            'req' => array(
                'authCred' => array(
                    'opName' => $this->username,
                    'password' => $this->password
                ),
                'terminalID' => 'i.Mali',
                'terminalMsgID' => '2020010700060',
                //                'msgID' => $msidGeneration->generateMSID(),
                'msgID' => $transaction,
                'test' => $this->isTest,
            )
        );

        $data = json_decode(json_encode($directRecharge), true);

        $response = $this->client->ZAPAvailableProducts($data);

        return response()->json(['data' => $response->ZAPAvailableProductsResult->products->ZAPProduct]);
    }

    public function getDstvProducts($number, $type)
    {
        $msidGeneration = new TransactionGeneration();
        $transaction = $msidGeneration->generateMSID();
        $directRecharge = array(
            'req' => array(
                'authCred' => array(
                    'opName' => $this->username,
                    'password' => $this->password
                ),
                'terminalID' => 'i.Mali',
                'terminalMsgID' => '2020010700060',
                'msgID' => $msidGeneration->generateMSID(),
                'test' => $this->isTest,
                'smartCardnumber' => $number
            )
        );

        $data = json_decode(json_encode($directRecharge), true);

        $response = $this->client->DSTVConfirmCustomer($data);

        $result = $response->DSTVConfirmCustomerResult;

        $responseNew = null;
        $responseDue = null;
        $amount = null;

        if ($result->hasFault == true) {
            return response()->json(['message' => $response->DSTVConfirmCustomerResult->fault->POR_operatorMsg], 400);
        } else {

            if ($type == "GOTV") {

                if ($result->hasGoTV == true) {

                    if ($result->hasNormal == false and $result->statusGoTV == 'Open' and $result->hasBoxOffice == false) {

                        $dataSumbit = array(
                            'req' => array(
                                'authCred' => array(
                                    'opName' => $this->username,
                                    'password' => $this->password
                                ),
                                'terminalID' => 'i.Mali',
                                'terminalMsgID' => '2020010700060',
                                'msgID' => $msidGeneration->generateMSID(),
                                'test' => $this->isTest,
                                'customerNumber' => $result->customerNumber
                            )
                        );
                        $data = json_decode(json_encode($dataSumbit), true);
                        $responseNew = $this->client->DSTVAccountPmntQuote($data);
                    }

                    if ($result->hasNormal == false and $result->statusGoTV == 'Suspended' and $result->hasBoxOffice == false) {

                        $dataSumbit = array(
                            'req' => array(
                                'authCred' => array(
                                    'opName' => $this->username,
                                    'password' => $this->password
                                ),
                                'terminalID' => 'i.Mali',
                                'terminalMsgID' => '2020010700060',
                                'msgID' => $msidGeneration->generateMSID(),
                                'test' => $this->isTest,
                                'customerNumber' => $result->customerNumber
                            )
                        );
                        $data = json_decode(json_encode($dataSumbit), true);
                        $client = new SoapClient($this->topUpUrl, ['trace' => true]);
                        $responseDue = $client->DSTVAccountPmntDue($data);
                    }


                    if ($responseDue != null) {
                        $responseDue = $responseDue->DSTVAccountPmntDueResult;
                    }

                    $dataNew = null;
                    if ($responseNew != null) {
                        $responseNew = $responseNew->DSTVAccountPmntQuoteResult->products->DSTVProduct;
                    }

                    //                    $product = $this->getDstvProduct($type, $result->customerNumber);
                    $product = $this->getDstvProduct($type, $number);

                    if ($product->DSTVAvailableProductsResult->hasFault == true) {
                        return response()->json([
                            //                        'product' => $product->DSTVAvailableProductsResult->products->DSTVProduct,
                            //                        'product' => $product->DSTVAvailableProductsResult,
                            'products' => $product,
                            'client_result' => $result,
                            'payment_quote' => $responseNew,
                            'data' => array($responseNew),
                            'payment_due' => $responseDue
                        ]);
                    } else {

                        if (is_array($product->DSTVAvailableProductsResult->products->DSTVProduct)) {
                            return response()->json([
                                'product' => $product->DSTVAvailableProductsResult->products->DSTVProduct,
                                //                        'product' => $product->DSTVAvailableProductsResult,
                                'products' => $product,
                                'client_result' => $result,
                                'payment_quote' => $responseNew,
                                'data' => array($responseNew),
                                'payment_due' => $responseDue
                            ]);
                        } else {
                            return response()->json([
                                'product' => array($product->DSTVAvailableProductsResult->products->DSTVProduct),
                                //                        'product' => $product->DSTVAvailableProductsResult,
                                'products' => $product,
                                'client_result' => $result,
                                'payment_quote' => $responseNew,
                                'data' => array($responseNew),
                                'payment_due' => $responseDue
                            ]);
                        }
                    }
                } else {
                    return response()->json(['message' => 'Este número não tem GOTV'], 400);
                }
            } elseif ($type == "DSTV") {

                if ($result->hasGoTV == false and $result->hasNormal == true) {

                    //                    if ($result->hasNormal == true and $result->statusGoTV == 'Open' and $result->hasBoxOffice == false) {
                    if ($result->hasNormal == true and $result->statusNormal == 'Open' and $result->hasBoxOffice == false) {

                        $dataSumbit = array(
                            'req' => array(
                                'authCred' => array(
                                    'opName' => $this->username,
                                    'password' => $this->password
                                ),
                                'terminalID' => 'i.Mali',
                                'terminalMsgID' => '2020010700060',
                                'msgID' => $msidGeneration->generateMSID(),
                                'test' => $this->isTest,
                                'customerNumber' => $result->customerNumber
                            )
                        );
                        $data = json_decode(json_encode($dataSumbit), true);
                        $responseNew = $this->client->DSTVAccountPmntQuote($data);
                    }

                    //                    if ($result->hasNormal == false and $result->statusNormal == 'Suspended' and $result->hasBoxOffice == false) {
                    if ($result->hasNormal == true and $result->statusNormal == 'Suspended' and $result->hasBoxOffice == false) {

                        $dataSumbit = array(
                            'req' => array(
                                'authCred' => array(
                                    'opName' => $this->username,
                                    'password' => $this->password
                                ),
                                'terminalID' => 'i.Mali',
                                'terminalMsgID' => '2020010700060',
                                'msgID' => $msidGeneration->generateMSID(),
                                'test' => $this->isTest,
                                'customerNumber' => $result->customerNumber
                            )
                        );
                        $data = json_decode(json_encode($dataSumbit), true);
                        $client = new SoapClient($this->topUpUrl, ['trace' => true]);
                        $responseDue = $client->DSTVAccountPmntDue($data);
                    }

                    if ($responseDue != null) {
                        $responseDue = $responseDue->DSTVAccountPmntDueResult;
                    }

                    if ($responseNew != null) {
                        $responseNew = $responseNew->DSTVAccountPmntQuoteResult->products->DSTVProduct;
                    }
                    $product = $this->getDstvProduct($type, $number);


                    //                    return response()->json([
                    //                        'product' => $product->DSTVAvailableProductsResult->products->DSTVProduct,
                    //                        'products' => $product,
                    //                        'client_result' => $result,
                    //                        'payment_quote' => array($responseNew),
                    //                        'data' => array($responseNew),
                    //                        'payment_due' => $responseDue
                    //                    ]);

                    if ($product->DSTVAvailableProductsResult->hasFault == true) {
                        return response()->json([
                            'products' => $product,
                            'client_result' => $result,
                            'payment_quote' => $responseNew,
                            'data' => array($responseNew),
                            'payment_due' => $responseDue
                        ]);
                    } else {

                        if (is_array($product->DSTVAvailableProductsResult->products->DSTVProduct)) {
                            return response()->json([
                                'product' => $product->DSTVAvailableProductsResult->products->DSTVProduct,
                                'products' => $product,
                                'client_result' => $result,
                                'payment_quote' => $responseNew,
                                'data' => array($responseNew),
                                'payment_due' => $responseDue
                            ]);
                        } else {
                            return response()->json([
                                'product' => array($product->DSTVAvailableProductsResult->products->DSTVProduct),
                                'products' => $product,
                                'client_result' => $result,
                                'payment_quote' => $responseNew,
                                'data' => array($responseNew),
                                'payment_due' => $responseDue
                            ]);
                        }
                    }
                } else {
                    return response()->json(['message' => 'Este número não tem DSTV'], 400);
                }
            }
        }
    }

    private function getDstvProduct($type, $customerSmartCard)
    {
        $msidGeneration = new TransactionGeneration();

        $transaction = $msidGeneration->generateMSID();

        $dataSumbit = array(
            'req' => array(
                'authCred' => array(
                    'opName' => $this->username,
                    'password' => $this->password
                ),
                'terminalID' => 'i.Mali',
                'terminalMsgID' => '2020010700060',
                'msgID' => $transaction,
                'test' => $this->isTest,
                'paymentType' => $type,
                'customerNumber' => '',
                'smartCardnumber' => $customerSmartCard

            )
        );
        //                'customerNumber' => "7026701729",
        //                'customerNumber' => '',
        //                'smartCardnumber' => "7026701729",
        //                'smartCardnumber' => "4620835248",

        $data = json_decode(json_encode($dataSumbit), true);

        $response = $this->client->DSTVAvailableProducts($data);

        return $response;
    }

    public function buyDstvPacote(Request $request)
    {

        $this->validate($request, [
            'payment_type' => 'required|in:GOTV,DSTV',
            'description' => 'required',
            'code' => 'required',
            'smartCardnumber' => 'required',
            'price' => 'required',
            'period' => 'required',
            //'pin' => 'required',
            'customerNumber' => 'required'
        ], [
            'payment_type.in' => 'a variavel payment_type deve ser GOTV ou DSTV',

        ]);

        $kyc = new Kyc();
        $result = $kyc->checkUserBuyDSTV($request);
        if ($result) {
            return $result;
        } else {

            $msidGeneration = new TransactionGeneration();

            $directRecharge = array(
                'req' => array(
                    'authCred' => array(
                        'opName' => $this->username,
                        'password' => $this->password
                    ),
                    'terminalID' => 'i.Mali',
                    'terminalMsgID' => '2020010700060',
                    'msgID' => $msidGeneration->generateMSID(),
                    'test' => $this->isTest,
                    'customerNumber' => $request->customerNumber,
                    'paymentType' => $request->payment_type,
                    'purchaseValue' => $request->price,
                    //                    'period' => $request->period,
                    'period' => 1,
                    'receiptFormat' => 'POR_FORMATED_50',
                    'terminalLocation' => 'Maputo Cidade',
                    'terminalChannel' => "i.Mali",
                    'terminalCompanyName' => 'Paytek Africa',
                    'terminalOperator' => 'i.Mali',
                )
            );

            $data = json_decode(json_encode($directRecharge), true);
            $response = $this->client->DSTVSubmitPayment($data);

            $result = $response->DSTVSubmitPaymentResult;

            if ($result->hasFault == true and $result->fault->mustALR == true) {

                GeneralAdvice::create([
                    'reqMsgID' => $result->reqMsgID,
                    'reqterminalID' => $result->reqterminalID,
                    'receiptFormat' => $result->receiptFormat,
                    'respDateTime' => $result->respDateTime,
                    'faultnumber' => $result->fault->faultnumber,
                    'user_id' => $request->user()->id,
                    'type' => 'dstv',
                    'amount' => $request->price,
                    'msno' => $request->code,
                    'description' => $request->description
                ]);

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

                $totalAmount = $request->price + $imaliUser->taxa;
                DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);


                $log = new Record();
                $log->createLog([
                    'description' => 'Nr Cliente: ' . $request->customerNumber . 'code: ' . $request->code,
                    'price: ' . $request->price,
                    'details' => $result->fault->POR_operatorMsg,
                    'operation' => 'Compra do Pacote ' . $request->payment_type,
                    'status' => 'Error',
                    //                    'properties' => $request->all(),
                    'properties' => json_encode($request->except(['pin'])),
                    'origin_ip' => $request->ip(),
                    'origin_request' => $request->url(),
                    'user_id' => $request->user()->id
                ]);

                //                if ($result->fault->faultnumber == "9") {
                //
                //                    // TRATAMOS O METODO DE MUSTALT
                //
                //                    return response()->json([
                //                        'message' => $result->fault->POR_operatorMsg,
                //                        'description' => 'VAmos tratar o must Alr',
                //                        'faultnumber' => $result->fault->faultnumber,
                //                        'data' => $response
                //                    ], 400);
                //                }

                // DEVEMOS TRATAR O MUSTALR
                return response()->json([
                    'message' => $result->fault->POR_operatorMsg,
                    'faultnumber' => $result->fault->faultnumber,
                    'description2' => 'VAmos tratar o must Alr',
                    'data' => $response
                ], 400);
            } elseif ($result->hasFault == true and $result->fault->mustALR == false) {

                if ($result->fault->faultnumber == "35") {
                    return response()->json([
                        'message' => "Serviço de recargas indisponível.",
                        'faultnumber' => $result->fault->faultnumber,
                        'data' => $response
                    ], 400);
                } else {
                    return response()->json([
                        'message' => $result->fault->POR_operatorMsg,
                        'faultnumber' => $result->fault->faultnumber,
                        'data' => $response
                    ], 400);
                }
            } else {


                // METODOS DE PAGAMENTO
                $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                $totalAmount = $request->price + $imaliUser->taxa;

                DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

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

                $recarga = PurchaseVoucher::create([
                    'transaction' => $result->transactionNo,
                    'vouchername' => $request->payment_type . '-' . $request->description,
                    //                    'vouchername' =>$request->description,
                    'vouchercode' => $request->code,
                    'vouchervalue' => $request->price,
                    'price' => $request->price,
                    'datepurchased' => $result->respDateTime,
                    'reqterminalMsgID' => $result->reqterminalMsgID,
                    'reqterminalID' => $result->reqterminalID,
                    'reqMsgID' => $result->reqMsgID,
                    'respDateTime' => $result->respDateTime,
                    'receiptFormat' => $result->receiptFormat,
                    'receipt' => $result->receipt,
                    'smsreceipt' => $result->smsreceipt,
                    'user_id' => $request->user()->id,
                    'voucher_list_id' => null,
                    'type' => 'Tv',
                    'smartCard' => $request->customerNumber,
                    'category_id' => 18,

                    'old_balance' => $imaliUser->balance,
                    'new_balance' => $imaliUser2->balance
                ]);

                TransactionHistory::create([
                    'user_id' => $recarga->user_id,
                    'voucher_id' => $recarga->id,
                    'category_id' => $recarga->category_id,
                    'transaction_type' => 'tv'
                ]);

                VoucherHistory::create([
                    'user_id' => $recarga->user_id,
                    'voucher_id' => $recarga->id,
                    'transaction_type' => 'tv'
                ]);

                $log = new Record();
                $log->createLog([
                    'description' => 'Transaction' . $recarga->reqMsgID . ' Nr Cliente: ' . $request->customerNumber . 'code: ' . $request->code,
                    'price: ' . $request->price,
                    'details' => "Pacote Activado Com Sucesso",
                    'operation' => 'Buy StarTimes',
                    'status' => 'Success',
                    'properties' => $recarga,
                    'origin_ip' => $request->ip(),
                    'origin_request' => $request->url(),
                    'user_id' => $request->user()->id
                ]);

                $notification = array(
                    'icon' => 'ic_i_mali_cover',
                    'title' => 'i.Mali recargas',
                    'body' => 'Parabéns, ' . ' comprou recarga ' . $recarga->vouchername . '.' . ' i.Mali é o Futuro',
                    'click_action' => 'com.imali.payapp.payment_RECARGA_NOTIFICATION',
                    'color' => '#ffffff'
                );

                $data = array(
                    'reqMsgID' => $recarga->reqMsgID,
                    'vouchername' => $recarga->vouchername,
                    'vouchercode' => (float)$recarga->vouchercode,
                    'data' => $recarga->created_at,
                    'price' => $recarga->price,
                    'vouchervalue' => $recarga->vouchervalue,
                    'sms' => $recarga->receipt,
                    'route' => 'RECARGA_NOTIFICATION',
                    'terminal' => 'firebase'
                );
                $this->pushNotifification($request->user()->firebase_token, $notification, $data);


                return response()->json([
                    'message' => 'Pagamento Feito com Sucesso',
                    'data' => $response,
                    'reqMsgID' => $response->DSTVSubmitPaymentResult->reqMsgID
                ], 200);
            }


            //
        }
    }

    //    public function getDstvProductsOLD($customerNumber)
    //    {
    //        $msidGeneration = new TransactionGeneration();
    //
    //        $transaction = $msidGeneration->generateMSID();
    //
    //        $directRecharge = array(
    //            'req' => array(
    //                'authCred' => array(
    //                    'opName' => $this->username,
    //                    'password' => $this->password
    //                ),
    //                'terminalID' => 'i.Mali',
    //                'terminalMsgID' => '2020010700060',
    //                'msgID' => $msidGeneration->generateMSID(),
    //                'test' => $this->isTest,
    //                'paymentType' => 'GOTV',
    //                'customerNumber' => $customerNumber,
    ////                'customerNumber' => '9001005',
    ////                'customerNumber' => '9001008',
    ////                'customerNumber' => '9001006',
    ////                'smartCardnumber' => '1001008'
    //            )
    //        );
    //
    //        $data = json_decode(json_encode($directRecharge), true);
    //
    //        $options = array(
    //            'cache_wsdl' => 0,
    //            'trace' => 1,
    //            'stream_context' => stream_context_create(array(
    //                'ssl' => array(
    //                    'verify_peer' => false,
    //                    'verify_peer_name' => false,
    //                    'allow_self_signed' => true
    //                )
    //            )));
    //
    //        $client = new SoapClient($this->topUpUrl, $options);
    ////        $response = $client->DSTVAvailableProducts($data);
    //        $response = $client->DSTVConfirmCustomer($data);
    //
    ////        $result = $response->DSTVConfirmCustomerResult;
    ////
    ////        if ($result->hasFault == false) {
    ////            if ($result->hasGOTV == true && $result->statusGoTV == 'open') {
    ////
    ////            }
    ////        }
    //
    //        return response()->json($response);
    //
    ////        if ($response->DSTVAvailableProductsResult->hasFault === false) {
    ////            return response()->json(['data' => $response->DSTVAvailableProductsResult->products->DSTVProduct]);
    ////        } else {
    ////            return response()->json(['message' => $response->DSTVAvailableProductsResult->fault->POR_operatorMsg], 400);
    ////        }
    //
    ////        return response()->json(['data' => $response->DSTVAvailableProductsResult->products->DSTVProduct]);
    ////        return response()->json(['data' => $response]);
    //    }
    //
    //    public function getDstvProducts($customerNumber)
    //    {
    //        $msidGeneration = new TransactionGeneration();
    //        $transaction = $msidGeneration->generateMSID();
    //        $directRecharge = array(
    //            'req' => array(
    //                'authCred' => array(
    //                    'opName' => $this->username,
    //                    'password' => $this->password
    //                ),
    //                'terminalID' => 'i.Mali',
    //                'terminalMsgID' => '2020010700060',
    //                'msgID' => $msidGeneration->generateMSID(),
    //                'test' => $this->isTest,
    //                'paymentType' => 'GOTV',
    //                'smartCardnumber' => $customerNumber
    //            )
    //        );
    //
    //        $data = json_decode(json_encode($directRecharge), true);
    //
    //        $options = array(
    //            'cache_wsdl' => 0,
    //            'trace' => 1,
    //            'stream_context' => stream_context_create(array(
    //                'ssl' => array(
    //                    'verify_peer' => false,
    //                    'verify_peer_name' => false,
    //                    'allow_self_signed' => true
    //                )
    //            )));
    //
    ////        $client = new SoapClient($this->topUpUrl, ['trace' => true]);
    //        $client = new SoapClient($this->topUpUrl, $options);
    //        $response = $client->DSTVConfirmCustomer($data);
    //
    //        $result = $response->DSTVConfirmCustomerResult;
    //
    //
    //        return response()->json($result);
    //
    //        $responseNew = null;
    //        $responseNewData = null;
    //        $responseDue = null;
    //        $amount = null;
    //
    //        if ($result->hasNormal == false and $result->statusGoTV == 'Open' and $result->hasNormal == false and $result->hasBoxOffice == false) {
    //
    //            $dataSumbit = array(
    //                'req' => array(
    //                    'authCred' => array(
    //                        'opName' => $this->username,
    //                        'password' => $this->password
    //                    ),
    //                    'terminalID' => 'i.Mali',
    //                    'terminalMsgID' => '2020010700060',
    //                    'msgID' => $msidGeneration->generateMSID(),
    //                    'test' => $this->isTest,
    //                    'customerNumber' => $result->customerNumber
    //                )
    //            );
    //            $data = json_decode(json_encode($dataSumbit), true);
    //
    //            $options = array(
    //                'cache_wsdl' => 0,
    //                'trace' => 1,
    //                'stream_context' => stream_context_create(array(
    //                    'ssl' => array(
    //                        'verify_peer' => false,
    //                        'verify_peer_name' => false,
    //                        'allow_self_signed' => true
    //                    )
    //                )));
    //
    ////            $client = new SoapClient($this->topUpUrl, ['trace' => true]);
    //            $client = new SoapClient($this->topUpUrl, $options);
    //            $responseNew = $client->DSTVAccountPmntQuote($data);
    //        }
    //
    //        if ($result->hasNormal == false and $result->statusGoTV == 'Suspended' and $result->hasBoxOffice == false) {
    //
    //            $dataSumbit = array(
    //                'req' => array(
    //                    'authCred' => array(
    //                        'opName' => $this->username,
    //                        'password' => $this->password
    //                    ),
    //                    'terminalID' => 'i.Mali',
    //                    'terminalMsgID' => '2020010700060',
    //                    'msgID' => $msidGeneration->generateMSID(),
    //                    'test' => $this->isTest,
    //                    'customerNumber' => $result->customerNumber
    //                )
    //            );
    //            $data = json_decode(json_encode($dataSumbit), true);
    //
    //            $options = array(
    //                'cache_wsdl' => 0,
    //                'trace' => 1,
    //                'stream_context' => stream_context_create(array(
    //                    'ssl' => array(
    //                        'verify_peer' => false,
    //                        'verify_peer_name' => false,
    //                        'allow_self_signed' => true
    //                    )
    //                )));
    //
    //            $client = new SoapClient($this->topUpUrl, $options);
    //            $responseDue = $client->DSTVAccountPmntDue($data);
    //
    ////            $amount = $responseNew->DSTVAccountPmntDueResult->dueAmount;
    //        }
    //
    ////        $pagamento = array(
    ////            'req' => array(
    ////                'authCred' => array(
    ////                    'opName' => $this->username,
    ////                    'password' => $this->password
    ////                ),
    ////                'terminalID' => 'i.Mali',
    ////                'terminalMsgID' => '2020010700060',
    ////                'msgID' => $msidGeneration->generateMSID(),
    ////                'test' => $this->isTest,
    ////                'customerNumber' => $result->customerNumber,
    ////                'paymentType' => 'GOTV',
    ////                'purchaseValue' => $amount,
    ////                'period' => $result->periodGoTV,
    ////                'receiptFormat' => 'POR_FORMATED_50',
    ////                'terminalLocation' => 'Maputo Cidade',
    ////                'terminalChannel' => "i.Mali",
    ////                'terminalCompanyName' => 'Paytek Africa',
    ////                'terminalOperator' => 'User121: ',
    ////            )
    ////        );
    ////
    ////        $data = json_decode(json_encode($pagamento), true);
    ////        $client = new SoapClient($this->topUpUrl, ['trace' => true]);
    ////        $responsePagamento = $client->DSTVSubmitPayment($data);
    //
    ////        return response()->json(['clienteResult' => $result, 'PREPayment' => $responseNew, 'payment'=> $responsePagamento]);
    //
    //        if ($responseDue != null) {
    //            $responseDue = $responseDue->DSTVAccountPmntDueResult;
    //        }
    //
    //        if ($responseNew != null) {
    //            $responseNew = $responseNew->DSTVAccountPmntQuoteResult->products->DSTVProduct;
    //            $responseNewData = $responseNew;
    //
    //            if (!is_array($responseNew))
    //                $responseNew = array($responseNew);
    //        }
    //
    //        return response()->json(['client_result' => $result, 'payment_quote' => $responseNewData, 'data' => $responseNew, 'payment_due' => $responseDue]);
    //
    //    }
    //
    //    public function buyDstvPacote(Request $request)
    //    {
    //
    //        return $request->all();
    ////        $kyc = new Kyc();
    ////        $result = $kyc->checkUserBuyZap($request);
    ////        if ($result) {
    ////            return $result;
    ////        } else {
    ////
    ////            $msidGeneration = new TransactionGeneration();
    ////
    ////            $directRecharge = array(
    ////                'req' => array(
    ////                    'authCred' => array(
    ////                        'opName' => $this->username,
    ////                        'password' => $this->password
    ////                    ),
    ////                    'terminalID' => 'i.Mali',
    ////                    'terminalMsgID' => '2020010700060',
    ////                    'msgID' => $msidGeneration->generateMSID(),
    ////                    'test' => $this->isTest,
    ////                    'customerNumber' => $request->customerNumber,
    ////                    'paymentType' => $request->payment_type,
    ////                    'purchaseValue' => $request->price,
    ////                    'period' => 1,
    ////                    'receiptFormat' => 'POR_FORMATED_50',
    ////                    'terminalLocation' => 'Maputo Cidade',
    ////                    'terminalChannel' => "i.Mali",
    ////                    'terminalCompanyName' => 'Paytek Africa',
    ////                    'terminalOperator' => 'Paytek iMali',
    ////                )
    ////            );
    ////
    ////            $data = json_decode(json_encode($directRecharge), true);
    ////            $client = new SoapClient($this->topUpUrl, ['trace' => true]);
    ////            $response = $client->DSTVSubmitPayment($data);
    ////
    ////            return response()->json(['message' => 'Pagamento Feito com Sucesso', 'data' => $response]);
    ////
    ////        }
    //
    //    }

    // todo ---- Actualizado customerNumber para costumerNumber
    public function buyZapPacote(Request $request)
    {
        $kyc = new Kyc();
        $result = $kyc->checkUserBuyZap($request);
        if ($result) {

            $log = new Record();
            $log->createLog([
                'description' => 'Nr Cliente: ' . $request->costumerNumber . 'code: ' . $request->code,
                'price: ' . $request->price,
                'details' => $result,
                'operation' => 'Buy Zap',
                'status' => 'Error',
                //                'properties' => $request->all(),
                'properties' => json_encode($request->except(['pin'])),
                'origin_ip' => $request->ip(),
                'origin_request' => $request->url(),
                'user_id' => $request->user()->id
            ]);

            return $result;
        } else {
            //            $topupUrl = 'https://topupretail.com:18880/Service.asmx?wsdl';
            $msidGeneration = new TransactionGeneration();

            $transaction = $msidGeneration->generateMSID();

            $directRecharge = array(
                'req' => array(
                    'authCred' => array(
                        'opName' => $this->username,
                        'password' => $this->password
                    ),
                    'terminalID' => 'i.Mali',
                    'terminalMsgID' => '2020010700060',
                    'msgID' => $msidGeneration->generateMSID(),
                    'test' => $this->isTest,
                    'customerNumber' => $request->costumerNumber,
                    'code' => $request->code,
                    'price' => $request->price,
                    'receiptFormat' => 'POR_FORMATED_50',
                    'terminalLocation' => 'Maputo Cidade',
                    'terminalChannel' => "i.Mali",
                    'terminalCompanyName' => 'Paytek Africa',
                    'terminalOperator' => 'User121',
                )
            );

            $data = json_decode(json_encode($directRecharge), true);

            $response = $this->client->ZAPPayment($data);

            $zapResult = $response->ZAPPaymentResult;


            if ($zapResult->hasFault === false) {


                //                $recarga = PurchaseVoucher::create([
                ////                    'transaction' => $response->transaction,
                //                    'vouchername' => $request->description,
                //                    'vouchercode' => $request->code,
                //                    'vouchervalue' => $request->price,
                //                    'price' => $request->price,
                ////            'barcode' => $voucherInfo->barcode,
                //                    'reqterminalMsgID' => $zapResult->reqterminalMsgID,
                //                    'reqterminalID' => $zapResult->reqterminalID,
                //                    'reqMsgID' => $zapResult->reqMsgID,
                //                    'respDateTime' => $zapResult->respDateTime,
                ////                    'voucherinfo' => $voucherInfo,
                ////            'serial' => $voucher->serial,
                ////            'pin' => $voucher->pin,
                ////            'datepurchased' => $voucher->datepurchased,
                //                    'receiptFormat' => $zapResult->receiptFormat,
                //                    'receipt' => $zapResult->receipt,
                //                    'smsreceipt' => $zapResult->smsreceipt,
                //                    'user_id' => $request->user()->id,
                //                    'voucher_list_id' => null,
                //                    'type' => 'Tv'
                //                ]);


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

                $totalAmount = $request->price + $imaliUser->taxa;

                DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

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

                $recarga = PurchaseVoucher::create([
                    //                    'transaction' => $response->transaction,
                    'vouchername' => 'Zap-' . $request->description,
                    'vouchercode' => $request->code,
                    'vouchervalue' => $request->price,
                    'price' => $request->price,
                    //            'barcode' => $voucherInfo->barcode,
                    'reqterminalMsgID' => $zapResult->reqterminalMsgID,
                    'reqterminalID' => $zapResult->reqterminalID,
                    'reqMsgID' => $zapResult->reqMsgID,
                    'respDateTime' => $zapResult->respDateTime,
                    //                    'voucherinfo' => $voucherInfo,
                    //            'serial' => $voucher->serial,
                    //            'pin' => $voucher->pin,
                    //            'datepurchased' => $voucher->datepurchased,
                    'receiptFormat' => $zapResult->receiptFormat,
                    'receipt' => $zapResult->receipt,
                    'smsreceipt' => $zapResult->smsreceipt,
                    'user_id' => $request->user()->id,
                    'voucher_list_id' => null,
                    'type' => 'Tv',
                    'category_id' => 18,

                    'old_balance' => $imaliUser->balance,
                    'new_balance' => $imaliUser2->balance
                ]);

                TransactionHistory::create([
                    'user_id' => $recarga->user_id,
                    'voucher_id' => $recarga->id,
                    'category_id' => $recarga->category_id,
                    'transaction_type' => 'tv'
                ]);

                $notification = array(
                    'icon' => 'ic_i_mali_cover',
                    'title' => 'i.Mali recargas',
                    'body' => 'Parabéns, ' . ' comprou recarga ' . $recarga->vouchername . '.' . ' i.Mali é o Futuro',
                    'click_action' => 'com.imali.payapp.payment_RECARGA_NOTIFICATION',
                    'color' => '#ffffff'
                );

                $data = array(
                    'reqMsgID' => $recarga->reqMsgID,
                    'vouchername' => $recarga->vouchername,
                    'vouchercode' => (float)$recarga->vouchercode,
                    'data' => $recarga->created_at,
                    //                    'pin' => $recarga->pin,
                    //                    'serial' => $recarga->serial,
                    'price' => $recarga->price,
                    'vouchervalue' => $recarga->vouchervalue,
                    'sms' => $recarga->receipt,
                    'route' => 'RECARGA_NOTIFICATION',
                    'terminal' => 'firebase'
                );
                $this->pushNotifification($request->user()->firebase_token, $notification, $data);


                $log = new Record();
                $log->createLog([
                    'description' => 'Transaction' . $recarga->reqMsgID . ' Nr Cliente: ' . $request->costumerNumber . 'code: ' . $request->code,
                    'price: ' . $request->price,
                    'details' => $result,
                    'operation' => 'Buy Zap',
                    'status' => 'Success',
                    'properties' => $recarga,
                    'origin_ip' => $request->ip(),
                    'origin_request' => $request->url(),
                    'user_id' => $request->user()->id
                ]);


                return response()->json(['data' => $response, 'message' => 'Pacote renovado com Sucesso', 'sms' => $zapResult->smsreceipt, 'reqMsgID' => $zapResult->reqMsgID]);
            } else {

                if ($response->ZAPPaymentResult->fault->mustALR === true) {

                    GeneralAdvice::create([
                        'reqMsgID' => $response->ZAPPaymentResult->reqMsgID,
                        'reqterminalID' => $response->ZAPPaymentResult->reqterminalID,
                        'receiptFormat' => $response->ZAPPaymentResult->receiptFormat,
                        'respDateTime' => $response->ZAPPaymentResult->respDateTime,
                        'faultnumber' => $response->ZAPPaymentResult->fault->faultnumber,
                        'user_id' => $request->user()->id,
                        'type' => 'zap',
                        'amount' => $request->price,
                        'msno' => $request->code,
                        'description' => $request->description
                    ]);

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

                    $totalAmount = $request->price + $imaliUser->taxa;
                    DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);


                    $log = new Record();
                    $log->createLog([
                        'description' => 'Nr Cliente: ' . $request->costumerNumber . 'code: ' . $request->code,
                        'price: ' . $request->price,
                        'details' => $response->ZAPPaymentResult->fault->POR_operatorMsg,
                        'operation' => 'Check Contador EDM',
                        'status' => 'Error',
                        //                        'properties' => $request->all(),
                        'properties' => json_encode($request->except(['pin'])),
                        'origin_ip' => $request->ip(),
                        'origin_request' => $request->url(),
                        'user_id' => $request->user()->id
                    ]);
                }

                $log = new Record();
                $log->createLog([
                    'description' => 'Nr Cliente: ' . $request->costumerNumber . 'code: ' . $request->code,
                    'price: ' . $request->price,
                    'details' => $response->ZAPPaymentResult->fault->POR_operatorMsg,
                    'operation' => 'Check Contador EDM',
                    'status' => 'Error',
                    //                    'properties' => $request->all(),
                    'properties' => json_encode($request->except(['pin'])),
                    'origin_ip' => $request->ip(),
                    'origin_request' => $request->url(),
                    'user_id' => $request->user()->id
                ]);

                if ($response->ZAPPaymentResult->fault->faultnumber == "35") {

                    return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                } else {
                    return response()->json(['message' => $response->ZAPPaymentResult->fault->POR_operatorMsg], 400);
                }

                //                return response()->json(['data' => $response, 'message' => $response->ZAPPaymentResult->fault->POR_operatorMsg], 400);
            }
        }
    }

    public function getWaterClient(Request $request)
    {
        //        $topupUrl = 'https://topupretail.com:18880/Service.asmx?wsdl';
        $msidGeneration = new TransactionGeneration();

        $transaction = $msidGeneration->generateMSID();


        $directRecharge = array(
            'req' => array(
                'authCred' => array(
                    'opName' => $this->username,
                    'password' => $this->password
                ),
                'terminalID' => 'i.Mali',
                'terminalMsgID' => '2020010700060',
                'msgID' => $msidGeneration->generateMSID(),
                'test' => $this->isTest,
                'clientNumber' => $request->clientNumber,
                'entityNumber' => $request->entityNumber,
            )
        );

        $data = json_decode(json_encode($directRecharge), true);

        $response = $this->client->AquaConfirmCustomer($data);

        $result = $response->AquaConfirmCustomerResult;

        if ($result->hasFault === true) {

            return response()->json(['message' => $result->fault->POR_operatorMsg, 'data' => $result], 400);
        } else {

            $count = 0;
            $name = '';
            //            $total = count((array)$result->aquaConfrimCustDocs->AquaConfrimCustDocs);
            //            $total = count((array($result->aquaConfrimCustDocs->AquaConfrimCustDocs)));

            $conta = ContaWater::query()
                ->where('entityNumber', $request->entityNumber)
                ->where('clientNumber', $request->clientNumber)
                ->where('user_id', $request->user()->id)
                ->first();

            if (is_array($result->aquaConfrimCustDocs->AquaConfrimCustDocs)) {
                foreach ($result->aquaConfrimCustDocs->AquaConfrimCustDocs as $wdata) {
                    $name = $wdata->clientName;
                }
                if (!$conta) {
                    ContaWater::create([
                        'entityNumber' => $request->entityNumber,
                        'clientNumber' => $request->clientNumber,
                        'clientName' => $name,
                        'user_id' => $request->user()->id
                    ]);
                }
                return response()->json(['data' => $result->aquaConfrimCustDocs->AquaConfrimCustDocs], 200);
            } else {
                if (!$conta) {
                    ContaWater::create([
                        'entityNumber' => $request->entityNumber,
                        'clientNumber' => $request->clientNumber,
                        'clientName' => $result->aquaConfrimCustDocs->AquaConfrimCustDocs->clientName,
                        'user_id' => $request->user()->id
                    ]);
                }
                return response()->json(['data' => array($result->aquaConfrimCustDocs->AquaConfrimCustDocs)], 200);
            }
        }
    }

    public function payWater(Request $request)
    {

        //        /VERIFICAR KYC

        //        $topupUrl = 'https://topupretail.com:18880/Service.asmx?wsdl';

        $kyc = new Kyc();
        $result = $kyc->checkUserBuyWater($request);
        if ($result) {

            $log = new Record();
            $log->createLog([
                'description' => 'Nr Cliente: ' . $request->clientNumber . 'Entidade: ' . $request->entityNumber,
                'Montante: ' . $request->purchaseValue,
                'details' => $result,
                'operation' => 'Pay Water',
                'status' => 'Error',
                //                'properties' => $request->all(),
                'properties' => json_encode($request->except(['pin'])),
                'origin_ip' => $request->ip(),
                'origin_request' => $request->url(),
                'user_id' => $request->user()->id
            ]);

            return $result;
        } else {


            $msidGeneration = new TransactionGeneration();

            $transaction = $msidGeneration->generateMSID();


            $directRecharge = array(
                'req' => array(
                    'authCred' => array(
                        'opName' => $this->username,
                        'password' => $this->password
                    ),
                    'terminalID' => 'i.Mali',
                    'terminalMsgID' => '2020010700060',
                    'msgID' => $msidGeneration->generateMSID(),
                    'test' => $this->isTest,
                    'clientNumber' => $request->clientNumber,
                    'entityNumber' => $request->entityNumber,
                    'documentTypeID' => $request->documentTypeID,
                    'documentYear' => $request->documentYear,
                    'documentNumber' => $request->documentNumber,
                    'clientName' => $request->clientName,
                    'purchaseValue' => $request->purchaseValue,
                    'receiptFormat' => 'POR_FORMATED_50',
                    'terminalLocation' => '',
                    'terminalChannel' => 'i.Mali',
                    'terminalCompanyName' => 'Paytek',
                    'terminalOperator' => $request->user()->name,
                )
            );

            $data = json_decode(json_encode($directRecharge), true);


            $response = $this->client->AquaPayment($data);

            if ($response->AquaPaymentResult->hasFault === false) {


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

                $totalAmount = $request->purchaseValue + $imaliUser->taxa;

                DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

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

                $water = Water::create([
                    'user_id' => $request->user()->id,
                    'reqterminalID' => $response->AquaPaymentResult->reqterminalID,
                    'reqMsgID' => $response->AquaPaymentResult->reqMsgID,
                    'reqterminalMsgID' => $response->AquaPaymentResult->reqterminalMsgID,
                    'respDateTime' => $response->AquaPaymentResult->respDateTime,
                    'receiptFormat' => $response->AquaPaymentResult->receiptFormat,
                    'smsreceipt' => $response->AquaPaymentResult->smsreceipt,
                    'receipt' => $response->AquaPaymentResult->receipt,
                    'TransactionCost' => $response->AquaPaymentResult->TransactionCost,
                    'clientNumber' => $request->clientNumber,
                    'entityNumber' => $request->entityNumber,
                    'documentTypeID' => $request->documentTypeID,
                    'documentYear' => $request->documentYear,
                    'documentNumber' => $request->documentNumber,
                    'clientName' => $request->clientName,
                    'purchaseValue' => $request->purchaseValue,
                    'category_id' => 22,

                    'old_balance' => $imaliUser->balance,
                    'new_balance' => $imaliUser2->balance
                ]);

                //            $sms = new SendSMS();
                //            $sms->sendSMSPurchaseWater($water->smsreceipt, $request->user()->phone);

                TransactionHistory::create([
                    'user_id' => $water->user_id,
                    'water_id' => $water->id,
                    'category_id' => $water->category_id,
                    'transaction_type' => 'water'
                ]);

                VoucherHistory::create([
                    'user_id' => $water->user_id,
                    'water_id' => $water->id,
                    'transaction_type' => 'water'
                ]);

                return response()->json(['message' => 'Transacção efectuada com Sucesso', 'sms' => $water->smsreceipt, 'reqMsgID' => $water->reqMsgID], 200);
            } else {


                if ($response->AquaPaymentResult->fault->mustALR === true) {

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

                    $totalAmount = $request->purchaseValue + $imaliUser->taxa;
                    DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);

                    GeneralAdvice::create([
                        'reqMsgID' => $response->AquaPaymentResult->reqMsgID,
                        'reqterminalID' => $response->AquaPaymentResult->reqterminalID,
                        'receiptFormat' => $response->AquaPaymentResult->receiptFormat,
                        'respDateTime' => $response->AquaPaymentResult->respDateTime,
                        'faultnumber' => $response->AquaPaymentResult->fault->faultnumber,
                        'user_id' => $request->user()->id,
                        'type' => 'agua',
                        'amount' => $request->purchaseValue,
                        'msno' => $request->entityNumber,
                        'description' => 'Factura Agua'
                    ]);
                }

                if ($response->AquaPaymentResult->fault->faultnumber == "35") {

                    return response()->json(['message' => "Serviço de recargas indisponível"], 400);
                } else {
                    return response()->json(['message' => $response->AquaPaymentResult->fault->POR_operatorMsg], 400);
                }
            }
        }
    }

    public function checkClientStartTimes($smartCard)
    {


        $transaction = $this->msid->generateMSID();
        $directRecharge = array(
            'req' => array(
                'authCred' => array(
                    'opName' => $this->username,
                    'password' => $this->password
                ),
                'terminalID' => 'i.Mali',
                'terminalMsgID' => '2020010700060',
                'msgID' => $transaction,
                'test' => $this->isTest,
                'smartCardnumber' => $smartCard
            )
        );

        $data = json_decode(json_encode($directRecharge), true);

        $response = $this->client->StarConfirmCustomer($data);

        if ($response->StarConfirmCustomerResult->hasFault == true) {
            //        return response()->json($response->StarConfirmCustomerResult);
            return response()->json([
                'message' => $response->StarConfirmCustomerResult->fault->POR_operatorMsg
            ], 400);
        } else {

            if (is_array($response->StarConfirmCustomerResult->availProducts->StarProduct)) {

                return response()->json([
                    'account' => $response->StarConfirmCustomerResult,
                    'data' => $response->StarConfirmCustomerResult->availProducts->StarProduct
                ]);
            } else {

                return response()->json([
                    'account' => $response->StarConfirmCustomerResult,
                    'data' => array($response->StarConfirmCustomerResult->availProducts->StarProduct)
                ]);
            }
        }
    }

    public function payStartTimesPackage(Request $request)
    {
        $this->validate($request, [
            'productDesc' => 'required',
            'productNumber' => 'required',
            'purchaseValue' => 'required',
            'smartCardnumber' => 'required'
        ]);
        $kyc = new Kyc();
        $result = $kyc->checkUserBuyStartimes($request);

        if ($result) {

            $log = new Record();
            $log->createLog([
                'description' => 'Nr Cliente: ' . $request->smartCardnumber . 'code: ' . $request->productNumber,
                'price: ' . $request->purchaseValue,
                'details' => $result,
                'operation' => 'Buy StarTimes',
                'status' => 'Error',
                //                'properties' => $request->all(),
                'properties' => json_encode($request->except(['pin'])),
                'origin_ip' => $request->ip(),
                'origin_request' => $request->url(),
                'user_id' => $request->user()->id
            ]);

            return $result;
        } else {

            $transaction = $this->msid->generateMSID();
            $directRecharge = array(
                'req' => array(
                    'authCred' => array(
                        'opName' => $this->username,
                        'password' => $this->password
                    ),
                    'terminalID' => 'i.Mali',
                    'terminalMsgID' => '2020010700060',
                    'msgID' => $transaction,
                    'test' => $this->isTest,
                    'smartCardnumber' => $request->smartCardnumber,
                    'productDesc' => $request->productDesc,
                    'productNumber' => $request->productNumber,
                    'purchaseValue' => $request->purchaseValue,
                    'receiptFormat' => 'POR_FORMATED_50',
                    'terminalChannel' => 'iMali_APP',
                    'terminalCompanyName' => 'Paytek',
                    'terminalOperator' => 'iMali',
                    'terminalLocation' => 'Maputo'
                )
            );
            $data = json_decode(json_encode($directRecharge), true);

            $response = $this->client->StarPayment($data);

            if ($response->StarPaymentResult->hasFault == false) {
                $result = $response->StarPaymentResult;

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

                $totalAmount = $request->purchaseValue + $imaliUser->taxa;

                DB::table('imali_accounts')->where('user_id', $request->user()->id)->decrement('balance', $totalAmount);

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

                $recarga = PurchaseVoucher::create([
                    'transaction' => $result->transactionId,
                    'vouchername' => 'StarTimes-' . $request->productDesc,
                    'vouchercode' => $request->productNumber,
                    'vouchervalue' => $request->purchaseValue,
                    'price' => $request->purchaseValue,
                    'datepurchased' => $result->respDateTime,
                    'reqterminalMsgID' => $result->reqterminalMsgID,
                    'reqterminalID' => $result->reqterminalID,
                    'reqMsgID' => $result->reqMsgID,
                    'respDateTime' => $result->respDateTime,
                    'receiptFormat' => $result->receiptFormat,
                    'receipt' => $result->receipt,
                    'smsreceipt' => $result->smsreceipt,
                    'user_id' => $request->user()->id,
                    'voucher_list_id' => null,
                    'type' => 'Tv',
                    'smartCard' => $request->smartCardnumber,
                    'category_id' => 18,

                    'old_balance' => $imaliUser->balance,
                    'new_balance' => $imaliUser2->balance
                ]);

                TransactionHistory::create([
                    'user_id' => $recarga->user_id,
                    'voucher_id' => $recarga->id,
                    'category_id' => $recarga->category_id,
                    'transaction_type' => 'tv'
                ]);

                VoucherHistory::create([
                    'user_id' => $recarga->user_id,
                    'voucher_id' => $recarga->id,
                    'transaction_type' => 'tv'
                ]);


                $log = new Record();
                $log->createLog([
                    'description' => 'Transaction' . $recarga->reqMsgID . ' Nr Cliente: ' . $request->smartCardNumber . 'code: ' . $request->productNumber,
                    'price: ' . $request->purchaseValue,
                    'details' => "Pacote Activado Com Sucesso",
                    'operation' => 'Buy StarTimes',
                    'status' => 'Success',
                    'properties' => $recarga,
                    'origin_ip' => $request->ip(),
                    'origin_request' => $request->url(),
                    'user_id' => $request->user()->id
                ]);

                $notification = array(
                    'icon' => 'ic_i_mali_cover',
                    'title' => 'i.Mali recargas',
                    'body' => 'Parabéns, ' . ' comprou recarga ' . $recarga->vouchername . '.' . ' i.Mali é o Futuro',
                    'click_action' => 'com.imali.payapp.payment_RECARGA_NOTIFICATION',
                    'color' => '#ffffff'
                );

                $data = array(
                    'reqMsgID' => $recarga->reqMsgID,
                    'vouchername' => $recarga->vouchername,
                    'vouchercode' => (float)$recarga->vouchercode,
                    'data' => $recarga->created_at,
                    'price' => $recarga->price,
                    'vouchervalue' => $recarga->vouchervalue,
                    'sms' => $recarga->receipt,
                    'route' => 'RECARGA_NOTIFICATION',
                    'terminal' => 'firebase'
                );
                $this->pushNotifification($request->user()->firebase_token, $notification, $data);

                return response()->json([
                    'payment' => $response,
                    'message' => 'Pacote activado com Sucesso',
                    'reqMsgID' => $recarga->reqMsgID,
                    'sms' => $recarga->smsreceipt
                ], 200);
            } else {

                if ($response->StarPaymentResult->fault->mustALR == true) {

                    $imaliUser = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
                    $totalAmount = $request->amount + $imaliUser->taxa;
                    DB::table('imali_accounts')->where('user_id', $request->user()->id)->increment('captive_balance', $totalAmount);

                    $g = GeneralAdvice::create([
                        'reqMsgID' => $response->StarPaymentResult->reqMsgID,
                        'reqterminalID' => $response->StarPaymentResult->reqterminalID,
                        'receiptFormat' => $response->StarPaymentResult->receiptFormat,
                        'respDateTime' => $response->StarPaymentResult->respDateTime,
                        'faultNumber' => $response->StarPaymentResult->fault->faultnumber,
                        'message' => $response->StarPaymentResult->fault->POR_operatorMsg,
                        'user_id' => $request->user()->id,
                        'type' => 'direct',
                        'amount' => $request->purchaseValue,
                        'msno' => $request->productNumber,
                        'description' => $request->productDesc
                    ]);

                    $log = new Record();
                    $log->createLog([
                        'description' => 'Transaction ' . $g->reqMsgID . ' Voucher: ' . $request->productDesc,
                        'details' => $response->StarPaymentResult->fault->POR_operatorMsg,
                        'operation' => 'Buy StarTimes',
                        'status' => 'Error',
                        //                        'properties' => $request->all(),
                        'properties' => json_encode($request->except(['pin'])),
                        'origin_ip' => $request->ip(),
                        'origin_request' => $request->url(),
                        'user_id' => $request->user()->id
                    ]);
                } else {

                    return response()->json([
                        //                        'payment' => $response,
                        'message' => $response->StarPaymentResult->fault->POR_operatorMsg
                    ], 400);
                }
            }
        }
    }


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

    //? Remover contador de energia
    public function destroy($id)
    {

        // recuperando o contador
        try {

            $quota = Contador::findOrFail($id);
        } catch (\Exception $e) {
            return response()->json(['message' => 'O contador selecionado não existe na Base de Dados!'], 500);
        }


        // excluindo o contador
        try {

            $quota->delete();

            return response()->json(['message' => 'Contador removido com sucesso.'], 200);
        } catch (\Exception $e) {
            return response()->json(['message' => 'Erro ao excluir o contador, possivelmente encontra-se relacionado com outros registos'], 500);
        }
    }
}