<?php namespace App\Http\Controllers; use App\Bank\Payment; use App\Classes\GenerateImaliAccount; use App\Classes\GenerateToken; use App\Classes\GenerateUserId; use App\Classes\Kyc; use App\Classes\PartnerKyc; use App\Classes\Record; use App\Classes\SendSMS; use App\Classes\SendSMSSislog; use App\Classes\SmsManager; use App\Classes\TransactionGeneration; use App\GeneralAdvice; use App\Imali\ImaliAccount; use App\Imali\ImaliAccountConfig; use App\Imali\MerchantAccount; use App\Imali\MerchantContract; use App\PaymentGeneration; use App\PhoneValidation; use App\PurchaseVoucher; use App\Refund; use App\Store; use App\StoreAmountGeneration; use App\User; use App\UserClient; use App\UserMobilePhone; use App\VoucherType; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use DB; use SoapClient; use SoapFault; class UserClientController extends Controller { protected $username; protected $password; protected $topUpUrl; protected $client; protected $msid; protected $request; protected $requestRefund; protected $requestRefundConfirm; protected $token; protected $generatedPayment; protected SmsManager $smsManager; public function __construct() { // TESTE $this->username = "TEST_PAYTEK"; $this->password = "TESTpassPAYtek"; $this->topUpUrl = 'https://topupretail.com:18880/Service.asmx?wsdl'; // PRODUCTION // $this->username = "PAYTEK_PROD"; // $this->password = "fs.S}nf4:IGXT|R"; // $this->topUpUrl = 'https://topupretail.com:18873/Service.asmx?wsdl'; $options = array( // 'cache_wsdl' => 0, // 'trace' => 1, 'exceptions' => 1, 'trace' => true, 'keep_alive' => false, 'connection_timeout' => 5000, 'cache_wsdl' => WSDL_CACHE_NONE, 'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | SOAP_COMPRESSION_DEFLATE, 'stream_context' => stream_context_create(array( 'ssl' => array( 'verify_peer' => true, 'verify_peer_name' => true, 'allow_self_signed' => true, // 'ciphers'=>'RC4-SHA' ) ))); $this->client = new SoapClient($this->topUpUrl, $options); $this->msid = new TransactionGeneration(); $this->smsManager = new SmsManager(); } public function getLang() { return response()->json(['message' => trans('not_found_transaction')]); } public function checkTransactionStatus($transaction) { $pay = Payment::query() ->with(['store', 'customer', 'account']) ->where('partner_transaction_id', '=', $transaction) ->first(); if (!$pay) { $pay = Payment::query() ->with(['store', 'customer', 'account']) ->where('transaction_id', '=', $transaction) ->first(); if ($pay) { $pay->makeHidden([ 'id', 'qrcode', 'firebase_token', 'device_name', 'store_id', 'user_client_id', 'updated_at', 'imali_account_id', 'merchant_id', 'sender_id', 'store_amount_generation_id', 'category_id', 'estado', 'estado_color', 'transaction_id', 'token', 'token_sent', 'used_points', 'received_points', 'client_id', 'payment_type', 'amount_debited', 'comissao', 'payment_id' ]); if ($pay->customer) { $pay->customer->makeHidden(['id', 'status', 'profile', 'email', 'birthday', 'balance_visibility', 'country_code', 'email_verified_at', 'session_status', 'firebase_token', 'user_client_id', 'phone_reference', 'terminalCompanyName', 'terminalChannel', 'terminalID', 'client_id', 'created_at', 'updated_at', 'info_status', 'last_name', 'phone', 'bi', 'update_info_status', 'user_update_info_status', 'document_id', 'photo', 'user_id']); } if ($pay->account) { $pay->account->makeHidden(['id', 'status', 'profile', 'email', 'birthday', 'balance_visibility', 'country_code', 'email_verified_at', 'session_status', 'firebase_token', 'user_client_id', 'phone_reference', 'terminalCompanyName', 'terminalChannel', 'terminalID', 'client_id', 'created_at', 'updated_at', 'info_status', 'bi', 'update_info_status', 'user_update_info_status', 'document_id', 'photo', 'user_id', 'imali_account_config', 'captive_balance', 'balance', 'points', 'reference' ]); } $pay->store->makeHidden([ 'id', 'qrcode', 'firebase_token', 'device_name', 'store_id', 'user_client_id', 'created_at', 'updated_at', 'updated_at', 'user_id', 'industry_activity', 'merchant_contract_id', 'merchant_account_id', 'longitude', 'latitude', 'balance', 'session_status', 'photo', 'logo', 'status', 'email', 'qrcode' ]); if (\auth()->user()->id != $pay->client_id) { return response()->json(['message' => trans('not_allowed_on_store')], 400); } else { return response()->json($pay); } } else { return response()->json(['message' => trans('not_found_transaction')], 400); } } else { $pay->makeHidden([ 'id', 'qrcode', 'firebase_token', 'device_name', 'store_id', 'user_client_id', 'updated_at', 'imali_account_id', 'merchant_id', 'sender_id', 'store_amount_generation_id', 'category_id', 'estado', 'estado_color', 'transaction_id', 'token', 'token_sent', 'used_points', 'received_points', 'client_id', 'payment_type', 'amount_debited', 'comissao', 'payment_id' ]); if ($pay->customer) { $pay->customer->makeHidden(['id', 'status', 'profile', 'email', 'birthday', 'balance_visibility', 'country_code', 'email_verified_at', 'session_status', 'firebase_token', 'user_client_id', 'phone_reference', 'terminalCompanyName', 'terminalChannel', 'terminalID', 'client_id', 'created_at', 'updated_at', 'info_status', 'phone', 'last_name', 'bi', 'update_info_status', 'user_update_info_status', 'document_id', 'photo', 'user_id']); } if ($pay->account) { $pay->account->makeHidden(['id', 'status', 'profile', 'email', 'birthday', 'balance_visibility', 'country_code', 'email_verified_at', 'session_status', 'firebase_token', 'user_client_id', 'phone_reference', 'terminalCompanyName', 'terminalChannel', 'terminalID', 'client_id', 'created_at', 'updated_at', 'info_status', 'bi', 'update_info_status', 'user_update_info_status', 'document_id', 'photo', 'user_id', 'imali_account_config', 'captive_balance', 'balance', 'points', 'reference' ]); } $pay->store->makeHidden([ 'id', 'qrcode', 'firebase_token', 'device_name', 'store_id', 'user_client_id', 'created_at', 'updated_at', 'updated_at', 'user_id', 'industry_activity', 'merchant_contract_id', 'merchant_account_id', 'longitude', 'latitude', 'balance', 'session_status', 'photo', 'logo', 'status', 'email', 'qrcode' ]); if (\auth()->user()->id != $pay->client_id) { return response()->json(['message' => trans('not_allowed_on_store')], 400); } else { return response()->json($pay); } } } public function getTransaction(Request $request, $transaction) { $token = str_replace('Bearer ', '', $request->header('authorization')); $userClient = UserClient::query() ->where('client_key', '=', $token) ->first(); $pay = PaymentGeneration::query() ->where('payment_generations.partner_transaction_id', '=', $transaction) ->first(); if (!$pay) { return response()->json(['message' => trans('not_found_transaction')], 400); } else { if ($userClient->id != $pay->user_client_id) { return response()->json(['message' => trans('not_allowed_on_store')], 400); } else { $payment = PaymentGeneration::query() ->with(['store', 'customer']) ->where('payment_generations.partner_transaction_id', '=', $transaction) ->get(); if ($payment) { $payment->makeHidden([ 'merchant_id', 'imali_account_id', 'user_id', 'token', 'user_client_id', 'token_sent', 'id', 'estado_color', 'sender_id', 'store_id', 'client_id', 'updated_at', 'category_id', 'stores.id', 'store.status', 'store.session_status', 'store.firebase_token', 'store.user_client_id', 'store.merchant_account_id', 'store.merchant_contract_id', 'store.industry_activity', 'store.user_id', 'store.created_at', 'store.updated_at', 'customer.id', 'customer.profile', 'customer.status', 'customer.email', 'customer.birthday', 'customer.balance_visibility', 'customer.country_code', 'customer.email_verified_at', 'customer.firebase_token', 'customer.phone_reference', 'customer.terminalCompanyName', 'customer.terminalChannel', 'customer.terminalID', 'customer.client_id', 'customer.info_status', 'customer.update_info_status', 'customer.user_update_info_status', 'customer.document_id', 'customer.created_at', 'customer.updated_at', ]); foreach ($payment as $store) { $store->store->makeHidden(['id', 'status', 'session_status', 'firebase_token', 'user_client_id', 'merchant_account_id', 'merchant_contract_id', 'industry_activity', 'user_id', 'created_at', 'updated_at', 'latitude', 'longitude', 'balance']); $store->customer->makeHidden(['id', 'status', 'profile', 'email', 'birthday', 'balance_visibility', 'country_code', 'email_verified_at', 'session_status', 'firebase_token', 'user_client_id', 'phone_reference', 'terminalCompanyName', 'terminalChannel', 'terminalID', 'client_id', 'created_at', 'updated_at', 'info_status', 'update_info_status', 'user_update_info_status', 'document_id', 'photo', 'user_id']); $store->account->makeHidden(['id', 'points', 'balance', 'captive_balance', 'user_id', 'imali_account_config', 'created_at', 'updated_at']); } return response()->json($payment); } else { return response()->json(['message' => trans('not_found_transaction')], 400); } } } } public function getAccount(Request $request) { return response()->json($request->user()->makeHidden(['id', 'created_at', 'updated_at', 'email_verified_at', 'session_status', 'url', 'user_type' , 'client_key', 'status'])); } public function getVoucherType() { $data = VoucherType::query() ->where('status', 'disponivel') ->where('type', 'recarga') ->select('name', 'code', 'type', 'logo', 'created_at', 'updated_at') ->get(); return response()->json(['data' => $data], 200); } public function getUserVoucher(Request $request) { $this->validate($request, [ 'accountNumber' => 'required|min:9|max:9' ]); $token = str_replace('Bearer ', '', $request->header('authorization')); $clientStore = UserClient::query()->where('client_key', $token)->first(); $kyc = new PartnerKyc(); $result = $kyc->checkImaliAccount($request); if ($result) { return $result; } else { $user = User::query() ->join('imali_accounts', 'imali_accounts.user_id', '=', 'users.id') ->where('imali_accounts.account_number', $request->accountNumber) ->select('users.*') ->first(); $data = PurchaseVoucher::query() ->where('user_id', $user->id) ->where('client_id', $clientStore->id) ->orderByDesc('created_at') ->get(); $data->makeHidden(['id', 'user_id', 'client_id', 'voucher_list_id', 'comissao', 'transaction', 'price', 'voucherinfo']); return response()->json(['data' => $data], 200); } } public function getVoucherList() { try { $msid = new TransactionGeneration(); $params = array( 'req' => array( 'authCred' => array( 'opName' => $this->username, 'password' => $this->password ), 'msgID' => $msid->generateMSID(), 'terminalID' => 'APP', 'terminalMsgID' => '202001070006' ) ); $data = json_decode(json_encode($params), true); $client = new SoapClient($this->topUpUrl, ['trace' => true]); $response = $client->VoucherList($data); return response()->json(['data' => $response->VoucherListResult->voucherlist->VoucherInfo]); } catch (SoapFault $fault) { echo '<br>' . $fault; } } public function buyVoucher(Request $request) { $this->validate($request, [ 'pin' => 'required|min:4|max:4', 'accountNumber' => 'required', 'voucher' => 'required', 'transactionID' => 'required', // 'amount' => 'required', 'terminalID' => 'required', 'terminalChannel' => 'required', 'terminalCompanyName' => 'required' ], [ 'pin.required' => 'O Pin é Obrigatório', 'accountNumber.required' => 'O accountNumber é Obrigatório', 'voucher.required' => 'O voucher é Obrigatório', 'terminalCompanyName.required' => 'O campo terminalCompanyName é Obrigatório', 'terminalID.required' => 'terminalID é Obrigatório', 'terminalChannel.required' => 'terminalChannel é Obrigatório', ]); $user = User::query() ->join('imali_accounts', 'imali_accounts.user_id', '=', 'users.id') ->where('imali_accounts.account_number', $request->accountNumber) ->first(); // $voucherAmount = intval(preg_replace('/[^0-9]+/', '', $request->voucher), 10); try { $kyc = new PartnerKyc(); $result = $kyc->checkPaymentVoucher($request); if ($result) { return $result; } else { $msid = new TransactionGeneration(); // $transaction = $msid->generateMSID(); $transaction = $this->msid->generateMSID(); $params = array( 'req' => array( 'authCred' => array( 'opName' => $this->username, 'password' => $this->password ), 'terminalMsgID' => '202001070006', // 'msgID' => $request->transactionID, 'msgID' => $transaction, 'test' => true, 'order' => array( 'VoucherOrder' => array( 'vouchercode' => $request->voucher, // 'vouchercode' => 'VOM000010', 'qty' => 1 ) ), 'receiptFormat' => 'POR_FORMATED_50', 'terminalChannel' => $request->terminalChannel, 'terminalCompanyName' => $request->terminalCompanyName, 'terminalID' => $request->terminalID, 'terminalOperator' => 'Operator' ) ); $data = json_decode(json_encode($params), true); $response = $this->client->PurchaseVoucher($data); $res = $response->PurchaseVoucherResult; $token = str_replace('Bearer ', '', $request->header('authorization')); $clientStore = UserClient::query()->where('client_key', $token)->first(); if ($response->PurchaseVoucherResult->hasFault === false) { $voucher = $response->PurchaseVoucherResult->vouchers->Voucher; $voucherInfo = $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo; $recarga = PurchaseVoucher::create([ // 'transaction' => $response->transaction, 'vouchername' => $voucherInfo->vouchername, 'vouchercode' => $voucherInfo->vouchercode, 'vouchervalue' => $voucherInfo->vouchervalue, 'barcode' => $voucherInfo->barcode, // 'price' => $voucherInfo->price, 'price' => $voucherInfo->vouchervalue, 'comissao' => $voucherInfo->vouchervalue - $voucherInfo->price, 'reqterminalMsgID' => $res->reqterminalMsgID, 'reqterminalID' => $res->reqterminalID, 'reqMsgID' => $res->reqMsgID, 'respDateTime' => $res->respDateTime, // 'voucherinfo' => $voucherInfo, 'serial' => $voucher->serial, 'pin' => $voucher->pin, 'datepurchased' => $voucher->datepurchased, 'receiptFormat' => $voucher->receiptFormat, 'receipt' => $voucher->receipt, 'smsreceipt' => $voucher->smsreceipt, 'user_id' => $user->id, 'voucher_list_id' => null, 'type' => 'recarga', 'client_id' => $clientStore->id, 'terminalChannel' => $request->terminalChannel, 'terminalCompanyName' => $request->terminalCompanyName, 'terminalID' => $request->terminalID, ]); $imaliUser = ImaliAccount::query()->where('account_number', $request->accountNumber)->first(); $totalAmount = $recarga->vouchervalue + $imaliUser->taxa; DB::table('imali_accounts')->where('user_id', $user->id)->decrement('balance', $totalAmount); // $sms = new SendSMS(); // // $sms->sendSMSPurchaseVoucher($response->PurchaseVoucherResult->vouchers->Voucher, $response->PurchaseVoucherResult->vouchers->Voucher->voucherinfo->vouchername, auth()->user()->phone); $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' => (double)$recarga->vouchercode, 'data' => $recarga->created_at, 'pin' => $recarga->pin, 'serial' => $recarga->serial, 'price' => $recarga->price, 'vouchervalue' => $recarga->vouchervalue, 'sms' => $recarga->receipt, 'terminal' => 'firebase' ); $this->pushNotifification($user->firebase_token, $notification, $data); return response()->json([ 'message' => 'Compra Feita com Sucesso!', 'transaction' => $request->transactionID, // 'data' => $response->PurchaseVoucherResult, 'vouchername' => $voucherInfo->vouchername, 'vouchercode' => $voucherInfo->vouchercode, 'vouchervalue' => $voucherInfo->vouchervalue, 'barcode' => $voucherInfo->barcode, 'serial' => $voucher->serial, 'pin' => $voucher->pin, ], 200); } else { if ($response->PurchaseVoucherResult->fault->mustALR === true) { $imaliUser = ImaliAccount::query()->where('user_id', $user->id)->first(); $totalAmount = $request->amount + $imaliUser->taxa; DB::table('imali_accounts')->where('user_id', $user->id)->increment('captive_balance', $totalAmount); // return response()->json(['message' => $response->PurchaseVoucherResult], 405); GeneralAdvice::create([ 'reqMsgID' => $response->PurchaseVoucherResult->reqMsgID, 'reqterminalID' => $response->PurchaseVoucherResult->reqterminalID, // 'receiptFormat' => $response->PurchaseVoucherResult->receiptFormat, 'receiptFormat' => 'POR_FORMATED_50', 'respDateTime' => $response->PurchaseVoucherResult->respDateTime, 'faultNumber' => $response->PurchaseVoucherResult->fault->faultnumber, 'user_id' => $user->id, 'type' => 'direct', // 'amount' => $request->voucher . substr(4, 4), 'amount' => $request->amount, 'message' => $response->PurchaseVoucherResult->fault->POR_operatorMsg, 'msno' => $request->voucher, 'description' => $request->voucher, 'client_id' => $clientStore->id, 'terminalChannel' => $request->terminalChannel, 'terminalCompanyName' => $request->terminalCompanyName, 'terminalID' => $request->terminalID, ]); return response()->json(['message' => $response->PurchaseVoucherResult->fault->POR_operatorMsg], 405); } else { return response()->json(['message' => $response->PurchaseVoucherResult->fault->POR_operatorMsg], 400); } } } } catch (SoapFault $fault) { echo '<br>' . $fault; } } public function getUserInfo($accountNumber, Request $request) { $user = User::query() ->join('imali_accounts', 'users.id', '=', 'imali_accounts.user_id') ->where('account_number', $accountNumber) ->first(); $user->makeHidden(['id', 'user_id', 'client_id', 'profile', 'status', 'birthday', 'bi', 'terminalID', 'terminalChannel', 'terminalCompanyName', 'email_verified_at', 'firebase_token', 'phone_reference', 'created_at', 'updated_at', 'imali_account_config', 'captive_balance', 'country_code', 'photo', 'email', 'points', 'phone', 'balance_visibility', 'update_info_status', 'user_update_info_status', 'document_id', 'info_status' ]); // $token = str_replace('Bearer ', '', $request->header('authorization')); // $clientStore = UserClient::query()->where('client_key', $token)->first(); $kyc = new PartnerKyc(); $result = $kyc->checkImaliAccount($request); if ($result) { return $result; } else { return response()->json($user); } } public function IntegrateImaliAccount(Request $request) { $this->validate($request, [ 'accountNumber' => 'required|min:9|max:9', 'pin' => 'required|min:4|max:4', ]); $user = User::query() ->join('imali_accounts', 'users.id', '=', 'imali_accounts.user_id') ->where('account_number', $request->accountNumber) ->first(); if ($user) { if (Hash::check($request->pin, $user->pin)) { return response()->json(['message' => 'Conta verificada']); } else { return response()->json(['message' => 'Pin incorrecto'], 405); } } else { return response()->json(['message' => 'Conta inválida'], 400); } } function saveClientIntegrator(Request $request) { $this->validate($request, [ 'name' => 'required|min:3|max:50', 'institution' => 'required|unique:user_clients|min:3', 'phone' => 'required|unique:user_clients|min:9|integer', 'email' => 'required|email|unique:user_clients,email', 'nuit' => 'required|min:9|integer', ], [ 'email.required' => 'O Campo Email é de carácter Obrigatório', 'email.unique' => 'Este Email já está em uso', 'phone.required' => 'O Número do celular é obrigatório', 'phone.unique' => 'O Número do celular já está em uso', 'phone.min' => 'O Campo Celular deve ter 9 dígitos', 'name.required' => 'O Campo Nome é obrigatório', 'institution.required' => 'O Campo Institution é obrigatório', 'nuit.required' => 'O campo Nuit é Obrigatório', 'nuit.min' => 'O campo nuit ter 9 dígitos', ]); $client = UserClient::create([ 'name' => $request->name, 'email' => $request->email, 'phone' => $request->phone, 'institution' => $request->institution, 'password' => Hash::make('12345678'), 'nuit' => $request->nuit, 'user_type' => $request->user_type ]); $token = $client->createToken('api_token')->plainTextToken; $client->update(['client_key' => $token]); // Mail::to($client->email)->send(new ImaliIntegration($client)); return response()->json(['message' => 'Cliente Integrador Adicionado com Sucesso', 'api_token' => $token]); } function revokeToken(Request $request) { $request->user()->tokens()->delete(); auth()->user()->tokens()->delete(); return response()->json(['message' => 'Logout feito com sucesso!']); } public function updateUserClient(Request $request) { $values = $this->validate($request, [ 'email' => 'required|email', // 'password' => 'required|min:8' ]); $userClient = UserClient::query() ->where('email', '=', $values['email']) ->first(); // if (!Auth::attempt($values)) { // if (!Hash::check($values['password'], $userClient->password)) { // return response()->json(['message' => 'Credenciais incorrectos'], 403); // } else { // $token = $userClient->createToken('secret')->plainTextToken; $userClient->update(['client_key' => $request->token]); return response()->json([ // 'user' => auth()->user(), 'user' => $userClient, 'token' => $request->token // 'token' => auth()->user()->createToken('secret')->plainTextToken ]); // } } public function loginUserClient(Request $request) { $values = $this->validate($request, [ 'email' => 'required|email', 'password' => 'required|min:8' ]); $userClient = UserClient::query() ->where('email', '=', $values['email']) ->first(); // if (!Auth::attempt($values)) { if ($userClient) { if (!Hash::check($values['password'], $userClient->password)) { return response()->json(['message' => 'Credenciais incorrectos'], 403); } else { $token = $userClient->createToken('secret')->plainTextToken; $userClient->update(['client_key' => $token]); return response()->json([ // 'user' => auth()->user(), 'user' => $userClient, 'token' => $token // 'token' => auth()->user()->createToken('secret')->plainTextToken ]); } } else { return response()->json(['message' => 'User account not found'], 404); } } public function saveToken(Request $request) { $this->validate($request, [ 'client_id' => 'required' ]); $client = UserClient::find($request->client_id); if ($client) { $token = $client->createToken('api_token')->plainTextToken; UserClient::query() ->where('id', '=', $request->client_id) ->update(['client_key' => $token]); return response()->json(['api_token' => $token]); } else { return response()->json(['message' => 'Client Not Found'], 400); } } public function getClients() { $users = UserClient::query()->get(); return response()->json($users); } public function getStoreQrcode(Request $request, $accountNumber) { $kyc = new PartnerKyc(); $checkKyc = $kyc->checkGetTransactions($request, $accountNumber); if ($checkKyc) { return $checkKyc; } else { $store = Store::query() ->where('account_number', $accountNumber) ->select('qrcode', 'public_id') ->first(); return response()->json(['qrcode_url' => $store->qrcode, 'store_reference' => $store->public_id], 200); } } public function QrcodeTransaction(Request $request) { $this->validate($request, [ 'amount' => 'required', 'accountNumber' => 'required', 'transactionID' => 'required|min:12', 'terminalID' => 'required', 'terminalChannel' => 'required', 'terminalCompanyName' => 'required' ], [ 'accountNumber.required' => 'O Campo accountNumber é Obrigatório', 'transactionID.required' => 'O Campo transactionId é Obrigatório', 'amount.required' => 'O Campo amount é Obrigatório', 'terminalCompanyName.required' => 'O campo terminalCompanyName é Obrigatório', 'terminalID.required' => 'terminalID é Obrigatório', 'terminalChannel.required' => 'terminalChannel é Obrigatório', ]); $kyc = new PartnerKyc(); $result = $kyc->checkIntegrador($request); if ($result) { $log = new Record(); $log->createLog([ 'description' => 'Gerar Qrcode Partner', 'details' => $request, 'operation' => 'Falha', 'properties' => json_encode($request->all()), 'origin_request' => $request->url(), 'origin_ip' => $request->ip(), 'status' => 'error', 'user_id' => $request->user()->id ]); return $result; } else { $checkStore = Store::query() ->join('merchant_accounts', 'merchant_accounts.id', '=', 'stores.merchant_account_id') ->where('stores.account_number', $request->accountNumber) ->select('stores.*', 'merchant_accounts.institution') ->first(); $token = str_replace('Bearer ', '', $request->header('authorization')); $userClient = UserClient::query()->where('client_key', $token)->first(); if ($checkStore) { if (is_numeric($request->amount)) { $res = StoreAmountGeneration::create([ 'transaction' => \Ramsey\Uuid\Uuid::uuid4(), 'partner_transaction_id' => $request->transactionID, 'amount' => $request->amount, 'store_id' => $checkStore->id, 'firebase_token' => $request->firebase_token, 'terminalID' => $request->terminalID, 'terminalChannel' => $request->terminalChannel, 'terminalCompanyName' => $request->terminalCompanyName, 'user_client_id' => $userClient->id ]); return response()->json(['message' => 'Transacção Gerada com Sucesso', 'amount' => $res->amount, 'transaction' => $res->transaction, // 'transaction' => $res->partner_transaction_id, 'account_number' => $checkStore->account_number, 'address_store' => $checkStore->address, // 'duration' => $res->duration, // 'status' => $res->status, 'institution' => $checkStore->institution, 'promo' => 'Compra Recargas com Zero Taxas no i.Mali'], 201); } else { return response()->json(['message' => 'Introduza um montante válido'], 407); } } else return response()->json(['message' => 'Loja Inválida'], 404); } } public function Qrcode(Request $request) { $this->validate($request, [ 'amount' => 'required', 'accountNumber' => 'required', 'transactionID' => 'required|min:12', 'terminalID' => 'required', 'terminalChannel' => 'required', 'terminalCompanyName' => 'required' ]); $kyc = new PartnerKyc(); $result = $kyc->checkIntegrador($request); if ($result) { $log = new Record(); $log->createLog([ 'description' => 'Gerar Qrcode Partner', 'details' => $request, 'operation' => 'Falha', 'properties' => json_encode($request->all()), 'origin_request' => $request->url(), 'origin_ip' => $request->ip(), 'status' => 'error', 'user_id' => $request->user()->id ]); return $result; } else { $checkStore = Store::query() ->join('merchant_accounts', 'merchant_accounts.id', '=', 'stores.merchant_account_id') ->where('stores.account_number', '=', $request->accountNumber) ->select('stores.*', 'merchant_accounts.institution') ->first(); $token = str_replace('Bearer ', '', $request->header('authorization')); $userClient = UserClient::query()->where('client_key', $token)->first(); if ($checkStore) { if (is_numeric($request->amount)) { $res = Payment::create([ 'transaction_id' => $request->transactionID, 'partner_transaction_id' => $request->transactionID, 'amount' => $request->amount, 'store_id' => $checkStore->id, 'status' => 'pending', 'estado' => 'pending', 'firebase_token' => $request->firebase_token, 'terminalID' => $request->terminalID, 'terminalChannel' => $request->terminalChannel, 'terminalCompanyName' => $request->terminalCompanyName, 'client_id' => $userClient->id ]); return response()->json([ 'message' => trans('transaction_generated'), 'amount' => $res->amount, 'transaction' => $res->transaction_id, 'account_number' => $checkStore->account_number, 'address_store' => $checkStore->address, 'institution' => $checkStore->institution, 'promo' => trans('promo')], 201); } else { return response()->json(['message' => trans('insert_valid_amount')], 407); } } else return response()->json(['message' => trans('invalid_store')], 404); } } public function getBalance($account_number) { if (is_numeric($account_number)) { $userBalance = ImaliAccount::query() ->where('account_number', $account_number) ->select('balance') ->first(); if ($userBalance) { return response()->json($userBalance); } else { return response()->json(['message' => 'Conta inválida'], 400); } } else { return response()->json(['message' => 'Conta i.Mali contém apenas dígitos numéricos'], 400); } } public function addStoreToUserClient(Request $request) { $this->validate($request, [ 'store_account_number' => 'required', 'user_client_id' => 'required', // 'id' => 'required', ], [ 'account_number.required' => 'campo store_account_number é de carácter obrigatório', // 'id.required' => 'Campo id é obrigatório', 'user_client_id.required' => 'Campo user_client_id é obrigatório', ]); $store = Store::query() ->where('account_number', $request->store_account_number) // ->where('account_number', $request->account_number) // ->where('id', $request->id) ->first(); $checkIntegration = Store::query() ->where('account_number', $request->store_account_number) ->where('user_client_id', $request->user_client_id) ->where('id', $request->id) ->first(); if ($checkIntegration) { return response()->json(['message' => 'Está integração já foi feita!'], 400); } else { if ($store) { $store->update([ 'user_client_id' => $request->user_client_id ]); return response()->json(['message' => 'Lojá integrada com Sucesso'], 200); } else { return response()->json(['message' => 'Lojá inválida'], 400); } } } public function sendToken(Request $request) { $this->validate($request, [ 'name' => 'required', 'phone' => 'required|unique:users|min:9', 'email' => 'required|email|unique:users,email', 'password' => 'required|min:8', 'password_confirmation' => 'required|min:8', 'terminalID' => 'required', // 'country_code' => 'required', 'terminalChannel' => 'required', 'terminalCompanyName' => 'required', ], [ 'email.required' => 'O Campo Email é de carácter Obrigatório', 'email.unique' => 'Este Email já está em uso', 'phone.required' => 'O Número do celular é obrigatório', 'phone.unique' => 'O Número do celular já está em uso', 'phone.min' => 'O Campo Celular deve ter 9 dígitos', 'name.required' => 'O Campo Nome é obrigatório', // 'bi.required' => 'O campo Bi é Obrigatório', // 'bi.min' => 'O campo Bi ter 13 dígitos', 'password.required' => 'O Campo Senha é obrigatório', 'password.confirmed' => 'Senhas incompatíveis', 'password.min' => 'A senha deve ter 8 digitos no mínimo', 'terminalChannel.required' => 'terminalChannel é Obrigatório', 'terminalID.required' => 'terminalID é Obrigatório', 'terminalCompanyName.required' => 'terminalCompanyName é Obrigatório', // 'country_code.required' => 'country_code é Obrigatório' ]); $token = new GenerateToken(); $data = ['phone' => $request->country_code . $request->phone, 'codigo' => $token->generatePhoneNumberCode()]; // $sms = new SendSMS(); // $sent = $sms->verifyUser($data); // $sislog = new SendSMSSislog(); // $sent = $sislog->smsVerifyUser($data); // if ($sent) { $validate = PhoneValidation::query()->where('phone', $request->phone)->count(); if ($validate === 0) { $save = PhoneValidation::create([ 'phone' => $request->phone, // 'country_code' => $request->country_code, 'country_code' => +258, 'expire_at' => now(), 'duration' => 5, 'codigo' => $data['codigo'], 'is_Validated' => 0 ]); if ($save) { return response()->json(['codigo' => $data['codigo'], 'message' => 'Codigo de Verificação enviado com sucesso!'], 200); } } else { $validate = PhoneValidation::query()->where('phone', $request->phone)->first(); $save = $validate->update(['codigo' => $data['codigo']]); if ($save) { return response()->json(['message' => 'Codigo de Verificação enviado com sucesso!', 'codigo' => $data['codigo']], 200); } } // } } public function checkCodigo(Request $request) { $this->validate($request, [ 'codigo' => 'required', 'phone' => 'required', ], [ // 'codigo.required' => 'O Campo Email é de carácter Obrigatório', // 'phone.required' => 'O Número do celular é obrigatório', ]); try { $validate = PhoneValidation::query()->where('phone', $request->phone)->where('codigo', $request->codigo)->count(); $getPhone = PhoneValidation::query()->where('phone', $request->phone)->where('codigo', $request->codigo)->first(); if ($validate > 0) { $log = new Record(); $log->createLog([ 'description' => $request->phone, 'details' => 'Celular Verificado com Successo!', 'operation' => 'Check Phone Validation', 'status' => 'Success', 'user_id' => 1 ]); $getPhone->update(['is_Validated' => 1]); return response()->json(['message' => 'Celular Verificado com Successo!'], 200); } else { $log = new Record(); $log->createLog([ 'description' => $request->phone, 'details' => 'Código inválido', 'operation' => 'Check Phone Validation', 'status' => 'Error', 'user_id' => 1 ]); return response()->json(['message' => 'Código inválido'], 400); } } catch (Exception $exception) { return response()->json($exception); } } public function registerUser(Request $request) { $this->validate($request, [ 'name' => 'required', 'phone' => 'required|unique:users|min:9', 'email' => 'required|email|unique:users,email', 'password' => 'required|max:8', 'pin' => 'required|min:4|max:4', 'terminalID' => 'required', 'terminalChannel' => 'required', // 'description' => 'required', 'terminalCompanyName' => 'required', // 'bi' => 'required|min:13' ], [ 'email.required' => 'O Campo Email é de carácter Obrigatório', 'email.unique' => 'Este Email já está em uso', 'phone.required' => 'O Número do celular é obrigatório', 'phone.unique' => 'O Número do celular já está em uso', 'phone.min' => 'O Campo Celular deve ter 9 dígitos', 'name.required' => 'O Campo Nome é obrigatório', 'bi.required' => 'O campo Bi é Obrigatório', 'bi.min' => 'O campo Bi ter 13 dígitos', 'password.required' => 'O Campo Senha é obrigatório', 'password.confirmed' => 'Senhas incompatíveis', 'password.min' => 'A senha deve ter 8 digitos no mínimo', 'terminalChannel.required' => 'terminalChannel é Obrigatório' ]); $getPhone = PhoneValidation::query() ->where('phone', $request->phone) ->where('is_Validated', '=', 1) ->first(); if (!$getPhone) { return response()->json(['message' => 'O Nr do Celular não confere ou Nr não validado.'], 401); } $generate = new GenerateUserId(); $randomString = $generate->generatedUserId(30); $user = User::create([ 'firebase_token' => request('firebase_token'), 'mobile_reference' => request('mobile_reference'), 'name' => request('name'), 'email' => request('email'), 'phone' => request('phone'), // 'bi' => request('bi'), 'pin' => Hash::make(request('pin')), 'user_id' => $randomString, 'password' => bcrypt(request('password')), ]); $mobile = UserMobilePhone::query() ->where('user_id', $request->user()->id) ->where('firebase_token', $request->firebase_token) ->where('mobile_reference', $request->mobile_reference) ->first(); // if (!$mobile) { // $mobile->create([ // 'firebase_token' => $request->firebase_token, // 'mobile_reference' => $request->mobile_reference, // 'user_id' => $user->id // ]); // } else { //// $mobile->create([ //// 'firebase_token' => $request->firebase_token, //// 'mobile_reference' => $request->mobile_reference, //// 'user_id' => $user->id //// ]); // } $imali = new GenerateImaliAccount(); $generateImaliAcount = $imali->GenerateImaliAccountNumberAndStore(); $account = ''; if ($generateImaliAcount) { // $imaliConfig = ImaliAccountConfig::find(4); $imaliConfig = ImaliAccountConfig::query()->first(); $account = $user->imaliAccount()->create([ 'points' => 0, 'user_id' => $user->id, 'imali_account_config' => $imaliConfig->id, 'account_number' => $generateImaliAcount, 'reference' => $imali->generateReference(), 'balance' => 0 ]); } return response()->json(['message' => 'Conta Criada com Sucesso', 'accountNumber' => $account->account_number]); } public function getGeneratedPayments(Request $request, $accountNumber) { $kyc = new PartnerKyc(); $checkKyc = $kyc->checkGetTransactions($request, $accountNumber); if ($checkKyc) { return $checkKyc; } else { $payments = Payment::query() ->join('stores', 'stores.id', '=', 'payments.store_id') ->orderByDesc('created_at') ->where('stores.account_number', '=', $accountNumber) ->whereDate('payments.created_at', '=', date('Y-m-d')) ->select('payments.*', 'stores.account_number as store_account_number') ->get(); $payments->makeHidden([ 'id', 'user_id', 'imali_account_id', 'user_client_id', 'merchant_id', 'store_id', 'token', 'token_sent', 'duration', 'updated_at', 'transaction_id', 'estado', 'estado_color', 'firebase_token', 'device_name', 'sender_id', 'client_id', 'payment_id', 'store_amount_generation_id', 'qrcode', 'refund_confirmation', 'comissao', 'payment_type', 'received_points' ]); return response()->json(['data' => $payments]); } } public function getStorePayments(Request $request, $accountNumber) { $kyc = new PartnerKyc(); $checkKyc = $kyc->checkGetTransactions($request, $accountNumber); if ($checkKyc) { return $checkKyc; } else { $payment = Payment::query() ->join('stores', 'stores.id', '=', 'payments.store_id') ->join('users', 'users.id', '=', 'payments.sender_id') ->join('imali_accounts', 'imali_accounts.user_id', '=', 'payments.sender_id') ->where('payments.client_id', '=', $request->user()->id) ->whereDate('payments.created_at', date('Y-m-d')) ->orderByDesc('payments.created_at') ->select('payments.*', 'stores.name as store_name', 'stores.account_number as store_account_number', 'imali_accounts.account_number as imali_account', 'users.name as imali_username') ->paginate(10); $payment->makeHidden([ 'id', 'comissao', 'sender_id', 'store_id', 'client_id', 'category_id', 'estado_color', 'updated_at', 'used_points', 'received_points', 'transaction_id', 'token', 'token_sent', 'qrcode', 'firebase_token', 'device_name', 'imali_account_id', 'merchant_id', 'payment_id', 'store_amount_generation_id', '' ]); return response()->json(['data' => $payment]); } } public function getRefunds(Request $request, $accountNumber) { $kyc = new PartnerKyc(); $checkKyc = $kyc->checkGetTransactions($request, $accountNumber); if ($checkKyc) { return $checkKyc; } else { $payment = Payment::query() ->join('stores', 'stores.id', '=', 'payments.store_id') ->join('users', 'users.id', '=', 'payments.sender_id') ->join('imali_accounts', 'imali_accounts.user_id', '=', 'payments.sender_id') ->where('payments.client_id', '=', $request->user()->id) ->where('stores.account_number', '=', $accountNumber) ->whereDate('payments.created_at', '=', date('Y-m-d')) ->where('payments.payment_type', '=', 'refund') ->orderByDesc('payments.created_at') ->select('payments.*', 'stores.name as store_name', 'stores.account_number as store_account_number', 'imali_accounts.account_number as imali_account', 'users.name as imali_username', 'payments.transaction_id as payment_tarnsaction') // ->paginate(25) ->get(); $payment->makeHidden([ 'id', 'comissao', 'sender_id', 'store_id', 'client_id', 'updated_at', 'merchant_id', 'imali_user_id', 'user_client_id', 'payment_id', 'estado_color', 'token', 'account_number', 'transaction_id', 'received_points', 'used_points', 'amount_credited', 'amount_debited', 'token_sent', 'estado', 'duration', 'firebase_token', 'qrcode', 'device_name', 'imali_account_id', 'store_amount_generation_id', 'category_id', 'payment_tarnsaction' ]); return response()->json(['data' => $payment]); } } public function generatePayment(Request $request) { $this->validate($request, [ 'storeAccountNumber' => 'required|min:9', 'clientAccountNumber' => 'required|min:9', 'transactionID' => 'required', 'description' => 'required', 'amount' => 'required', 'terminalID' => 'required', 'terminalChannel' => 'required', 'terminalCompanyName' => 'required', ], [ ]); $trasactionGeneration = new TransactionGeneration(); $kyc = new PartnerKyc(); // $checkKyc = $kyc->checkPaymentCliente($request); $checkKyc = $kyc->checkPaymentGeneration($request); $tokenGeral = ''; if ($checkKyc) { return $checkKyc; } else { $this->request = $request; DB::transaction(function () { $store = DB::table('stores')->where('account_number', '=', $this->request->storeAccountNumber)->first(); $imali = DB::table('imali_accounts')->where('account_number', '=', $this->request->clientAccountNumber)->first(); $payerUser = DB::table('users')->where('id', $imali->user_id)->first(); $token = str_replace('Bearer ', '', $this->request->header('authorization')); $clientStore = DB::table('user_clients')->where('client_key', $token)->first(); $user = DB::table('users')->where('id', '=', $imali->user_id)->first(); $merchant = MerchantAccount::find($store->merchant_account_id); $trasactionGeneration = new GenerateToken(); $tra = new TransactionGeneration(); $generatedToken = $trasactionGeneration->generatePhoneNumberCode(); DB::table('payments')->insert([ // 'transaction_id' => $tra->generateTransaction(), 'transaction_id' => $this->request->transactionID, 'partner_transaction_id' => $this->request->transactionID, // 'store_account_number' => $this->request->storeAccountNumber, // 'customer_account_number' => $this->request->clientAccountNumber, 'amount' => $this->request->amount, 'estado' => 'pending', 'status' => 'pending', 'description' => $this->request->description, 'token' => $generatedToken, 'terminalID' => $this->request->terminalID, 'terminalChannel' => $this->request->terminalChannel, 'terminalCompanyName' => $this->request->terminalCompanyName, 'store_id' => $store->id, 'merchant_id' => $merchant->id, 'client_id' => $clientStore->id, 'imali_account_id' => $imali->id, 'sender_id' => $imali->user_id, 'created_at' => now(), 'updated_at' => now(), ]); $data = ['phone' => $payerUser->phone, 'token' => $generatedToken]; $this->token = $generatedToken; if (env('APP_ENV') == 'production') { $this->smsManager->tokenPayment($data); } }); if (env('APP_ENV') == 'local') { return response()->json(['message' => trans('otp_sent'), 'otp' => $this->token]); } elseif (env('APP_ENV') == 'production') { return response()->json(['message' => trans('otp_sent')]); } } } public function makePayment(Request $request) { $this->validate($request, [ 'token' => 'required|min:6', 'partner_transaction_id' => 'required', ], [ 'token.required' => trans('token_required'), 'partner_transaction_id.required' => trans('partner_transaction_id_required'), ]); $kyc = new PartnerKyc(); $checkKyc = $kyc->confirmPayment($request); if ($checkKyc) { return $checkKyc; } else { $generatedPayment = Payment::query()->where('partner_transaction_id', '=', $request->partner_transaction_id)->first(); $this->generatedPayment = $generatedPayment; $this->request = $request; if ($generatedPayment) { DB::transaction(function () { $store = DB::table('stores')->where('id', $this->generatedPayment->store_id)->first(); $merchant = DB::table('merchant_accounts')->where('id', $store->merchant_account_id)->first(); $imali = DB::table('imali_accounts')->where('user_id', $this->generatedPayment->sender_id)->first(); $imaliConfig = DB::table('imali_account_configs')->where('id', $imali->imali_account_config)->first(); $valorAPagar = $this->generatedPayment->amount + $imaliConfig->taxa; $points = round($valorAPagar); // Payer or Sender Section DB::table('imali_accounts')->where('user_id', $this->generatedPayment->sender_id)->decrement('balance', $valorAPagar); DB::table('imali_accounts')->where('user_id', $this->generatedPayment->sender_id)->increment('points', $points); $contractoComerciante = DB::table('merchant_contracts')->where('store_id', $this->generatedPayment->store_id)->first(); $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100; $valorMin = $contractoComerciante->min_amount; $valorMax = $contractoComerciante->max_amount; if ($taxaDesconto < $valorMin) { $taxaDesconto = $valorMin; } if ($taxaDesconto > $valorMax) { $taxaDesconto = $valorMax; } // $valorFinal = $valorAPagar - $taxaDesconto; $valorFinal = $this->generatedPayment->amount - $taxaDesconto; // Recever User Merchante // DB::table('stores')->where('account_number', $this->generatedPayment->store_account_number)->increment('balance', $valorFinal); if ($merchant) { DB::table('stores')->where('id', $this->generatedPayment->store_id)->increment('balance', $valorFinal); DB::table('merchant_accounts')->where('id', $merchant->id)->increment('balance', $valorFinal); } // DB::table('payments')->insert([ // 'transaction_id' => $this->generatedPayment->transaction_id, // 'partner_transaction_id' => $this->generatedPayment->partner_transaction_id, // 'sender_id' => $this->generatedPayment->user_id, // 'store_id' => $this->generatedPayment->store_id, // 'client_id' => $this->generatedPayment->user_client_id, // 'received_points' => $this->generatedPayment->amount, // 'amount' => $this->generatedPayment->amount, // 'amount_credited' => $valorFinal, // 'comissao' => $taxaDesconto, // 'description' => $this->generatedPayment->description, // 'used_points' => 0, // 'estado' => 'pago', // 'estado_color' => '#388E3C', // 'payment_type' => 'directo', // 'terminalID' => $this->generatedPayment->terminalID, // 'terminalChannel' => $this->generatedPayment->terminalChannel, // 'terminalCompanyName' => $this->generatedPayment->terminalCompanyName, // 'created_at' => now(), // 'updated_at' => now() // ]); DB::table('payments') ->where('partner_transaction_id', $this->generatedPayment->partner_transaction_id) ->update([ 'received_points' => $this->generatedPayment->amount, 'amount_credited' => $this->generatedPayment->amount - $taxaDesconto, 'amount_debited' => $valorAPagar, 'comissao' => $taxaDesconto, 'description' => $this->generatedPayment->description, 'used_points' => 0, 'estado' => 'success', 'status' => 'success', 'estado_color' => '#388E3C', 'payment_type' => 'directo', 'updated_at' => now() ]); $payerUser = DB::table('users')->where('id', $imali->user_id)->first(); $trasactionGeneration = new TransactionGeneration(); $transaction = $trasactionGeneration->generateTransaction(); $actualPoints = $imali->points + $points; $createTransaction = DB::table('payments')->where('transaction_id', $this->generatedPayment->transaction_id)->first(); DB::table('history_payments')->insert([ 'sender_account' => $imali->account_number, 'sender_name' => $payerUser->name, 'amount_credited' => $valorFinal, 'status_user' => 'sender', 'status' => 'done', 'comissao' => $taxaDesconto, 'amount' => $valorAPagar, 'user_id' => $payerUser->id, 'actual_points' => $actualPoints, 'last_points' => $imali->points, 'win_points' => $points, 'transaction_id' => $transaction, 'payment_id' => $createTransaction->id, 'created_at' => now(), 'updated_at' => now() ]); DB::table('profits')->insert([ 'payer_id' => $payerUser->id, 'payer_account' => $store->account_number, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'profit_id' => $trasactionGeneration->generateTransaction(), 'payment_id' => $createTransaction->id, 'profit_payer_id' => $createTransaction->store_id, 'created_at' => now(), 'updated_at' => now() ]); // DB::table('payment_generations') // ->where('transaction_id', $this->generatedPayment->transaction_id) // ->update(['status' => 'success', 'updated_at' => now()]); // // DB::table('payment_generation_confirmations')->insert([ // 'payment_generation_id' => $this->generatedPayment->id, // 'payment_id' => $createTransaction->id, // 'created_at' => now(), // 'updated_at' => now() // ]); $result = json_decode(json_encode($createTransaction), true); if (env('APP_ENV') == 'production') { $this->smsManager->sendMessageToClientePayment($result); } // $sms->sendMessageToComerciante($createTransaction); // $sms->sendMessageToClientePayment($payerUser); // Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction)); // Mail::to($payerUser->email)->send(new Pagamento($createTransaction)); $log = new Record(); $log->createLog([ 'description' => 'Pagamento na loja do comerciante', 'details' => 'Pagamento Feito com Sucesso', 'operation' => 'Payment', 'properties' => json_encode($createTransaction), 'status' => 'Success', 'user_id' => $this->generatedPayment->user_id ]); }, 5); } } return response()->json(['message' => trans('payment_done')]); } public function makePaymentOlD(Request $request) { $this->validate($request, [ 'storeAccountNumber' => 'required|min:9', 'clientAccountNumber' => 'required|min:9', 'transactionID' => 'required', 'amount' => 'required', 'pin' => 'required|min:4|max:4', // 'apiKey' => 'required', 'terminalID' => 'required', 'terminalChannel' => 'required', 'description' => 'required', 'terminalCompanyName' => 'required', 'usedPoints' => 'required' ], [ 'clientAccountNumber.required' => 'O Campo clientAccountNumber é de carácter Obrigatório', 'storeAccountNumber.required' => 'O Campo storeAccountNumber é de carácter Obrigatório', 'storeAccountNumber.min' => 'O Campo storeAccountNumber deve ter 9 dígitos', 'clientAccountNumber.min' => 'O Campo clientAccountNumber deve ter 9 dígitos', 'transactionID.required' => 'O campo transactionID é obrigatório', 'pin.required' => 'O pin é obrigatório', 'pin.max' => 'O pin deve ter 4 digitos', 'pin.min' => 'O pin deve ter 4 digitos', 'terminalCompanyName.required' => 'O campo terminalCompanyName é Obrigatório', 'terminalID.required' => 'terminalID é Obrigatório', 'amount.required' => 'O Campo amount é obrigatório', 'apiKey.required' => 'apiKey é obrigatória', 'description.required' => 'Descrição de Pagamento é obrigatória', 'usedPoints.required' => 'usedPoints é obrigatória' ]); $trasactionGeneration = new TransactionGeneration(); $kyc = new PartnerKyc(); $checkKyc = $kyc->checkPaymentCliente($request); if ($checkKyc) { return $checkKyc; } else { $store = Store::query()->where('account_number', '=', $request->storeAccountNumber)->first(); $imali = ImaliAccount::query()->where('account_number', '=', $request->clientAccountNumber)->first(); $payerUser = User::query()->where('id', $imali->user_id)->first(); $store = Store::query()->where('account_number', $request->storeAccountNumber)->first(); $token = str_replace('Bearer ', '', $request->header('authorization')); $clientStore = UserClient::query()->where('client_key', $token)->first(); $payer_id = $payerUser->id; $imali = ImaliAccount::query()->where('user_id', $payer_id)->first(); $valorAPagar = $request->amount; $points = round($valorAPagar); // Payer or Sender Section DB::table('imali_accounts')->where('user_id', $payer_id)->decrement('balance', $valorAPagar); DB::table('imali_accounts')->where('user_id', $payer_id)->increment('points', $points); $contractoComerciante = MerchantContract::query()->where('store_id', $store->id)->first(); $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100; $valorMin = $contractoComerciante->min_amount; $valorMax = $contractoComerciante->max_amount; if ($taxaDesconto < $valorMin) { $taxaDesconto = $valorMin; } if ($taxaDesconto > $valorMax) { $taxaDesconto = $valorMax; } // $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100; $valorFinal = $valorAPagar - $taxaDesconto; // Recever User Merchante DB::table('stores')->where('account_number', $store->account_number)->increment('balance', $valorFinal); // $profit = $valorAPagar*($contractoComerciante->taxa)/100; $transaction = $trasactionGeneration->generateTransaction(); $createTransaction = Payment::create([ 'transaction_id' => $request->transactionID, 'sender_id' => $payer_id, 'store_id' => $store->id, 'client_id' => $clientStore->id, 'received_points' => $points, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'description' => $request->description, 'used_points' => $request->usedPoints, 'estado' => 'pago', 'estado_color' => '#388E3C', 'terminalID' => $request->terminalID, 'terminalChannel' => $request->terminalChannel, 'terminalCompanyName' => $request->terminalCompanyName, 'created_at' => now(), 'updated_at' => now() ]); $actualPoints = $imali->points + $points; $createTransaction->paymentHistoric()->create([ 'sender_account' => $imali->account_number, 'sender_name' => $payerUser->name, 'amount_credited' => $valorFinal, 'status_user' => 'sender', 'status' => 'done', 'comissao' => $taxaDesconto, 'amount' => $valorAPagar, 'user_id' => $payerUser->id, 'actual_points' => $actualPoints, 'last_points' => $imali->points, 'win_points' => $points, 'transaction_id' => $transaction ]); $saveProfit = $createTransaction->profit()->create([ 'payer_id' => $payer_id, 'payer_account' => $store->account_number, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'profit_id' => $trasactionGeneration->generateTransaction(), 'payment_id' => $createTransaction->id, 'profit_payer_id' => $createTransaction->store_id ]); $this->smsManager->sendSMSToComerciante($createTransaction); // $sms->sendMessageToComerciante($createTransaction); // $sms->sendMessageToClientePayment($payerUser); // Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction)); // Mail::to($payerUser->email)->send(new Pagamento($createTransaction)); $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' - ' . $store->name, 'details' => 'Pagamento Feito com Sucesso', 'operation' => 'Payment', 'status' => 'Success', 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Pagamento Feito com Sucesso!', // 'transaction' => $transaction, 'transaction' => $createTransaction->transaction_id, 'amount' => $createTransaction->amount, 'created_at' => $createTransaction->created_at, 'duration' => 3000 ], 200); } } public function makePayment2(Request $request) { // $user = User::find($request->user()->id); $user = User::query() ->join('imali_accounts', 'imali_accounts.user_id', '=', 'users.id') ->where('imali_accounts.account_number', '=', $request->account_number) ->select('users.*') ->first(); if (Hash::check($request->pin, $user->pin)) { $trasactionGeneration = new TransactionGeneration(); // $payerUser = User::query()->where('user_id', $request->user()->user_id)->first(); $payerUser = User::query()->where('user_id', $user->user_id)->first(); $store = Store::query()->where('account_number', $request->store_account_number)->first(); $payer_id = $payerUser->id; $imali = ImaliAccount::query()->where('user_id', $payer_id)->first(); $kyc = new Kyc(); $kycCheck = $kyc->checkSenderPayment($request); $kyc = new PartnerKyc(); $checkKYC = $kyc->checkPaymentCliente($request); if ($kycCheck) { $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => $kycCheck, 'operation' => 'Payment', 'status' => 'Error', 'user_id' => $request->user()->id ]); return $kycCheck; } else { if ($payerUser) { if ($imali->balance < $request->amount) { $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => 'Saldo Insuficiente', 'operation' => 'Payment', 'status' => 'Error', 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402, [], JSON_NUMERIC_CHECK); } else { $valorAPagar = $request->amount; $points = round($valorAPagar); // Payer or Sender Section DB::table('imali_accounts')->where('user_id', $payer_id)->decrement('balance', $valorAPagar); DB::table('imali_accounts')->where('user_id', $payer_id)->increment('points', $points); $contractoComerciante = MerchantContract::query()->where('store_id', $store->id)->first(); $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100; $valorMin = $contractoComerciante->min_amount; $valorMax = $contractoComerciante->max_amount; if ($taxaDesconto < $valorMin) { $taxaDesconto = $valorMin; } if ($taxaDesconto > $valorMax) { $taxaDesconto = $valorMax; } // $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100; $valorFinal = $valorAPagar - $taxaDesconto; // Recever User Merchante DB::table('stores')->where('account_number', $store->account_number)->increment('balance', $valorFinal); // $profit = $valorAPagar*($contractoComerciante->taxa)/100; $transaction = $trasactionGeneration->generateTransaction(); $createTransaction = Payment::create([ 'transaction_id' => $transaction, 'sender_id' => $payer_id, 'store_id' => $store->id, 'received_points' => $points, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'pago', 'estado_color' => '#388E3C', 'created_at' => now(), 'updated_at' => now() ]); $actualPoints = $imali->points + $points; $createTransaction->paymentHistoric()->create([ 'sender_account' => $imali->account_number, 'sender_name' => $payerUser->name, 'amount_credited' => $valorFinal, 'status_user' => 'sender', 'status' => 'done', 'comissao' => $taxaDesconto, 'amount' => $valorAPagar, 'user_id' => $payerUser->id, 'actual_points' => $actualPoints, 'last_points' => $imali->points, 'win_points' => $points, 'transaction_id' => $transaction ]); $saveProfit = $createTransaction->profit()->create([ 'payer_id' => $payer_id, 'payer_account' => $store->account_number, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'profit_id' => $trasactionGeneration->generateTransaction(), 'payment_id' => $createTransaction->id, 'profit_payer_id' => $createTransaction->store_id ]); if ($saveProfit) { // $sms = new SendSMS(); // $sms->sendMessageToClientePayment($createTransaction); // $sms->sendMessageToComerciante($createTransaction); // $sms->sendMessageToClientePayment($payerUser); // Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction)); // Mail::to($payerUser->email)->send(new Pagamento($createTransaction)); $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => 'Pagamento Feito com Sucesso', 'operation' => 'Payment', 'status' => 'Success', 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Pagamento Feito com Sucesso!', 'transaction' => $transaction, 'created_at' => $createTransaction->created_at, 'duration' => 3000 ], 200); } } } } } else { return response()->json(['message' => 'Pin Incorrecto'], 400); } } public function refundCustomerNew(Request $request) { $this->validate($request, [ 'amount' => 'required', 'description' => 'required', 'customerAccountNumber' => 'required', 'storeAccountNumber' => 'required', 'paymentTransaction' => 'required', 'partnerTransactionID' => 'required|min:12', 'terminalID' => 'required', 'terminalChannel' => 'required', 'terminalCompanyName' => 'required', ]); $kyc = new PartnerKyc(); $kycCheck = $kyc->checkMerchantRefund($request); if ($kycCheck) { return $kycCheck; } else { $this->requestRefund = $request; DB::transaction(function () { $imaliUser = DB::table('imali_accounts') ->join('users', 'users.id', '=', 'imali_accounts.user_id') ->where('account_number', $this->requestRefund->customerAccountNumber) ->select('users.*', 'imali_accounts.id as imali_account_id') ->first(); $merchant = DB::table('merchant_accounts') ->join('stores', 'stores.merchant_account_id', '=', 'merchant_accounts.id') ->where('stores.account_number', $this->requestRefund->storeAccountNumber) ->select('merchant_accounts.*', 'stores.balance as store_balance', 'stores.id as store_id') ->first(); $imaliConfig = DB::table('imali_account_configs') ->where('id', '=', $merchant->kyc_config_id) ->first(); $loja = Store::query()->where('account_number', '=', $this->requestRefund->storeAccountNumber)->first(); $payment = Payment::query() ->where('transaction_id', '=', $this->requestRefund->paymentTransaction) ->first(); $generation = new GenerateToken(); $token = $generation->generatePhoneNumberCode(); DB::table('payments')->insert([ // 'transaction_id' => $this->msid->generateTransaction(), 'transaction_id' => $this->requestRefund->partnerTransactionID, 'partner_transaction_id' => $this->requestRefund->partnerTransactionID, 'amount' => $this->requestRefund->amount, 'comissao' => $imaliConfig->taxa_refund_mechant, 'amount_debited' => $this->requestRefund->amount + $imaliConfig->taxa_refund_mechant, 'amount_credited' => $this->requestRefund->amount, // 'account_number' => $this->requestRefund->customerAccountNumber, 'description' => $this->requestRefund->description, 'store_id' => $merchant->store_id, 'sender_id' => $imaliUser->id, 'imali_account_id' => $imaliUser->imali_account_id, 'payment_id' => $payment->id, 'estado' => 'pending', 'status' => 'pending', 'payment_type' => 'refund', 'token' => $token, 'merchant_id' => $merchant->id, 'client_id' => $this->requestRefund->user()->id, 'terminalCompanyName' => $this->requestRefund->terminalCompanyName, 'terminalChannel' => $this->requestRefund->terminalChannel, 'terminalID' => $this->requestRefund->terminalID, 'created_at' => now(), 'updated_at' => now() ]); $data = ['phone' => $merchant->phone_number, 'token' => $token]; $this->token = $token; if (env('APP_ENV') == 'production') { $this->smsManager->tokenPayment($data); } }); if (env('APP_ENV') == 'local') { return response()->json(['message' => trans('otp_sent'), 'token' => $this->token]); } elseif (env('APP_ENV') == 'production') { return response()->json(['message' => trans('otp_sent')]); } } } public function confirmRefund(Request $request) { $this->validate($request, [ 'partner_transaction_id' => 'required|min:12', 'token_otp' => 'required' ]); $kyc = new PartnerKyc(); $kycCheck = $kyc->checkConfirmRefund($request); if ($kycCheck) { return $kycCheck; } else { $this->requestRefundConfirm = $request; DB::transaction(function () { // $refund = DB::table('refunds') // ->where('partner_transaction_id', $this->requestRefundConfirm->partner_transaction_id) // ->first(); $refund = DB::table('payments') ->where('partner_transaction_id', $this->requestRefundConfirm->partner_transaction_id) ->first(); DB::table('payments') ->where('partner_transaction_id', $this->requestRefundConfirm->partner_transaction_id) ->update([ 'received_points' => 0, 'used_points' => 0, 'estado' => 'success', 'refund_confirmation' => true, 'status' => 'success', 'updated_at' => now() ]); $merchant = DB::table('merchant_accounts') ->join('stores', 'stores.merchant_account_id', '=', 'merchant_accounts.id') ->where('stores.id', $refund->store_id) ->select('merchant_accounts.*', 'stores.balance as store_balance') ->first(); $loja = DB::table('stores')->where('id', '=', $refund->store_id)->first(); $imaliConfig = ImaliAccountConfig::find($merchant->kyc_config_id); $payment = DB::table('payments')->where('id', $refund->payment_id)->first(); $user = DB::table('users')->where('id', $refund->sender_id)->first(); $imali = DB::table('imali_accounts')->where('user_id', $refund->sender_id)->first(); DB::table('imali_accounts')->where('user_id', $refund->sender_id)->increment('balance', $refund->amount); // DB::table('merchant_accounts')->where('id', $refund->merchant_id)->increment('balance', $refund->amount + $imaliConfig->taxa_refund_mechant); DB::table('merchant_accounts')->where('id', $refund->merchant_id)->decrement('balance', $refund->amount + $imaliConfig->taxa_refund_mechant); $tran = new TransactionGeneration(); DB::table('profits')->insert([ 'payer_id' => $user->id, 'payer_account' => $loja->account_number, 'amount' => $refund->amount, 'amount_credited' => $refund->amount + $imaliConfig->taxa_refund_mechant, 'comissao' => $imaliConfig->taxa_refund_mechant, 'profit_id' => $tran->generateTransaction(), 'payment_id' => $payment->id, 'profit_payer_id' => $payment->store_id, 'created_at' => now(), 'updated_at' => now() ]); // DB::table('refunds') // ->where('transaction', $refund->transaction) // ->update(['estado' => 'successo', 'updated_at' => now()]); $notification = array( 'icon' => 'ic_imali_logo_verde_01', // 'icon' => 'ic_i_mali_cover', 'title' => 'Recebeste ' . $refund->amount . ' MT', 'body' => 'Parabéns, ' . ' recebeste reembolso ' . $refund->amount . ' MT ' . ' da loja ' . $loja->name, 'click_action' => 'com.imali.payapp.payment_PAGAR_NOTIFICATION', // 'color' => '#008577' 'color' => '#ffffff' ); $data = array( 'transaction' => $refund->transaction_id, 'loja' => $loja->name, 'loja_account' => $loja->account_number, 'pontos' => $payment->received_points, 'pontos_usados' => $payment->used_points, 'amount' => (double)$refund->amount, 'amount_debited' => (double)$refund->amount, 'account_number' => (int)$imali->account_number, 'phone' => $user->phone, 'descricao' => $refund->description, 'data' => $refund->created_at, 'estado' => $refund->estado, 'comissao' => (double)$refund->comissao, 'terminal' => 'firebase' ); $result = json_decode(json_encode($payment), true); if (env('APP_ENV') == 'production') { $this->smsManager->sendMessageToCustomerPayment($data, $result); } $this->pushNotifification($user->firebase_token, $notification, $data); }); return response()->json(['message' => trans('refund_done')], 200); } } public function refundCustomer(Request $request) { $this->validate($request, [ // 'transaction' => 'required', 'amount' => 'required', 'description' => 'required', 'account_number' => 'required', 'store_account_number' => 'required', 'payment_transaction' => 'required', 'partner_transaction_id' => 'required', // 'password' => 'required', 'terminalID' => 'required', 'terminalChannel' => 'required', 'terminalCompanyName' => 'required', ], [ 'transaction.required' => 'O Campo transaction é de carácter Obrigatório', 'amount.required' => 'O Campo transaction é de carácter Obrigatório', 'description.required' => 'O campo description é obrigatório', 'partner_transaction_id.required' => 'O campo partner_transaction_id é obrigatório', 'account_number.required' => 'O campo account_number é obrigatório', 'merchant_id.required' => 'O campo merchant_id é obrigatório', 'imali_user_id.required' => 'O campo imali_user_id é obrigatório', 'store_id.required' => 'O campo imali_user_id é obrigatório', 'user_client_id.required' => 'O campo imali_user_id é obrigatório', ]); $kyc = new PartnerKyc(); $kycCheck = $kyc->checkMerchantRefund($request); if ($kycCheck) { return $kycCheck; } else { $imaliUser = ImaliAccount::query() ->join('users', 'users.id', '=', 'imali_accounts.user_id') ->where('account_number', $request->account_number) ->select('users.*') ->first(); $merchant = MerchantAccount::query() ->join('stores', 'stores.merchant_account_id', '=', 'merchant_accounts.id') ->where('stores.account_number', $request->store_account_number) ->select('merchant_accounts.*', 'stores.balance as store_balance', 'stores.id as store_id') ->first(); $imaliConfig = ImaliAccountConfig::find($merchant->kyc_config_id); // $loja = Store::query()->where('id', '=', $request->store_id)->first(); $loja = Store::query()->where('account_number', '=', $request->store_account_number)->first(); $payment = Payment::query() ->where('transaction_id', $request->payment_transaction) ->first(); $refund = Refund::create([ 'transaction' => $this->msid->generateTransaction(), 'amount' => $request->amount, 'fee' => $imaliConfig->taxa_refund_mechant, 'amount_debited' => $request->amount + $imaliConfig->taxa_refund_mechant, 'account_number' => $request->account_number, 'description' => $request->description, 'store_id' => $merchant->store_id, 'imali_user_id' => $imaliUser->id, 'payment_id' => $payment->id, // 'estado' => 'Reembolso', 'estado' => 'pendente', 'merchant_id' => $merchant->id, 'user_client_id' => $request->user()->id, 'terminalCompanyName' => $request->terminalCompanyName, 'terminalChannel' => $request->terminalChannel, 'terminalID' => $request->terminalID ]); $payment = Payment::create([ 'transaction_id' => $refund->transaction, 'sender_id' => $refund->imali_user_id, 'store_id' => $refund->store_id, 'received_points' => 0, 'amount' => $refund->amount, 'amount_credited' => $refund->amount, 'comissao' => $refund->fee, 'description' => $refund->description, 'used_points' => 0, 'estado' => 'pago', 'client_id' => $request->user()->id, 'payment_type' => 'reembolso', 'estado_color' => '#388E3C', 'created_at' => now(), 'updated_at' => now() ]); DB::table('imali_accounts')->where('user_id', $refund->imali_user_id)->increment('balance', $refund->amount); DB::table('merchant_accounts')->where('id', $refund->merchant_id)->increment('balance', $refund->amount); $notification = array( 'icon' => 'ic_imali_logo_verde_01', // 'icon' => 'ic_i_mali_cover', 'title' => 'Recebeste ' . $request->amount . ' MT', 'body' => 'Parabéns, ' . ' recebeste reembolso ' . $request->amount . ' MT ' . ' da loja ' . $loja->name, 'click_action' => 'com.imali.payapp.payment_PAGAR_NOTIFICATION', // 'color' => '#008577' 'color' => '#ffffff' ); $data = array( 'transaction' => $refund->transaction, 'loja' => $loja->name, 'loja_account' => $loja->account_number, 'pontos' => $payment->received_points, 'pontos_usados' => $payment->used_points, 'amount' => (double)$refund->amount, 'amount_debited' => (double)$refund->amount, 'account_number' => (int)$refund->account_number, 'phone' => $request->user()->phone, 'descricao' => $refund->description, 'data' => $refund->created_at, 'estado' => $refund->estado, 'comissao' => (double)$refund->comissao, 'terminal' => 'firebase' ); $this->pushNotifification($imaliUser->firebase_token, $notification, $data); return response()->json(['message' => 'Reembolso feito com Sucesso!'], 200); } } 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); } }